├── .gitattributes ├── ISSUE_TEMPLATE.md ├── License.md ├── README.md ├── examples └── Example999_Testing │ ├── Example999_Testing.ino │ ├── Example999_Testing.ino.standard.hex │ └── Example999_Testing.ino.with_bootloader.standard.hex ├── keywords.txt ├── library.properties └── src ├── HyperDisplay_SSD1309.cpp └── HyperDisplay_SSD1309.h /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ### Subject of the issue 2 | Describe your issue here. 3 | 4 | ### Your workbench 5 | * What platform are you using? 6 | * What version of the device are you using? Is there a firmware version? 7 | * How is the device wired to your platform? 8 | * How is everything being powered? 9 | * Are there any additional details that may help us help you? 10 | 11 | ### Steps to reproduce 12 | Tell us how to reproduce this issue. Please post stripped down example code demonstrating your issue to a gist. 13 | 14 | ### Expected behaviour 15 | Tell us what should happen 16 | 17 | ### Actual behaviour 18 | Tell us what happens instead 19 | -------------------------------------------------------------------------------- /License.md: -------------------------------------------------------------------------------- 1 | SparkFun License Information 2 | ============================ 3 | 4 | SparkFun uses two different licenses for our files — one for hardware and one for code. 5 | 6 | Hardware 7 | --------- 8 | 9 | **SparkFun hardware is released under [Creative Commons Share-alike 4.0 International](http://creativecommons.org/licenses/by-sa/4.0/).** 10 | 11 | Note: This is a human-readable summary of (and not a substitute for) the [license](http://creativecommons.org/licenses/by-sa/4.0/legalcode). 12 | 13 | You are free to: 14 | 15 | Share — copy and redistribute the material in any medium or format 16 | Adapt — remix, transform, and build upon the material 17 | for any purpose, even commercially. 18 | The licensor cannot revoke these freedoms as long as you follow the license terms. 19 | Under the following terms: 20 | 21 | Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. 22 | ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. 23 | No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. 24 | Notices: 25 | 26 | You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation. 27 | No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material. 28 | 29 | 30 | Code 31 | -------- 32 | 33 | **SparkFun code, firmware, and software is released under the MIT License(http://opensource.org/licenses/MIT).** 34 | 35 | The MIT License (MIT) 36 | 37 | Copyright (c) 2016 SparkFun Electronics 38 | 39 | Permission is hereby granted, free of charge, to any person obtaining a copy 40 | of this software and associated documentation files (the "Software"), to deal 41 | in the Software without restriction, including without limitation the rights 42 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 43 | copies of the Software, and to permit persons to whom the Software is 44 | furnished to do so, subject to the following conditions: 45 | 46 | The above copyright notice and this permission notice shall be included in all 47 | copies or substantial portions of the Software. 48 | 49 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 50 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 51 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 52 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 53 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 54 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 55 | SOFTWARE. 56 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | SparkFun HyperDisplay SSD1309 Arduino Library 2 | ======================================== 3 | 4 | Standardized library for control of displays using the SSD1309 driver IC. 5 | 6 | 7 | Repository Contents 8 | ------------------- 9 | 10 | * **/examples** - Example sketches for the library (.ino). Run these from the Arduino IDE. 11 | * **/src** - Source files for the library (.cpp, .h). 12 | * **keywords.txt** - Keywords from this library that will be highlighted in the Arduino IDE. 13 | * **library.properties** - General library properties for the Arduino package manager. 14 | 15 | Documentation 16 | -------------- 17 | 18 | * **[Installing an Arduino Library Guide](https://learn.sparkfun.com/tutorials/installing-an-arduino-library)** - Basic information on how to install an Arduino library. 19 | 20 | Products that use this Library 21 | --------------------------------- 22 | 23 | * [Transparent Graphical OLED [LCD-15173]](https://www.sparkfun.com/products/15173) 24 | 25 | Version History 26 | --------------- 27 | 28 | * [V1.0.0](https://github.com/sparkfun/HyperDisplay_SSD1309_ArduinoLibrary/releases/tag/v1.0.0) -- Initial release 29 | 30 | License Information 31 | ------------------- 32 | 33 | This product is _**open source**_! 34 | 35 | The **code** is released under the GPL v3 license. See the included LICENSE.md for more information. 36 | 37 | Distributed as-is; no warranty is given. 38 | 39 | - Your friends at SparkFun. 40 | -------------------------------------------------------------------------------- /examples/Example999_Testing/Example999_Testing.ino: -------------------------------------------------------------------------------- 1 | #include "HyperDisplay_UG2856KLBAG01_I2C.h" 2 | 3 | #define SERIAL_PORT Serial 4 | 5 | UG2856KLBAG01_I2C myTOLED; 6 | #define WIRE_PORT Wire 7 | 8 | #define RES_PIN 3 9 | 10 | 11 | #define MY_BUFFER_LENGTH BUFFER_LENGTH 12 | 13 | 14 | // 15 | 16 | uint8_t color = 0x01; 17 | 18 | void Fill_RAM(unsigned char Data) 19 | { 20 | myTOLED.setColumnAddress(0, 127); 21 | myTOLED.setPageAddress(0, 7); 22 | for(uint8_t indj = 0; indj < 64; indj++) 23 | { 24 | WIRE_PORT.beginTransmission(0x3C); 25 | WIRE_PORT.write(0x40); 26 | for(uint8_t indi = 0; indi < 16; indi++) 27 | { 28 | WIRE_PORT.write(Data); 29 | } 30 | WIRE_PORT.endTransmission(); 31 | } 32 | } 33 | 34 | 35 | 36 | 37 | 38 | void setup() { 39 | Serial.begin(9600); 40 | 41 | Serial.println(MY_BUFFER_LENGTH); 42 | Serial.println(sizeof(SSD1309_Bite_t)); 43 | 44 | myTOLED.begin(WIRE_PORT, false, SSD1309_ARD_I2C_UNUSED_PIN); 45 | Wire.setClock(400000); 46 | 47 | // myTOLED.pixel(126,2,(color_t)&color); 48 | 49 | uint8_t a = 0xFF; 50 | 51 | myTOLED.hwxline(0,63, 10, (color_t)&a); 52 | 53 | myTOLED.line(10, 10, 350, 20, 1, (color_t)&color); 54 | 55 | myTOLED.rectangleSet(15,15, 45, 38, true); 56 | myTOLED.rectangleClear(20,20, 40, 33, true); 57 | 58 | myTOLED.circleSet(100, 32, 28, true); 59 | myTOLED.circleClear(88, 28, 17, true); 60 | 61 | 62 | 63 | } 64 | 65 | void loop() { 66 | 67 | myTOLED.pixelSet(126,2); 68 | delay(1000); 69 | 70 | myTOLED.pixelClear(126,2); 71 | delay(1000); 72 | 73 | 74 | } 75 | -------------------------------------------------------------------------------- /examples/Example999_Testing/Example999_Testing.ino.standard.hex: -------------------------------------------------------------------------------- 1 | :100000000C94D9020C9401030C9401030C94010389 2 | :100010000C9401030C9401030C9401030C94010350 3 | :100020000C9401030C9401030C9401030C94010340 4 | :100030000C9401030C9401030C9401030C94010330 5 | :100040000C9432190C9401030C9491080C946B08D5 6 | :100050000C9401030C9401030C9401030C94010310 7 | :100060000C94C3080C940103050800FF0C4B00001E 8 | :100070000000003E5B4F5B3E3E6B4F6B3E1C3E7C88 9 | :100080003E1C183C7E3C181C577D571C1C5E7F5E36 10 | :100090001C00183C1800FFE7C3E7FF0018241800F5 11 | :1000A000FFE7DBE7FF30483A060E2629792926408C 12 | :1000B0007F050507407F05253F5A3CE73C5A7F3EB8 13 | :1000C0001C1C08081C1C3E7F14227F22145F5F004A 14 | :1000D0005F5F06097F017F006689956A60606060E6 15 | :1000E0006094A2FFA29408047E040810207E2010D1 16 | :1000F00008082A1C08081C2A08081E101010100CDA 17 | :100100001E0C1E0C30383E3830060E3E0E06000027 18 | :1001100000000000005F00000007000700147F14CB 19 | :100120007F14242A7F2A122313086462364956203A 20 | :10013000500008070300001C2241000041221C005F 21 | :100140002A1C7F1C2A08083E08080080703000081E 22 | :1001500008080808000060600020100804023E51F2 23 | :1001600049453E00427F4000724949494621414984 24 | :100170004D331814127F1027454545393C4A4949EB 25 | :100180003141211109073649494936464949291E55 26 | :100190000000140000004034000000081422411444 27 | :1001A00014141414004122140802015909063E4196 28 | :1001B0005D594E7C1211127C7F494949363E4141BE 29 | :1001C00041227F4141413E7F494949417F09090917 30 | :1001D000013E414151737F0808087F00417F410083 31 | :1001E0002040413F017F081422417F404040407F32 32 | :1001F000021C027F7F0408107F3E4141413E7F097F 33 | :100200000909063E4151215E7F09192946264949BF 34 | :10021000493203017F01033F4040403F1F204020FF 35 | :100220001F3F4038403F63140814630304780403FD 36 | :100230006159494D43007F414141020408102000AB 37 | :100240004141417F0402010204404040404000031C 38 | :1002500007080020545478407F28444438384444E8 39 | :100260004428384444287F385454541800087E09E0 40 | :100270000218A4A49C787F0804047800447D400000 41 | :100280002040403D007F1028440000417F40007C1A 42 | :10029000047804787C080404783844444438FC1812 43 | :1002A00024241818242418FC7C08040408485454F6 44 | :1002B000542404043F44243C4040207C1C20402023 45 | :1002C0001C3C4030403C44281028444C9090907C8A 46 | :1002D0004464544C4400083641000000770000009C 47 | :1002E0004136080002010204023C2623263C1EA1DE 48 | :1002F000A161123A4040207A38545455592155553D 49 | :1003000079412154547841215554784020545579ED 50 | :10031000400C1E527212395555555939545454597E 51 | :1003200039555454580000457C410002457D420037 52 | :1003300001457C40F0292429F0F0282528F07C5440 53 | :100340005545002054547C547C0A097F4932494960 54 | :1003500049323248484832324A4848303A414121CD 55 | :100360007A3A42402078009DA0A07D394444443927 56 | :100370003D4040403D3C24FF2424487E4943662BB9 57 | :100380002FFC2F2BFF0929F620C0887E090320545B 58 | :100390005479410000447D413048484A3238404059 59 | :1003A000227A007A0A0A727D0D19317D2629292FB9 60 | :1003B00028262929292630484D40203808080808D1 61 | :1003C00008080808382F10C8ACBA2F102834FA00D3 62 | :1003D000007B000008142A142222142A1408AA0000 63 | :1003E0005500AAAA55AA55AA000000FF0010101037 64 | :1003F000FF00141414FF001010FF00FF1010F01085 65 | :10040000F0141414FC001414F700FF0000FF00FFA8 66 | :100410001414F404FC141417101F10101F101F14D0 67 | :1004200014141F00101010F0000000001F10101016 68 | :10043000101F10101010F010000000FF101010100E 69 | :100440001010101010FF10000000FF140000FF003B 70 | :10045000FF00001F10170000FC04F41414171017FD 71 | :100460001414F404F40000FF00F71414141414140A 72 | :1004700014F700F7141414171410101F101F14147D 73 | :1004800014F4141010F010F000001F101F000000F2 74 | :100490001F14000000FC140000F010F01010FF10FA 75 | :1004A000FF141414FF141010101F00000000F010AF 76 | :1004B000FFFFFFFFFFF0F0F0F0F0FFFFFF00000094 77 | :1004C0000000FFFF0F0F0F0F0F38444438447C2A01 78 | :1004D0002A3E147E02020606027E027E026355490F 79 | :1004E00041633844443C04407E201E2006027E02C4 80 | :1004F0000299A5E7A5991C2A492A1C4C7201724C45 81 | :10050000304A4D4D303048784830BC625A463D3E06 82 | :10051000494949007E0101017E2A2A2A2A2A4444A7 83 | :100520005F444440514A444040444A51400000FF27 84 | :100530000103E080FF000008086B6B0836123624C8 85 | :1005400036060F090F0600001818000000101000F2 86 | :100550003040FF0101001F01011E00191D1712008C 87 | :100560003C3C3C3C0000000000000000002500284E 88 | :10057000002B000404040404040404020202020226 89 | :100580000203030303030301020408102040800157 90 | :1005900002040810200102040810200000000800D6 91 | :1005A000020100000304070000000000000000003A 92 | :1005B000631D11241FBECFEFD8E0DEBFCDBF11E019 93 | :1005C000A0E0B1E0E2E5FFE302C005900D92AA3899 94 | :1005D000B107D9F727E0AAE8B1E001C01D92AE3912 95 | :1005E000B207E1F712E0C9EDD2E004C02197FE01A5 96 | :1005F0000E949C1FC83DD107C9F70E947B1A0C942A 97 | :10060000A71F0C940000CF92DF92EF92FF920F93FE 98 | :100610001F93CF93DF936C017A018B01C0E0D0E090 99 | :10062000CE15DF0581F0D8016D918D01D601ED91D8 100 | :10063000FC910190F081E02DC6010995892B11F004 101 | :100640002196EECF7E01C701DF91CF911F910F91CF 102 | :10065000FF90EF90DF90CF900895FC01538D448D73 103 | :10066000252F30E0842F90E0821B930B541710F05D 104 | :10067000CF96089501970895FC01918D828D98176A 105 | :1006800061F0828DDF01A80FB11D5D968C91928D76 106 | :100690009F5F9F73928F90E008958FEF9FEF089573 107 | :1006A000FC01918D828D981731F0828DE80FF11D3C 108 | :1006B000858D90E008958FEF9FEF0895FC01918D57 109 | :1006C000228D892F90E0805C9F4F821B91098F7350 110 | :1006D0009927089581E592E00E945E0321E0892B2D 111 | :1006E00009F420E0822F0895FC01848DDF01A80F1A 112 | :1006F000B11DA35ABF4F2C91848D90E001968F734A 113 | :100700009927848FA689B7892C93A089B1898C9168 114 | :10071000837080648C93938D848D981306C00288B7 115 | :10072000F389E02D80818F7D80830895EF92FF9281 116 | :100730000F931F93CF93DF93EC0181E0888F9B8D04 117 | :100740008C8D981305C0E889F989808185FD26C0C4 118 | :10075000F62E0B8D10E00F5F1F4F0F731127E02E49 119 | :100760008C8DE8120CC00FB607FCFACFE889F98926 120 | :10077000808185FFF5CFCE010E947403F1CF8B8D70 121 | :10078000FE01E80FF11DE35AFF4FF0829FB7F89486 122 | :100790000B8FEA89FB89808180620AC09FB7F89439 123 | :1007A000EE89FF896083E889F9898081837080649C 124 | :1007B00080839FBF81E090E0DF91CF911F910F91E7 125 | :1007C000FF90EF900895CF93DF93EC01888D8823FD 126 | :1007D000C9F0EA89FB89808185FD05C0A889B989AE 127 | :1007E0008C9186FD0FC00FB607FCF5CF808185FF89 128 | :1007F000F2CFA889B9898C9185FFEDCFCE010E94F7 129 | :100800007403E7CFDF91CF91089580E090E0892BCA 130 | :1008100029F00E946A0381110C940000089585ED6F 131 | :100820008093BC008091BC0084FDFCCF10927007C7 132 | :10083000089540912802262F30E0240F311D2132E7 133 | :100840003105DCF4209170072430C9F4FC0180E00C 134 | :1008500090E0861758F4309128022191DC01A85FBE 135 | :10086000BD4FA30FB11D2C930196F3CF80912802A9 136 | :10087000680F6093280280E0089581E0089582E087 137 | :100880000895089508950895E091500280914F02CF 138 | :10089000E81730F4F0E0E851FE4F808190E00895D1 139 | :1008A0008FEF9FEF08959091500280914F0298171B 140 | :1008B00050F4E92FF0E0E851FE4F208130E09F5FD7 141 | :1008C0009093500202C02FEF3FEFC901089580912D 142 | :1008D0004F0290E020915002821B91090895CF921F 143 | :1008E000DF92EF92FF920F931F93CF93DF937C01E0 144 | :1008F000CB018A0120917107222389F0EB016B0162 145 | :10090000C40ED51ECC15DD0569F06991D701ED91B6 146 | :10091000FC910190F081E02DC7010995F3CF642F80 147 | :100920000E941904C801DF91CF911F910F91FF9090 148 | :10093000EF90DF90CF900895CF93DF931F92CDB7C4 149 | :10094000DEB76983209171072223D1F020919407AB 150 | :10095000203240F021E030E0FC013383228380E04C 151 | :1009600090E015C080917207E82FF0E0ED58F84F45 152 | :10097000998190838F5F809372078093940705C05D 153 | :1009800061E0CE0101960E94190481E090E00F9091 154 | :10099000DF91CF910895DC01FB0111821082158255 155 | :1009A000148214968D919C91159793838283169649 156 | :1009B0008D919C9117979783868310861186128656 157 | :1009C00013861486158616861786108A118A128A4F 158 | :1009D000138A148A158A168A178A118E108E138E1E 159 | :1009E000128E158E148E168E178E10A211A212A2C0 160 | :1009F00013A214A215A211AA10AA1896ED91FC91A7 161 | :100A0000199717A216A281E090E0A0E0B0E080A7BD 162 | :100A100091A7A2A7B3A714A615A616A617A6089570 163 | :100A2000CF92DF92EF92FF920F931F93CF93DF93BA 164 | :100A3000DA0111961C921E9280EC91E013969C9321 165 | :100A40008E93129788E991E015969C938E93149754 166 | :100A500085E016968C93169788E017968C931797D7 167 | :100A60006D3011F06A3029F481E01D968C931D974A 168 | :100A700003C01D961C921D9780EE860F8F3508F0DF 169 | :100A800053C081E01C968C931C9705E0609FB001D9 170 | :100A9000112418961D921D921D921C921B9780E0A6 171 | :100AA00090E040E050E06A5F7F4F182FFB01E80FB5 172 | :100AB000F91FE859FF4FE49120E030E0F0E0EF014A 173 | :100AC000022E02C0D595C7950A94E2F7C0FF21C057 174 | :100AD0001896CD90DD90ED90FC901B97CFEFCC1A3F 175 | :100AE000DC0AEC0AFC0A1896CD92DD92ED92FC929B 176 | :100AF0001B971296CD91DC911397C40FD51F1883C5 177 | :100B00001496CD91DC911597C40FD51F28834F5FA4 178 | :100B10005F4F2F5F3F4F2830310589F601968530B2 179 | :100B2000910509F0C2CF02C01C961C92DF91CF91B3 180 | :100B30001F910F91FF90EF90DF90CF9008952F922B 181 | :100B40003F924F925F926F927F928F929F92AF925D 182 | :100B5000BF92CF92DF92EF92FF920F931F93CF93AA 183 | :100B6000DF93CDB7DEB760970FB6F894DEBF0FBE48 184 | :100B7000CDBF3C017A8369835C834B833C872B87A1 185 | :100B80001E870D87F88AEF86212C312C2101D60192 186 | :100B9000C501AA27BB278F839887A987BA87882092 187 | :100BA00009F452C0AB81BC812D853E852A173B07D5 188 | :100BB00008F48EC089809A808B859C85881599055C 189 | :100BC000B0F1D301ED91FC910084F185E02DA201FB 190 | :100BD00091016F857889C30109959E838D83C20138 191 | :100BE000B1016F5F7F4F8F4F9F4F2F8138854985B0 192 | :100BF0005A850E947D1F1B012C0144245524D301DA 193 | :100C0000ED91FC910484F585E02DA12CB12C6501BA 194 | :100C1000E12CF12C8701E3942D813E814B815C8195 195 | :100C2000B401C3010995BFEF8B1A9B0AC5CF2B8175 196 | :100C30003C812F5F3F4F3C832B83B4CF29813A8186 197 | :100C40002F5F3F4F3A83298389819A81AB85BC8589 198 | :100C5000A817B907E8F18B809C802D853E85281563 199 | :100C6000390560F3D301ED91FC910084F185E02D0D 200 | :100C7000A20191016F857889C30109959E838D83B7 201 | :100C8000C201B1016F5F7F4F8F4F9F4F2F8138851A 202 | :100C900049855A850E947D1F1B012C01442455243F 203 | :100CA000D301ED91FC910484F585E02DA12CB12CAC 204 | :100CB0006501E12CF12C8701E3942D813E81A40193 205 | :100CC00069817A81C3010995BFEF8B1A9B0AC5CF51 206 | :100CD00060960FB6F894DEBF0FBECDBFDF91CF9107 207 | :100CE0001F910F91FF90EF90DF90CF90BF90AF904A 208 | :100CF0009F908F907F906F905F904F903F902F903C 209 | :100D000008950895089580E090E008950E94A21F3C 210 | :100D10004F925F926F927F928F929F92AF92BF920B 211 | :100D2000CF92DF92EF92FF920F931F93CF93DF93B7 212 | :100D30006C01DC01ED91FC910688F789E02D4AE811 213 | :100D400051E00995F601C085D1856A817B81888152 214 | :100D50009981681B790B80919001681B710980E073 215 | :100D600090E00E94901E288539854A855B850E9407 216 | :100D7000551E87FF2FC0009191018C849D84AE8405 217 | :100D8000BF846E817F818C819D81681B790B10E00F 218 | :100D9000601B710B80E090E00E94901EA501940101 219 | :100DA0000E94551E87FD8BC088899989AA89BB89B5 220 | :100DB00088879987AA87BB87B801110F880B990B81 221 | :100DC0000E94921EA50194010E94E91D6C877D87F7 222 | :100DD0008E879F8780919601882309F462C0812CB9 223 | :100DE000912C54018091920190919301A0919401D2 224 | :100DF000B0919501F601C085D18588169906AA069D 225 | :100E0000BB06A8F5E0918E01F0918F01E80DF91D68 226 | :100E1000608170E080E090E00E94921E2C853D850C 227 | :100E20004E855F850E94E91D2B013C01E0918C01FC 228 | :100E3000F0918D01E80DF91D608170E080E090E097 229 | :100E40000E94921E288539854A855B850E94E91D8E 230 | :100E5000AB01BC01E12CF12C93018201C6010E947F 231 | :100E6000B40EFFEF8F1A9F0AAF0ABF0ABBCF609183 232 | :100E7000900170E06F5F7F4F072E000C880B990B7D 233 | :100E80000E94921E9B01AC01688579858A859B85AD 234 | :100E90000E94E91D688779878A879B8781E090E0B7 235 | :100EA00002C080E090E0F601A085B1852EE0EAE87E 236 | :100EB000F1E0589601900D922A95E1F702C080E08A 237 | :100EC00090E0DF91CF911F910F91FF90EF90DF9015 238 | :100ED000CF90BF90AF909F908F907F906F905F90DA 239 | :100EE0004F9008958F929F92AF92BF92CF92DF92D0 240 | :100EF000EF92FF920F931F93CF93DF93CDB7DEB79F 241 | :100F0000C114D104E104F10429F0EF85EF930E94AC 242 | :100F1000D3170F90DF91CF911F910F91FF90EF901A 243 | :100F2000DF90CF90BF90AF909F908F9008958F9259 244 | :100F30009F92AF92BF92CF92DF92EF92FF920F9368 245 | :100F40001F93CF93DF93CDB7DEB7C114D104E10473 246 | :100F5000F10429F0EF85EF930E940F160F90DF91B7 247 | :100F6000CF911F910F91FF90EF90DF90CF90BF90A6 248 | :100F7000AF909F908F9008958F929F92AF92BF9263 249 | :100F8000CF92DF92EF92FF920F931F93CF93DF9355 250 | :100F9000962EC72E7901FC01EF5EFB4F20812223A4 251 | :100FA00019F03DE3D32E02C02CE3D22E442309F4E2 252 | :100FB0005AC0A12CB12C8C010C5F1B4FEC01CE5EF2 253 | :100FC000DB4F88248394D8016D917C91C7010E94E6 254 | :100FD000471FA616B70610F580927107D0929307A7 255 | :100FE000109272071092940760E470E088819981F2 256 | :100FF0000E94AD0E88819981F80140815181DC0108 257 | :10100000ED91FC910280F381E02D692D7C2D0995F5 258 | :101010000E947717BFEFAB1ABB0AD5CF81E0809350 259 | :101020007107D0929307109272071092940760E4B0 260 | :1010300070E0888199810E94AD0E0990D881C02D01 261 | :10104000F80160817181C7010E94471FE881F98121 262 | :101050000280F381E02DAC01692D7C2DCE01099534 263 | :101060000E94771729C0092D1C2DE00EF11ECC24FB 264 | :10107000C394EC01CE5EDB4FE016F106E9F0C092BE 265 | :101080007107D0929307109272071092940760E054 266 | :1010900070E0888199810E94AD0E88819981D80184 267 | :1010A0006D918D01DC01ED91FC910190F081E02DBD 268 | :1010B00009950E947717E0CF80E090E0DF91CF9113 269 | :1010C0001F910F91FF90EF90DF90CF90BF90AF9066 270 | :1010D0009F908F9008951F920F920FB60F92112438 271 | :1010E0002F933F934F935F936F937F938F939F9330 272 | :1010F000AF93BF93EF93FF9381E592E00E94740357 273 | :10110000FF91EF91BF91AF919F918F917F916F91DF 274 | :101110005F914F913F912F910F900FBE0F901F90B5 275 | :1011200018951F920F920FB60F9211242F938F9341 276 | :101130009F93EF93FF93E0916102F09162028081AF 277 | :10114000E0916702F091680282FD12C09081809167 278 | :101150006A028F5F8F7320916B02821751F0E091CA 279 | :101160006A02F0E0EF5AFD4F958F80936A0201C04A 280 | :101170008081FF91EF919F918F912F910F900FBEE2 281 | :101180000F901F9018951F920F920FB60F92112477 282 | :101190002F933F934F935F936F937F938F939F937F 283 | :1011A000AF93BF93EF93FF938091B900887F803610 284 | :1011B00009F49CC068F5883209F45BC090F4803172 285 | :1011C00009F454C038F4882309F4F6C0883009F4CF 286 | :1011D0004DC0F6C0883109F44CC0803209F45DC0BE 287 | :1011E000EFC0803409F468C048F4803309F455C076 288 | :1011F000883309F0E5C080936E07D8C0803509F4C4 289 | :101200004FC0883509F45DC0883409F0D9C0D6C014 290 | :10121000883909F4C7C0A8F4883709F467C038F4DE 291 | :10122000883609F463C0803709F460C0C9C08838C3 292 | :1012300009F4B8C0803909F45FC0803809F0C0C033 293 | :101240005BC0803B09F486C038F4803A09F466C07C 294 | :10125000883A09F47FC0B4C0803C09F4A7C0883C38 295 | :1012600009F4A4C0883B09F48AC0AAC080914B0746 296 | :1012700010C090916D0780916C07981770F5E09100 297 | :101280006D0781E08E0F80936D07F0E0E45BF84F0F 298 | :1012900080818093BB0085EC86C080936E078EC0F2 299 | :1012A000E0916D0781E08E0F80936D078091BB0008 300 | :1012B000F0E0E45BF84F808390916D0780916C07BC 301 | :1012C0006EC0E0916D0781E08E0F80936D07809175 302 | :1012D000BB00F0E0E45BF84F808380916F078111E1 303 | :1012E0006DC081E080934A0784EA61C083E0809307 304 | :1012F000700710924A02CFCF80914A02803208F0E4 305 | :1013000051C0E0914A0281E08E0F80934A028091A1 306 | :10131000BB00F0E0E65DFD4F8083BDCF85EC8093A0 307 | :10132000BC001092700780914A02803230F4E09144 308 | :101330004A02F0E0E65DFD4F108260914A0270E0E3 309 | :10134000E0914B02F0914C028AE292E009951092F2 310 | :101350004A0236C084E080937007109229021092EE 311 | :101360002802E0914D02F0914E02099580912802E9 312 | :10137000811105C081E08093280210920802E0915B 313 | :10138000290281E08E0F80932902F0E0E85FFD4F93 314 | :1013900080818093BB009091290280912802981748 315 | :1013A00008F479CF85E88093BC000AC085EC80936F 316 | :1013B000BC001092700704C010926E070E940F04C8 317 | :1013C000FF91EF91BF91AF919F918F917F916F911D 318 | :1013D0005F914F913F912F910F900FBE0F901F90F3 319 | :1013E00018958F929F92AF92BF92CF92DF92EF9219 320 | :1013F000FF920F931F93CF93DF936115710509F44B 321 | :1014000091C0EA016B017C01FC0100851185F801A6 322 | :101410002223E9F16481758180E090E00E94901EB2 323 | :10142000F60120813181428153810E94E91D4B01E7 324 | :101430005C0120E030E0A9010E94551E87FF04C036 325 | :101440001982188291E007C0C501B4010E94611E93 326 | :101450007983688390E0F80126813781488159813A 327 | :101460002417350720F43983288381E001C080E008 328 | :10147000F80124813581488159814217530718F4B6 329 | :101480003983288391E0F701268137813CC0608150 330 | :10149000718180E090E00E94901EF60120813181F0 331 | :1014A000428153810E94E91D4B015C0120E030E044 332 | :1014B000A9010E94551E87FF04C01982188291E07D 333 | :1014C00007C0C501B4010E94611E7983688390E062 334 | :1014D000F80122813381488159812417350720F48E 335 | :1014E0003983288381E001C080E0F80120813181C7 336 | :1014F000488159814217530718F43983288391E0B2 337 | :10150000F70124813581488159814217530728F01A 338 | :10151000215031093983288308C0811106C0892FE1 339 | :1015200090E005C083E090E002C082E090E0DF91AF 340 | :10153000CF911F910F91FF90EF90DF90CF90BF90D0 341 | :10154000AF909F908F9008950F931F93CF93DF9349 342 | :10155000FB01EA0137FD0DC0C901B801640F751F19 343 | :10156000811D911D9F0140E050E00E947D1FCB0135 344 | :1015700015C088279927DC01801B910BA20BB30BA8 345 | :101580000E94471FC817D90710F09E0104C0BE0172 346 | :101590006E0F7F1F9B01281B390BC901DF91CF9173 347 | :1015A0001F910F9108952F923F924F925F926F92E9 348 | :1015B0007F928F929F92AF92BF92CF92DF92EF92E3 349 | :1015C000FF920F931F93CF93DF93CDB7DEB768974A 350 | :1015D0000FB6F894DEBF0FBECDBF1C017E876D87AE 351 | :1015E0005E834D83388F2F8B18870F83DA86C986E9 352 | :1015F00089829A82AB82BC82B9A829813A814B81C7 353 | :101600005C81211531054105510509F42FC244279C 354 | :1016100055272F87388B498B5A8B8DA59EA5AFA553 355 | :10162000B8A9BC01CD01882799270E947D1F6B8B2B 356 | :101630007C8B8D8B9E8B2B013C01662477248F89BC 357 | :10164000988D4D855E85841B950BDC011196BC87BA 358 | :10165000AB87D101ED91FC91EE2009F4E7C0008445 359 | :10166000F185E02DA3019201B601C10109952AA9D6 360 | :10167000222309F48AC0BB2009F444C02D813E8195 361 | :101680004F8158854217530708F4F0C1D101ED91FD 362 | :10169000FC91B1E0BF930684F785E02D812C912C5D 363 | :1016A0005401C12CD12C7601C3948C012B853C852F 364 | :1016B0004F8158856F89788DC1010995C301B201A9 365 | :1016C0006F5F7F4F8F4F9F4F2F85388949895A8988 366 | :1016D0000E947D1F2B013C0166247724D101ED91EE 367 | :1016E000FC910084F185E02DA301920169857A8542 368 | :1016F000C10109952F8138852150310938872F8301 369 | :101700000F90BCCF4F815885AD81BE814A175B07D2 370 | :1017100008F4ACC1D101ED91FC911F920684F785CC 371 | :10172000E02D812C912C5401C12CD12C7601C39435 372 | :101730008C012B853C854D815E816D857E85C10147 373 | :101740000995C301B2016F5F7F4F8F4F9F4F2F8568 374 | :10175000388949895A890E947D1F2B013C016624E2 375 | :101760007724D101ED91FC910084F185E02DA30156 376 | :10177000920169857A85C10109952D813E812F5F8E 377 | :101780003F4F3E832D830F90BDCFBB2041F14D8154 378 | :101790005E818F8198858417950708F467C1D10110 379 | :1017A000ED91FC91B1E0BF930684F785E02D5301E4 380 | :1017B0004201C980DA80EB80FC8009851A852B857F 381 | :1017C0003C854F8158856F89788DC10109952F819E 382 | :1017D00038852150310938872F830F90D8CF4F811A 383 | :1017E00058858D819E814817590708F43FC1D10162 384 | :1017F000ED91FC911F920684F785E02D5301420183 385 | :10180000C980DA80EB80FC8009851A852B853C85B0 386 | :101810004D815E816D857E85C10109952D813E8159 387 | :101820002F5F3F4F3E832D830F90D9CF8F819885B7 388 | :101830004D815E81841B950BDC011197B88BAF87BE 389 | :10184000BB2009F486C04F5F5F4F1F920088F1896B 390 | :10185000E02D53014201C980DA80EB80FC800985CC 391 | :101860001A852F8538896D857E85C10109952F855B 392 | :1018700038892901612C712C930182014B895C8983 393 | :1018800069817A81C1010E94A40A9C8B8B8B4C01D7 394 | :10189000A12CB12CD101ED91FC911F920684F7850A 395 | :1018A000E02DC980DA80EB80FC8009851A852B85C4 396 | :1018B0003C854F8158856D857E85C10109954B8595 397 | :1018C0005C858A0120E030E04B895C8969817A81FE 398 | :1018D000C1010E94A40A9E878D874C01A12CB12CC6 399 | :1018E0004F81588541505109D101ED91FC91B1E0F2 400 | :1018F000BF930088F189E02DC980DA80EB80FC80FD 401 | :1019000009851A852F8538896F89788DC1010995D8 402 | :10191000930182014D855E8569817A81C1010E94B2 403 | :10192000A40A4C01A12CB12CD101ED91FC91B1E0A4 404 | :10193000BF930684F785E02DC980DA80EB80FC80B8 405 | :1019400009851A852B853C854D815E816F89788D4F 406 | :1019500087C01F920684F785E02D53014201C9809C 407 | :10196000DA80EB80FC8009851A852B853C854D81CA 408 | :101970005E816D857E85C10109952B853C85290198 409 | :10198000612C712C930182014B895C8969817A8178 410 | :10199000C1010E94A40A9C8B8B8B4C01A12CB12C01 411 | :1019A0004D815E814F5F5F4FD101ED91FC911F92A0 412 | :1019B0000088F189E02DC980DA80EB80FC80098500 413 | :1019C0001A852F8538896F89788DC10109954F85D2 414 | :1019D00058898A0120E030E04B895C8969817A81ED 415 | :1019E000C1010E94A40A9E838D834C01A12CB12CBD 416 | :1019F000D101ED91FC91B1E0BF930684F785E02D14 417 | :101A0000C980DA80EB80FC8009851A852B853C85AE 418 | :101A10004F8158856F89788DC101099593018201A5 419 | :101A20004D815E8169817A81C1010E94A40A4C01C5 420 | :101A3000A12CB12C4F81588541505109D101ED9114 421 | :101A4000FC91B1E0BF930088F189E02DC980DA8074 422 | :101A5000EB80FC8009851A852F8538896D857E8508 423 | :101A6000C10109950F900F900F900F9068960FB6D7 424 | :101A7000F894DEBF0FBECDBFDF91CF911F910F91C4 425 | :101A8000FF90EF90DF90CF90BF90AF909F908F909E 426 | :101A90007F906F905F904F903F902F9008954F925E 427 | :101AA0005F926F927F928F929F92AF92BF92CF92EE 428 | :101AB000DF92EF92FF920F931F93CF93DF9300D0AB 429 | :101AC0001F92CDB7DEB78C013C0129EF621A2BEFD4 430 | :101AD000720AD3018D919C915801B5EFAB1ABBEFFF 431 | :101AE000BB0AF501208131812C015694542C4424E9 432 | :101AF00057944794420E531E6801F7EFCF1AFBEF3D 433 | :101B0000DF0AD601ED90FC90E81AF90AF694FE2C53 434 | :101B1000EE24F794E7944801B3EF8B1ABBEF9B0ACE 435 | :101B2000F401808191810196821B930BE80EF91ECE 436 | :101B3000B70180E090E04AE00E94EF160E94E716AD 437 | :101B4000C8010E944017D4018C91F501908121E2D7 438 | :101B500029839A838B83D801ED91FC910280F381D4 439 | :101B6000E02DC8010995D801ED91FC910190F0811B 440 | :101B7000E02D23E030E040E0BE016F5F7F4FC80101 441 | :101B80000995D801ED91FC910480F581E02DC80103 442 | :101B90000995F6018081D3019C9122E229839770F7 443 | :101BA0009A8387708B83D801ED91FC910280F38139 444 | :101BB000E02DC8010995D801ED91FC910190F081CB 445 | :101BC000E02D23E030E040E0BE016F5F7F4FC801B1 446 | :101BD0000995D801ED91FC910480F581E02DC801B3 447 | :101BE0000995B8016E5F7F4F640D751DD801ED91A9 448 | :101BF000FC910190F081E02D970141E0C801099529 449 | :101C0000F801EA5FFB4F10820F900F900F90DF9169 450 | :101C1000CF911F910F91FF90EF90DF90CF90BF90E9 451 | :101C2000AF909F908F907F906F905F904F900895AE 452 | :101C30008F929F92AF92BF92CF92DF92EF92FF92DC 453 | :101C40000F931F93CF93DF93CDB7DEB762970FB695 454 | :101C5000F894DEBF0FBECDBF6B877C878D879E87D4 455 | :101C60002F87388B498B5A8BA80197016F8578890C 456 | :101C700089899A89882019F00E94E81D02C00E9473 457 | :101C8000E91D69837A838B839C8321E0AE01475FE2 458 | :101C90005F4FBE01615F7F4F8EE097E00E94F109C8 459 | :101CA0007C0121E0AE01495F5F4FBE016F5F7F4F56 460 | :101CB0008EE097E00E94F1098C0120E0AE014B5FBD 461 | :101CC0005F4FBE01655F7F4F8EE097E00E94F10994 462 | :101CD000892B81F581E0E816F10421F4013011052A 463 | :101CE00041F428C082E0E816F10419F4023011052D 464 | :101CF00009F149855A858F8198858417950728F0C1 465 | :101D000001969C01241B350B05C09A012F5F3F4FA4 466 | :101D1000281B390B6D817E818F9245015601C12CA4 467 | :101D2000D12C7601C39400E011E08EE097E00E9490 468 | :101D3000D3170F9062960FB6F894DEBF0FBECDBFDB 469 | :101D4000DF91CF911F910F91FF90EF90DF90CF9097 470 | :101D5000BF90AF909F908F900895DC01ED91FC9122 471 | :101D60000190F081E02D09946F927F928F929F9263 472 | :101D7000AF92BF92CF92DF92EF92FF920F931F9399 473 | :101D8000CF93DF93CDB7DEB72C970FB6F894DEBFB5 474 | :101D90000FBECDBF4C014D835E836F83788709876B 475 | :101DA0001A872B873C87370120E0AE014D5F5F4FDC 476 | :101DB000BE016B5F7F4F0E94F1098C0121E0AE01F3 477 | :101DC0004F5F5F4FBE01675F7F4FC4010E94F10903 478 | :101DD000012B79F5892B69F549815A816B817C81C9 479 | :101DE000D4018D919C911197EF28A1F41896ED9153 480 | :101DF000FC911997A4A4B5A4C6A4D7A4E0A4F1A407 481 | :101E000002A513A526A137A1DC011C96ED91FC913A 482 | :101E10001D970DC0DC011C96ED91FC911D97A12C26 483 | :101E2000B12C6501E12CF12C8701E3949301C401ED 484 | :101E300009952C960FB6F894DEBF0FBECDBFDF918B 485 | :101E4000CF911F910F91FF90EF90DF90CF90BF90B7 486 | :101E5000AF909F908F907F906F9008952F923F92B8 487 | :101E60004F925F926F927F928F929F92AF92BF92AA 488 | :101E7000CF92DF92EF92FF920F931F93CF93DF9356 489 | :101E8000CDB7DEB76A970FB6F894DEBF0FBECDBFF1 490 | :101E90003C0149875A876B877C870D871E872F8770 491 | :101EA000388BC98ADA8AEB8AFC8A8D8A9E8AAF8A45 492 | :101EB000B88E49A85AA82BA9298F2CA92A8F842E1D 493 | :101EC000952E062F172F9601A701B401C8010E9475 494 | :101ED000421F181664F4C601D70189879A87AB8719 495 | :101EE000BC87C401D801898B9A8BAB8BBC8BCD840A 496 | :101EF000DE84EF84F8888D889E88AF88B88CA50131 497 | :101F00009401C701B6010E94421F181644F48D8641 498 | :101F10009E86AF86B88ACD8ADE8AEF8AF88E21E067 499 | :101F2000AE014D5F5F4FBE01635F7F4FC3010E94F3 500 | :101F3000F1094C0121E0AE014F5F5F4FBE016B5EC6 501 | :101F40007F4FC3010E94F1097C0120E0AE01495F8F 502 | :101F50005F4FBE01675F7F4FC3010E94F1098C0193 503 | :101F600020E0AE014B5F5F4FBE016F5E7F4FC3014C 504 | :101F70000E94F109A1E08A16910421F4EA94EF2865 505 | :101F800051F46BC0E2E08E16910429F4F2E0EF16F2 506 | :101F9000F10409F462C00130110519F4019739F414 507 | :101FA0005CC00230110519F4029709F456C009818A 508 | :101FB0001A812D813E814B815C816F817885D301AF 509 | :101FC000ED90FC901197EFA5F8A9EF2B39F5189635 510 | :101FD0000D90BC91A02D98968D909D90AD90BC9049 511 | :101FE0009B979696CD90DC909797FDA9FF938EA92D 512 | :101FF0008F939F968C919F978F939E968C919E978F 513 | :102000008F939D968C919D978F939C968C918F9397 514 | :10201000D7015296ED91FC91539715C0BEA9BF937D 515 | :10202000EDA9EF93FA8DFF93898D8F935F924F9275 516 | :10203000D7015296ED91FC915397812C912C54012C 517 | :102040008394CFA4D8A8EE24E394C30109950F90FC 518 | :102050000F900F900F900F900F906A960FB6F89414 519 | :10206000DEBF0FBECDBFDF91CF911F910F91FF90CB 520 | :10207000EF90DF90CF90BF90AF909F908F907F9028 521 | :102080006F905F904F903F902F9008952F923F92C6 522 | :102090004F925F926F927F928F929F92AF92BF9278 523 | :1020A000CF92DF92EF92FF920F931F93CF93DF9324 524 | :1020B000CDB7DEB7A7970FB6F894DEBF0FBECDBF82 525 | :1020C0001C0149875A876B877C870D871E872F875E 526 | :1020D000388BCD82DE82EF82F886AEA2BFA2C70126 527 | :1020E000B6010E94611E698F20E030E0A9016D8574 528 | :1020F0007E858F8598890E94E91D4B015C01298DA1 529 | :10210000622F70E080E090E00E94921E2B013C0163 530 | :1021100029853A854B855C850E94E91D6A8F7B8FF6 531 | :102120008C8F9D8FEEA0FFA095018401AB01BC01B7 532 | :10213000C1010E94B40E20E030E0A9016D817E81D2 533 | :102140008F8198850E94421F18160CF083C0A3014E 534 | :10215000920169857A858B859C850E94E81D69833B 535 | :102160007A838B839C83EEA0FFA095018401AB0151 536 | :10217000BC01C1010E94B40EA30192016D857E8550 537 | :102180008F8598890E94E81D6E8F7F8F88A399A301 538 | :1021900020E030E0A90169857A858B859C850E94C5 539 | :1021A000E91D4B015C01EEA0FFA00E8D1F8D28A143 540 | :1021B00039A1AB01BC01C1010E94B40EA30192017F 541 | :1021C0006D857E858F8598890E94E91D2B013C01D4 542 | :1021D000EEA0FFA08B019C01B501A401C1010E94EA 543 | :1021E000B40E1F921F921F921F921F921F923FA127 544 | :1021F0003F938EA18F938D849E84AF84B888CA8CC0 545 | :10220000DB8CEC8CFD8C9501840149815A816B81BA 546 | :102210007C81C1010E942E0F1F921F921F921F925C 547 | :102220001F921F929FA19F932EA12F9353014201B2 548 | :10223000C984DA84EB84FC840E8D1F8D28A139A11A 549 | :10224000B701A601C1010E942E0F0FB6F894DEBFA0 550 | :102250000FBECDBF2D813E814F81588560E070E07B 551 | :1022600080E89FE30E94E81D0E945A1E7B8F6A8FC0 552 | :102270001D82998D2D81291708F078C12F5F2D833C 553 | :10228000622F70E08A8D9B8D1816190644F0CB01E1 554 | :10229000880F991F2A8D3B8D820F931F10C0398D97 555 | :1022A0003150398FCB01880F991F2A8D3B8D820FBA 556 | :1022B000931F298D32E0239F8019910911249C01DD 557 | :1022C0002F5F3F4F3B8F2A8F3D81898D831708F405 558 | :1022D0004DC1072E000C880B990B0E94921E69833A 559 | :1022E0007A838B839C839B01AC016D857E858F8572 560 | :1022F00098890E94E91D698B7A8B8B8B9C8B298D29 561 | :10230000622F70E080E090E00E94921E6E8F7F8FBF 562 | :1023100088A399A39B01AC0169857A858B859C85EF 563 | :102320000E94E91D6D8B7E8B8F8B988FEEA0FFA096 564 | :1023300009891A892B893C89AB01BC01C1010E9422 565 | :10234000B40E2E8D3F8D48A159A169857A858B8564 566 | :102350009C850E94E81D6AA37BA38CA39DA3EEA08D 567 | :10236000FFA009891A892B893C89AB01BC01C101F5 568 | :102370000E94B40E29813A814B815C816D857E85F6 569 | :102380008F8598890E94E81D2B013C01EEA0FFA0DB 570 | :102390008B019C014D895E896F89788DC1010E94F6 571 | :1023A000B40EEEA0FFA0930182014AA15BA16CA133 572 | :1023B0007DA1C1010E94B40E1F921F921F921F9215 573 | :1023C0001F921F923FA13F938EA18F9389889A8875 574 | :1023D000AB88BC88CD88DE88EF88F88C95018401B5 575 | :1023E0004AA15BA16CA17DA1C1010E942E0F1F9289 576 | :1023F0001F921F921F921F921F929FA19F932EA127 577 | :102400002F9353014201CD88DE88EF88F88C930129 578 | :1024100082014AA15BA16CA17DA1C1010E942E0F86 579 | :102420000FB6F894DEBF0FBECDBF9D81298D9217E8 580 | :1024300009F41FCF2E8D3F8D48A159A16D857E8552 581 | :102440008F8598890E94E91D698B7A8B8B8B9C8B79 582 | :1024500029813A814B815C8169857A858B859C8550 583 | :102460000E94E91D6D8B7E8B8F8B988FEEA0FFA055 584 | :1024700009891A892B893C89AB01BC01C1010E94E1 585 | :10248000B40E29813A814B815C8169857A858B857F 586 | :102490009C850E94E81D69837A838B839C83EEA0D0 587 | :1024A000FFA009891A892B893C89AB01BC01C101B4 588 | :1024B0000E94B40E2E8D3F8D48A159A16D857E8559 589 | :1024C0008F8598890E94E81D2B013C01EEA0FFA09A 590 | :1024D0008B019C014D895E896F89788DC1010E94B5 591 | :1024E000B40EEEA0FFA09301820149815A816B8155 592 | :1024F0007C81C1010E94B40E1F921F921F921F92F5 593 | :102500001F921F923FA13F938EA18F9389889A8833 594 | :10251000AB88BC88CD88DE88EF88F88C9501840173 595 | :1025200049815A816B817C81C1010E942E0F1F92CB 596 | :102530001F921F921F921F921F929FA19F932EA1E5 597 | :102540002F9353014201CD88DE88EF88F88C9301E8 598 | :10255000820149815A816B817C81C1010E942E0FC9 599 | :102560000FB6F894DEBF0FBECDBF83CEA7960FB6D1 600 | :10257000F894DEBF0FBECDBFDF91CF911F910F91B9 601 | :10258000FF90EF90DF90CF90BF90AF909F908F9093 602 | :102590007F906F905F904F903F902F9008952F9273 603 | :1025A0003F924F925F926F927F928F92AF92BF92C3 604 | :1025B000CF92DF92EF92FF920F931F93CF93DF930F 605 | :1025C000CDB7DEB7A2970FB6F894DEBF0FBECDBF72 606 | :1025D0006D837E838F83988729013A01E982FA828D 607 | :1025E0000B831C83A98ABA8ACB8ADC8AC601B5010F 608 | :1025F0000E94E81D0E94611E69877A878B879C87ED 609 | :102600002D813E814F815885C801B7010E94E81D88 610 | :102610000E945A1E97FF09C090958095709561950C 611 | :102620007F4F8F4F9F4F1FEF01C011E09B01AC0107 612 | :10263000220F331F441F551F2D873E874F87588B0E 613 | :1026400089859A85281B390B4109510929833A83C9 614 | :102650004B835C836D817E818F8198850E94611E92 615 | :102660007E836D83C301B2010E94611E1B018985B7 616 | :102670009A85880F991F9C0140E050E0298F3A8F7E 617 | :102680004B8F5C8F612C712C412F110F550B5AA36E 618 | :1026900049A3B10180E090E00E94901E9B01AC0133 619 | :1026A00069897A898B899C890E94421F18160CF0CF 620 | :1026B0007CC05FEF651A750A89819A81AB81BC8104 621 | :1026C000181619061A061B060CF05BC0930140E0B1 622 | :1026D00050E02D8B3E8B4F8B588FCA01B9010E9461 623 | :1026E000901E6D8F7E8F8F8F98A3B1016F5F7F4F8C 624 | :1026F0006619770980E090E00E94901E2B013C0152 625 | :102700004D815E81BA0180E090E00E94901E812C94 626 | :10271000AEA8BFA8C8ACD9ACED8CFE8C0F8D18A1AB 627 | :10272000A30192010E94180E0D891E892F89388DF0 628 | :102730004EA95FA961E070E08EE097E00E94A40AD4 629 | :102740009C0140E050E02EAB3FAB48AF59AF4D810C 630 | :102750005E8189A19AA1480F591F5E834D8329810B 631 | :102760003A814B815C81898D9A8DAB8DBC8D281B04 632 | :10277000390B4A0B5B0B29833A834B835C83612CB7 633 | :10278000712C29813A814B815C818D859E85AF8535 634 | :10279000B889280F391F4A1F5B1F29833A834B834F 635 | :1027A0005C839FEF291A390A74CFB30180E090E06F 636 | :1027B0000E94901E69837A838B839C83B101661982 637 | :1027C000770980E090E00E94901E2B013C01AD81D2 638 | :1027D000BE81BD0180E090E00E94901E812CAEA8D9 639 | :1027E000BFA8C8ACD9ACE980FA800B811C81A301D9 640 | :1027F00092010E94180E29853A85B90180E090E087 641 | :102800000E94901EA2960FB6F894DEBF0FBECDBFF9 642 | :10281000DF91CF911F910F91FF90EF90DF90CF90BC 643 | :10282000BF90AF908F907F906F905F904F903F9050 644 | :102830002F9008958F929F92AF92BF92CF92DF9286 645 | :10284000EF92FF920F931F93CF93DF93CDB7DEB735 646 | :1028500062970FB6F894DEBF0FBECDBF6B877C8743 647 | :102860008D879E872F87388B498B5A8BA8019701BC 648 | :10287000882019F00E94E81D06C06B857C858D8537 649 | :102880009E850E94E91D69837A838B839C8320E067 650 | :10289000AE01475F5F4FBE01655F7F4F8EE097E0FF 651 | :1028A0000E94F1097C0120E0AE01495F5F4FBE014B 652 | :1028B0006F5F7F4F8EE097E00E94F1098C0121E06D 653 | :1028C000AE014B5F5F4FBE01615F7F4F8EE097E0CF 654 | :1028D0000E94F109892B81F581E0E816F10421F4C9 655 | :1028E0000130110541F428C082E0E816F10419F422 656 | :1028F0000230110509F169857A858F8198858617DF 657 | :10290000970728F001969C01261B370B05C09B01F9 658 | :102910002F5F3F4F281B390B4D815E818F92450100 659 | :102920005601C12CD12C7601C39400E011E08EE059 660 | :1029300097E00E940F160F9062960FB6F894DEBFD4 661 | :102940000FBECDBFDF91CF911F910F91FF90EF9000 662 | :10295000DF90CF90BF90AF909F908F9008953FB73A 663 | :10296000F89480919A0790919B07A0919C07B09151 664 | :102970009D0726B5A89B05C02F3F19F00196A11D04 665 | :10298000B11D3FBFBA2FA92F982F8827820F911D05 666 | :10299000A11DB11DBC01CD0142E0660F771F881F4C 667 | :1029A000991F4A95D1F708952F923F924F925F92C7 668 | :1029B0006F927F928F92AF92BF92CF92DF92EF92FF 669 | :1029C000FF920F931F93CF93DF93CDB7DEB7A297FC 670 | :1029D0000FB6F894DEBF0FBECDBF6D837E838F83AD 671 | :1029E000988729833A834B835C83E98AFA8A0B8B25 672 | :1029F0001C8B9B01AC01C801B7010E94E81D0E941D 673 | :102A0000611E6D877E878F87988B29813A814B81E4 674 | :102A10005C81C601B5010E94E81D0E945A1E97FF05 675 | :102A200009C090958095709561957F4F8F4F9F4F0E 676 | :102A30001FEF01C011E09B01AC01220F331F441FA7 677 | :102A4000551F29873A874B875C8729013A014D85B5 678 | :102A50005E85441A550A6108710869817A818B8103 679 | :102A60009C810E94611E7A8369836D817E818F8142 680 | :102A700098850E94611E1B018D859E85880F991F78 681 | :102A80009C0140E050E02D8B3E8B4F8B588FC12C2A 682 | :102A9000D12C412F110F550B5AA349A3B10180E04E 683 | :102AA00090E00E94901E9B01AC0169897A898B8914 684 | :102AB0009C890E94421F18160CF06CC05FEFC51A6B 685 | :102AC000D50A14141504160417040CF057C0C601D7 686 | :102AD000A0E0B0E08D839E83AF83B887BC01CD01B9 687 | :102AE0000E94901E698F7A8F8B8F9C8FA981BA81EB 688 | :102AF000BD0180E090E00E94901E6D8F7E8F8F8FD1 689 | :102B000098A3B1016F5F7F4F6C197D0980E090E061 690 | :102B10000E94901E812CAEA8BFA8C8ACD9ACE98C8D 691 | :102B2000FA8C0B8D1C8D2D8D3E8D4F8D58A10E94E2 692 | :102B30001A140D811E812F8138854EA95FA961E08D 693 | :102B400070E08EE097E00E94A40A9C0140E050E013 694 | :102B50002EAB3FAB48AF59AF49815A8189A19AA1A9 695 | :102B6000480F591F5A8349832D893E894F89588DB3 696 | :102B7000421A530A640A750AC12CD12C89859A8598 697 | :102B8000AB85BC85480E591E6A1E7B1E9FEF291A15 698 | :102B9000390A84CFB60180E090E00E94901E6987D8 699 | :102BA0007A878B879C87A981BA81BD0180E090E0FC 700 | :102BB0000E94901E2B013C01B1016C197D0980E03F 701 | :102BC00090E00E94901E812CAEA8BFA8C8ACD9ACE2 702 | :102BD000E984FA840B851C85A30192010E941A14D2 703 | :102BE0002D853E85B90180E090E00E94901EA2965E 704 | :102BF0000FB6F894DEBF0FBECDBFDF91CF911F910E 705 | :102C00000F91FF90EF90DF90CF90BF90AF908F909B 706 | :102C10007F906F905F904F903F902F9008952F92EC 707 | :102C20003F924F925F926F927F928F929F92AF925C 708 | :102C3000BF92CF92DF92EF92FF920F931F93CF93A9 709 | :102C4000DF93CDB7DEB72C970FB6F894DEBF0FBE7B 710 | :102C5000CDBF1C013B015C874B8729011A8709877F 711 | :102C6000A7019601442755272D833E834F8358871C 712 | :102C7000C501B401882799270E947D1F9B01AC01E3 713 | :102C80004427552729833A834B835C83D101ED91F7 714 | :102C9000FC910084F185E02DB801C101099529A1BD 715 | :102CA000222309F43FC09301241935092901641432 716 | :102CB000750409F473C0D101ED91FC910484F5858C 717 | :102CC000E02DA12CB12C6501E12CF12C8701E394BE 718 | :102CD0009C014B855C85B301C101099569817A81AD 719 | :102CE0008B819C816F5F7F4F8F4F9F4F2D813E81E6 720 | :102CF0004F8158850E947D1F9B01AC0144275527B9 721 | :102D000029833A834B835C83D101ED91FC9100844C 722 | :102D1000F185E02D69857A85C1010995B1E06B1ACD 723 | :102D20007108C5CF460C571C64147504B9F1D10164 724 | :102D3000ED91FC910484F585E02DA12CB12C650169 725 | :102D4000E12CF12C8701E3949C014B855C85B30158 726 | :102D5000C101099569817A818B819C816F5F7F4F69 727 | :102D60008F4F9F4F2D813E814F8158850E947D1F3F 728 | :102D70009B01AC014427552729833A834B835C830D 729 | :102D8000D101ED91FC910084F185E02D69857A8572 730 | :102D9000C1010995BFEF6B1A7B0AC6CF2C960FB6FF 731 | :102DA000F894DEBF0FBECDBFDF91CF911F910F9181 732 | :102DB000FF90EF90DF90CF90BF90AF909F908F905B 733 | :102DC0007F906F905F904F903F902F90089542E0DA 734 | :102DD00050E067E871E081E592E00C9403038F9284 735 | :102DE0009F92AF92BF920F931F93CF93DF93CDB774 736 | :102DF000DEB7A1970FB6F894DEBF0FBECDBF19A204 737 | :102E0000423008F44AE08E010F5D1F4F842E912C52 738 | :102E1000A12CB12CA50194010E945B1FE62FB901E2 739 | :102E2000CA0101501109EA3014F4E05D01C0E95C07 740 | :102E3000D801EC93232B242B252B61F701151105C9 741 | :102E400071F0F80101900020E9F73197AF01401BC4 742 | :102E5000510BB80181E592E00E94030302C080E0BB 743 | :102E600090E0A1960FB6F894DEBF0FBECDBFDF9104 744 | :102E7000CF911F910F91BF90AF909F908F90089529 745 | :102E8000EF92FF920F931F93CF93DF9300D0CDB7B4 746 | :102E9000DEB78C011A82198280E28983D801ED9114 747 | :102EA000FC910280F381E02DC8010995D801ED91D4 748 | :102EB000FC910190F081E02D22E030E040E0BE0185 749 | :102EC0006F5F7F4FC80109957C01D801ED91FC919E 750 | :102ED0000480F581E02DC8010995C7010F900F907E 751 | :102EE000DF91CF911F910F91FF90EF900895309156 752 | :102EF0009407313208F04BC0809170078111FCCFEC 753 | :102F00009091930722E02093700721E020936F07B0 754 | :102F10002FEF20936E0710926D0730936C07E3E755 755 | :102F2000F7E0ACE4B7E020E0321721F041914D9397 756 | :102F30002F5FFACF10924B0720914B07990F922BDE 757 | :102F400090934B0790914A07913061F410924A0791 758 | :102F500090914B079093BB009091BC0093FDF8CFEC 759 | :102F600095EC01C095EE9093BC0090917007923063 760 | :102F7000E1F390916E079F3F79F080916E07803268 761 | :102F800041F080916E07803331F084E005C081E02C 762 | :102F900003C082E001C083E0109272071092940790 763 | :102FA0001092710708952F923F924F925F926F9205 764 | :102FB0007F928F929F92AF92BF92CF92DF92EF92C9 765 | :102FC000FF920F931F93CF93DF93CDB7DEB72C976C 766 | :102FD0000FB6F894DEBF0FBECDBF1C017C876B8798 767 | :102FE0003A0129011A870987A70196014427552725 768 | :102FF0002D833E834F835887C501B40188279927C5 769 | :103000000E947D1F9B01AC014427552729833A83E9 770 | :103010004B835C83D101ED91FC910084F185E02D1F 771 | :10302000B801C101099529A1222309F43FC09301E8 772 | :103030002419350929016414750409F473C0D101F8 773 | :10304000ED91FC910484F585E02DA12CB12C650156 774 | :10305000E12CF12C8701E3949C01A3016B857C8515 775 | :10306000C101099569817A818B819C816F5F7F4F56 776 | :103070008F4F9F4F2D813E814F8158850E947D1F2C 777 | :103080009B01AC014427552729833A834B835C83FA 778 | :10309000D101ED91FC910084F185E02D69857A855F 779 | :1030A000C1010995B1E06B1A7108C5CF460C571CD8 780 | :1030B00064147504B9F1D101ED91FC910484F58596 781 | :1030C000E02DA12CB12C6501E12CF12C8701E394BA 782 | :1030D0009C01A3016B857C85C101099569817A8179 783 | :1030E0008B819C816F5F7F4F8F4F9F4F2D813E81E2 784 | :1030F0004F8158850E947D1F9B01AC0144275527B5 785 | :1031000029833A834B835C83D101ED91FC91008448 786 | :10311000F185E02D69857A85C1010995BFEF6B1AAC 787 | :103120007B0AC6CF2C960FB6F894DEBF0FBECDBF7C 788 | :10313000DF91CF911F910F91FF90EF90DF90CF9093 789 | :10314000BF90AF909F908F907F906F905F904F90C7 790 | :103150003F902F90089590E0FC01E556FA4F24919E 791 | :10316000FC01E957FA4F3491FC01ED58FA4FE49114 792 | :10317000EE2309F43CC0222339F1233091F038F4D6 793 | :103180002130A9F0223001F584B58F7D12C027309F 794 | :1031900091F02830A1F02430B9F4809180008F7D27 795 | :1031A00003C0809180008F77809380000DC084B52C 796 | :1031B0008F7784BD09C08091B0008F7703C0809164 797 | :1031C000B0008F7D8093B000F0E0EE0FFF1FE75955 798 | :1031D000FA4FA591B4919FB7F894611104C08C91F6 799 | :1031E0003095382302C0EC913E2B3C939FBF08954D 800 | :1031F0008F929F92AF92BF92CF92DF92EF92FF9207 801 | :103200006B017C010E94AF144B015C01C114D1041D 802 | :10321000E104F104F1F00E94AF14DC01CB01881944 803 | :103220009909AA09BB09883E9340A105B10570F32D 804 | :1032300021E0C21AD108E108F10888EE880E83E087 805 | :10324000981EA11CB11CC114D104E104F10419F7AA 806 | :10325000DDCFFF90EF90DF90CF90BF90AF909F9029 807 | :103260008F9008951F920F920FB60F9211242F93F3 808 | :103270003F938F939F93AF93BF93809196079091C5 809 | :103280009707A0919807B09199073091950723E08F 810 | :10329000230F2D3720F40196A11DB11D05C026E88E 811 | :1032A000230F0296A11DB11D2093950780939607C9 812 | :1032B00090939707A0939807B093990780919A07E6 813 | :1032C00090919B07A0919C07B0919D070196A11D2D 814 | :1032D000B11D80939A0790939B07A0939C07B0938E 815 | :1032E0009D07BF91AF919F918F913F912F910F902B 816 | :1032F0000FBE0F901F9018950895DA01C90123E0C1 817 | :10330000B695A795979587952A95D1F7860F971F1C 818 | :1033100008954F925F926F927F928F929F92AF9299 819 | :10332000BF92CF92DF92EF92FF920F931F93CF93B2 820 | :10333000DF93DA014901E114F1040105110509F4F3 821 | :10334000ADC025013601A80197016D018B01EC018B 822 | :10335000C301B20188279927442755270E947D1F62 823 | :103360009B01AC0144275527E881F9810680F7814C 824 | :10337000E02DB401CE010995FC012081AE014E5F24 825 | :103380005F4FC60173E0969587957A95E1F7F7E070 826 | :10339000CF22DD2420FF14C09C013695322F222736 827 | :1033A00037952795200F311FFA01E20FF31F21E017 828 | :1033B00030E001C0220FCA94EAF73081232B13C0FA 829 | :1033C000FC01F695FE2FEE27F795E795E00FF11F2C 830 | :1033D000E40FF51F21E030E001C0220FCA94EAF7A4 831 | :1033E0002095308123232083BE016A5F7B4FFB0140 832 | :1033F000D080AE01495F5B4F9E01275F3B4FDE01EE 833 | :10340000A55FBB4F37965F01FA01DD2039F1C0801F 834 | :10341000D1808C159D0508F46C01FA01D182C0821F 835 | :10342000F901408151814817590708F4AC01F901AD 836 | :10343000518340838D919C9111970817190708F4C7 837 | :10344000C8018D939C93F50180819181801791072C 838 | :1034500008F4C801F501918380830AC091838083B9 839 | :10346000F901918380830D931C93F50111830083EF 840 | :1034700081E0FB018083CE01DF91CF911F910F91FD 841 | :10348000FF90EF90DF90CF90BF90AF909F908F9084 842 | :103490007F906F905F904F900C944F0DDF91CF9184 843 | :1034A0001F910F91FF90EF90DF90CF90BF90AF9062 844 | :1034B0009F908F907F906F905F904F900895AF9204 845 | :1034C000BF92CF92DF92EF92FF920F931F93DC0196 846 | :1034D000ED91FC9172970190F081E02D8E0F9F1F6E 847 | :1034E0000E9489191F910F91FF90EF90DF90CF906C 848 | :1034F000BF90AF900895CF93DF9300D01F92CDB7C8 849 | :10350000DEB7789484B5826084BD84B5816084BD63 850 | :1035100085B5826085BD85B5816085BD80916E0071 851 | :10352000816080936E0010928100809181008260A2 852 | :1035300080938100809181008160809381008091DF 853 | :1035400080008160809380008091B10084608093CE 854 | :10355000B1008091B00081608093B00080917A00CA 855 | :10356000846080937A0080917A00826080937A00F0 856 | :1035700080917A00816080937A0080917A008068DF 857 | :1035800080937A001092C100E0916102F091620292 858 | :1035900082E08083E0915D02F0915E021082E09112 859 | :1035A0005F02F09160028FEC808310926902E091DB 860 | :1035B0006502F091660286E08083E0916302F091FB 861 | :1035C0006402808180618083E0916302F0916402F3 862 | :1035D000808188608083E0916302F0916402808141 863 | :1035E00080688083E0916302F091640280818F7D26 864 | :1035F00080834AE060E270E080E090E00E94EF1695 865 | :103600000E94E7164AE061E070E080E090E00E94EE 866 | :10361000EF160E94E7168FEF80930A078EEE92E076 867 | :1036200090930D0780930C0710920B071092500295 868 | :1036300010924F0210927207109294071092700726 869 | :1036400081E080936F0710924A0761E082E10E9457 870 | :10365000AB1861E083E10E94AB188091B9008E7FC6 871 | :103660008093B9008091B9008D7F8093B90088E480 872 | :103670008093B80085E48093BC0081E494E090934B 873 | :103680004E0280934D0282E494E090934C0280932A 874 | :103690004B0264E170E080E090E00E94F81860E086 875 | :1036A000809109070E94AB1865E070E080E090E02F 876 | :1036B0000E94F81861E0809109070E94AB1868EC3D 877 | :1036C00070E080E090E00E94F8188DEF898312E1AD 878 | :1036D0001A8322E030E040E0CE0101963C01BC01BB 879 | :1036E0008AEF92E00E94BC078EEA898321E030E0F5 880 | :1036F00040E0B3018AEF92E00E94BC0785ED898328 881 | :1037000080EA8A8322E030E040E0B3018AEF92E071 882 | :103710000E94BC0788EA89838FE38A8322E030E035 883 | :1037200040E0B3018AEF92E00E94BC071A8219823E 884 | :1037300083ED898322E030E040E0B3018AEF92E03C 885 | :103740000E94BC0780E4898321E030E040E0B301BF 886 | :103750008AEF92E00E94BC078AEF92E00E94401735 887 | :1037600081EA898321E030E040E0B3018AEF92E012 888 | :103770000E94BC0788EC898321E030E040E0B3017F 889 | :103780008AEF92E00E94BC078AED89831A8322E0C7 890 | :1037900030E040E0B3018AEF92E00E94BC0781E88C 891 | :1037A00089838FE88A8322E030E040E0B3018AEF2A 892 | :1037B00092E00E94BC0789ED898385E28A8322E03A 893 | :1037C00030E040E0B3018AEF92E00E94BC078BED4D 894 | :1037D000898384E38A8322E030E040E0B3018AEF0A 895 | :1037E00092E00E94BC0784EA898321E030E040E057 896 | :1037F000B3018AEF92E00E94BC0786EA898321E048 897 | :1038000030E040E0B3018AEF92E00E94BC0780E024 898 | :1038100094E0ECEFF2E0DF019C011D92215030407A 899 | :10382000E1F78091000710920207109201078823A8 900 | :10383000C9F080910307909104078730910510F437 901 | :1038400087E090E0909304078093030710920607A7 902 | :103850001092050780910707909108078F3791050F 903 | :1038600068F40AC087E090E0909304078093030710 904 | :1038700010920607109205078FE790E090930807D3 905 | :103880008093070781E0809300078AEF92E00E940F 906 | :103890004F0D8FEA898321E030E040E0B3018AEFE9 907 | :1038A00092E00E94BC078CE08093B80055245A94A3 908 | :1038B0005B821F92812C912C5401C12CD12C76015A 909 | :1038C000C3948E010D5F1F4F21E030E04FE350E0C5 910 | :1038D00060E070E08EE097E00E940F161F921F924A 911 | :1038E0001F921F92A12CB12C90EAC92E91E4D92EDF 912 | :1038F000E12CF12C0FEA13E420E030E040E251E447 913 | :10390000CA01B9010E94D4145982E091FA02F091DF 914 | :10391000FB023697808191811F921F921F921F9206 915 | :103920001F921F927F926F92812C912C38E1A32ECF 916 | :1039300032E4B32EC12CD12C44E3E42E42E4F42E25 917 | :1039400000E010E020E731E4B901A80186509D4F66 918 | :103950000E942E0F1982E091FA02F091FB02369735 919 | :10396000808191811F921F921F921F921F921F921E 920 | :103970007F926F92812C912C54E0A52E52E4B52EAB 921 | :10398000C12CD12C60E2E62E62E4F62E00E010E0BD 922 | :1039900020EA31E4B901A80186509D4F0E942E0F04 923 | :1039A0005982E091FA02F091FB0236978081918171 924 | :1039B000DC01A650BD4F4D01ED91FC9111970084A3 925 | :1039C000F185E02D20E030E0A901B301CD0109959A 926 | :1039D0005C01C12CD12C70EEE72E71E4F72E00E0D3 927 | :1039E00010E020E032E440E050E068EC72E4C40112 928 | :1039F0000E9446101982E091FA02F091FB0236977C 929 | :103A0000808191819C0126503D4F4901D901ED9162 930 | :103A1000FC910084F185E02D20E030E0A901B301A4 931 | :103A2000C40109955C01C12CD12CE8E8EE2EE1E43B 932 | :103A3000FE2E00E010E020EE31E440E050E060EBCC 933 | :103A400072E4C4010E9446100FB6F894DEBF0FBEA8 934 | :103A5000CDBF99249A949982E091FA02F091FB02E9 935 | :103A6000369780819181730100E010E020E030E41E 936 | :103A700040E050E06CEF72E486509D4F0E94B40E1F 937 | :103A800068EE73E080E090E00E94F8181982E091FF 938 | :103A9000FA02F091FB0236978081918100E010E0FC 939 | :103AA00020E030E440E050E06CEF72E486509D4F3F 940 | :103AB0000E94B40E68EE73E080E090E00E94F81877 941 | :103AC0000E940504C8CFCF93DF93E1E5F2E01382B3 942 | :103AD000128288EE93E0A0E0B0E084839583A68311 943 | :103AE000B78325E031E03183208325EC30E0358752 944 | :103AF000248724EC30E03787268720EC30E0318BB8 945 | :103B0000208B21EC30E0338B228B22EC30E0358BA4 946 | :103B1000248B26EC30E0378B268B118E128E138E81 947 | :103B2000148EEEEEF2E01382128284839583A683D4 948 | :103B3000B78387E191E091838083109211071092FF 949 | :103B40001007CEE0D7E089E291E09983888380E88E 950 | :103B500090E0909313078093120780E490E0909395 951 | :103B600015078093140788E197E0909317078093D7 952 | :103B70001607BC01CE010E94CB0482E090E0909336 953 | :103B8000FD068093FC061092000710920207109227 954 | :103B90000107109204071092030710920607109273 955 | :103BA0000507109208071092070780E190E09093B4 956 | :103BB000FF068093FE0687E491E09093FB028093DA 957 | :103BC000FA028FE691E099838883DF91CF9108957F 958 | :103BD0005058BB27AA270E94001E0C94081F0E9461 959 | :103BE000FA1E38F00E94011F20F039F49F3F19F4AB 960 | :103BF00026F40C94F71E0EF4E095E7FB0C94F11EEE 961 | :103C0000E92F0E94191F58F3BA1762077307840738 962 | :103C1000950720F079F4A6F50C943B1F0EF4E0957F 963 | :103C20000B2EBA2FA02D0B01B90190010C01CA0176 964 | :103C3000A0011124FF27591B99F0593F50F4503E21 965 | :103C400068F11A16F040A22F232F342F4427585F13 966 | :103C5000F3CF469537952795A795F0405395C9F72B 967 | :103C60007EF41F16BA0B620B730B840BBAF09150E3 968 | :103C7000A1F0FF0FBB1F661F771F881FC2F70EC082 969 | :103C8000BA0F621F731F841F48F487957795679555 970 | :103C9000B795F7959E3F08F0B0CF9395880F08F041 971 | :103CA0009927EE0F9795879508950E94CD1E08F4E9 972 | :103CB00081E008950E94611E6894B1110C943C1F2C 973 | :103CC00008950E94211F88F09F5798F0B92F9927D7 974 | :103CD000B751B0F0E1F0660F771F881F991F1AF0F7 975 | :103CE000BA95C9F714C0B13091F00E943B1FB1E002 976 | :103CF00008950C943B1F672F782F8827B85F39F001 977 | :103D0000B93FCCF3869577956795B395D9F73EF48F 978 | :103D100090958095709561957F4F8F4F9F4F089537 979 | :103D2000E89409C097FB3EF4909580957095619555 980 | :103D30007F4F8F4F9F4F9923A9F0F92F96E9BB270B 981 | :103D40009395F695879577956795B795F111F8CF87 982 | :103D5000FAF4BB0F11F460FF1BC06F5F7F4F8F4FF2 983 | :103D60009F4F16C0882311F096E911C0772321F0E8 984 | :103D70009EE8872F762F05C0662371F096E8862F80 985 | :103D800070E060E02AF09A95660F771F881FDAF7D7 986 | :103D9000880F9695879597F90895990F0008550F04 987 | :103DA000AA0BE0E8FEEF16161706E807F907C0F0C1 988 | :103DB00012161306E407F50798F0621B730B840BC9 989 | :103DC000950B39F40A2661F0232B242B252B21F4A3 990 | :103DD00008950A2609F4A140A6958FEF811D811D43 991 | :103DE000089597F99F6780E870E060E008959FEF7D 992 | :103DF00080EC089500240A94161617061806090682 993 | :103E0000089500240A941216130614060506089550 994 | :103E1000092E0394000C11F4882352F0BB0F40F4D8 995 | :103E2000BF2B11F460FF04C06F5F7F4F8F4F9F4F18 996 | :103E3000089557FD9058440F551F59F05F3F71F09A 997 | :103E40004795880F97FB991F61F09F3F79F0879501 998 | :103E50000895121613061406551FF2CF4695F1DF8A 999 | :103E600008C0161617061806991FF1CF869571051A 1000 | :103E7000610508940895E894BB2766277727CB014E 1001 | :103E800097F908950E94CD1E08F48FEF0895AA1B9C 1002 | :103E9000BB1B51E107C0AA1FBB1FA617B70710F035 1003 | :103EA000A61BB70B881F991F5A95A9F78095909567 1004 | :103EB000BC01CD010895A1E21A2EAA1BBB1BFD0176 1005 | :103EC0000DC0AA1FBB1FEE1FFF1FA217B307E407F9 1006 | :103ED000F50720F0A21BB30BE40BF50B661F771F51 1007 | :103EE000881F991F1A9469F7609570958095909531 1008 | :103EF0009B01AC01BD01CF010895052E97FB1EF477 1009 | :103F000000940E94941F57FD07D00E945B1F07FC7E 1010 | :103F100003D04EF40C94941F509540953095219504 1011 | :103F20003F4F4F4F5F4F08959095809570956195E5 1012 | :103F30007F4F8F4F9F4F0895EE0FFF1F0590F49115 1013 | :103F4000E02D099481E090E0F8940C94A71FF89478 1014 | :023F5000FFCFA1 1015 | :103F52000100000000960303032D03E3035E033C0C 1016 | :103F6200035003000000009C046F048306430467AF 1017 | :103F720004530444040000000088060303830682FD 1018 | :103F8200068606CB04860697077207D30A9F05109A 1019 | :103F920005140400000000BC07810681067D198912 1020 | :103FA200197C1900000000000000000000ECFBEC8E 1021 | :103FB200FBECFB0000000000000000ECFB000088AE 1022 | :103FC200060303830682067D197C195F1A9707721E 1023 | :0A3FD20007D30A9F0510050D0A0031 1024 | :00000001FF 1025 | -------------------------------------------------------------------------------- /examples/Example999_Testing/Example999_Testing.ino.with_bootloader.standard.hex: -------------------------------------------------------------------------------- 1 | :100000000C94D9020C9401030C9401030C94010389 2 | :100010000C9401030C9401030C9401030C94010350 3 | :100020000C9401030C9401030C9401030C94010340 4 | :100030000C9401030C9401030C9401030C94010330 5 | :100040000C9432190C9401030C9491080C946B08D5 6 | :100050000C9401030C9401030C9401030C94010310 7 | :100060000C94C3080C940103050800FF0C4B00001E 8 | :100070000000003E5B4F5B3E3E6B4F6B3E1C3E7C88 9 | :100080003E1C183C7E3C181C577D571C1C5E7F5E36 10 | :100090001C00183C1800FFE7C3E7FF0018241800F5 11 | :1000A000FFE7DBE7FF30483A060E2629792926408C 12 | :1000B0007F050507407F05253F5A3CE73C5A7F3EB8 13 | :1000C0001C1C08081C1C3E7F14227F22145F5F004A 14 | :1000D0005F5F06097F017F006689956A60606060E6 15 | :1000E0006094A2FFA29408047E040810207E2010D1 16 | :1000F00008082A1C08081C2A08081E101010100CDA 17 | :100100001E0C1E0C30383E3830060E3E0E06000027 18 | :1001100000000000005F00000007000700147F14CB 19 | :100120007F14242A7F2A122313086462364956203A 20 | :10013000500008070300001C2241000041221C005F 21 | :100140002A1C7F1C2A08083E08080080703000081E 22 | :1001500008080808000060600020100804023E51F2 23 | :1001600049453E00427F4000724949494621414984 24 | :100170004D331814127F1027454545393C4A4949EB 25 | :100180003141211109073649494936464949291E55 26 | :100190000000140000004034000000081422411444 27 | :1001A00014141414004122140802015909063E4196 28 | :1001B0005D594E7C1211127C7F494949363E4141BE 29 | :1001C00041227F4141413E7F494949417F09090917 30 | :1001D000013E414151737F0808087F00417F410083 31 | :1001E0002040413F017F081422417F404040407F32 32 | :1001F000021C027F7F0408107F3E4141413E7F097F 33 | :100200000909063E4151215E7F09192946264949BF 34 | :10021000493203017F01033F4040403F1F204020FF 35 | :100220001F3F4038403F63140814630304780403FD 36 | :100230006159494D43007F414141020408102000AB 37 | :100240004141417F0402010204404040404000031C 38 | :1002500007080020545478407F28444438384444E8 39 | :100260004428384444287F385454541800087E09E0 40 | :100270000218A4A49C787F0804047800447D400000 41 | :100280002040403D007F1028440000417F40007C1A 42 | :10029000047804787C080404783844444438FC1812 43 | :1002A00024241818242418FC7C08040408485454F6 44 | :1002B000542404043F44243C4040207C1C20402023 45 | :1002C0001C3C4030403C44281028444C9090907C8A 46 | :1002D0004464544C4400083641000000770000009C 47 | :1002E0004136080002010204023C2623263C1EA1DE 48 | :1002F000A161123A4040207A38545455592155553D 49 | :1003000079412154547841215554784020545579ED 50 | :10031000400C1E527212395555555939545454597E 51 | :1003200039555454580000457C410002457D420037 52 | :1003300001457C40F0292429F0F0282528F07C5440 53 | :100340005545002054547C547C0A097F4932494960 54 | :1003500049323248484832324A4848303A414121CD 55 | :100360007A3A42402078009DA0A07D394444443927 56 | :100370003D4040403D3C24FF2424487E4943662BB9 57 | :100380002FFC2F2BFF0929F620C0887E090320545B 58 | :100390005479410000447D413048484A3238404059 59 | :1003A000227A007A0A0A727D0D19317D2629292FB9 60 | :1003B00028262929292630484D40203808080808D1 61 | :1003C00008080808382F10C8ACBA2F102834FA00D3 62 | :1003D000007B000008142A142222142A1408AA0000 63 | :1003E0005500AAAA55AA55AA000000FF0010101037 64 | :1003F000FF00141414FF001010FF00FF1010F01085 65 | :10040000F0141414FC001414F700FF0000FF00FFA8 66 | :100410001414F404FC141417101F10101F101F14D0 67 | :1004200014141F00101010F0000000001F10101016 68 | :10043000101F10101010F010000000FF101010100E 69 | :100440001010101010FF10000000FF140000FF003B 70 | :10045000FF00001F10170000FC04F41414171017FD 71 | :100460001414F404F40000FF00F71414141414140A 72 | :1004700014F700F7141414171410101F101F14147D 73 | :1004800014F4141010F010F000001F101F000000F2 74 | :100490001F14000000FC140000F010F01010FF10FA 75 | :1004A000FF141414FF141010101F00000000F010AF 76 | :1004B000FFFFFFFFFFF0F0F0F0F0FFFFFF00000094 77 | :1004C0000000FFFF0F0F0F0F0F38444438447C2A01 78 | :1004D0002A3E147E02020606027E027E026355490F 79 | :1004E00041633844443C04407E201E2006027E02C4 80 | :1004F0000299A5E7A5991C2A492A1C4C7201724C45 81 | :10050000304A4D4D303048784830BC625A463D3E06 82 | :10051000494949007E0101017E2A2A2A2A2A4444A7 83 | :100520005F444440514A444040444A51400000FF27 84 | :100530000103E080FF000008086B6B0836123624C8 85 | :1005400036060F090F0600001818000000101000F2 86 | :100550003040FF0101001F01011E00191D1712008C 87 | :100560003C3C3C3C0000000000000000002500284E 88 | :10057000002B000404040404040404020202020226 89 | :100580000203030303030301020408102040800157 90 | :1005900002040810200102040810200000000800D6 91 | :1005A000020100000304070000000000000000003A 92 | :1005B000631D11241FBECFEFD8E0DEBFCDBF11E019 93 | :1005C000A0E0B1E0E2E5FFE302C005900D92AA3899 94 | :1005D000B107D9F727E0AAE8B1E001C01D92AE3912 95 | :1005E000B207E1F712E0C9EDD2E004C02197FE01A5 96 | :1005F0000E949C1FC83DD107C9F70E947B1A0C942A 97 | :10060000A71F0C940000CF92DF92EF92FF920F93FE 98 | :100610001F93CF93DF936C017A018B01C0E0D0E090 99 | :10062000CE15DF0581F0D8016D918D01D601ED91D8 100 | :10063000FC910190F081E02DC6010995892B11F004 101 | :100640002196EECF7E01C701DF91CF911F910F91CF 102 | :10065000FF90EF90DF90CF900895FC01538D448D73 103 | :10066000252F30E0842F90E0821B930B541710F05D 104 | :10067000CF96089501970895FC01918D828D98176A 105 | :1006800061F0828DDF01A80FB11D5D968C91928D76 106 | :100690009F5F9F73928F90E008958FEF9FEF089573 107 | :1006A000FC01918D828D981731F0828DE80FF11D3C 108 | :1006B000858D90E008958FEF9FEF0895FC01918D57 109 | :1006C000228D892F90E0805C9F4F821B91098F7350 110 | :1006D0009927089581E592E00E945E0321E0892B2D 111 | :1006E00009F420E0822F0895FC01848DDF01A80F1A 112 | :1006F000B11DA35ABF4F2C91848D90E001968F734A 113 | :100700009927848FA689B7892C93A089B1898C9168 114 | :10071000837080648C93938D848D981306C00288B7 115 | :10072000F389E02D80818F7D80830895EF92FF9281 116 | :100730000F931F93CF93DF93EC0181E0888F9B8D04 117 | :100740008C8D981305C0E889F989808185FD26C0C4 118 | :10075000F62E0B8D10E00F5F1F4F0F731127E02E49 119 | :100760008C8DE8120CC00FB607FCFACFE889F98926 120 | :10077000808185FFF5CFCE010E947403F1CF8B8D70 121 | :10078000FE01E80FF11DE35AFF4FF0829FB7F89486 122 | :100790000B8FEA89FB89808180620AC09FB7F89439 123 | :1007A000EE89FF896083E889F9898081837080649C 124 | :1007B00080839FBF81E090E0DF91CF911F910F91E7 125 | :1007C000FF90EF900895CF93DF93EC01888D8823FD 126 | :1007D000C9F0EA89FB89808185FD05C0A889B989AE 127 | :1007E0008C9186FD0FC00FB607FCF5CF808185FF89 128 | :1007F000F2CFA889B9898C9185FFEDCFCE010E94F7 129 | :100800007403E7CFDF91CF91089580E090E0892BCA 130 | :1008100029F00E946A0381110C940000089585ED6F 131 | :100820008093BC008091BC0084FDFCCF10927007C7 132 | :10083000089540912802262F30E0240F311D2132E7 133 | :100840003105DCF4209170072430C9F4FC0180E00C 134 | :1008500090E0861758F4309128022191DC01A85FBE 135 | :10086000BD4FA30FB11D2C930196F3CF80912802A9 136 | :10087000680F6093280280E0089581E0089582E087 137 | :100880000895089508950895E091500280914F02CF 138 | :10089000E81730F4F0E0E851FE4F808190E00895D1 139 | :1008A0008FEF9FEF08959091500280914F0298171B 140 | :1008B00050F4E92FF0E0E851FE4F208130E09F5FD7 141 | :1008C0009093500202C02FEF3FEFC901089580912D 142 | :1008D0004F0290E020915002821B91090895CF921F 143 | :1008E000DF92EF92FF920F931F93CF93DF937C01E0 144 | :1008F000CB018A0120917107222389F0EB016B0162 145 | :10090000C40ED51ECC15DD0569F06991D701ED91B6 146 | :10091000FC910190F081E02DC7010995F3CF642F80 147 | :100920000E941904C801DF91CF911F910F91FF9090 148 | :10093000EF90DF90CF900895CF93DF931F92CDB7C4 149 | :10094000DEB76983209171072223D1F020919407AB 150 | :10095000203240F021E030E0FC013383228380E04C 151 | :1009600090E015C080917207E82FF0E0ED58F84F45 152 | :10097000998190838F5F809372078093940705C05D 153 | :1009800061E0CE0101960E94190481E090E00F9091 154 | :10099000DF91CF910895DC01FB0111821082158255 155 | :1009A000148214968D919C91159793838283169649 156 | :1009B0008D919C9117979783868310861186128656 157 | :1009C00013861486158616861786108A118A128A4F 158 | :1009D000138A148A158A168A178A118E108E138E1E 159 | :1009E000128E158E148E168E178E10A211A212A2C0 160 | :1009F00013A214A215A211AA10AA1896ED91FC91A7 161 | :100A0000199717A216A281E090E0A0E0B0E080A7BD 162 | :100A100091A7A2A7B3A714A615A616A617A6089570 163 | :100A2000CF92DF92EF92FF920F931F93CF93DF93BA 164 | :100A3000DA0111961C921E9280EC91E013969C9321 165 | :100A40008E93129788E991E015969C938E93149754 166 | :100A500085E016968C93169788E017968C931797D7 167 | :100A60006D3011F06A3029F481E01D968C931D974A 168 | :100A700003C01D961C921D9780EE860F8F3508F0DF 169 | :100A800053C081E01C968C931C9705E0609FB001D9 170 | :100A9000112418961D921D921D921C921B9780E0A6 171 | :100AA00090E040E050E06A5F7F4F182FFB01E80FB5 172 | :100AB000F91FE859FF4FE49120E030E0F0E0EF014A 173 | :100AC000022E02C0D595C7950A94E2F7C0FF21C057 174 | :100AD0001896CD90DD90ED90FC901B97CFEFCC1A3F 175 | :100AE000DC0AEC0AFC0A1896CD92DD92ED92FC929B 176 | :100AF0001B971296CD91DC911397C40FD51F1883C5 177 | :100B00001496CD91DC911597C40FD51F28834F5FA4 178 | :100B10005F4F2F5F3F4F2830310589F601968530B2 179 | :100B2000910509F0C2CF02C01C961C92DF91CF91B3 180 | :100B30001F910F91FF90EF90DF90CF9008952F922B 181 | :100B40003F924F925F926F927F928F929F92AF925D 182 | :100B5000BF92CF92DF92EF92FF920F931F93CF93AA 183 | :100B6000DF93CDB7DEB760970FB6F894DEBF0FBE48 184 | :100B7000CDBF3C017A8369835C834B833C872B87A1 185 | :100B80001E870D87F88AEF86212C312C2101D60192 186 | :100B9000C501AA27BB278F839887A987BA87882092 187 | :100BA00009F452C0AB81BC812D853E852A173B07D5 188 | :100BB00008F48EC089809A808B859C85881599055C 189 | :100BC000B0F1D301ED91FC910084F185E02DA201FB 190 | :100BD00091016F857889C30109959E838D83C20138 191 | :100BE000B1016F5F7F4F8F4F9F4F2F8138854985B0 192 | :100BF0005A850E947D1F1B012C0144245524D301DA 193 | :100C0000ED91FC910484F585E02DA12CB12C6501BA 194 | :100C1000E12CF12C8701E3942D813E814B815C8195 195 | :100C2000B401C3010995BFEF8B1A9B0AC5CF2B8175 196 | :100C30003C812F5F3F4F3C832B83B4CF29813A8186 197 | :100C40002F5F3F4F3A83298389819A81AB85BC8589 198 | :100C5000A817B907E8F18B809C802D853E85281563 199 | :100C6000390560F3D301ED91FC910084F185E02D0D 200 | :100C7000A20191016F857889C30109959E838D83B7 201 | :100C8000C201B1016F5F7F4F8F4F9F4F2F8138851A 202 | :100C900049855A850E947D1F1B012C01442455243F 203 | :100CA000D301ED91FC910484F585E02DA12CB12CAC 204 | :100CB0006501E12CF12C8701E3942D813E81A40193 205 | :100CC00069817A81C3010995BFEF8B1A9B0AC5CF51 206 | :100CD00060960FB6F894DEBF0FBECDBFDF91CF9107 207 | :100CE0001F910F91FF90EF90DF90CF90BF90AF904A 208 | :100CF0009F908F907F906F905F904F903F902F903C 209 | :100D000008950895089580E090E008950E94A21F3C 210 | :100D10004F925F926F927F928F929F92AF92BF920B 211 | :100D2000CF92DF92EF92FF920F931F93CF93DF93B7 212 | :100D30006C01DC01ED91FC910688F789E02D4AE811 213 | :100D400051E00995F601C085D1856A817B81888152 214 | :100D50009981681B790B80919001681B710980E073 215 | :100D600090E00E94901E288539854A855B850E9407 216 | :100D7000551E87FF2FC0009191018C849D84AE8405 217 | :100D8000BF846E817F818C819D81681B790B10E00F 218 | :100D9000601B710B80E090E00E94901EA501940101 219 | :100DA0000E94551E87FD8BC088899989AA89BB89B5 220 | :100DB00088879987AA87BB87B801110F880B990B81 221 | :100DC0000E94921EA50194010E94E91D6C877D87F7 222 | :100DD0008E879F8780919601882309F462C0812CB9 223 | :100DE000912C54018091920190919301A0919401D2 224 | :100DF000B0919501F601C085D18588169906AA069D 225 | :100E0000BB06A8F5E0918E01F0918F01E80DF91D68 226 | :100E1000608170E080E090E00E94921E2C853D850C 227 | :100E20004E855F850E94E91D2B013C01E0918C01FC 228 | :100E3000F0918D01E80DF91D608170E080E090E097 229 | :100E40000E94921E288539854A855B850E94E91D8E 230 | :100E5000AB01BC01E12CF12C93018201C6010E947F 231 | :100E6000B40EFFEF8F1A9F0AAF0ABF0ABBCF609183 232 | :100E7000900170E06F5F7F4F072E000C880B990B7D 233 | :100E80000E94921E9B01AC01688579858A859B85AD 234 | :100E90000E94E91D688779878A879B8781E090E0B7 235 | :100EA00002C080E090E0F601A085B1852EE0EAE87E 236 | :100EB000F1E0589601900D922A95E1F702C080E08A 237 | :100EC00090E0DF91CF911F910F91FF90EF90DF9015 238 | :100ED000CF90BF90AF909F908F907F906F905F90DA 239 | :100EE0004F9008958F929F92AF92BF92CF92DF92D0 240 | :100EF000EF92FF920F931F93CF93DF93CDB7DEB79F 241 | :100F0000C114D104E104F10429F0EF85EF930E94AC 242 | :100F1000D3170F90DF91CF911F910F91FF90EF901A 243 | :100F2000DF90CF90BF90AF909F908F9008958F9259 244 | :100F30009F92AF92BF92CF92DF92EF92FF920F9368 245 | :100F40001F93CF93DF93CDB7DEB7C114D104E10473 246 | :100F5000F10429F0EF85EF930E940F160F90DF91B7 247 | :100F6000CF911F910F91FF90EF90DF90CF90BF90A6 248 | :100F7000AF909F908F9008958F929F92AF92BF9263 249 | :100F8000CF92DF92EF92FF920F931F93CF93DF9355 250 | :100F9000962EC72E7901FC01EF5EFB4F20812223A4 251 | :100FA00019F03DE3D32E02C02CE3D22E442309F4E2 252 | :100FB0005AC0A12CB12C8C010C5F1B4FEC01CE5EF2 253 | :100FC000DB4F88248394D8016D917C91C7010E94E6 254 | :100FD000471FA616B70610F580927107D0929307A7 255 | :100FE000109272071092940760E470E088819981F2 256 | :100FF0000E94AD0E88819981F80140815181DC0108 257 | :10100000ED91FC910280F381E02D692D7C2D0995F5 258 | :101010000E947717BFEFAB1ABB0AD5CF81E0809350 259 | :101020007107D0929307109272071092940760E4B0 260 | :1010300070E0888199810E94AD0E0990D881C02D01 261 | :10104000F80160817181C7010E94471FE881F98121 262 | :101050000280F381E02DAC01692D7C2DCE01099534 263 | :101060000E94771729C0092D1C2DE00EF11ECC24FB 264 | :10107000C394EC01CE5EDB4FE016F106E9F0C092BE 265 | :101080007107D0929307109272071092940760E054 266 | :1010900070E0888199810E94AD0E88819981D80184 267 | :1010A0006D918D01DC01ED91FC910190F081E02DBD 268 | :1010B00009950E947717E0CF80E090E0DF91CF9113 269 | :1010C0001F910F91FF90EF90DF90CF90BF90AF9066 270 | :1010D0009F908F9008951F920F920FB60F92112438 271 | :1010E0002F933F934F935F936F937F938F939F9330 272 | :1010F000AF93BF93EF93FF9381E592E00E94740357 273 | :10110000FF91EF91BF91AF919F918F917F916F91DF 274 | :101110005F914F913F912F910F900FBE0F901F90B5 275 | :1011200018951F920F920FB60F9211242F938F9341 276 | :101130009F93EF93FF93E0916102F09162028081AF 277 | :10114000E0916702F091680282FD12C09081809167 278 | :101150006A028F5F8F7320916B02821751F0E091CA 279 | :101160006A02F0E0EF5AFD4F958F80936A0201C04A 280 | :101170008081FF91EF919F918F912F910F900FBEE2 281 | :101180000F901F9018951F920F920FB60F92112477 282 | :101190002F933F934F935F936F937F938F939F937F 283 | :1011A000AF93BF93EF93FF938091B900887F803610 284 | :1011B00009F49CC068F5883209F45BC090F4803172 285 | :1011C00009F454C038F4882309F4F6C0883009F4CF 286 | :1011D0004DC0F6C0883109F44CC0803209F45DC0BE 287 | :1011E000EFC0803409F468C048F4803309F455C076 288 | :1011F000883309F0E5C080936E07D8C0803509F4C4 289 | :101200004FC0883509F45DC0883409F0D9C0D6C014 290 | :10121000883909F4C7C0A8F4883709F467C038F4DE 291 | :10122000883609F463C0803709F460C0C9C08838C3 292 | :1012300009F4B8C0803909F45FC0803809F0C0C033 293 | :101240005BC0803B09F486C038F4803A09F466C07C 294 | :10125000883A09F47FC0B4C0803C09F4A7C0883C38 295 | :1012600009F4A4C0883B09F48AC0AAC080914B0746 296 | :1012700010C090916D0780916C07981770F5E09100 297 | :101280006D0781E08E0F80936D07F0E0E45BF84F0F 298 | :1012900080818093BB0085EC86C080936E078EC0F2 299 | :1012A000E0916D0781E08E0F80936D078091BB0008 300 | :1012B000F0E0E45BF84F808390916D0780916C07BC 301 | :1012C0006EC0E0916D0781E08E0F80936D07809175 302 | :1012D000BB00F0E0E45BF84F808380916F078111E1 303 | :1012E0006DC081E080934A0784EA61C083E0809307 304 | :1012F000700710924A02CFCF80914A02803208F0E4 305 | :1013000051C0E0914A0281E08E0F80934A028091A1 306 | :10131000BB00F0E0E65DFD4F8083BDCF85EC8093A0 307 | :10132000BC001092700780914A02803230F4E09144 308 | :101330004A02F0E0E65DFD4F108260914A0270E0E3 309 | :10134000E0914B02F0914C028AE292E009951092F2 310 | :101350004A0236C084E080937007109229021092EE 311 | :101360002802E0914D02F0914E02099580912802E9 312 | :10137000811105C081E08093280210920802E0915B 313 | :10138000290281E08E0F80932902F0E0E85FFD4F93 314 | :1013900080818093BB009091290280912802981748 315 | :1013A00008F479CF85E88093BC000AC085EC80936F 316 | :1013B000BC001092700704C010926E070E940F04C8 317 | :1013C000FF91EF91BF91AF919F918F917F916F911D 318 | :1013D0005F914F913F912F910F900FBE0F901F90F3 319 | :1013E00018958F929F92AF92BF92CF92DF92EF9219 320 | :1013F000FF920F931F93CF93DF936115710509F44B 321 | :1014000091C0EA016B017C01FC0100851185F801A6 322 | :101410002223E9F16481758180E090E00E94901EB2 323 | :10142000F60120813181428153810E94E91D4B01E7 324 | :101430005C0120E030E0A9010E94551E87FF04C036 325 | :101440001982188291E007C0C501B4010E94611E93 326 | :101450007983688390E0F80126813781488159813A 327 | :101460002417350720F43983288381E001C080E008 328 | :10147000F80124813581488159814217530718F4B6 329 | :101480003983288391E0F701268137813CC0608150 330 | :10149000718180E090E00E94901EF60120813181F0 331 | :1014A000428153810E94E91D4B015C0120E030E044 332 | :1014B000A9010E94551E87FF04C01982188291E07D 333 | :1014C00007C0C501B4010E94611E7983688390E062 334 | :1014D000F80122813381488159812417350720F48E 335 | :1014E0003983288381E001C080E0F80120813181C7 336 | :1014F000488159814217530718F43983288391E0B2 337 | :10150000F70124813581488159814217530728F01A 338 | :10151000215031093983288308C0811106C0892FE1 339 | :1015200090E005C083E090E002C082E090E0DF91AF 340 | :10153000CF911F910F91FF90EF90DF90CF90BF90D0 341 | :10154000AF909F908F9008950F931F93CF93DF9349 342 | :10155000FB01EA0137FD0DC0C901B801640F751F19 343 | :10156000811D911D9F0140E050E00E947D1FCB0135 344 | :1015700015C088279927DC01801B910BA20BB30BA8 345 | :101580000E94471FC817D90710F09E0104C0BE0172 346 | :101590006E0F7F1F9B01281B390BC901DF91CF9173 347 | :1015A0001F910F9108952F923F924F925F926F92E9 348 | :1015B0007F928F929F92AF92BF92CF92DF92EF92E3 349 | :1015C000FF920F931F93CF93DF93CDB7DEB768974A 350 | :1015D0000FB6F894DEBF0FBECDBF1C017E876D87AE 351 | :1015E0005E834D83388F2F8B18870F83DA86C986E9 352 | :1015F00089829A82AB82BC82B9A829813A814B81C7 353 | :101600005C81211531054105510509F42FC244279C 354 | :1016100055272F87388B498B5A8B8DA59EA5AFA553 355 | :10162000B8A9BC01CD01882799270E947D1F6B8B2B 356 | :101630007C8B8D8B9E8B2B013C01662477248F89BC 357 | :10164000988D4D855E85841B950BDC011196BC87BA 358 | :10165000AB87D101ED91FC91EE2009F4E7C0008445 359 | :10166000F185E02DA3019201B601C10109952AA9D6 360 | :10167000222309F48AC0BB2009F444C02D813E8195 361 | :101680004F8158854217530708F4F0C1D101ED91FD 362 | :10169000FC91B1E0BF930684F785E02D812C912C5D 363 | :1016A0005401C12CD12C7601C3948C012B853C852F 364 | :1016B0004F8158856F89788DC1010995C301B201A9 365 | :1016C0006F5F7F4F8F4F9F4F2F85388949895A8988 366 | :1016D0000E947D1F2B013C0166247724D101ED91EE 367 | :1016E000FC910084F185E02DA301920169857A8542 368 | :1016F000C10109952F8138852150310938872F8301 369 | :101700000F90BCCF4F815885AD81BE814A175B07D2 370 | :1017100008F4ACC1D101ED91FC911F920684F785CC 371 | :10172000E02D812C912C5401C12CD12C7601C39435 372 | :101730008C012B853C854D815E816D857E85C10147 373 | :101740000995C301B2016F5F7F4F8F4F9F4F2F8568 374 | :10175000388949895A890E947D1F2B013C016624E2 375 | :101760007724D101ED91FC910084F185E02DA30156 376 | :10177000920169857A85C10109952D813E812F5F8E 377 | :101780003F4F3E832D830F90BDCFBB2041F14D8154 378 | :101790005E818F8198858417950708F467C1D10110 379 | :1017A000ED91FC91B1E0BF930684F785E02D5301E4 380 | :1017B0004201C980DA80EB80FC8009851A852B857F 381 | :1017C0003C854F8158856F89788DC10109952F819E 382 | :1017D00038852150310938872F830F90D8CF4F811A 383 | :1017E00058858D819E814817590708F43FC1D10162 384 | :1017F000ED91FC911F920684F785E02D5301420183 385 | :10180000C980DA80EB80FC8009851A852B853C85B0 386 | :101810004D815E816D857E85C10109952D813E8159 387 | :101820002F5F3F4F3E832D830F90D9CF8F819885B7 388 | :101830004D815E81841B950BDC011197B88BAF87BE 389 | :10184000BB2009F486C04F5F5F4F1F920088F1896B 390 | :10185000E02D53014201C980DA80EB80FC800985CC 391 | :101860001A852F8538896D857E85C10109952F855B 392 | :1018700038892901612C712C930182014B895C8983 393 | :1018800069817A81C1010E94A40A9C8B8B8B4C01D7 394 | :10189000A12CB12CD101ED91FC911F920684F7850A 395 | :1018A000E02DC980DA80EB80FC8009851A852B85C4 396 | :1018B0003C854F8158856D857E85C10109954B8595 397 | :1018C0005C858A0120E030E04B895C8969817A81FE 398 | :1018D000C1010E94A40A9E878D874C01A12CB12CC6 399 | :1018E0004F81588541505109D101ED91FC91B1E0F2 400 | :1018F000BF930088F189E02DC980DA80EB80FC80FD 401 | :1019000009851A852F8538896F89788DC1010995D8 402 | :10191000930182014D855E8569817A81C1010E94B2 403 | :10192000A40A4C01A12CB12CD101ED91FC91B1E0A4 404 | :10193000BF930684F785E02DC980DA80EB80FC80B8 405 | :1019400009851A852B853C854D815E816F89788D4F 406 | :1019500087C01F920684F785E02D53014201C9809C 407 | :10196000DA80EB80FC8009851A852B853C854D81CA 408 | :101970005E816D857E85C10109952B853C85290198 409 | :10198000612C712C930182014B895C8969817A8178 410 | :10199000C1010E94A40A9C8B8B8B4C01A12CB12C01 411 | :1019A0004D815E814F5F5F4FD101ED91FC911F92A0 412 | :1019B0000088F189E02DC980DA80EB80FC80098500 413 | :1019C0001A852F8538896F89788DC10109954F85D2 414 | :1019D00058898A0120E030E04B895C8969817A81ED 415 | :1019E000C1010E94A40A9E838D834C01A12CB12CBD 416 | :1019F000D101ED91FC91B1E0BF930684F785E02D14 417 | :101A0000C980DA80EB80FC8009851A852B853C85AE 418 | :101A10004F8158856F89788DC101099593018201A5 419 | :101A20004D815E8169817A81C1010E94A40A4C01C5 420 | :101A3000A12CB12C4F81588541505109D101ED9114 421 | :101A4000FC91B1E0BF930088F189E02DC980DA8074 422 | :101A5000EB80FC8009851A852F8538896D857E8508 423 | :101A6000C10109950F900F900F900F9068960FB6D7 424 | :101A7000F894DEBF0FBECDBFDF91CF911F910F91C4 425 | :101A8000FF90EF90DF90CF90BF90AF909F908F909E 426 | :101A90007F906F905F904F903F902F9008954F925E 427 | :101AA0005F926F927F928F929F92AF92BF92CF92EE 428 | :101AB000DF92EF92FF920F931F93CF93DF9300D0AB 429 | :101AC0001F92CDB7DEB78C013C0129EF621A2BEFD4 430 | :101AD000720AD3018D919C915801B5EFAB1ABBEFFF 431 | :101AE000BB0AF501208131812C015694542C4424E9 432 | :101AF00057944794420E531E6801F7EFCF1AFBEF3D 433 | :101B0000DF0AD601ED90FC90E81AF90AF694FE2C53 434 | :101B1000EE24F794E7944801B3EF8B1ABBEF9B0ACE 435 | :101B2000F401808191810196821B930BE80EF91ECE 436 | :101B3000B70180E090E04AE00E94EF160E94E716AD 437 | :101B4000C8010E944017D4018C91F501908121E2D7 438 | :101B500029839A838B83D801ED91FC910280F381D4 439 | :101B6000E02DC8010995D801ED91FC910190F0811B 440 | :101B7000E02D23E030E040E0BE016F5F7F4FC80101 441 | :101B80000995D801ED91FC910480F581E02DC80103 442 | :101B90000995F6018081D3019C9122E229839770F7 443 | :101BA0009A8387708B83D801ED91FC910280F38139 444 | :101BB000E02DC8010995D801ED91FC910190F081CB 445 | :101BC000E02D23E030E040E0BE016F5F7F4FC801B1 446 | :101BD0000995D801ED91FC910480F581E02DC801B3 447 | :101BE0000995B8016E5F7F4F640D751DD801ED91A9 448 | :101BF000FC910190F081E02D970141E0C801099529 449 | :101C0000F801EA5FFB4F10820F900F900F90DF9169 450 | :101C1000CF911F910F91FF90EF90DF90CF90BF90E9 451 | :101C2000AF909F908F907F906F905F904F900895AE 452 | :101C30008F929F92AF92BF92CF92DF92EF92FF92DC 453 | :101C40000F931F93CF93DF93CDB7DEB762970FB695 454 | :101C5000F894DEBF0FBECDBF6B877C878D879E87D4 455 | :101C60002F87388B498B5A8BA80197016F8578890C 456 | :101C700089899A89882019F00E94E81D02C00E9473 457 | :101C8000E91D69837A838B839C8321E0AE01475FE2 458 | :101C90005F4FBE01615F7F4F8EE097E00E94F109C8 459 | :101CA0007C0121E0AE01495F5F4FBE016F5F7F4F56 460 | :101CB0008EE097E00E94F1098C0120E0AE014B5FBD 461 | :101CC0005F4FBE01655F7F4F8EE097E00E94F10994 462 | :101CD000892B81F581E0E816F10421F4013011052A 463 | :101CE00041F428C082E0E816F10419F4023011052D 464 | :101CF00009F149855A858F8198858417950728F0C1 465 | :101D000001969C01241B350B05C09A012F5F3F4FA4 466 | :101D1000281B390B6D817E818F9245015601C12CA4 467 | :101D2000D12C7601C39400E011E08EE097E00E9490 468 | :101D3000D3170F9062960FB6F894DEBF0FBECDBFDB 469 | :101D4000DF91CF911F910F91FF90EF90DF90CF9097 470 | :101D5000BF90AF909F908F900895DC01ED91FC9122 471 | :101D60000190F081E02D09946F927F928F929F9263 472 | :101D7000AF92BF92CF92DF92EF92FF920F931F9399 473 | :101D8000CF93DF93CDB7DEB72C970FB6F894DEBFB5 474 | :101D90000FBECDBF4C014D835E836F83788709876B 475 | :101DA0001A872B873C87370120E0AE014D5F5F4FDC 476 | :101DB000BE016B5F7F4F0E94F1098C0121E0AE01F3 477 | :101DC0004F5F5F4FBE01675F7F4FC4010E94F10903 478 | :101DD000012B79F5892B69F549815A816B817C81C9 479 | :101DE000D4018D919C911197EF28A1F41896ED9153 480 | :101DF000FC911997A4A4B5A4C6A4D7A4E0A4F1A407 481 | :101E000002A513A526A137A1DC011C96ED91FC913A 482 | :101E10001D970DC0DC011C96ED91FC911D97A12C26 483 | :101E2000B12C6501E12CF12C8701E3949301C401ED 484 | :101E300009952C960FB6F894DEBF0FBECDBFDF918B 485 | :101E4000CF911F910F91FF90EF90DF90CF90BF90B7 486 | :101E5000AF909F908F907F906F9008952F923F92B8 487 | :101E60004F925F926F927F928F929F92AF92BF92AA 488 | :101E7000CF92DF92EF92FF920F931F93CF93DF9356 489 | :101E8000CDB7DEB76A970FB6F894DEBF0FBECDBFF1 490 | :101E90003C0149875A876B877C870D871E872F8770 491 | :101EA000388BC98ADA8AEB8AFC8A8D8A9E8AAF8A45 492 | :101EB000B88E49A85AA82BA9298F2CA92A8F842E1D 493 | :101EC000952E062F172F9601A701B401C8010E9475 494 | :101ED000421F181664F4C601D70189879A87AB8719 495 | :101EE000BC87C401D801898B9A8BAB8BBC8BCD840A 496 | :101EF000DE84EF84F8888D889E88AF88B88CA50131 497 | :101F00009401C701B6010E94421F181644F48D8641 498 | :101F10009E86AF86B88ACD8ADE8AEF8AF88E21E067 499 | :101F2000AE014D5F5F4FBE01635F7F4FC3010E94F3 500 | :101F3000F1094C0121E0AE014F5F5F4FBE016B5EC6 501 | :101F40007F4FC3010E94F1097C0120E0AE01495F8F 502 | :101F50005F4FBE01675F7F4FC3010E94F1098C0193 503 | :101F600020E0AE014B5F5F4FBE016F5E7F4FC3014C 504 | :101F70000E94F109A1E08A16910421F4EA94EF2865 505 | :101F800051F46BC0E2E08E16910429F4F2E0EF16F2 506 | :101F9000F10409F462C00130110519F4019739F414 507 | :101FA0005CC00230110519F4029709F456C009818A 508 | :101FB0001A812D813E814B815C816F817885D301AF 509 | :101FC000ED90FC901197EFA5F8A9EF2B39F5189635 510 | :101FD0000D90BC91A02D98968D909D90AD90BC9049 511 | :101FE0009B979696CD90DC909797FDA9FF938EA92D 512 | :101FF0008F939F968C919F978F939E968C919E978F 513 | :102000008F939D968C919D978F939C968C918F9397 514 | :10201000D7015296ED91FC91539715C0BEA9BF937D 515 | :10202000EDA9EF93FA8DFF93898D8F935F924F9275 516 | :10203000D7015296ED91FC915397812C912C54012C 517 | :102040008394CFA4D8A8EE24E394C30109950F90FC 518 | :102050000F900F900F900F900F906A960FB6F89414 519 | :10206000DEBF0FBECDBFDF91CF911F910F91FF90CB 520 | :10207000EF90DF90CF90BF90AF909F908F907F9028 521 | :102080006F905F904F903F902F9008952F923F92C6 522 | :102090004F925F926F927F928F929F92AF92BF9278 523 | :1020A000CF92DF92EF92FF920F931F93CF93DF9324 524 | :1020B000CDB7DEB7A7970FB6F894DEBF0FBECDBF82 525 | :1020C0001C0149875A876B877C870D871E872F875E 526 | :1020D000388BCD82DE82EF82F886AEA2BFA2C70126 527 | :1020E000B6010E94611E698F20E030E0A9016D8574 528 | :1020F0007E858F8598890E94E91D4B015C01298DA1 529 | :10210000622F70E080E090E00E94921E2B013C0163 530 | :1021100029853A854B855C850E94E91D6A8F7B8FF6 531 | :102120008C8F9D8FEEA0FFA095018401AB01BC01B7 532 | :10213000C1010E94B40E20E030E0A9016D817E81D2 533 | :102140008F8198850E94421F18160CF083C0A3014E 534 | :10215000920169857A858B859C850E94E81D69833B 535 | :102160007A838B839C83EEA0FFA095018401AB0151 536 | :10217000BC01C1010E94B40EA30192016D857E8550 537 | :102180008F8598890E94E81D6E8F7F8F88A399A301 538 | :1021900020E030E0A90169857A858B859C850E94C5 539 | :1021A000E91D4B015C01EEA0FFA00E8D1F8D28A143 540 | :1021B00039A1AB01BC01C1010E94B40EA30192017F 541 | :1021C0006D857E858F8598890E94E91D2B013C01D4 542 | :1021D000EEA0FFA08B019C01B501A401C1010E94EA 543 | :1021E000B40E1F921F921F921F921F921F923FA127 544 | :1021F0003F938EA18F938D849E84AF84B888CA8CC0 545 | :10220000DB8CEC8CFD8C9501840149815A816B81BA 546 | :102210007C81C1010E942E0F1F921F921F921F925C 547 | :102220001F921F929FA19F932EA12F9353014201B2 548 | :10223000C984DA84EB84FC840E8D1F8D28A139A11A 549 | :10224000B701A601C1010E942E0F0FB6F894DEBFA0 550 | :102250000FBECDBF2D813E814F81588560E070E07B 551 | :1022600080E89FE30E94E81D0E945A1E7B8F6A8FC0 552 | :102270001D82998D2D81291708F078C12F5F2D833C 553 | :10228000622F70E08A8D9B8D1816190644F0CB01E1 554 | :10229000880F991F2A8D3B8D820F931F10C0398D97 555 | :1022A0003150398FCB01880F991F2A8D3B8D820FBA 556 | :1022B000931F298D32E0239F8019910911249C01DD 557 | :1022C0002F5F3F4F3B8F2A8F3D81898D831708F405 558 | :1022D0004DC1072E000C880B990B0E94921E69833A 559 | :1022E0007A838B839C839B01AC016D857E858F8572 560 | :1022F00098890E94E91D698B7A8B8B8B9C8B298D29 561 | :10230000622F70E080E090E00E94921E6E8F7F8FBF 562 | :1023100088A399A39B01AC0169857A858B859C85EF 563 | :102320000E94E91D6D8B7E8B8F8B988FEEA0FFA096 564 | :1023300009891A892B893C89AB01BC01C1010E9422 565 | :10234000B40E2E8D3F8D48A159A169857A858B8564 566 | :102350009C850E94E81D6AA37BA38CA39DA3EEA08D 567 | :10236000FFA009891A892B893C89AB01BC01C101F5 568 | :102370000E94B40E29813A814B815C816D857E85F6 569 | :102380008F8598890E94E81D2B013C01EEA0FFA0DB 570 | :102390008B019C014D895E896F89788DC1010E94F6 571 | :1023A000B40EEEA0FFA0930182014AA15BA16CA133 572 | :1023B0007DA1C1010E94B40E1F921F921F921F9215 573 | :1023C0001F921F923FA13F938EA18F9389889A8875 574 | :1023D000AB88BC88CD88DE88EF88F88C95018401B5 575 | :1023E0004AA15BA16CA17DA1C1010E942E0F1F9289 576 | :1023F0001F921F921F921F921F929FA19F932EA127 577 | :102400002F9353014201CD88DE88EF88F88C930129 578 | :1024100082014AA15BA16CA17DA1C1010E942E0F86 579 | :102420000FB6F894DEBF0FBECDBF9D81298D9217E8 580 | :1024300009F41FCF2E8D3F8D48A159A16D857E8552 581 | :102440008F8598890E94E91D698B7A8B8B8B9C8B79 582 | :1024500029813A814B815C8169857A858B859C8550 583 | :102460000E94E91D6D8B7E8B8F8B988FEEA0FFA055 584 | :1024700009891A892B893C89AB01BC01C1010E94E1 585 | :10248000B40E29813A814B815C8169857A858B857F 586 | :102490009C850E94E81D69837A838B839C83EEA0D0 587 | :1024A000FFA009891A892B893C89AB01BC01C101B4 588 | :1024B0000E94B40E2E8D3F8D48A159A16D857E8559 589 | :1024C0008F8598890E94E81D2B013C01EEA0FFA09A 590 | :1024D0008B019C014D895E896F89788DC1010E94B5 591 | :1024E000B40EEEA0FFA09301820149815A816B8155 592 | :1024F0007C81C1010E94B40E1F921F921F921F92F5 593 | :102500001F921F923FA13F938EA18F9389889A8833 594 | :10251000AB88BC88CD88DE88EF88F88C9501840173 595 | :1025200049815A816B817C81C1010E942E0F1F92CB 596 | :102530001F921F921F921F921F929FA19F932EA1E5 597 | :102540002F9353014201CD88DE88EF88F88C9301E8 598 | :10255000820149815A816B817C81C1010E942E0FC9 599 | :102560000FB6F894DEBF0FBECDBF83CEA7960FB6D1 600 | :10257000F894DEBF0FBECDBFDF91CF911F910F91B9 601 | :10258000FF90EF90DF90CF90BF90AF909F908F9093 602 | :102590007F906F905F904F903F902F9008952F9273 603 | :1025A0003F924F925F926F927F928F92AF92BF92C3 604 | :1025B000CF92DF92EF92FF920F931F93CF93DF930F 605 | :1025C000CDB7DEB7A2970FB6F894DEBF0FBECDBF72 606 | :1025D0006D837E838F83988729013A01E982FA828D 607 | :1025E0000B831C83A98ABA8ACB8ADC8AC601B5010F 608 | :1025F0000E94E81D0E94611E69877A878B879C87ED 609 | :102600002D813E814F815885C801B7010E94E81D88 610 | :102610000E945A1E97FF09C090958095709561950C 611 | :102620007F4F8F4F9F4F1FEF01C011E09B01AC0107 612 | :10263000220F331F441F551F2D873E874F87588B0E 613 | :1026400089859A85281B390B4109510929833A83C9 614 | :102650004B835C836D817E818F8198850E94611E92 615 | :102660007E836D83C301B2010E94611E1B018985B7 616 | :102670009A85880F991F9C0140E050E0298F3A8F7E 617 | :102680004B8F5C8F612C712C412F110F550B5AA36E 618 | :1026900049A3B10180E090E00E94901E9B01AC0133 619 | :1026A00069897A898B899C890E94421F18160CF0CF 620 | :1026B0007CC05FEF651A750A89819A81AB81BC8104 621 | :1026C000181619061A061B060CF05BC0930140E0B1 622 | :1026D00050E02D8B3E8B4F8B588FCA01B9010E9461 623 | :1026E000901E6D8F7E8F8F8F98A3B1016F5F7F4F8C 624 | :1026F0006619770980E090E00E94901E2B013C0152 625 | :102700004D815E81BA0180E090E00E94901E812C94 626 | :10271000AEA8BFA8C8ACD9ACED8CFE8C0F8D18A1AB 627 | :10272000A30192010E94180E0D891E892F89388DF0 628 | :102730004EA95FA961E070E08EE097E00E94A40AD4 629 | :102740009C0140E050E02EAB3FAB48AF59AF4D810C 630 | :102750005E8189A19AA1480F591F5E834D8329810B 631 | :102760003A814B815C81898D9A8DAB8DBC8D281B04 632 | :10277000390B4A0B5B0B29833A834B835C83612CB7 633 | :10278000712C29813A814B815C818D859E85AF8535 634 | :10279000B889280F391F4A1F5B1F29833A834B834F 635 | :1027A0005C839FEF291A390A74CFB30180E090E06F 636 | :1027B0000E94901E69837A838B839C83B101661982 637 | :1027C000770980E090E00E94901E2B013C01AD81D2 638 | :1027D000BE81BD0180E090E00E94901E812CAEA8D9 639 | :1027E000BFA8C8ACD9ACE980FA800B811C81A301D9 640 | :1027F00092010E94180E29853A85B90180E090E087 641 | :102800000E94901EA2960FB6F894DEBF0FBECDBFF9 642 | :10281000DF91CF911F910F91FF90EF90DF90CF90BC 643 | :10282000BF90AF908F907F906F905F904F903F9050 644 | :102830002F9008958F929F92AF92BF92CF92DF9286 645 | :10284000EF92FF920F931F93CF93DF93CDB7DEB735 646 | :1028500062970FB6F894DEBF0FBECDBF6B877C8743 647 | :102860008D879E872F87388B498B5A8BA8019701BC 648 | :10287000882019F00E94E81D06C06B857C858D8537 649 | :102880009E850E94E91D69837A838B839C8320E067 650 | :10289000AE01475F5F4FBE01655F7F4F8EE097E0FF 651 | :1028A0000E94F1097C0120E0AE01495F5F4FBE014B 652 | :1028B0006F5F7F4F8EE097E00E94F1098C0121E06D 653 | :1028C000AE014B5F5F4FBE01615F7F4F8EE097E0CF 654 | :1028D0000E94F109892B81F581E0E816F10421F4C9 655 | :1028E0000130110541F428C082E0E816F10419F422 656 | :1028F0000230110509F169857A858F8198858617DF 657 | :10290000970728F001969C01261B370B05C09B01F9 658 | :102910002F5F3F4F281B390B4D815E818F92450100 659 | :102920005601C12CD12C7601C39400E011E08EE059 660 | :1029300097E00E940F160F9062960FB6F894DEBFD4 661 | :102940000FBECDBFDF91CF911F910F91FF90EF9000 662 | :10295000DF90CF90BF90AF909F908F9008953FB73A 663 | :10296000F89480919A0790919B07A0919C07B09151 664 | :102970009D0726B5A89B05C02F3F19F00196A11D04 665 | :10298000B11D3FBFBA2FA92F982F8827820F911D05 666 | :10299000A11DB11DBC01CD0142E0660F771F881F4C 667 | :1029A000991F4A95D1F708952F923F924F925F92C7 668 | :1029B0006F927F928F92AF92BF92CF92DF92EF92FF 669 | :1029C000FF920F931F93CF93DF93CDB7DEB7A297FC 670 | :1029D0000FB6F894DEBF0FBECDBF6D837E838F83AD 671 | :1029E000988729833A834B835C83E98AFA8A0B8B25 672 | :1029F0001C8B9B01AC01C801B7010E94E81D0E941D 673 | :102A0000611E6D877E878F87988B29813A814B81E4 674 | :102A10005C81C601B5010E94E81D0E945A1E97FF05 675 | :102A200009C090958095709561957F4F8F4F9F4F0E 676 | :102A30001FEF01C011E09B01AC01220F331F441FA7 677 | :102A4000551F29873A874B875C8729013A014D85B5 678 | :102A50005E85441A550A6108710869817A818B8103 679 | :102A60009C810E94611E7A8369836D817E818F8142 680 | :102A700098850E94611E1B018D859E85880F991F78 681 | :102A80009C0140E050E02D8B3E8B4F8B588FC12C2A 682 | :102A9000D12C412F110F550B5AA349A3B10180E04E 683 | :102AA00090E00E94901E9B01AC0169897A898B8914 684 | :102AB0009C890E94421F18160CF06CC05FEFC51A6B 685 | :102AC000D50A14141504160417040CF057C0C601D7 686 | :102AD000A0E0B0E08D839E83AF83B887BC01CD01B9 687 | :102AE0000E94901E698F7A8F8B8F9C8FA981BA81EB 688 | :102AF000BD0180E090E00E94901E6D8F7E8F8F8FD1 689 | :102B000098A3B1016F5F7F4F6C197D0980E090E061 690 | :102B10000E94901E812CAEA8BFA8C8ACD9ACE98C8D 691 | :102B2000FA8C0B8D1C8D2D8D3E8D4F8D58A10E94E2 692 | :102B30001A140D811E812F8138854EA95FA961E08D 693 | :102B400070E08EE097E00E94A40A9C0140E050E013 694 | :102B50002EAB3FAB48AF59AF49815A8189A19AA1A9 695 | :102B6000480F591F5A8349832D893E894F89588DB3 696 | :102B7000421A530A640A750AC12CD12C89859A8598 697 | :102B8000AB85BC85480E591E6A1E7B1E9FEF291A15 698 | :102B9000390A84CFB60180E090E00E94901E6987D8 699 | :102BA0007A878B879C87A981BA81BD0180E090E0FC 700 | :102BB0000E94901E2B013C01B1016C197D0980E03F 701 | :102BC00090E00E94901E812CAEA8BFA8C8ACD9ACE2 702 | :102BD000E984FA840B851C85A30192010E941A14D2 703 | :102BE0002D853E85B90180E090E00E94901EA2965E 704 | :102BF0000FB6F894DEBF0FBECDBFDF91CF911F910E 705 | :102C00000F91FF90EF90DF90CF90BF90AF908F909B 706 | :102C10007F906F905F904F903F902F9008952F92EC 707 | :102C20003F924F925F926F927F928F929F92AF925C 708 | :102C3000BF92CF92DF92EF92FF920F931F93CF93A9 709 | :102C4000DF93CDB7DEB72C970FB6F894DEBF0FBE7B 710 | :102C5000CDBF1C013B015C874B8729011A8709877F 711 | :102C6000A7019601442755272D833E834F8358871C 712 | :102C7000C501B401882799270E947D1F9B01AC01E3 713 | :102C80004427552729833A834B835C83D101ED91F7 714 | :102C9000FC910084F185E02DB801C101099529A1BD 715 | :102CA000222309F43FC09301241935092901641432 716 | :102CB000750409F473C0D101ED91FC910484F5858C 717 | :102CC000E02DA12CB12C6501E12CF12C8701E394BE 718 | :102CD0009C014B855C85B301C101099569817A81AD 719 | :102CE0008B819C816F5F7F4F8F4F9F4F2D813E81E6 720 | :102CF0004F8158850E947D1F9B01AC0144275527B9 721 | :102D000029833A834B835C83D101ED91FC9100844C 722 | :102D1000F185E02D69857A85C1010995B1E06B1ACD 723 | :102D20007108C5CF460C571C64147504B9F1D10164 724 | :102D3000ED91FC910484F585E02DA12CB12C650169 725 | :102D4000E12CF12C8701E3949C014B855C85B30158 726 | :102D5000C101099569817A818B819C816F5F7F4F69 727 | :102D60008F4F9F4F2D813E814F8158850E947D1F3F 728 | :102D70009B01AC014427552729833A834B835C830D 729 | :102D8000D101ED91FC910084F185E02D69857A8572 730 | :102D9000C1010995BFEF6B1A7B0AC6CF2C960FB6FF 731 | :102DA000F894DEBF0FBECDBFDF91CF911F910F9181 732 | :102DB000FF90EF90DF90CF90BF90AF909F908F905B 733 | :102DC0007F906F905F904F903F902F90089542E0DA 734 | :102DD00050E067E871E081E592E00C9403038F9284 735 | :102DE0009F92AF92BF920F931F93CF93DF93CDB774 736 | :102DF000DEB7A1970FB6F894DEBF0FBECDBF19A204 737 | :102E0000423008F44AE08E010F5D1F4F842E912C52 738 | :102E1000A12CB12CA50194010E945B1FE62FB901E2 739 | :102E2000CA0101501109EA3014F4E05D01C0E95C07 740 | :102E3000D801EC93232B242B252B61F701151105C9 741 | :102E400071F0F80101900020E9F73197AF01401BC4 742 | :102E5000510BB80181E592E00E94030302C080E0BB 743 | :102E600090E0A1960FB6F894DEBF0FBECDBFDF9104 744 | :102E7000CF911F910F91BF90AF909F908F90089529 745 | :102E8000EF92FF920F931F93CF93DF9300D0CDB7B4 746 | :102E9000DEB78C011A82198280E28983D801ED9114 747 | :102EA000FC910280F381E02DC8010995D801ED91D4 748 | :102EB000FC910190F081E02D22E030E040E0BE0185 749 | :102EC0006F5F7F4FC80109957C01D801ED91FC919E 750 | :102ED0000480F581E02DC8010995C7010F900F907E 751 | :102EE000DF91CF911F910F91FF90EF900895309156 752 | :102EF0009407313208F04BC0809170078111FCCFEC 753 | :102F00009091930722E02093700721E020936F07B0 754 | :102F10002FEF20936E0710926D0730936C07E3E755 755 | :102F2000F7E0ACE4B7E020E0321721F041914D9397 756 | :102F30002F5FFACF10924B0720914B07990F922BDE 757 | :102F400090934B0790914A07913061F410924A0791 758 | :102F500090914B079093BB009091BC0093FDF8CFEC 759 | :102F600095EC01C095EE9093BC0090917007923063 760 | :102F7000E1F390916E079F3F79F080916E07803268 761 | :102F800041F080916E07803331F084E005C081E02C 762 | :102F900003C082E001C083E0109272071092940790 763 | :102FA0001092710708952F923F924F925F926F9205 764 | :102FB0007F928F929F92AF92BF92CF92DF92EF92C9 765 | :102FC000FF920F931F93CF93DF93CDB7DEB72C976C 766 | :102FD0000FB6F894DEBF0FBECDBF1C017C876B8798 767 | :102FE0003A0129011A870987A70196014427552725 768 | :102FF0002D833E834F835887C501B40188279927C5 769 | :103000000E947D1F9B01AC014427552729833A83E9 770 | :103010004B835C83D101ED91FC910084F185E02D1F 771 | :10302000B801C101099529A1222309F43FC09301E8 772 | :103030002419350929016414750409F473C0D101F8 773 | :10304000ED91FC910484F585E02DA12CB12C650156 774 | :10305000E12CF12C8701E3949C01A3016B857C8515 775 | :10306000C101099569817A818B819C816F5F7F4F56 776 | :103070008F4F9F4F2D813E814F8158850E947D1F2C 777 | :103080009B01AC014427552729833A834B835C83FA 778 | :10309000D101ED91FC910084F185E02D69857A855F 779 | :1030A000C1010995B1E06B1A7108C5CF460C571CD8 780 | :1030B00064147504B9F1D101ED91FC910484F58596 781 | :1030C000E02DA12CB12C6501E12CF12C8701E394BA 782 | :1030D0009C01A3016B857C85C101099569817A8179 783 | :1030E0008B819C816F5F7F4F8F4F9F4F2D813E81E2 784 | :1030F0004F8158850E947D1F9B01AC0144275527B5 785 | :1031000029833A834B835C83D101ED91FC91008448 786 | :10311000F185E02D69857A85C1010995BFEF6B1AAC 787 | :103120007B0AC6CF2C960FB6F894DEBF0FBECDBF7C 788 | :10313000DF91CF911F910F91FF90EF90DF90CF9093 789 | :10314000BF90AF909F908F907F906F905F904F90C7 790 | :103150003F902F90089590E0FC01E556FA4F24919E 791 | :10316000FC01E957FA4F3491FC01ED58FA4FE49114 792 | :10317000EE2309F43CC0222339F1233091F038F4D6 793 | :103180002130A9F0223001F584B58F7D12C027309F 794 | :1031900091F02830A1F02430B9F4809180008F7D27 795 | :1031A00003C0809180008F77809380000DC084B52C 796 | :1031B0008F7784BD09C08091B0008F7703C0809164 797 | :1031C000B0008F7D8093B000F0E0EE0FFF1FE75955 798 | :1031D000FA4FA591B4919FB7F894611104C08C91F6 799 | :1031E0003095382302C0EC913E2B3C939FBF08954D 800 | :1031F0008F929F92AF92BF92CF92DF92EF92FF9207 801 | :103200006B017C010E94AF144B015C01C114D1041D 802 | :10321000E104F104F1F00E94AF14DC01CB01881944 803 | :103220009909AA09BB09883E9340A105B10570F32D 804 | :1032300021E0C21AD108E108F10888EE880E83E087 805 | :10324000981EA11CB11CC114D104E104F10419F7AA 806 | :10325000DDCFFF90EF90DF90CF90BF90AF909F9029 807 | :103260008F9008951F920F920FB60F9211242F93F3 808 | :103270003F938F939F93AF93BF93809196079091C5 809 | :103280009707A0919807B09199073091950723E08F 810 | :10329000230F2D3720F40196A11DB11D05C026E88E 811 | :1032A000230F0296A11DB11D2093950780939607C9 812 | :1032B00090939707A0939807B093990780919A07E6 813 | :1032C00090919B07A0919C07B0919D070196A11D2D 814 | :1032D000B11D80939A0790939B07A0939C07B0938E 815 | :1032E0009D07BF91AF919F918F913F912F910F902B 816 | :1032F0000FBE0F901F9018950895DA01C90123E0C1 817 | :10330000B695A795979587952A95D1F7860F971F1C 818 | :1033100008954F925F926F927F928F929F92AF9299 819 | :10332000BF92CF92DF92EF92FF920F931F93CF93B2 820 | :10333000DF93DA014901E114F1040105110509F4F3 821 | :10334000ADC025013601A80197016D018B01EC018B 822 | :10335000C301B20188279927442755270E947D1F62 823 | :103360009B01AC0144275527E881F9810680F7814C 824 | :10337000E02DB401CE010995FC012081AE014E5F24 825 | :103380005F4FC60173E0969587957A95E1F7F7E070 826 | :10339000CF22DD2420FF14C09C013695322F222736 827 | :1033A00037952795200F311FFA01E20FF31F21E017 828 | :1033B00030E001C0220FCA94EAF73081232B13C0FA 829 | :1033C000FC01F695FE2FEE27F795E795E00FF11F2C 830 | :1033D000E40FF51F21E030E001C0220FCA94EAF7A4 831 | :1033E0002095308123232083BE016A5F7B4FFB0140 832 | :1033F000D080AE01495F5B4F9E01275F3B4FDE01EE 833 | :10340000A55FBB4F37965F01FA01DD2039F1C0801F 834 | :10341000D1808C159D0508F46C01FA01D182C0821F 835 | :10342000F901408151814817590708F4AC01F901AD 836 | :10343000518340838D919C9111970817190708F4C7 837 | :10344000C8018D939C93F50180819181801791072C 838 | :1034500008F4C801F501918380830AC091838083B9 839 | :10346000F901918380830D931C93F50111830083EF 840 | :1034700081E0FB018083CE01DF91CF911F910F91FD 841 | :10348000FF90EF90DF90CF90BF90AF909F908F9084 842 | :103490007F906F905F904F900C944F0DDF91CF9184 843 | :1034A0001F910F91FF90EF90DF90CF90BF90AF9062 844 | :1034B0009F908F907F906F905F904F900895AF9204 845 | :1034C000BF92CF92DF92EF92FF920F931F93DC0196 846 | :1034D000ED91FC9172970190F081E02D8E0F9F1F6E 847 | :1034E0000E9489191F910F91FF90EF90DF90CF906C 848 | :1034F000BF90AF900895CF93DF9300D01F92CDB7C8 849 | :10350000DEB7789484B5826084BD84B5816084BD63 850 | :1035100085B5826085BD85B5816085BD80916E0071 851 | :10352000816080936E0010928100809181008260A2 852 | :1035300080938100809181008160809381008091DF 853 | :1035400080008160809380008091B10084608093CE 854 | :10355000B1008091B00081608093B00080917A00CA 855 | :10356000846080937A0080917A00826080937A00F0 856 | :1035700080917A00816080937A0080917A008068DF 857 | :1035800080937A001092C100E0916102F091620292 858 | :1035900082E08083E0915D02F0915E021082E09112 859 | :1035A0005F02F09160028FEC808310926902E091DB 860 | :1035B0006502F091660286E08083E0916302F091FB 861 | :1035C0006402808180618083E0916302F0916402F3 862 | :1035D000808188608083E0916302F0916402808141 863 | :1035E00080688083E0916302F091640280818F7D26 864 | :1035F00080834AE060E270E080E090E00E94EF1695 865 | :103600000E94E7164AE061E070E080E090E00E94EE 866 | :10361000EF160E94E7168FEF80930A078EEE92E076 867 | :1036200090930D0780930C0710920B071092500295 868 | :1036300010924F0210927207109294071092700726 869 | :1036400081E080936F0710924A0761E082E10E9457 870 | :10365000AB1861E083E10E94AB188091B9008E7FC6 871 | :103660008093B9008091B9008D7F8093B90088E480 872 | :103670008093B80085E48093BC0081E494E090934B 873 | :103680004E0280934D0282E494E090934C0280932A 874 | :103690004B0264E170E080E090E00E94F81860E086 875 | :1036A000809109070E94AB1865E070E080E090E02F 876 | :1036B0000E94F81861E0809109070E94AB1868EC3D 877 | :1036C00070E080E090E00E94F8188DEF898312E1AD 878 | :1036D0001A8322E030E040E0CE0101963C01BC01BB 879 | :1036E0008AEF92E00E94BC078EEA898321E030E0F5 880 | :1036F00040E0B3018AEF92E00E94BC0785ED898328 881 | :1037000080EA8A8322E030E040E0B3018AEF92E071 882 | :103710000E94BC0788EA89838FE38A8322E030E035 883 | :1037200040E0B3018AEF92E00E94BC071A8219823E 884 | :1037300083ED898322E030E040E0B3018AEF92E03C 885 | :103740000E94BC0780E4898321E030E040E0B301BF 886 | :103750008AEF92E00E94BC078AEF92E00E94401735 887 | :1037600081EA898321E030E040E0B3018AEF92E012 888 | :103770000E94BC0788EC898321E030E040E0B3017F 889 | :103780008AEF92E00E94BC078AED89831A8322E0C7 890 | :1037900030E040E0B3018AEF92E00E94BC0781E88C 891 | :1037A00089838FE88A8322E030E040E0B3018AEF2A 892 | :1037B00092E00E94BC0789ED898385E28A8322E03A 893 | :1037C00030E040E0B3018AEF92E00E94BC078BED4D 894 | :1037D000898384E38A8322E030E040E0B3018AEF0A 895 | :1037E00092E00E94BC0784EA898321E030E040E057 896 | :1037F000B3018AEF92E00E94BC0786EA898321E048 897 | :1038000030E040E0B3018AEF92E00E94BC0780E024 898 | :1038100094E0ECEFF2E0DF019C011D92215030407A 899 | :10382000E1F78091000710920207109201078823A8 900 | :10383000C9F080910307909104078730910510F437 901 | :1038400087E090E0909304078093030710920607A7 902 | :103850001092050780910707909108078F3791050F 903 | :1038600068F40AC087E090E0909304078093030710 904 | :1038700010920607109205078FE790E090930807D3 905 | :103880008093070781E0809300078AEF92E00E940F 906 | :103890004F0D8FEA898321E030E040E0B3018AEFE9 907 | :1038A00092E00E94BC078CE08093B80055245A94A3 908 | :1038B0005B821F92812C912C5401C12CD12C76015A 909 | :1038C000C3948E010D5F1F4F21E030E04FE350E0C5 910 | :1038D00060E070E08EE097E00E940F161F921F924A 911 | :1038E0001F921F92A12CB12C90EAC92E91E4D92EDF 912 | :1038F000E12CF12C0FEA13E420E030E040E251E447 913 | :10390000CA01B9010E94D4145982E091FA02F091DF 914 | :10391000FB023697808191811F921F921F921F9206 915 | :103920001F921F927F926F92812C912C38E1A32ECF 916 | :1039300032E4B32EC12CD12C44E3E42E42E4F42E25 917 | :1039400000E010E020E731E4B901A80186509D4F66 918 | :103950000E942E0F1982E091FA02F091FB02369735 919 | :10396000808191811F921F921F921F921F921F921E 920 | :103970007F926F92812C912C54E0A52E52E4B52EAB 921 | :10398000C12CD12C60E2E62E62E4F62E00E010E0BD 922 | :1039900020EA31E4B901A80186509D4F0E942E0F04 923 | :1039A0005982E091FA02F091FB0236978081918171 924 | :1039B000DC01A650BD4F4D01ED91FC9111970084A3 925 | :1039C000F185E02D20E030E0A901B301CD0109959A 926 | :1039D0005C01C12CD12C70EEE72E71E4F72E00E0D3 927 | :1039E00010E020E032E440E050E068EC72E4C40112 928 | :1039F0000E9446101982E091FA02F091FB0236977C 929 | :103A0000808191819C0126503D4F4901D901ED9162 930 | :103A1000FC910084F185E02D20E030E0A901B301A4 931 | :103A2000C40109955C01C12CD12CE8E8EE2EE1E43B 932 | :103A3000FE2E00E010E020EE31E440E050E060EBCC 933 | :103A400072E4C4010E9446100FB6F894DEBF0FBEA8 934 | :103A5000CDBF99249A949982E091FA02F091FB02E9 935 | :103A6000369780819181730100E010E020E030E41E 936 | :103A700040E050E06CEF72E486509D4F0E94B40E1F 937 | :103A800068EE73E080E090E00E94F8181982E091FF 938 | :103A9000FA02F091FB0236978081918100E010E0FC 939 | :103AA00020E030E440E050E06CEF72E486509D4F3F 940 | :103AB0000E94B40E68EE73E080E090E00E94F81877 941 | :103AC0000E940504C8CFCF93DF93E1E5F2E01382B3 942 | :103AD000128288EE93E0A0E0B0E084839583A68311 943 | :103AE000B78325E031E03183208325EC30E0358752 944 | :103AF000248724EC30E03787268720EC30E0318BB8 945 | :103B0000208B21EC30E0338B228B22EC30E0358BA4 946 | :103B1000248B26EC30E0378B268B118E128E138E81 947 | :103B2000148EEEEEF2E01382128284839583A683D4 948 | :103B3000B78387E191E091838083109211071092FF 949 | :103B40001007CEE0D7E089E291E09983888380E88E 950 | :103B500090E0909313078093120780E490E0909395 951 | :103B600015078093140788E197E0909317078093D7 952 | :103B70001607BC01CE010E94CB0482E090E0909336 953 | :103B8000FD068093FC061092000710920207109227 954 | :103B90000107109204071092030710920607109273 955 | :103BA0000507109208071092070780E190E09093B4 956 | :103BB000FF068093FE0687E491E09093FB028093DA 957 | :103BC000FA028FE691E099838883DF91CF9108957F 958 | :103BD0005058BB27AA270E94001E0C94081F0E9461 959 | :103BE000FA1E38F00E94011F20F039F49F3F19F4AB 960 | :103BF00026F40C94F71E0EF4E095E7FB0C94F11EEE 961 | :103C0000E92F0E94191F58F3BA1762077307840738 962 | :103C1000950720F079F4A6F50C943B1F0EF4E0957F 963 | :103C20000B2EBA2FA02D0B01B90190010C01CA0176 964 | :103C3000A0011124FF27591B99F0593F50F4503E21 965 | :103C400068F11A16F040A22F232F342F4427585F13 966 | :103C5000F3CF469537952795A795F0405395C9F72B 967 | :103C60007EF41F16BA0B620B730B840BBAF09150E3 968 | :103C7000A1F0FF0FBB1F661F771F881FC2F70EC082 969 | :103C8000BA0F621F731F841F48F487957795679555 970 | :103C9000B795F7959E3F08F0B0CF9395880F08F041 971 | :103CA0009927EE0F9795879508950E94CD1E08F4E9 972 | :103CB00081E008950E94611E6894B1110C943C1F2C 973 | :103CC00008950E94211F88F09F5798F0B92F9927D7 974 | :103CD000B751B0F0E1F0660F771F881F991F1AF0F7 975 | :103CE000BA95C9F714C0B13091F00E943B1FB1E002 976 | :103CF00008950C943B1F672F782F8827B85F39F001 977 | :103D0000B93FCCF3869577956795B395D9F73EF48F 978 | :103D100090958095709561957F4F8F4F9F4F089537 979 | :103D2000E89409C097FB3EF4909580957095619555 980 | :103D30007F4F8F4F9F4F9923A9F0F92F96E9BB270B 981 | :103D40009395F695879577956795B795F111F8CF87 982 | :103D5000FAF4BB0F11F460FF1BC06F5F7F4F8F4FF2 983 | :103D60009F4F16C0882311F096E911C0772321F0E8 984 | :103D70009EE8872F762F05C0662371F096E8862F80 985 | :103D800070E060E02AF09A95660F771F881FDAF7D7 986 | :103D9000880F9695879597F90895990F0008550F04 987 | :103DA000AA0BE0E8FEEF16161706E807F907C0F0C1 988 | :103DB00012161306E407F50798F0621B730B840BC9 989 | :103DC000950B39F40A2661F0232B242B252B21F4A3 990 | :103DD00008950A2609F4A140A6958FEF811D811D43 991 | :103DE000089597F99F6780E870E060E008959FEF7D 992 | :103DF00080EC089500240A94161617061806090682 993 | :103E0000089500240A941216130614060506089550 994 | :103E1000092E0394000C11F4882352F0BB0F40F4D8 995 | :103E2000BF2B11F460FF04C06F5F7F4F8F4F9F4F18 996 | :103E3000089557FD9058440F551F59F05F3F71F09A 997 | :103E40004795880F97FB991F61F09F3F79F0879501 998 | :103E50000895121613061406551FF2CF4695F1DF8A 999 | :103E600008C0161617061806991FF1CF869571051A 1000 | :103E7000610508940895E894BB2766277727CB014E 1001 | :103E800097F908950E94CD1E08F48FEF0895AA1B9C 1002 | :103E9000BB1B51E107C0AA1FBB1FA617B70710F035 1003 | :103EA000A61BB70B881F991F5A95A9F78095909567 1004 | :103EB000BC01CD010895A1E21A2EAA1BBB1BFD0176 1005 | :103EC0000DC0AA1FBB1FEE1FFF1FA217B307E407F9 1006 | :103ED000F50720F0A21BB30BE40BF50B661F771F51 1007 | :103EE000881F991F1A9469F7609570958095909531 1008 | :103EF0009B01AC01BD01CF010895052E97FB1EF477 1009 | :103F000000940E94941F57FD07D00E945B1F07FC7E 1010 | :103F100003D04EF40C94941F509540953095219504 1011 | :103F20003F4F4F4F5F4F08959095809570956195E5 1012 | :103F30007F4F8F4F9F4F0895EE0FFF1F0590F49115 1013 | :103F4000E02D099481E090E0F8940C94A71FF89478 1014 | :023F5000FFCFA1 1015 | :103F52000100000000960303032D03E3035E033C0C 1016 | :103F6200035003000000009C046F048306430467AF 1017 | :103F720004530444040000000088060303830682FD 1018 | :103F8200068606CB04860697077207D30A9F05109A 1019 | :103F920005140400000000BC07810681067D198912 1020 | :103FA200197C1900000000000000000000ECFBEC8E 1021 | :103FB200FBECFB0000000000000000ECFB000088AE 1022 | :103FC200060303830682067D197C195F1A9707721E 1023 | :0A3FD20007D30A9F0510050D0A0031 1024 | :107E0000112484B714BE81FFF0D085E080938100F7 1025 | :107E100082E08093C00088E18093C10086E0809377 1026 | :107E2000C20080E18093C4008EE0C9D0259A86E02C 1027 | :107E300020E33CEF91E0309385002093840096BBD3 1028 | :107E4000B09BFECF1D9AA8958150A9F7CC24DD24C4 1029 | :107E500088248394B5E0AB2EA1E19A2EF3E0BF2EE7 1030 | :107E6000A2D0813461F49FD0082FAFD0023811F036 1031 | :107E7000013811F484E001C083E08DD089C08234E0 1032 | :107E800011F484E103C0853419F485E0A6D080C0E4 1033 | :107E9000853579F488D0E82EFF2485D0082F10E0AE 1034 | :107EA000102F00270E291F29000F111F8ED06801E7 1035 | :107EB0006FC0863521F484E090D080E0DECF843638 1036 | :107EC00009F040C070D06FD0082F6DD080E0C81688 1037 | :107ED00080E7D80618F4F601B7BEE895C0E0D1E017 1038 | :107EE00062D089930C17E1F7F0E0CF16F0E7DF06D8 1039 | :107EF00018F0F601B7BEE89568D007B600FCFDCFD4 1040 | :107F0000A601A0E0B1E02C9130E011968C91119780 1041 | :107F100090E0982F8827822B932B1296FA010C0160 1042 | :107F200087BEE89511244E5F5F4FF1E0A038BF0790 1043 | :107F300051F7F601A7BEE89507B600FCFDCF97BE46 1044 | :107F4000E89526C08437B1F42ED02DD0F82E2BD052 1045 | :107F50003CD0F601EF2C8F010F5F1F4F84911BD097 1046 | :107F6000EA94F801C1F70894C11CD11CFA94CF0C13 1047 | :107F7000D11C0EC0853739F428D08EE10CD085E9AC 1048 | :107F80000AD08FE07ACF813511F488E018D01DD067 1049 | :107F900080E101D065CF982F8091C00085FFFCCF94 1050 | :107FA0009093C60008958091C00087FFFCCF809118 1051 | :107FB000C00084FD01C0A8958091C6000895E0E648 1052 | :107FC000F0E098E1908380830895EDDF803219F02E 1053 | :107FD00088E0F5DFFFCF84E1DECF1F93182FE3DFCA 1054 | :107FE0001150E9F7F2DF1F91089580E0E8DFEE27F6 1055 | :047FF000FF270994CA 1056 | :027FFE00040479 1057 | :0400000300007E007B 1058 | :00000001FF 1059 | -------------------------------------------------------------------------------- /keywords.txt: -------------------------------------------------------------------------------- 1 | ####################################### 2 | # Syntax Coloring Map 3 | ####################################### 4 | 5 | ####################################### 6 | # Datatypes (KEYWORD1) 7 | ####################################### 8 | 9 | SSD1309 KEYWORD1 10 | SSD1309_Status_t KEYWORD1 11 | SSD1309_Intfc_t KEYWORD1 12 | SSD1309_Cmd_t KEYWORD1 13 | 14 | ####################################### 15 | # Methods and Functions (KEYWORD2) 16 | ####################################### 17 | 18 | writeBytes KEYWORD2 19 | selectDriver KEYWORD2 20 | deselectDriver KEYWORD2 21 | getOffsetColor KEYWORD2 22 | refreshDisplay KEYWORD2 23 | updateRefreshZone KEYWORD2 24 | setMirrorPixel KEYWORD2 25 | clearMirrorPixel KEYWORD2 26 | hwpixel KEYWORD2 27 | windowSet KEYWORD2 28 | windowClear KEYWORD2 29 | pixelSet KEYWORD2 30 | pixelClear KEYWORD2 31 | rectangleSet KEYWORD2 32 | rectangleClear KEYWORD2 33 | lineSet KEYWORD2 34 | lineClear KEYWORD2 35 | polygonSet KEYWORD2 36 | polygonClear KEYWORD2 37 | circleSet KEYWORD2 38 | circleClear KEYWORD2 39 | setContrastControl KEYWORD2 40 | overrideRam KEYWORD2 41 | setInversion KEYWORD2 42 | setPower KEYWORD2 43 | nop KEYWORD2 44 | setCommandLock KEYWORD2 45 | contHScrollSetupRight KEYWORD2 46 | contHScrollSetupLeft KEYWORD2 47 | contVHScrollSetupRight KEYWORD2 48 | contVHScrollSetupLeft KEYWORD2 49 | setScroll KEYWORD2 50 | setVScrollArea KEYWORD2 51 | contentScrollSetupRight KEYWORD2 52 | contentScrollSetupLeft KEYWORD2 53 | setLowCSAinPAM KEYWORD2 54 | setHighCSAinPAM KEYWORD2 55 | setMemoryAddressingMode KEYWORD2 56 | setColumnAddress KEYWORD2 57 | setPageAddress KEYWORD2 58 | setPSAinPAM KEYWORD2 59 | setDisplayStartLine KEYWORD2 60 | setSegmentMapping KEYWORD2 61 | setMultiplexRatio KEYWORD2 62 | setCOMoutputDirection KEYWORD2 63 | setDisplayOffset KEYWORD2 64 | setCOMpinsHWconfig KEYWORD2 65 | setGPIO KEYWORD2 66 | setDisplayClockDivideRatio KEYWORD2 67 | setPreChargePeriod KEYWORD2 68 | setVCOMHdeselectLevel KEYWORD2 69 | writeBytes KEYWORD2 70 | writeBytes KEYWORD2 71 | selectDriver KEYWORD2 72 | deselectDriver KEYWORD2 73 | 74 | ####################################### 75 | # Constants (LITERAL1) 76 | ####################################### 77 | 78 | HPYERDISPLAY_SSD1309_H LITERAL1 79 | SSD1309_MAX_WIDTH LITERAL1 80 | SSD1309_MAX_HEIGHT LITERAL1 81 | SSD1309_START_ROW LITERAL1 82 | SSD1309_START_COL LITERAL1 83 | SSD1309_START_PG LITERAL1 84 | SSD1309_STOP_ROW LITERAL1 85 | SSD1309_STOP_COL LITERAL1 86 | SSD1309_STOP_PG LITERAL1 87 | SSD1309_RAM_BYTES LITERAL1 88 | SSD1309_DEFAULT_WORKING_NUM_BYTES LITERAL1 89 | SSD1309_ARD_UNUSED_PIN LITERAL1 90 | SSD1309_BASE_ADDR LITERAL1 91 | SSD1309_I2C_BUFFER_LENGTH LITERAL1 92 | SSD1309_I2C_BUFFER_LENGTH LITERAL1 93 | UG2856KLBAG01_SPI_FREQ_MAX LITERAL1 94 | UG2856KLBAG01_SPI_MODE LITERAL1 95 | UG2856KLBAG01_SPI_ORDER LITERAL1 96 | SSD1309_Nominal LITERAL1 97 | SSD1309_Error LITERAL1 98 | SSD1309_NoRefresh LITERAL1 99 | SSD1309_Intfc_4WSPI LITERAL1 100 | SSD1309_Intfc_3WSPI LITERAL1 101 | SSD1309_Intfc_I2C LITERAL1 102 | SSD1309_Intfc_8080 LITERAL1 103 | SSD1309_Intfc_6800 LITERAL1 104 | Fundamental LITERAL1 105 | SSD1309_CMD_setContrastControl LITERAL1 106 | SSD1309_CMD_followRAMcontent LITERAL1 107 | SSD1309_CMD_allPixelsOn LITERAL1 108 | SSD1309_CMD_inversionOff LITERAL1 109 | SSD1309_CMD_inversionOn LITERAL1 110 | SSD1309_CMD_pwrOff LITERAL1 111 | SSD1309_CMD_pwrOn LITERAL1 112 | SSD1309_CMD_nop LITERAL1 113 | SSD1309_CMD_setCommandLock LITERAL1 114 | SSD1309_CMD_contHScrollSetupRight LITERAL1 115 | SSD1309_CMD_contHScrollSetupLeft LITERAL1 116 | SSD1309_CMD_contVHScrollSetupRight LITERAL1 117 | SSD1309_CMD_contVHScrollSetupLeft LITERAL1 118 | SSD1309_CMD_deactivateScroll LITERAL1 119 | SSD1309_CMD_activateScroll LITERAL1 120 | SSD1309_CMD_setVScrollArea LITERAL1 121 | SSD1309_CMD_contentScrollSetupRight LITERAL1 122 | SSD1309_CMD_contentScrollSetupLeft LITERAL1 123 | SSD1309_CMD_setLowCSAinPAM LITERAL1 124 | SSD1309_CMD_setHighCSAinPAM LITERAL1 125 | SSD1309_CMD_setMemoryAddressingMode LITERAL1 126 | SSD1309_CMD_setColumnAddress LITERAL1 127 | SSD1309_CMD_setPageAddress LITERAL1 128 | SSD1309_CMD_setPSAinPAM LITERAL1 129 | SSD1309_CMD_setDisplayStartLine LITERAL1 130 | SSD1309_CMD_setSegmentMapReset LITERAL1 131 | SSD1309_CMD_setSegmentMapFlipped LITERAL1 132 | SSD1309_CMD_setMultiplexRatio LITERAL1 133 | SSD1309_CMD_setCOMoutputNormal LITERAL1 134 | SSD1309_CMD_setCOMoutputFlipped LITERAL1 135 | SSD1309_CMD_setDisplayOffset LITERAL1 136 | SSD1309_CMD_setCOMpinsHWconfig LITERAL1 137 | SSD1309_CMD_setGPIO LITERAL1 138 | SSD1309_CMD_setDisplayClockDivideRatio LITERAL1 139 | SSD1309_CMD_setPreChargePeriod LITERAL1 140 | SSD1309_CMD_setVCOMHdeselectLevel LITERAL1 141 | -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=SparkFun HyperDisplay SSD1309 2 | version=1.1.1 3 | author=SparkFun Electronics 4 | maintainer=SparkFun Electronics 5 | sentence=Standardized library for control of displays using the SSD1309 driver IC. 6 | paragraph=An extension of HyperDisplay for the SSD1309, SPI and I2C class stubs are provided, and extension to custom interfaces is encouraged. For a complete solution also download a end-point library that depends on this library. 7 | category=Device Control 8 | url=https://github.com/sparkfun/HyperDisplay_SSD1309_ArduinoLibrary 9 | architectures=* 10 | depends=SparkFun HyperDisplay -------------------------------------------------------------------------------- /src/HyperDisplay_SSD1309.cpp: -------------------------------------------------------------------------------- 1 | #include "HyperDisplay_SSD1309.h" 2 | 3 | const SSD1309_Bite_t ON = { 0x01 }; 4 | const SSD1309_Bite_t OFF = { 0x00 }; 5 | 6 | SSD1309::SSD1309(uint16_t xSize, uint16_t ySize, SSD1309_Intfc_t interface) : hyperdisplay(xSize, ySize) 7 | { 8 | _intfc = interface; 9 | _needsRefresh = false; 10 | _pgRefStart = 0; 11 | _pgRefEnd = 0; 12 | _colRefStart = 0; 13 | _colRefEnd = 0; 14 | } 15 | 16 | 17 | //////////////////////////////////////////////////////////// 18 | // Display Interface Functions // 19 | //////////////////////////////////////////////////////////// 20 | /* 21 | 22 | SSD1309_Status_t writeBytes(uint8_t * pdata, bool DATAcmd, uint32_t numBytes) = 0; // Pure virtual 23 | SSD1309_Status_t selectDriver( void ); // Optional virtual 24 | SSD1309_Status_t deselectDriver( void ); // Optional virtual 25 | 26 | */ 27 | SSD1309_Status_t SSD1309::selectDriver( void ){ return SSD1309_NotImplemented; } // Default implementation is 'empty' (rather 'inconsequential') so that the compiler may optimize it away 28 | SSD1309_Status_t SSD1309::deselectDriver( void ){ return SSD1309_NotImplemented; } // Default implementation is 'empty' (rather 'inconsequential') so that the compiler may optimize it away 29 | 30 | 31 | //////////////////////////////////////////////////////////// 32 | // Internal Utility Funcs // 33 | //////////////////////////////////////////////////////////// 34 | /* 35 | 36 | color_t getOffsetColor(color_t base, uint32_t numPixels); // (required by hyperdisplay) 37 | 38 | */ 39 | color_t SSD1309::getOffsetColor(color_t base, uint32_t numPixels) 40 | { 41 | // For the SSD1309 this function will depend on the current window if it is available 42 | wind_info_t* pwindow = pCurrentWindow; 43 | if(pwindow != NULL){ 44 | SSD1309_Bite_t* mirror = (SSD1309_Bite_t*)pwindow->data; 45 | if(mirror != NULL){ 46 | // Assume left->right top->bottom for full window width 47 | uint8_t window_width = (pwindow->xMax - pwindow->xMin + 1); 48 | uint8_t x = numPixels % window_width; 49 | uint8_t y = numPixels / window_width; 50 | uint8_t temp = (*(mirror + ((window_width * (y/8)) + x))).bite; 51 | if(temp & (0x01 << (y % 8))){ 52 | return (color_t)0x01; 53 | }else{ 54 | return (color_t)0x00; 55 | } 56 | }else{ 57 | return base; // Also be dumb when there is no mirror data 58 | } 59 | }else{ 60 | // When little information available fall back to 'dumb' implementation 61 | return base; 62 | } 63 | return base; 64 | } 65 | 66 | SSD1309_Status_t SSD1309::refreshDisplay( void ) 67 | { 68 | if(!_needsRefresh){ return SSD1309_NoRefresh; } 69 | 70 | // This function is used to re-send the most up-to-date RAM information to just a few memory locations (rather than the whole screen every time...) 71 | // Compute where to start in the ram array and how many bytes to send out: 72 | size_t offset = (SSD1309_MAX_WIDTH * _pgRefStart) + _colRefStart; 73 | size_t numBytes = (_colRefEnd - _colRefStart + 1) + ((_pgRefEnd - _pgRefStart) * SSD1309_MAX_WIDTH); 74 | 75 | // Setup the write 76 | setMemoryAddressingMode( 0x00 ); // Horizontal Addressing Mode 77 | setColumnAddress((uint8_t)_colRefStart, (uint8_t)_colRefEnd); 78 | setPageAddress((uint8_t)_pgRefStart, (uint8_t)_pgRefEnd); 79 | 80 | // Transmit the bytes 81 | writeBytes((uint8_t*)(ramMirror + offset), true, numBytes); 82 | 83 | _needsRefresh = false; 84 | return SSD1309_Nominal; 85 | } 86 | 87 | SSD1309_Status_t SSD1309::updateRefreshZone( hd_hw_extent_t colStart, hd_hw_extent_t colEnd, hd_hw_extent_t rowStart, hd_hw_extent_t rowEnd ) 88 | { 89 | hd_hw_extent_t pgEnd = rowEnd / 8; // Convert to pages 90 | hd_hw_extent_t pgStart = rowStart / 8; 91 | if(_needsRefresh){ 92 | // A refresh is pending from some other operation: 93 | // Take the largest bounds 94 | _pgRefStart = min(_pgRefStart, pgStart); 95 | _pgRefEnd = max(_pgRefEnd, pgEnd); 96 | _colRefStart = min(_colRefStart, colStart); 97 | _colRefEnd = max(_colRefEnd, colEnd); 98 | }else{ 99 | _pgRefStart = pgStart; 100 | _pgRefEnd = pgEnd; 101 | _colRefStart = colStart; 102 | _colRefEnd = colEnd; 103 | } 104 | _needsRefresh = true; 105 | return SSD1309_Nominal; 106 | } 107 | 108 | 109 | SSD1309_Status_t SSD1309::setMirrorPixel(hd_hw_extent_t x, hd_hw_extent_t y) 110 | { 111 | uint8_t temp = (*(ramMirror + ((SSD1309_MAX_WIDTH * (y/8)) + x))).bite; 112 | temp |= (0x01 << (y % 8)); 113 | (*(ramMirror + ((SSD1309_MAX_WIDTH * (y/8)) + x))).bite = temp; 114 | return SSD1309_Nominal; 115 | } 116 | 117 | SSD1309_Status_t SSD1309::clearMirrorPixel(hd_hw_extent_t x, hd_hw_extent_t y) 118 | { 119 | uint8_t temp = (*(ramMirror + ((SSD1309_MAX_WIDTH * (y/8)) + x))).bite; 120 | temp &= (~(0x01 << (y % 8))); 121 | (*(ramMirror + ((SSD1309_MAX_WIDTH * (y/8)) + x))).bite = temp; 122 | return SSD1309_Nominal; 123 | } 124 | 125 | SSD1309_Status_t SSD1309::setWindowPixel(hd_hw_extent_t x, hd_hw_extent_t y, wind_info_t* pwindow) 126 | { 127 | pwindow = (pwindow == NULL) ? pCurrentWindow : pwindow; // Fall back to current window if not secified 128 | if(pwindow->data == NULL){ return SSD1309_Error; } 129 | 130 | SSD1309_Bite_t* windowMirror = (SSD1309_Bite_t*)pwindow->data; 131 | uint8_t temp = (*(windowMirror + (((pwindow->xMax - pwindow->xMin) * (y/8)) + x))).bite; 132 | temp |= (0x01 << (y % 8)); 133 | (*(windowMirror + (((pwindow->xMax - pwindow->xMin) * (y/8)) + x))).bite = temp; 134 | return SSD1309_Nominal; 135 | } 136 | 137 | SSD1309_Status_t SSD1309::clearWindowPixel(hd_hw_extent_t x, hd_hw_extent_t y, wind_info_t* pwindow) 138 | { 139 | pwindow = (pwindow == NULL) ? pCurrentWindow : pwindow; // Fall back to current window if not secified 140 | if(pwindow->data == NULL){ return SSD1309_Error; } 141 | 142 | SSD1309_Bite_t* windowMirror = (SSD1309_Bite_t*)pwindow->data; 143 | uint8_t temp = (*(windowMirror + (((pwindow->xMax - pwindow->xMin) * (y/8)) + x))).bite; 144 | temp &= (~(0x01 << (y % 8))); 145 | (*(windowMirror + (((pwindow->xMax - pwindow->xMin) * (y/8)) + x))).bite = temp; 146 | return SSD1309_Nominal; 147 | } 148 | 149 | 150 | //////////////////////////////////////////////////////////// 151 | // Hyperdisplay API // 152 | //////////////////////////////////////////////////////////// 153 | /* 154 | // void hwpixel(hd_hw_extent_t x0, hd_hw_extent_t y0, color_t data = NULL, hd_colors_t colorCycleLength = 1, hd_colors_t startColorOffset = 0); 155 | // void hwxline(hd_hw_extent_t x0, hd_hw_extent_t y0, hd_hw_extent_t len, color_t data = NULL, hd_colors_t colorCycleLength = 1, hd_colors_t startColorOffset = 0, bool goLeft = false); 156 | // void hwyline(hd_hw_extent_t x0, hd_hw_extent_t y0, hd_hw_extent_t len, color_t data = NULL, hd_colors_t colorCycleLength = 1, hd_colors_t startColorOffset = 0, bool goUp = false); 157 | // void hwrectangle(hd_hw_extent_t x0, hd_hw_extent_t y0, hd_hw_extent_t x1, hd_hw_extent_t y1, bool filled = false, color_t data = NULL, hd_colors_t colorCycleLength = 1, hd_colors_t startColorOffset = 0, bool reverseGradient = false, bool gradientVertical = false); 158 | // void hwfillFromArray(hd_hw_extent_t x0, hd_hw_extent_t y0, hd_hw_extent_t x1, hd_hw_extent_t y1, color_t data = NULL, hd_pixels_t numPixels = 0, bool Vh = false ); 159 | */ 160 | void SSD1309::hwpixel(hd_hw_extent_t x0, hd_hw_extent_t y0, color_t data, hd_colors_t colorCycleLength, hd_colors_t startColorOffset) 161 | { 162 | if(colorCycleLength == 0){ return; } 163 | 164 | startColorOffset = getNewColorOffset(colorCycleLength, startColorOffset, 0); // This line is needed to condition the user's input start color offset because it could be greater than the cycle length 165 | color_t value = getOffsetColor(data, startColorOffset); 166 | 167 | // If value is either 0 or 1 then interpret it as a direct value... 168 | if((uint32_t)data == 0x00){ 169 | value = (color_t)&OFF; 170 | } 171 | if((uint32_t)data == 0x01){ 172 | value = (color_t)&ON; 173 | } 174 | 175 | SSD1309_Bite_t user = *((SSD1309_Bite_t*)value); 176 | if(user.b0){ // Check if the user's bit is set or not (this implies that the user should always set bit 0 of a 'bite' to the pixel value they want) 177 | // Need to set the pixel high 178 | setMirrorPixel(x0, y0); 179 | }else{ 180 | // Need to clear the pixel 181 | clearMirrorPixel(x0, y0); 182 | } 183 | updateRefreshZone( x0, x0, y0, y0); // Tell where we need updates 184 | refreshDisplay(); // Perform updates 185 | } 186 | 187 | // void SSD1309::hwxline(hd_hw_extent_t x0, hd_hw_extent_t y0, hd_hw_extent_t len, color_t data, hd_colors_t colorCycleLength, hd_colors_t startColorOffset, bool goLeft) 188 | // { 189 | // if(colorCycleLength == 0){ return; } 190 | 191 | // startColorOffset = getNewColorOffset(colorCycleLength, startColorOffset, 0); // This line is needed to condition the user's input start color offset because it could be greater than the cycle length 192 | // color_t value = getOffsetColor(data, startColorOffset); 193 | 194 | // if(goLeft) 195 | // { 196 | // for(hd_hw_extent_t indi = 0; indi < len; indi++) 197 | // { 198 | // SSD1309_Bite_t user = *((SSD1309_Bite_t*)value); 199 | // if(user.b0){ setMirrorPixel(x0 - indi, y0); } 200 | // else{ clearMirrorPixel(x0 - indi, y0); } 201 | // // updateRefreshZone( x0 - indi, x0, y0, y0); 202 | // // startColorOffset = getNewColorOffset(colorCycleLength, startColorOffset, 1); 203 | // // value = getOffsetColor(data, startColorOffset); 204 | // } 205 | // updateRefreshZone( x0 - len + 1, x0, y0, y0); 206 | // } 207 | // else 208 | // { 209 | // for(hd_hw_extent_t indi = 0; indi < len; indi++) 210 | // { 211 | // SSD1309_Bite_t user = *((SSD1309_Bite_t*)value); 212 | // if(user.b0){ setMirrorPixel(x0 + indi, y0); } 213 | // else{ clearMirrorPixel(x0 + indi, y0); } 214 | // // updateRefreshZone( x0, x0 + indi, y0, y0); 215 | // // startColorOffset = getNewColorOffset(colorCycleLength, startColorOffset, 1); 216 | // // value = getOffsetColor(data, startColorOffset); 217 | // } 218 | // updateRefreshZone( x0, x0 + len - 1, y0, y0); 219 | // } 220 | // refreshDisplay(); // Perform updates 221 | // } 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | // void SSD1309::hwyline(hd_hw_extent_t x0, hd_hw_extent_t y0, hd_hw_extent_t len, color_t data, hd_colors_t colorCycleLength, hd_colors_t startColorOffset, bool goUp) 235 | // { 236 | // // To implement this consider writing 0xFF bytes into a single column 237 | // } 238 | 239 | // Implementation of swpixel for SSD1309 240 | void SSD1309::swpixel( hd_extent_t x0, hd_extent_t y0, color_t data, hd_colors_t colorCycleLength, hd_colors_t startColorOffset) 241 | { 242 | if(data == NULL){ return; } 243 | if(colorCycleLength == 0){ return; } 244 | 245 | startColorOffset = getNewColorOffset(colorCycleLength, startColorOffset, 0); // This line is needed to condition the user's input start color offset because it could be greater than the cycle length 246 | // color_t value = getOffsetColor(data, startColorOffset); 247 | color_t value = data; // have to skip color sequences in buffered writing mode 248 | 249 | hd_hw_extent_t x0w = (hd_hw_extent_t)x0; // Cast to hw extent type to be sure of integer values 250 | hd_hw_extent_t y0w = (hd_hw_extent_t)y0; 251 | 252 | SSD1309_Bite_t user = *((SSD1309_Bite_t*)value); 253 | if(user.b0){ // Check if the user's bit is set or not (this implies that the user should always set bit 0 of a 'bite' to the pixel value they want) 254 | // Need to set the pixel high 255 | setWindowPixel(x0w, y0w, pCurrentWindow); 256 | }else{ 257 | // Need to clear the pixel 258 | clearWindowPixel(x0w, y0w, pCurrentWindow); 259 | } 260 | // updateRefreshZone( x0, x0, y0, y0); // Tell where we need updates 261 | // refreshDisplay(); // Perform updates 262 | } 263 | 264 | // Functions that don't need color arguments, for simplicity. 265 | 266 | void SSD1309::setWindowColorSet(wind_info_t* pwindow){ 267 | if(pwindow == NULL){ 268 | setWindowColorSequence(pCurrentWindow, (color_t)(&colorSet)); 269 | } 270 | else{ 271 | setWindowColorSequence(pwindow, (color_t)(&colorSet)); 272 | } 273 | } 274 | 275 | void SSD1309::setWindowColorClear(wind_info_t* pwindow){ 276 | if(pwindow == NULL){ 277 | setWindowColorSequence(pCurrentWindow, (color_t)(&colorClear)); 278 | } 279 | else{ 280 | setWindowColorSequence(pwindow, (color_t)(&colorClear)); 281 | } 282 | } 283 | 284 | void SSD1309::windowSet(wind_info_t* pwindow) 285 | { 286 | wind_info_t* ptemp = NULL; 287 | SSD1309_Bite_t pix; 288 | pix.bite = 0xFF; 289 | 290 | if(pwindow != NULL){ ptemp = pCurrentWindow; pCurrentWindow = pwindow; } // Store current window and change to the desired window 291 | fillWindow((color_t)&pix); 292 | if(ptemp != NULL){ pCurrentWindow = ptemp; } // Restore the old window, if needed 293 | } 294 | 295 | void SSD1309::windowClear(wind_info_t* pwindow) 296 | { 297 | wind_info_t* ptemp = NULL; 298 | SSD1309_Bite_t pix; 299 | pix.bite = 0x00; 300 | 301 | if(pwindow != NULL){ ptemp = pCurrentWindow; pCurrentWindow = pwindow; } // Store current window and change to the desired window 302 | fillWindow((color_t)&pix); 303 | if(ptemp != NULL){ pCurrentWindow = ptemp; } // Restore the old window, if needed 304 | } 305 | 306 | 307 | 308 | void SSD1309::pixelSet(hd_extent_t x0, hd_extent_t y0) 309 | { 310 | SSD1309_Bite_t pix; 311 | pix.bite = 0xFF; 312 | pixel(x0, y0, (color_t)&pix); 313 | } 314 | 315 | void SSD1309::pixelClear(hd_extent_t x0, hd_extent_t y0) 316 | { 317 | SSD1309_Bite_t pix; 318 | pix.bite = 0x00; 319 | pixel(x0, y0, (color_t)&pix); 320 | } 321 | 322 | void SSD1309::rectangleSet(hd_extent_t x0, hd_extent_t y0, hd_extent_t x1, hd_extent_t y1, bool filled) 323 | { 324 | SSD1309_Bite_t pix; 325 | pix.bite = 0xFF; 326 | rectangle( x0, y0, x1, y1, filled, (color_t)&pix); 327 | } 328 | 329 | void SSD1309::rectangleClear(hd_extent_t x0, hd_extent_t y0, hd_extent_t x1, hd_extent_t y1, bool filled) 330 | { 331 | SSD1309_Bite_t pix; 332 | pix.bite = 0x00; 333 | rectangle( x0, y0, x1, y1, filled, (color_t)&pix); 334 | } 335 | 336 | #if HYPERDISPLAY_DRAWING_LEVEL > 0 337 | void SSD1309::lineSet(hd_extent_t x0, hd_extent_t y0, hd_extent_t x1, hd_extent_t y1, uint16_t width) 338 | { 339 | SSD1309_Bite_t pix; 340 | pix.bite = 0xFF; 341 | line( x0, y0, x1, y1, width, (color_t)&pix); 342 | } 343 | 344 | void SSD1309::lineClear(hd_extent_t x0, hd_extent_t y0, hd_extent_t x1, hd_extent_t y1, uint16_t width) 345 | { 346 | SSD1309_Bite_t pix; 347 | pix.bite = 0x00; 348 | } 349 | 350 | void SSD1309::polygonSet(hd_extent_t x[], hd_extent_t y[], uint8_t numSides, uint16_t width) 351 | { 352 | SSD1309_Bite_t pix; 353 | pix.bite = 0xFF; 354 | polygon( x, y, numSides, width, (color_t)&pix); 355 | } 356 | 357 | void SSD1309::polygonClear(hd_extent_t x[], hd_extent_t y[], uint8_t numSides, uint16_t width) 358 | { 359 | SSD1309_Bite_t pix; 360 | pix.bite = 0x00; 361 | polygon( x, y, numSides, width, (color_t)&pix); 362 | } 363 | 364 | void SSD1309::circleSet(hd_extent_t x0, hd_extent_t y0, hd_extent_t radius, bool filled) 365 | { 366 | SSD1309_Bite_t pix; 367 | pix.bite = 0xFF; 368 | circle( x0, y0, radius, filled, (color_t)&pix); 369 | } 370 | 371 | void SSD1309::circleClear(hd_extent_t x0, hd_extent_t y0, hd_extent_t radius, bool filled) 372 | { 373 | SSD1309_Bite_t pix; 374 | pix.bite = 0x00; 375 | circle( x0, y0, radius, filled, (color_t)&pix); 376 | } 377 | #endif /* HYPERDISPLAY_DRAWING_LEVEL > 0 */ 378 | 379 | 380 | 381 | //////////////////////////////////////////////////////////// 382 | // SSD1309 Settings // 383 | //////////////////////////////////////////////////////////// 384 | /* 385 | 386 | SSD1309_Status_t setContrastControl(uint8_t val); 387 | SSD1309_Status_t overrideRam(bool on); 388 | SSD1309_Status_t setInversion(bool on); 389 | SSD1309_Status_t setPower(bool on); 390 | SSD1309_Status_t nop( void ); 391 | SSD1309_Status_t setCommandLock(bool on); 392 | 393 | // Scrolling Command Table 394 | SSD1309_Status_t contHScrollSetupRight(uint8_t PSA, uint8_t interval, uint8_t PEA, uint8_t CSA, uint8_t CEA); 395 | SSD1309_Status_t contHScrollSetupLeft(uint8_t PSA, uint8_t interval, uint8_t PEA, uint8_t CSA, uint8_t CEA); 396 | SSD1309_Status_t contVHScrollSetupRight(bool horiz, uint8_t PSA, uint8_t interval, uint8_t PEA, uint8_t CSA, uint8_t CEA); 397 | SSD1309_Status_t contVHScrollSetupLeft(bool horiz, uint8_t PSA, uint8_t interval, uint8_t PEA, uint8_t CSA, uint8_t CEA); 398 | SSD1309_Status_t setScroll(bool on); 399 | SSD1309_Status_t setVScrollArea(uint8_t TFA, uint8_t SA); 400 | SSD1309_Status_t contentScrollSetupRight(uint8_t PSA, uint8_t PEA, uint8_t CSA, uint8_t CEA); 401 | SSD1309_Status_t contentScrollSetupLeft(uint8_t PSA, uint8_t PEA, uint8_t CSA, uint8_t CEA); 402 | 403 | // Addressing Setting Command Table 404 | SSD1309_Status_t setLowCSAinPAM( uint8_t low ); // Note: this command should be OR'd with the desired Page Address Mode Lower Nibble of Column Start Address when it is sent 405 | SSD1309_Status_t setHighCSAinPAM( uint8_t high ); // This command also OR'd with the high nibble... 406 | SSD1309_Status_t setMemoryAddressingMode( uint8_t mode ); // Only for horizontal or vertical addressing mode... 407 | SSD1309_Status_t setColumnAddress(uint8_t CSA, uint8_t CEA); 408 | SSD1309_Status_t setPageAddress(uint8_t PSA, uint8_t PEA); 409 | SSD1309_Status_t setPSAinPAM( uint8_t PSA ); // Note: OR this with 3 Least Significant bits that represent the page start address 410 | SSD1309_Status_t setDisplayStartLine( uint8_t DSL ); // Note: OR this with 6 Least Significant Bits that represent the display start line 411 | SSD1309_Status_t setSegmentMapping(bool flipped); 412 | SSD1309_Status_t setMultiplexRatio( uint8_t MUXR); 413 | SSD1309_Status_t setCOMoutputDirection(bool flipped); 414 | SSD1309_Status_t setDisplayOffset(uint8_t OFST); 415 | SSD1309_Status_t setCOMpinsHWconfig(uint8_t CONF); 416 | SSD1309_Status_t setGPIO(uint8_t SET); 417 | 418 | // Timing and Driving Scheme Setting Command Table 419 | SSD1309_Status_t setDisplayClockDivideRatio(uint8_t FREQ); 420 | SSD1309_Status_t setPreChargePeriod(uint8_t PER); 421 | SSD1309_Status_t setVCOMHdeselectLevel(uint8_t LVL); 422 | 423 | */ 424 | SSD1309_Status_t SSD1309::setContrastControl(uint8_t val) 425 | { 426 | uint8_t buff[2] = { 427 | SSD1309_CMD_setContrastControl, 428 | val, 429 | }; 430 | selectDriver(); 431 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 432 | deselectDriver(); 433 | return retval; 434 | } 435 | 436 | SSD1309_Status_t SSD1309::overrideRam(bool on) 437 | { 438 | uint8_t buff[1] = { 439 | SSD1309_CMD_followRAMcontent 440 | }; 441 | if(on){ buff[0] = SSD1309_CMD_allPixelsOn; } 442 | selectDriver(); 443 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 444 | deselectDriver(); 445 | return retval; 446 | } 447 | 448 | SSD1309_Status_t SSD1309::setInversion(bool on) 449 | { 450 | uint8_t buff[1] = { 451 | SSD1309_CMD_inversionOff 452 | }; 453 | if(on){ buff[0] = SSD1309_CMD_inversionOn; } 454 | selectDriver(); 455 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 456 | deselectDriver(); 457 | return retval; 458 | } 459 | 460 | SSD1309_Status_t SSD1309::setPower(bool on) 461 | { 462 | uint8_t buff[1] = { 463 | SSD1309_CMD_pwrOff 464 | }; 465 | if(on){ buff[0] = SSD1309_CMD_pwrOn; } 466 | selectDriver(); 467 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 468 | deselectDriver(); 469 | return retval; 470 | } 471 | 472 | SSD1309_Status_t SSD1309::nop( void ) 473 | { 474 | uint8_t buff[1] = { 475 | SSD1309_CMD_nop 476 | }; 477 | selectDriver(); 478 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 479 | deselectDriver(); 480 | return retval; 481 | } 482 | 483 | SSD1309_Status_t SSD1309::setCommandLock(bool on) 484 | { 485 | uint8_t buff[2] = { 486 | SSD1309_CMD_setCommandLock, 487 | 0x12 488 | }; 489 | if(on){ buff[1] |= 0x04; } 490 | selectDriver(); 491 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 492 | deselectDriver(); 493 | return retval; 494 | } 495 | 496 | 497 | // Scrolling Command Table 498 | SSD1309_Status_t SSD1309::contHScrollSetupRight(uint8_t PSA, uint8_t interval, uint8_t PEA, uint8_t CSA, uint8_t CEA) 499 | { 500 | uint8_t buff[8] = { 501 | SSD1309_CMD_contHScrollSetupRight, 502 | 0x00, 503 | (uint8_t)(PSA & 0x07), 504 | (uint8_t)(interval & 0x07), 505 | (uint8_t)(PEA & 0x07), 506 | 0x00, 507 | CSA, 508 | CEA 509 | }; 510 | selectDriver(); 511 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 512 | deselectDriver(); 513 | return retval; 514 | } 515 | 516 | SSD1309_Status_t SSD1309::contHScrollSetupLeft(uint8_t PSA, uint8_t interval, uint8_t PEA, uint8_t CSA, uint8_t CEA) 517 | { 518 | uint8_t buff[8] = { 519 | SSD1309_CMD_contHScrollSetupLeft, 520 | 0x00, 521 | (uint8_t)(PSA & 0x07), 522 | (uint8_t)(interval & 0x07), 523 | (uint8_t)(PEA & 0x07), 524 | 0x00, 525 | CSA, 526 | CEA 527 | }; 528 | selectDriver(); 529 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 530 | deselectDriver(); 531 | return retval; 532 | } 533 | 534 | SSD1309_Status_t SSD1309::contVHScrollSetupRight(bool horiz, uint8_t PSA, uint8_t interval, uint8_t PEA, uint8_t CSA, uint8_t CEA) 535 | { 536 | uint8_t buff[8] = { 537 | SSD1309_CMD_contVHScrollSetupRight, 538 | 0x00, 539 | (uint8_t)(PSA & 0x07), 540 | (uint8_t)(interval & 0x07), 541 | (uint8_t)(PEA & 0x07), 542 | 0x00, 543 | CSA, 544 | CEA 545 | }; 546 | selectDriver(); 547 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 548 | deselectDriver(); 549 | return retval; 550 | } 551 | 552 | SSD1309_Status_t SSD1309::contVHScrollSetupLeft(bool horiz, uint8_t PSA, uint8_t interval, uint8_t PEA, uint8_t CSA, uint8_t CEA) 553 | { 554 | uint8_t buff[8] = { 555 | SSD1309_CMD_contVHScrollSetupLeft, 556 | 0x00, 557 | (uint8_t)(PSA & 0x07), 558 | (uint8_t)(interval & 0x07), 559 | (uint8_t)(PEA & 0x07), 560 | 0x00, 561 | CSA, 562 | CEA 563 | }; 564 | selectDriver(); 565 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 566 | deselectDriver(); 567 | return retval; 568 | } 569 | 570 | SSD1309_Status_t SSD1309::setScroll(bool on) 571 | { 572 | uint8_t buff[1] = { 573 | SSD1309_CMD_deactivateScroll 574 | }; 575 | if(on){ buff[0] = SSD1309_CMD_activateScroll; } 576 | selectDriver(); 577 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 578 | deselectDriver(); 579 | return retval; 580 | } 581 | 582 | SSD1309_Status_t SSD1309::setVScrollArea(uint8_t TFA, uint8_t SA) 583 | { 584 | uint8_t buff[3] = { 585 | SSD1309_CMD_setVScrollArea, 586 | (uint8_t)(TFA & 0x3F), 587 | (uint8_t)(SA & 0x7F) 588 | }; 589 | selectDriver(); 590 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 591 | deselectDriver(); 592 | return retval; 593 | } 594 | 595 | SSD1309_Status_t SSD1309::contentScrollSetupRight(uint8_t PSA, uint8_t PEA, uint8_t CSA, uint8_t CEA) 596 | { 597 | uint8_t buff[8] = { 598 | SSD1309_CMD_contentScrollSetupRight, 599 | 0x00, 600 | (uint8_t)(PSA & 0x07), 601 | 0x01, 602 | (uint8_t)(PEA & 0x07), 603 | 0x00, 604 | CSA, 605 | CEA 606 | }; 607 | selectDriver(); 608 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 609 | deselectDriver(); 610 | return retval; 611 | } 612 | 613 | SSD1309_Status_t SSD1309::contentScrollSetupLeft(uint8_t PSA, uint8_t PEA, uint8_t CSA, uint8_t CEA) 614 | { 615 | uint8_t buff[8] = { 616 | SSD1309_CMD_contentScrollSetupLeft, 617 | 0x00, 618 | (uint8_t)(PSA & 0x07), 619 | 0x01, 620 | (uint8_t)(PEA & 0x07), 621 | 0x00, 622 | CSA, 623 | CEA 624 | }; 625 | selectDriver(); 626 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 627 | deselectDriver(); 628 | return retval; 629 | } 630 | 631 | 632 | // Addressing Setting Command Table 633 | SSD1309_Status_t SSD1309::setLowCSAinPAM( uint8_t CSA ) 634 | { // Note: this command should be OR'd with the desired Page Address Mode Lower Nibble of Column Start Address when it is sent 635 | uint8_t buff[1] = { 636 | (uint8_t)(SSD1309_CMD_setLowCSAinPAM | (CSA & 0x0F)) 637 | }; 638 | selectDriver(); 639 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 640 | deselectDriver(); 641 | return retval; 642 | } 643 | 644 | SSD1309_Status_t SSD1309::setHighCSAinPAM( uint8_t CSA ) 645 | { // This command also OR'd with the high nibble... 646 | uint8_t buff[1] = { 647 | (uint8_t)(SSD1309_CMD_setHighCSAinPAM | (CSA >> 4)) 648 | }; 649 | selectDriver(); 650 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 651 | deselectDriver(); 652 | return retval; 653 | } 654 | 655 | SSD1309_Status_t SSD1309::setMemoryAddressingMode( uint8_t mode ) 656 | { 657 | uint8_t buff[2] = { 658 | SSD1309_CMD_setMemoryAddressingMode, 659 | (uint8_t)(mode & 0x03) 660 | }; 661 | selectDriver(); 662 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 663 | deselectDriver(); 664 | return retval; 665 | } 666 | // Only for horizontal or vertical addressing mode... 667 | SSD1309_Status_t SSD1309::setColumnAddress(uint8_t CSA, uint8_t CEA) 668 | { 669 | uint8_t buff[3] = { 670 | SSD1309_CMD_setColumnAddress, 671 | CSA, 672 | CEA 673 | }; 674 | selectDriver(); 675 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 676 | deselectDriver(); 677 | return retval; 678 | } 679 | 680 | SSD1309_Status_t SSD1309::setPageAddress(uint8_t PSA, uint8_t PEA) 681 | { 682 | uint8_t buff[3] = { 683 | SSD1309_CMD_setPageAddress, 684 | (uint8_t)(PSA & 0x07), 685 | (uint8_t)(PEA & 0x07) 686 | }; 687 | selectDriver(); 688 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 689 | deselectDriver(); 690 | return retval; 691 | } 692 | 693 | SSD1309_Status_t SSD1309::setPSAinPAM( uint8_t PSA ) 694 | { // Note: OR this with 3 Least Significant bits that represent the page start address 695 | uint8_t buff[1] = { 696 | (uint8_t)(SSD1309_CMD_setPSAinPAM | (PSA & 0x07)) 697 | }; 698 | selectDriver(); 699 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 700 | deselectDriver(); 701 | return retval; 702 | } 703 | 704 | SSD1309_Status_t SSD1309::setDisplayStartLine( uint8_t DSL ) 705 | { // Note: OR this with 6 Least Significant Bits that represent the display start line 706 | uint8_t buff[1] = { 707 | (uint8_t)(SSD1309_CMD_setDisplayStartLine | (DSL & 0x3F)) 708 | }; 709 | selectDriver(); 710 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 711 | deselectDriver(); 712 | return retval; 713 | } 714 | 715 | SSD1309_Status_t SSD1309::setSegmentMapping(bool flipped) 716 | { 717 | uint8_t buff[1] = { 718 | SSD1309_CMD_setSegmentMapReset 719 | }; 720 | if(flipped){ buff[0] = SSD1309_CMD_setSegmentMapFlipped; } 721 | selectDriver(); 722 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 723 | deselectDriver(); 724 | return retval; 725 | } 726 | 727 | SSD1309_Status_t SSD1309::setMultiplexRatio( uint8_t MUXR) 728 | { 729 | uint8_t buff[2] = { 730 | SSD1309_CMD_setMultiplexRatio, 731 | (uint8_t)(MUXR & 0x3F) 732 | }; 733 | selectDriver(); 734 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 735 | deselectDriver(); 736 | return retval; 737 | } 738 | 739 | SSD1309_Status_t SSD1309::setCOMoutputDirection(bool flipped) 740 | { 741 | uint8_t buff[1] = { 742 | SSD1309_CMD_setCOMoutputNormal 743 | }; 744 | if( flipped ){ buff[0] = SSD1309_CMD_setCOMoutputFlipped; } 745 | selectDriver(); 746 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 747 | deselectDriver(); 748 | return retval; 749 | } 750 | 751 | SSD1309_Status_t SSD1309::setDisplayOffset(uint8_t OFST) 752 | { 753 | uint8_t buff[2] = { 754 | SSD1309_CMD_setDisplayOffset, 755 | (uint8_t)(OFST & 0x3F) 756 | }; 757 | selectDriver(); 758 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 759 | deselectDriver(); 760 | return retval; 761 | } 762 | 763 | SSD1309_Status_t SSD1309::setCOMpinsHWconfig(uint8_t CONF) 764 | { 765 | uint8_t buff[2] = { 766 | SSD1309_CMD_setCOMpinsHWconfig, 767 | (uint8_t)(0x02 | (CONF & 0x30)) 768 | }; 769 | selectDriver(); 770 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 771 | deselectDriver(); 772 | return retval; 773 | } 774 | 775 | SSD1309_Status_t SSD1309::setGPIO(uint8_t SET) 776 | { 777 | uint8_t buff[2] = { 778 | SSD1309_CMD_setGPIO, 779 | (uint8_t)(SET & 0x03) 780 | }; 781 | selectDriver(); 782 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 783 | deselectDriver(); 784 | return retval; 785 | } 786 | 787 | 788 | // Timing and Driving Scheme Setting Command Table 789 | SSD1309_Status_t SSD1309::setDisplayClockDivideRatio(uint8_t FREQ) 790 | { 791 | uint8_t buff[2] = { 792 | SSD1309_CMD_setDisplayClockDivideRatio, 793 | FREQ 794 | }; 795 | selectDriver(); 796 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 797 | deselectDriver(); 798 | return retval; 799 | } 800 | 801 | SSD1309_Status_t SSD1309::setPreChargePeriod(uint8_t PER) 802 | { 803 | uint8_t buff[2] = { 804 | SSD1309_CMD_setPreChargePeriod, 805 | PER 806 | }; 807 | selectDriver(); 808 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 809 | deselectDriver(); 810 | return retval; 811 | } 812 | 813 | SSD1309_Status_t SSD1309::setVCOMHdeselectLevel(uint8_t LVL) 814 | { 815 | uint8_t buff[2] = { 816 | SSD1309_CMD_setVCOMHdeselectLevel, 817 | (uint8_t)(LVL & 0x3C) 818 | }; 819 | selectDriver(); 820 | SSD1309_Status_t retval = writeBytes(buff, false, sizeof(buff)); 821 | deselectDriver(); 822 | return retval; 823 | } 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | //////////////////////////////////////////////////////////// 854 | // SSD1309_Arduino_SPI_OneWay Implementation // 855 | //////////////////////////////////////////////////////////// 856 | SSD1309_Arduino_I2C::SSD1309_Arduino_I2C(uint16_t xSize, uint16_t ySize) : hyperdisplay(xSize, ySize), SSD1309(xSize, ySize, SSD1309_Intfc_I2C) 857 | { 858 | // Find nearest (lower) power of two from the I2C buffer length 859 | _i2cXferLen = nspoti (SSD1309_I2C_BUFFER_LENGTH - 2); // We subtract two because one is for the device address (worst case) and the second is for the control byte. 860 | _rst = SSD1309_ARD_UNUSED_PIN; 861 | } 862 | 863 | //////////////////////////////////////////////////////////// 864 | // Display Interface Functions // 865 | //////////////////////////////////////////////////////////// 866 | SSD1309_Status_t SSD1309_Arduino_I2C::writeBytes(uint8_t * pdata, bool DATAcmd, size_t numBytes) 867 | { 868 | uint8_t addr = SSD1309_BASE_ADDR; 869 | if(_sa0val){ addr |= 0x01; } 870 | 871 | uint16_t retval = (uint16_t)SSD1309_Nominal; 872 | 873 | if(DATAcmd){ 874 | // Data is sent all in a row, using only one device address and control byte header 875 | uint32_t offset = 0; 876 | for(size_t indi = 0; indi < (numBytes / _i2cXferLen); indi++){ 877 | _i2c->beginTransmission(addr); 878 | _i2c->write(0x40); 879 | _i2c->write(pdata, _i2cXferLen); 880 | offset += _i2cXferLen; 881 | if(_i2c->endTransmission()){ 882 | retval |= (uint16_t)SSD1309_Error; 883 | } 884 | } 885 | _i2c->beginTransmission(addr); 886 | _i2c->write(0x40); 887 | _i2c->write((pdata + offset), (numBytes % _i2cXferLen)); 888 | if(_i2c->endTransmission()){ 889 | retval |= (uint16_t)SSD1309_Error; 890 | } 891 | }else{ 892 | // Commands are sent one byte at a time, each with the device address and 0x00 control byte first 893 | for(size_t indi = 0; indi < numBytes; indi++){ 894 | _i2c->beginTransmission(addr); 895 | _i2c->write(0x00); 896 | _i2c->write(*(pdata+indi)); 897 | if(_i2c->endTransmission()){ 898 | retval |= (uint16_t)SSD1309_Error; 899 | } 900 | } 901 | } 902 | return (SSD1309_Status_t)retval; 903 | } 904 | 905 | 906 | 907 | 908 | 909 | 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 | //////////////////////////////////////////////////////////// 923 | // SSD1309_Arduino_SPI_OneWay Implementation // 924 | //////////////////////////////////////////////////////////// 925 | SSD1309_Arduino_SPI::SSD1309_Arduino_SPI(uint16_t xSize, uint16_t ySize) : hyperdisplay(xSize, ySize), SSD1309(xSize, ySize, SSD1309_Intfc_I2C) 926 | { 927 | _rst = SSD1309_ARD_UNUSED_PIN; 928 | } 929 | 930 | //////////////////////////////////////////////////////////// 931 | // Display Interface Functions // 932 | //////////////////////////////////////////////////////////// 933 | SSD1309_Status_t SSD1309_Arduino_SPI::writeBytes(uint8_t * pdata, bool DATAcmd, size_t numBytes) 934 | { 935 | uint8_t addr = SSD1309_BASE_ADDR; // Not used in SPI mode but still set for good practice 936 | 937 | SSD1309_Status_t retval = SSD1309_Nominal; 938 | 939 | _spi->beginTransaction(SPISettings(UG2856KLBAG01_SPI_FREQ_MAX, UG2856KLBAG01_SPI_ORDER, UG2856KLBAG01_SPI_MODE)); 940 | 941 | if(DATAcmd){ 942 | // In SPI mode data is indicated by the state of the _dc line so no control bytes are needed 943 | digitalWrite(_dc, HIGH); 944 | for(size_t indi = 0; indi < numBytes; indi++){ 945 | selectDriver(); 946 | _spi->transfer(*(pdata + indi)); 947 | deselectDriver(); 948 | } 949 | }else{ 950 | // In SPI mode commands are indicated by the _dc line state, so no control bytes are needed 951 | digitalWrite(_dc, LOW); 952 | for(size_t indi = 0; indi < numBytes; indi++){ 953 | selectDriver(); 954 | _spi->transfer(*(pdata + indi)); 955 | deselectDriver(); 956 | } 957 | } 958 | _spi->endTransaction(); 959 | digitalWrite(_dc, HIGH); 960 | return SSD1309_Nominal; 961 | } 962 | 963 | SSD1309_Status_t SSD1309_Arduino_SPI::selectDriver( void ){ 964 | digitalWrite(_cs, LOW); 965 | return SSD1309_Nominal; 966 | } 967 | SSD1309_Status_t SSD1309_Arduino_SPI::deselectDriver( void ){ 968 | digitalWrite(_cs, HIGH); 969 | return SSD1309_Nominal; 970 | } -------------------------------------------------------------------------------- /src/HyperDisplay_SSD1309.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | A library to control SSD1309 OLED drivers, derived from the SparkFun HyperDisplay library 4 | 5 | Created: August 2018 6 | Modified: August 2018 7 | 8 | Authors: Owen Lyke 9 | 10 | */ 11 | 12 | #ifndef HYPERDISPLAY_SSD1309_H 13 | #define HYPERDISPLAY_SSD1309_H 14 | 15 | 16 | //////////////////////////////////////////////////////////// 17 | // Includes // 18 | //////////////////////////////////////////////////////////// 19 | #include "hyperdisplay.h" // Inherit drawing functions from this library 20 | #include "Arduino.h" 21 | #include "Wire.h" // Arduino I2C support 22 | #include "SPI.h" // Arduino SPI support 23 | 24 | //////////////////////////////////////////////////////////// 25 | // Defines // 26 | //////////////////////////////////////////////////////////// 27 | #define SSD1309_MAX_WIDTH 128 28 | #define SSD1309_MAX_HEIGHT 64 29 | #define SSD1309_START_ROW 0 30 | #define SSD1309_START_COL 0 31 | #define SSD1309_START_PG 0 32 | #define SSD1309_STOP_ROW 63 33 | #define SSD1309_STOP_COL 127 34 | #define SSD1309_STOP_PG 7 35 | 36 | #define SSD1309_RAM_BYTES (SSD1309_MAX_WIDTH*(SSD1309_MAX_HEIGHT/8)) 37 | 38 | // #define SSD1309_DEFAULT_WORKING_NUM_BYTES 2*64 39 | 40 | 41 | 42 | template 43 | T nspoti(T i1){ // Nearest smaller power of two for integers 44 | T retval = i1; // Be explicit about passing by value 45 | T bytesize = sizeof( T ); // Number of bytes (assuming 8 bits) that the type occupies 46 | retval--; // In case we start on a power of two 47 | if(retval == 0){ return 0; } 48 | if(bytesize > 0){ 49 | retval |= (retval >> 1); 50 | retval |= (retval >> 2); 51 | retval |= (retval >> 4); 52 | } 53 | if(bytesize > 1){ 54 | retval |= (retval >> 8); 55 | } 56 | if(bytesize > 3){ 57 | retval |= (retval >> 16); 58 | } 59 | if(bytesize > 4){ 60 | return 0; 61 | } 62 | retval++; // This will carry a one into the next highest bit - we now have the nearest greater power of two (thanks http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2Float) 63 | retval = retval >> 1; // This divides by two to get the nearest lower power of two 64 | // retval += (retval == 0); // If you needed you could add this line to make sure that 0 is not returned 65 | return retval; 66 | } 67 | 68 | 69 | 70 | //////////////////////////////////////////////////////////// 71 | // Typedefs // 72 | //////////////////////////////////////////////////////////// 73 | typedef enum{ 74 | SSD1309_Nominal = 0, 75 | SSD1309_Error, 76 | SSD1309_NoRefresh, 77 | SSD1309_NotImplemented, 78 | 79 | SSD1309_NumStatus 80 | }SSD1309_Status_t; 81 | 82 | typedef enum{ 83 | SSD1309_Intfc_4WSPI = 0, 84 | SSD1309_Intfc_3WSPI, 85 | SSD1309_Intfc_I2C, 86 | SSD1309_Intfc_8080, 87 | SSD1309_Intfc_6800, 88 | }SSD1309_Intfc_t; // This lists the possible interface modes of the SSD1309. The mode is selected by strapping pins BS[2:0] and the binary representations of these enum values corresponds to those strapping pins 89 | 90 | typedef union{ 91 | struct{ 92 | uint8_t b0 : 1; // Bit 0 93 | uint8_t b1 : 1; // Bit 1 94 | uint8_t b2 : 1; // Bit 2 95 | uint8_t b3 : 1; // Bit 3 96 | uint8_t b4 : 1; // Bit 4 97 | uint8_t b5 : 1; // Bit 5 98 | uint8_t b6 : 1; // Bit 6 99 | uint8_t b7 : 1; // Bit 7 100 | }; 101 | uint8_t bite; // All bits arranged in order 102 | }SSD1309_Bite_t; // The basic (minimal) type that holds pixel information 103 | 104 | typedef enum{ 105 | // Fundamental Commands 106 | SSD1309_CMD_setContrastControl = 0x81, 107 | SSD1309_CMD_followRAMcontent = 0xA4, 108 | SSD1309_CMD_allPixelsOn = 0xA5, 109 | SSD1309_CMD_inversionOff = 0xA6, 110 | SSD1309_CMD_inversionOn = 0xA7, 111 | SSD1309_CMD_pwrOff = 0xAE, 112 | SSD1309_CMD_pwrOn = 0xAF, 113 | SSD1309_CMD_nop = 0xE3, 114 | SSD1309_CMD_setCommandLock = 0xFD, 115 | 116 | // Scrolling Command Table 117 | SSD1309_CMD_contHScrollSetupRight = 0x26, 118 | SSD1309_CMD_contHScrollSetupLeft = 0x27, 119 | SSD1309_CMD_contVHScrollSetupRight = 0x29, 120 | SSD1309_CMD_contVHScrollSetupLeft = 0x2A, 121 | SSD1309_CMD_deactivateScroll = 0x2E, 122 | SSD1309_CMD_activateScroll = 0x2F, 123 | SSD1309_CMD_setVScrollArea = 0xA3, 124 | SSD1309_CMD_contentScrollSetupRight = 0x2C, 125 | SSD1309_CMD_contentScrollSetupLeft = 0x2D, 126 | 127 | // Addressing Setting Command Table 128 | SSD1309_CMD_setLowCSAinPAM = 0x00, // Note: this command should be OR'd with the desired Page Address Mode Lower Nibble of Column Start Address when it is sent 129 | SSD1309_CMD_setHighCSAinPAM = 0x10, // This command also OR'd with the high nibble... 130 | SSD1309_CMD_setMemoryAddressingMode = 0x20, // Only for horizontal or vertical addressing mode... 131 | SSD1309_CMD_setColumnAddress = 0x21, 132 | SSD1309_CMD_setPageAddress = 0x22, 133 | SSD1309_CMD_setPSAinPAM = 0xB0, // Note: OR this with 3 Least Significant bits that represent the page start address 134 | SSD1309_CMD_setDisplayStartLine = 0x40, // Note: OR this with 6 Least Significant Bits that represent the display start line 135 | SSD1309_CMD_setSegmentMapReset = 0xA0, 136 | SSD1309_CMD_setSegmentMapFlipped = 0xA1, 137 | SSD1309_CMD_setMultiplexRatio = 0xA8, 138 | SSD1309_CMD_setCOMoutputNormal = 0xC0, 139 | SSD1309_CMD_setCOMoutputFlipped = 0xC8, 140 | SSD1309_CMD_setDisplayOffset = 0xD3, 141 | SSD1309_CMD_setCOMpinsHWconfig = 0xDA, 142 | SSD1309_CMD_setGPIO = 0xDC, 143 | 144 | // Timing and Driving Scheme Setting Command Table 145 | SSD1309_CMD_setDisplayClockDivideRatio = 0xD5, 146 | SSD1309_CMD_setPreChargePeriod = 0xD9, 147 | SSD1309_CMD_setVCOMHdeselectLevel = 0xDB, 148 | }SSD1309_Cmd_t; 149 | 150 | //////////////////////////////////////////////////////////// 151 | // Class Definition // 152 | //////////////////////////////////////////////////////////// 153 | class SSD1309 : virtual public hyperdisplay{ 154 | private: 155 | protected: 156 | 157 | SSD1309(uint16_t xSize, uint16_t ySize, SSD1309_Intfc_t interface); 158 | 159 | public: // temporary 160 | 161 | SSD1309_Bite_t ramMirror[(SSD1309_MAX_WIDTH*(SSD1309_MAX_HEIGHT/8))]; // Yes, a screen buffer exists for each display object. Normally this would not fly but a) only 128*64 bits are needed to fill the screen and b) knowledge of the memory contents is required to allow for single pixel access 162 | 163 | SSD1309_Intfc_t _intfc; // The interface mode being used 164 | 165 | bool _needsRefresh; 166 | hd_hw_extent_t _pgRefStart, _pgRefEnd; 167 | hd_hw_extent_t _colRefStart, _colRefEnd; 168 | 169 | // This function defines how you talk to the driver, and it is very implementation-specific (e.g. depends on the interface mode, among others) 170 | virtual SSD1309_Status_t writeBytes(uint8_t * pdata, bool DATAcmd, size_t numBytes) = 0; // Pure virtual forces implementation in derived classes 171 | virtual SSD1309_Status_t selectDriver( void ); // Allows the user to implement a device-select function (does not force you to though) 172 | virtual SSD1309_Status_t deselectDriver( void ); // Allows the user to implement a device-deselect function 173 | 174 | // These are internally available utility functions 175 | color_t getOffsetColor(color_t base, uint32_t numPixels); // (required by hyperdisplay) 176 | SSD1309_Status_t refreshDisplay( void ); 177 | SSD1309_Status_t updateRefreshZone( hd_hw_extent_t colStart, hd_hw_extent_t colEnd, hd_hw_extent_t rowStart, hd_hw_extent_t rowEnd ); 178 | SSD1309_Status_t setMirrorPixel(hd_hw_extent_t x, hd_hw_extent_t y); 179 | SSD1309_Status_t clearMirrorPixel(hd_hw_extent_t x, hd_hw_extent_t y); 180 | SSD1309_Status_t setWindowPixel(hd_hw_extent_t x, hd_hw_extent_t y, wind_info_t* pwindow = NULL); 181 | SSD1309_Status_t clearWindowPixel(hd_hw_extent_t x, hd_hw_extent_t y, wind_info_t* pwindow = NULL); 182 | 183 | public: 184 | 185 | SSD1309_Bite_t colorSet = {0x01}; 186 | SSD1309_Bite_t colorClear = {0x00}; 187 | 188 | // Here is the main API implementation that allows this class to hook into the hyperdisplay library 189 | void hwpixel(hd_hw_extent_t x0, hd_hw_extent_t y0, color_t data = NULL, hd_colors_t colorCycleLength = 1, hd_colors_t startColorOffset = 0); // Single pixel write. Required by hyperdisplay. Uses screen-relative coordinates 190 | // void hwxline(hd_hw_extent_t x0, hd_hw_extent_t y0, hd_hw_extent_t len, color_t data = NULL, hd_colors_t colorCycleLength = 1, hd_colors_t startColorOffset = 0, bool goLeft = false); // More efficient xline imp. Uses screen-relative coordinates 191 | // void hwyline(hd_hw_extent_t x0, hd_hw_extent_t y0, hd_hw_extent_t len, color_t data = NULL, hd_colors_t colorCycleLength = 1, hd_colors_t startColorOffset = 0, bool goUp = false); // More efficient yline imp. Uses screen-relative coordinates 192 | // void hwrectangle(hd_hw_extent_t x0, hd_hw_extent_t y0, hd_hw_extent_t x1, hd_hw_extent_t y1, bool filled = false, color_t data = NULL, hd_colors_t colorCycleLength = 1, hd_colors_t startColorOffset = 0, bool reverseGradient = false, bool gradientVertical = false); // More efficient rectangle imp in window-relative coordinates 193 | // void hwfillFromArray(hd_hw_extent_t x0, hd_hw_extent_t y0, hd_hw_extent_t x1, hd_hw_extent_t y1, color_t data = NULL, hd_pixels_t numPixels = 0, bool Vh = false ); // More efficient fill from array implementation. Uses screen-relative coordinates 194 | 195 | // Buffered drawing API 196 | void swpixel( hd_extent_t x0, hd_extent_t y0, color_t data = NULL, hd_colors_t colorCycleLength = 1, hd_colors_t startColorOffset = 0); 197 | 198 | // Functions that don't need color arguments, for simplicity. 199 | void setWindowColorSet(wind_info_t* pwindow = NULL); 200 | void setWindowColorClear(wind_info_t* pwindow = NULL); 201 | void windowSet(wind_info_t* pwindow = NULL); 202 | void windowClear(wind_info_t* pwindow = NULL); 203 | void pixelSet(hd_extent_t x0, hd_extent_t y0); 204 | void pixelClear(hd_extent_t x0, hd_extent_t y0); 205 | void rectangleSet(hd_extent_t x0, hd_extent_t y0, hd_extent_t x1, hd_extent_t y1, bool filled = false); 206 | void rectangleClear(hd_extent_t x0, hd_extent_t y0, hd_extent_t x1, hd_extent_t y1, bool filled = false); 207 | #if HYPERDISPLAY_DRAWING_LEVEL > 0 208 | void lineSet(hd_extent_t x0, hd_extent_t y0, hd_extent_t x1, hd_extent_t y1, uint16_t width = 1); 209 | void lineClear(hd_extent_t x0, hd_extent_t y0, hd_extent_t x1, hd_extent_t y1, uint16_t width = 1); 210 | void polygonSet(hd_extent_t x[], hd_extent_t y[], uint8_t numSides, uint16_t width = 1); 211 | void polygonClear(hd_extent_t x[], hd_extent_t y[], uint8_t numSides, uint16_t width = 1); 212 | void circleSet(hd_extent_t x0, hd_extent_t y0, hd_extent_t radius, bool filled = false); 213 | void circleClear(hd_extent_t x0, hd_extent_t y0, hd_extent_t radius, bool filled = false); 214 | #endif /* HYPERDISPLAY_DRAWING_LEVEL > 0 */ 215 | 216 | // Here are all of the settings you can change on the SSD1309 - they use the writeBytes API 217 | // Fundamental Commands 218 | SSD1309_Status_t setContrastControl(uint8_t val); 219 | SSD1309_Status_t overrideRam(bool on); 220 | SSD1309_Status_t setInversion(bool on); 221 | SSD1309_Status_t setPower(bool on); 222 | SSD1309_Status_t nop( void ); 223 | SSD1309_Status_t setCommandLock(bool on); 224 | 225 | // Scrolling Command Table 226 | SSD1309_Status_t contHScrollSetupRight(uint8_t PSA, uint8_t interval, uint8_t PEA, uint8_t CSA, uint8_t CEA); 227 | SSD1309_Status_t contHScrollSetupLeft(uint8_t PSA, uint8_t interval, uint8_t PEA, uint8_t CSA, uint8_t CEA); 228 | SSD1309_Status_t contVHScrollSetupRight(bool horiz, uint8_t PSA, uint8_t interval, uint8_t PEA, uint8_t CSA, uint8_t CEA); 229 | SSD1309_Status_t contVHScrollSetupLeft(bool horiz, uint8_t PSA, uint8_t interval, uint8_t PEA, uint8_t CSA, uint8_t CEA); 230 | SSD1309_Status_t setScroll(bool on); 231 | SSD1309_Status_t setVScrollArea(uint8_t TFA, uint8_t SA); 232 | SSD1309_Status_t contentScrollSetupRight(uint8_t PSA, uint8_t PEA, uint8_t CSA, uint8_t CEA); 233 | SSD1309_Status_t contentScrollSetupLeft(uint8_t PSA, uint8_t PEA, uint8_t CSA, uint8_t CEA); 234 | 235 | // Addressing Setting Command Table 236 | SSD1309_Status_t setLowCSAinPAM( uint8_t CSA ); // Note: this command should be OR'd with the desired Page Address Mode Lower Nibble of Column Start Address when it is sent 237 | SSD1309_Status_t setHighCSAinPAM( uint8_t CSA ); // This command also OR'd with the high nibble... 238 | SSD1309_Status_t setMemoryAddressingMode( uint8_t mode ); // Only for horizontal or vertical addressing mode... 239 | SSD1309_Status_t setColumnAddress(uint8_t CSA, uint8_t CEA); 240 | SSD1309_Status_t setPageAddress(uint8_t PSA, uint8_t PEA); 241 | SSD1309_Status_t setPSAinPAM( uint8_t PSA ); // Note: OR this with 3 Least Significant bits that represent the page start address 242 | SSD1309_Status_t setDisplayStartLine( uint8_t DSL ); // Note: OR this with 6 Least Significant Bits that represent the display start line 243 | SSD1309_Status_t setSegmentMapping(bool flipped); 244 | SSD1309_Status_t setMultiplexRatio( uint8_t MUXR); 245 | SSD1309_Status_t setCOMoutputDirection(bool flipped); 246 | SSD1309_Status_t setDisplayOffset(uint8_t OFST); 247 | SSD1309_Status_t setCOMpinsHWconfig(uint8_t CONF); 248 | SSD1309_Status_t setGPIO(uint8_t SET); 249 | 250 | // Timing and Driving Scheme Setting Command Table 251 | SSD1309_Status_t setDisplayClockDivideRatio(uint8_t FREQ); 252 | SSD1309_Status_t setPreChargePeriod(uint8_t PER); 253 | SSD1309_Status_t setVCOMHdeselectLevel(uint8_t LVL); 254 | }; 255 | 256 | 257 | 258 | 259 | //////////////////////////////////////////////////////////// 260 | // Examples of Derived Classes // 261 | //////////////////////////////////////////////////////////// 262 | 263 | /* 264 | 265 | These classes are included as a demonstration of how to use the 266 | SSD1309 superclass to derive more specific implementations. The 267 | SSD1309 class imposes limits based on the maximum dimensions 268 | that the driver can handle (128 x 64) and allows for several 269 | different data bus interfaces. 270 | 271 | Let's consider defining an Arduino I2C class for the 1309 below: 272 | 273 | To create a class for this display we first created a derived 274 | class for Arduino I2C that is derived from SSD1309. This 275 | allowed for definitin of the control pins and an I2C port, as 276 | well as to implement the required (by SSD1309) hooks: 277 | - writeBytes 278 | - selectDrver 279 | - deselectDriver 280 | 281 | The Arduino I2C class has now defined the communication 282 | type but has not constrained the display size and location. 283 | Using a final derived class (based on the WiseChip UG-2856KLBAG01 screen) 284 | these parameters were built-in to the begin function. The begin function 285 | also calls functions to set up the required parameters from the 286 | two main superclasses (hyperdisplay and SSD1309). Additionally 287 | in this final class we implemented the pure-virtual function 288 | 'getCharInfo.' This completes the class so that it is no longer 289 | of an abstract type - this means that you can actually 290 | instantiate an object of this class. 291 | 292 | */ 293 | 294 | 295 | // Here are a few implementation-specific classes that can be used on the appropirate system 296 | #define SSD1309_ARD_UNUSED_PIN 0xFF 297 | 298 | 299 | //////////////////////////////////////////////////////////// 300 | // Arduino I2C Class // 301 | //////////////////////////////////////////////////////////// 302 | 303 | #define SSD1309_BASE_ADDR 0b0111100 // Or this with 0x01 if _sa0val true to get the 7-bit I2C address 304 | 305 | #ifdef BUFFER_LENGTH // For some reason Arduino chose BUFFER_LENGTH to mean the I2C buffer length in Wire.h, so if that is defined we will *assume* thats what it means 306 | #define SSD1309_I2C_BUFFER_LENGTH BUFFER_LENGTH 307 | #else 308 | #define SSD1309_I2C_BUFFER_LENGTH 32 // In case BUFFER_LENGTH is not defined we will fall back to 32 309 | #endif 310 | 311 | class SSD1309_Arduino_I2C: public SSD1309{ // General for use with Arduino using I2C with arbitrary display size 312 | private: 313 | protected: 314 | 315 | SSD1309_Arduino_I2C(uint16_t xSize, uint16_t ySize); // Interface is removed from parameters because it is constrained to I2C in this derived class 316 | 317 | size_t _i2cXferLen; 318 | 319 | uint8_t _rst, _sa0; // Pin definitions 320 | bool _sa0val; 321 | TwoWire * _i2c; // Which I2C port to use 322 | 323 | public: 324 | SSD1309_Status_t writeBytes(uint8_t * pdata, bool DATAcmd, size_t numBytes); 325 | // SSD1309_Status_t selectDriver( void ); 326 | // SSD1309_Status_t deselectDriver( void ); 327 | }; 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | //////////////////////////////////////////////////////////// 339 | // Arduino SPI Class // 340 | //////////////////////////////////////////////////////////// 341 | #define UG2856KLBAG01_SPI_FREQ_MAX 8000000 // once tested up to 10 MHz 342 | #define UG2856KLBAG01_SPI_MODE SPI_MODE3 343 | #define UG2856KLBAG01_SPI_ORDER MSBFIRST 344 | 345 | class SSD1309_Arduino_SPI: public SSD1309{ // General for use with Arduino using I2C with arbitrary display size 346 | private: 347 | protected: 348 | 349 | SSD1309_Arduino_SPI(uint16_t xSize, uint16_t ySize); // Interface is removed from parameters because it is constrained to I2C in this derived class 350 | 351 | uint8_t _rst, _cs, _dc; // Pin definitions 352 | SPIClass * _spi; // Which I2C port to use 353 | 354 | public: 355 | SSD1309_Status_t writeBytes(uint8_t * pdata, bool DATAcmd, size_t numBytes); 356 | SSD1309_Status_t selectDriver( void ); 357 | SSD1309_Status_t deselectDriver( void ); 358 | }; 359 | 360 | 361 | #endif /* HYPERDISPLAY_SSD1309_H */ 362 | --------------------------------------------------------------------------------