Upgraded firmware for Simone Giertz's Every Day Calendar that links an ATProto-powered ESP32, for sync with goals.garden 🌱
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

Initial upload of files and documentation

M 0ff77055 79110705

+3696 -1
+425
LICENSE.CC-BY-SA
··· 1 + Attribution-ShareAlike 4.0 International 2 + 3 + ======================================================================= 4 + 5 + Creative Commons Corporation ("Creative Commons") is not a law firm and 6 + does not provide legal services or legal advice. Distribution of 7 + Creative Commons public licenses does not create a lawyer-client or 8 + other relationship. Creative Commons makes its licenses and related 9 + information available on an "as-is" basis. Creative Commons gives no 10 + warranties regarding its licenses, any material licensed under their 11 + terms and conditions, or any related information. Creative Commons 12 + disclaims all liability for damages resulting from their use to the 13 + fullest extent possible. 14 + 15 + Using Creative Commons Public Licenses 16 + 17 + Creative Commons public licenses provide a standard set of terms and 18 + conditions that creators and other rights holders may use to share 19 + original works of authorship and other material subject to copyright 20 + and certain other rights specified in the public license below. The 21 + following considerations are for informational purposes only, are not 22 + exhaustive, and do not form part of our licenses. 23 + 24 + Considerations for licensors: Our public licenses are 25 + intended for use by those authorized to give the public 26 + permission to use material in ways otherwise restricted by 27 + copyright and certain other rights. Our licenses are 28 + irrevocable. Licensors should read and understand the terms 29 + and conditions of the license they choose before applying it. 30 + Licensors should also secure all rights necessary before 31 + applying our licenses so that the public can reuse the 32 + material as expected. Licensors should clearly mark any 33 + material not subject to the license. This includes other CC- 34 + licensed material, or material used under an exception or 35 + limitation to copyright. More considerations for licensors: 36 + wiki.creativecommons.org/Considerations_for_licensors 37 + 38 + Considerations for the public: By using one of our public 39 + licenses, a licensor grants the public permission to use the 40 + licensed material under specified terms and conditions. If 41 + the licensor's permission is not necessary for any reason--for 42 + example, because of any applicable exception or limitation to 43 + copyright--then that use is not regulated by the license. Our 44 + licenses grant only permissions under copyright and certain 45 + other rights that a licensor has authority to grant. Use of 46 + the licensed material may still be restricted for other 47 + reasons, including because others have copyright or other 48 + rights in the material. A licensor may make special requests, 49 + such as asking that all changes be marked or described. 50 + Although not required by our licenses, you are encouraged to 51 + respect those requests where reasonable. More_considerations 52 + for the public: 53 + wiki.creativecommons.org/Considerations_for_licensees 54 + 55 + ======================================================================= 56 + 57 + Creative Commons Attribution-ShareAlike 4.0 International Public 58 + License 59 + 60 + By exercising the Licensed Rights (defined below), You accept and agree 61 + to be bound by the terms and conditions of this Creative Commons 62 + Attribution-ShareAlike 4.0 International Public License ("Public 63 + License"). To the extent this Public License may be interpreted as a 64 + contract, You are granted the Licensed Rights in consideration of Your 65 + acceptance of these terms and conditions, and the Licensor grants You 66 + such rights in consideration of benefits the Licensor receives from 67 + making the Licensed Material available under these terms and 68 + conditions. 69 + 70 + 71 + Section 1 -- Definitions. 72 + 73 + a. Adapted Material means material subject to Copyright and Similar 74 + Rights that is derived from or based upon the Licensed Material 75 + and in which the Licensed Material is translated, altered, 76 + arranged, transformed, or otherwise modified in a manner requiring 77 + permission under the Copyright and Similar Rights held by the 78 + Licensor. For purposes of this Public License, where the Licensed 79 + Material is a musical work, performance, or sound recording, 80 + Adapted Material is always produced where the Licensed Material is 81 + synched in timed relation with a moving image. 82 + 83 + b. Adapter's License means the license You apply to Your Copyright 84 + and Similar Rights in Your contributions to Adapted Material in 85 + accordance with the terms and conditions of this Public License. 86 + 87 + c. BY-SA Compatible License means a license listed at 88 + creativecommons.org/compatiblelicenses, approved by Creative 89 + Commons as essentially the equivalent of this Public License. 90 + 91 + d. Copyright and Similar Rights means copyright and/or similar rights 92 + closely related to copyright including, without limitation, 93 + performance, broadcast, sound recording, and Sui Generis Database 94 + Rights, without regard to how the rights are labeled or 95 + categorized. For purposes of this Public License, the rights 96 + specified in Section 2(b)(1)-(2) are not Copyright and Similar 97 + Rights. 98 + 99 + e. Effective Technological Measures means those measures that, in the 100 + absence of proper authority, may not be circumvented under laws 101 + fulfilling obligations under Article 11 of the WIPO Copyright 102 + Treaty adopted on December 20, 1996, and/or similar international 103 + agreements. 104 + 105 + f. Exceptions and Limitations means fair use, fair dealing, and/or 106 + any other exception or limitation to Copyright and Similar Rights 107 + that applies to Your use of the Licensed Material. 108 + 109 + g. License Elements means the license attributes listed in the name 110 + of a Creative Commons Public License. The License Elements of this 111 + Public License are Attribution and ShareAlike. 112 + 113 + h. Licensed Material means the artistic or literary work, database, 114 + or other material to which the Licensor applied this Public 115 + License. 116 + 117 + i. Licensed Rights means the rights granted to You subject to the 118 + terms and conditions of this Public License, which are limited to 119 + all Copyright and Similar Rights that apply to Your use of the 120 + Licensed Material and that the Licensor has authority to license. 121 + 122 + j. Licensor means the individual(s) or entity(ies) granting rights 123 + under this Public License. 124 + 125 + k. Share means to provide material to the public by any means or 126 + process that requires permission under the Licensed Rights, such 127 + as reproduction, public display, public performance, distribution, 128 + dissemination, communication, or importation, and to make material 129 + available to the public including in ways that members of the 130 + public may access the material from a place and at a time 131 + individually chosen by them. 132 + 133 + l. Sui Generis Database Rights means rights other than copyright 134 + resulting from Directive 96/9/EC of the European Parliament and of 135 + the Council of 11 March 1996 on the legal protection of databases, 136 + as amended and/or succeeded, as well as other essentially 137 + equivalent rights anywhere in the world. 138 + 139 + m. You means the individual or entity exercising the Licensed Rights 140 + under this Public License. Your has a corresponding meaning. 141 + 142 + 143 + Section 2 -- Scope. 144 + 145 + a. License grant. 146 + 147 + 1. Subject to the terms and conditions of this Public License, 148 + the Licensor hereby grants You a worldwide, royalty-free, 149 + non-sublicensable, non-exclusive, irrevocable license to 150 + exercise the Licensed Rights in the Licensed Material to: 151 + 152 + a. reproduce and Share the Licensed Material, in whole or 153 + in part; and 154 + 155 + b. produce, reproduce, and Share Adapted Material. 156 + 157 + 2. Exceptions and Limitations. For the avoidance of doubt, where 158 + Exceptions and Limitations apply to Your use, this Public 159 + License does not apply, and You do not need to comply with 160 + its terms and conditions. 161 + 162 + 3. Term. The term of this Public License is specified in Section 163 + 6(a). 164 + 165 + 4. Media and formats; technical modifications allowed. The 166 + Licensor authorizes You to exercise the Licensed Rights in 167 + all media and formats whether now known or hereafter created, 168 + and to make technical modifications necessary to do so. The 169 + Licensor waives and/or agrees not to assert any right or 170 + authority to forbid You from making technical modifications 171 + necessary to exercise the Licensed Rights, including 172 + technical modifications necessary to circumvent Effective 173 + Technological Measures. For purposes of this Public License, 174 + simply making modifications authorized by this Section 2(a) 175 + (4) never produces Adapted Material. 176 + 177 + 5. Downstream recipients. 178 + 179 + a. Offer from the Licensor -- Licensed Material. Every 180 + recipient of the Licensed Material automatically 181 + receives an offer from the Licensor to exercise the 182 + Licensed Rights under the terms and conditions of this 183 + Public License. 184 + 185 + b. Additional offer from the Licensor -- Adapted Material. 186 + Every recipient of Adapted Material from You 187 + automatically receives an offer from the Licensor to 188 + exercise the Licensed Rights in the Adapted Material 189 + under the conditions of the Adapter's License You apply. 190 + 191 + c. No downstream restrictions. You may not offer or impose 192 + any additional or different terms or conditions on, or 193 + apply any Effective Technological Measures to, the 194 + Licensed Material if doing so restricts exercise of the 195 + Licensed Rights by any recipient of the Licensed 196 + Material. 197 + 198 + 6. No endorsement. Nothing in this Public License constitutes or 199 + may be construed as permission to assert or imply that You 200 + are, or that Your use of the Licensed Material is, connected 201 + with, or sponsored, endorsed, or granted official status by, 202 + the Licensor or others designated to receive attribution as 203 + provided in Section 3(a)(1)(A)(i). 204 + 205 + b. Other rights. 206 + 207 + 1. Moral rights, such as the right of integrity, are not 208 + licensed under this Public License, nor are publicity, 209 + privacy, and/or other similar personality rights; however, to 210 + the extent possible, the Licensor waives and/or agrees not to 211 + assert any such rights held by the Licensor to the limited 212 + extent necessary to allow You to exercise the Licensed 213 + Rights, but not otherwise. 214 + 215 + 2. Patent and trademark rights are not licensed under this 216 + Public License. 217 + 218 + 3. To the extent possible, the Licensor waives any right to 219 + collect royalties from You for the exercise of the Licensed 220 + Rights, whether directly or through a collecting society 221 + under any voluntary or waivable statutory or compulsory 222 + licensing scheme. In all other cases the Licensor expressly 223 + reserves any right to collect such royalties. 224 + 225 + 226 + Section 3 -- License Conditions. 227 + 228 + Your exercise of the Licensed Rights is expressly made subject to the 229 + following conditions. 230 + 231 + a. Attribution. 232 + 233 + 1. If You Share the Licensed Material (including in modified 234 + form), You must: 235 + 236 + a. retain the following if it is supplied by the Licensor 237 + with the Licensed Material: 238 + 239 + i. identification of the creator(s) of the Licensed 240 + Material and any others designated to receive 241 + attribution, in any reasonable manner requested by 242 + the Licensor (including by pseudonym if 243 + designated); 244 + 245 + ii. a copyright notice; 246 + 247 + iii. a notice that refers to this Public License; 248 + 249 + iv. a notice that refers to the disclaimer of 250 + warranties; 251 + 252 + v. a URI or hyperlink to the Licensed Material to the 253 + extent reasonably practicable; 254 + 255 + b. indicate if You modified the Licensed Material and 256 + retain an indication of any previous modifications; and 257 + 258 + c. indicate the Licensed Material is licensed under this 259 + Public License, and include the text of, or the URI or 260 + hyperlink to, this Public License. 261 + 262 + 2. You may satisfy the conditions in Section 3(a)(1) in any 263 + reasonable manner based on the medium, means, and context in 264 + which You Share the Licensed Material. For example, it may be 265 + reasonable to satisfy the conditions by providing a URI or 266 + hyperlink to a resource that includes the required 267 + information. 268 + 269 + 3. If requested by the Licensor, You must remove any of the 270 + information required by Section 3(a)(1)(A) to the extent 271 + reasonably practicable. 272 + 273 + b. ShareAlike. 274 + 275 + In addition to the conditions in Section 3(a), if You Share 276 + Adapted Material You produce, the following conditions also apply. 277 + 278 + 1. The Adapter's License You apply must be a Creative Commons 279 + license with the same License Elements, this version or 280 + later, or a BY-SA Compatible License. 281 + 282 + 2. You must include the text of, or the URI or hyperlink to, the 283 + Adapter's License You apply. You may satisfy this condition 284 + in any reasonable manner based on the medium, means, and 285 + context in which You Share Adapted Material. 286 + 287 + 3. You may not offer or impose any additional or different terms 288 + or conditions on, or apply any Effective Technological 289 + Measures to, Adapted Material that restrict exercise of the 290 + rights granted under the Adapter's License You apply. 291 + 292 + 293 + Section 4 -- Sui Generis Database Rights. 294 + 295 + Where the Licensed Rights include Sui Generis Database Rights that 296 + apply to Your use of the Licensed Material: 297 + 298 + a. for the avoidance of doubt, Section 2(a)(1) grants You the right 299 + to extract, reuse, reproduce, and Share all or a substantial 300 + portion of the contents of the database; 301 + 302 + b. if You include all or a substantial portion of the database 303 + contents in a database in which You have Sui Generis Database 304 + Rights, then the database in which You have Sui Generis Database 305 + Rights (but not its individual contents) is Adapted Material, 306 + 307 + including for purposes of Section 3(b); and 308 + c. You must comply with the conditions in Section 3(a) if You Share 309 + all or a substantial portion of the contents of the database. 310 + 311 + For the avoidance of doubt, this Section 4 supplements and does not 312 + replace Your obligations under this Public License where the Licensed 313 + Rights include other Copyright and Similar Rights. 314 + 315 + 316 + Section 5 -- Disclaimer of Warranties and Limitation of Liability. 317 + 318 + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 319 + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 320 + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 321 + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 322 + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 323 + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 324 + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 325 + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 326 + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 327 + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 328 + 329 + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 330 + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 331 + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 332 + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 333 + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 334 + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 335 + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 336 + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 337 + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 338 + 339 + c. The disclaimer of warranties and limitation of liability provided 340 + above shall be interpreted in a manner that, to the extent 341 + possible, most closely approximates an absolute disclaimer and 342 + waiver of all liability. 343 + 344 + 345 + Section 6 -- Term and Termination. 346 + 347 + a. This Public License applies for the term of the Copyright and 348 + Similar Rights licensed here. However, if You fail to comply with 349 + this Public License, then Your rights under this Public License 350 + terminate automatically. 351 + 352 + b. Where Your right to use the Licensed Material has terminated under 353 + Section 6(a), it reinstates: 354 + 355 + 1. automatically as of the date the violation is cured, provided 356 + it is cured within 30 days of Your discovery of the 357 + violation; or 358 + 359 + 2. upon express reinstatement by the Licensor. 360 + 361 + For the avoidance of doubt, this Section 6(b) does not affect any 362 + right the Licensor may have to seek remedies for Your violations 363 + of this Public License. 364 + 365 + c. For the avoidance of doubt, the Licensor may also offer the 366 + Licensed Material under separate terms or conditions or stop 367 + distributing the Licensed Material at any time; however, doing so 368 + will not terminate this Public License. 369 + 370 + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 371 + License. 372 + 373 + 374 + Section 7 -- Other Terms and Conditions. 375 + 376 + a. The Licensor shall not be bound by any additional or different 377 + terms or conditions communicated by You unless expressly agreed. 378 + 379 + b. Any arrangements, understandings, or agreements regarding the 380 + Licensed Material not stated herein are separate from and 381 + independent of the terms and conditions of this Public License. 382 + 383 + 384 + Section 8 -- Interpretation. 385 + 386 + a. For the avoidance of doubt, this Public License does not, and 387 + shall not be interpreted to, reduce, limit, restrict, or impose 388 + conditions on any use of the Licensed Material that could lawfully 389 + be made without permission under this Public License. 390 + 391 + b. To the extent possible, if any provision of this Public License is 392 + deemed unenforceable, it shall be automatically reformed to the 393 + minimum extent necessary to make it enforceable. If the provision 394 + cannot be reformed, it shall be severed from this Public License 395 + without affecting the enforceability of the remaining terms and 396 + conditions. 397 + 398 + c. No term or condition of this Public License will be waived and no 399 + failure to comply consented to unless expressly agreed to by the 400 + Licensor. 401 + 402 + d. Nothing in this Public License constitutes or may be interpreted 403 + as a limitation upon, or waiver of, any privileges and immunities 404 + that apply to the Licensor or You, including from the legal 405 + processes of any jurisdiction or authority. 406 + 407 + 408 + ======================================================================= 409 + 410 + Creative Commons is not a party to its public licenses. 411 + Notwithstanding, Creative Commons may elect to apply one of its public 412 + licenses to material it publishes and in those instances will be 413 + considered the "Licensor." Except for the limited purpose of indicating 414 + that material is shared under a Creative Commons public license or as 415 + otherwise permitted by the Creative Commons policies published at 416 + creativecommons.org/policies, Creative Commons does not authorize the 417 + use of the trademark "Creative Commons" or any other trademark or logo 418 + of Creative Commons without its prior written consent including, 419 + without limitation, in connection with any unauthorized modifications 420 + to any of its public licenses or any other arrangements, 421 + understandings, or agreements concerning use of licensed material. For 422 + the avoidance of doubt, this paragraph does not form part of the public 423 + licenses. 424 + 425 + Creative Commons may be contacted at creativecommons.org.
+21
LICENSE.MIT
··· 1 + The MIT License (MIT) 2 + 3 + Copyright (c) 2019, 2020 Simone Giertz 4 + 5 + Permission is hereby granted, free of charge, to any person obtaining a copy 6 + of this software and associated documentation files (the "Software"), to deal 7 + in the Software without restriction, including without limitation the rights 8 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 + copies of the Software, and to permit persons to whom the Software is 10 + furnished to do so, subject to the following conditions: 11 + 12 + The above copyright notice and this permission notice shall be included in 13 + all copies or substantial portions of the Software. 14 + 15 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 + THE SOFTWARE.
+52 -1
README.md
··· 1 1 # The Every Day Calendar 2 2 3 - Open source code and schematic files for The Ever Day Calendar 3 + ![edc](/images/edc.gif) 4 + 5 + ## Overview 6 + 7 + This repository contains firmware and schematics of the [Every Day Calendar](https://www.kickstarter.com/projects/simonegiertz/the-every-day-calendar) project. 8 + 9 + Please note that this is a finished project. The files are provided as is and we will not be maintaining this repository. 10 + 11 + 12 + ## Installation 13 + 14 + To download the firmware and schematic files, run the following command on your terminal: 15 + 16 + 17 + git clone https://gitlab.com/simonegiertz/the-every-day-calendar.git 18 + ## Firmware 19 + 20 + ### Connecting Every Day Calendar to the Arduino IDE 21 + 22 + 1. Power on the Every Day Calendar with a 5V adapter and connect the calendar to your computer using a USB Type-B to USB Typ-A cable. 23 + 24 + 2. Open the Arduino IDE 25 + 26 + - Configure the board type to **Arduino Pro or Pro Mini** 27 + 28 + ![board_config](/images/board_config.png) 29 + 30 + - Configure the processor and clock speed to **Atmega328P (3.3V, 8MHz)** 31 + 32 + ![clockconfig](/images/clockconfig.png) 33 + 34 + ### Installing Arduino Libraries 35 + 36 + 1. Copy the contents of this repository's *firmware > libraries* directory into your computer's Arduino libraries folder. 37 + 38 + - Typically that's located in **Documents/Arduino/libraries** 39 + 40 + **Note:** If more instruction is needed, follow Arduino's guide: https://www.arduino.cc/en/guide/libraries 41 + 42 + To test and see if the custom libraries are working, you can run our sample code provided in the *firmware > sketches* directory of this Github repository. Simply upload one of the sample code files onto the calendar using the Arduino IDE, open the **Serial Monitor** and set the baud rate to **9600**. 43 + 44 + ![serialmonitor](/images/serialmonitor.png) 45 + 46 + Once everything is working, you're ready to play with the Every Day Calendar! Have fun! 47 + 48 + ## License 49 + 50 + The contents of this repository are released under the following licenses for hardware and software: 51 + 52 + - Hardware: CC BY-SA 4.0: https://creativecommons.org/licenses/by-sa/4.0/ 53 + - Software: MIT License: https://opensource.org/licenses/MIT 54 +
+147
firmware/libraries/EverydayCalendar/EverydayCalendar_lights.cpp
··· 1 + #include "EverydayCalendar_lights.h" 2 + #include <Arduino.h> 3 + #include <SPI.h> 4 + #include <EEPROM.h> 5 + 6 + #define UINT16_MSB(uint16) ((uint8_t)(uint16 >> 8)) 7 + #define UINT16_LSB(uint16) ((uint8_t)(uint16 & 0xFF)) 8 + #define ARRAY_SIZE(array) (sizeof((array))/sizeof((array[0]))) 9 + #define EEPROM_START_ADR 0x00000000 10 + 11 + static const int csPin = 10; 12 + static const int tickle_pin = 9; 13 + static const int outputEnablePin = 8; 14 + // set up the speed, data order and data mode 15 + static SPISettings spiSettings(4000000, MSBFIRST, SPI_MODE0); 16 + static const uint8_t maxBrightness = 255; 17 + static uint8_t brightness = maxBrightness/2; 18 + static uint32_t ledValues[12] = {0}; // Months are the integers in range [0,11], Days are bits within the integers, in range [0,31] 19 + 20 + 21 + void EverydayCalendar_lights::configure(){ 22 + // LED configurations 23 + SPI.begin(); 24 + pinMode (csPin, OUTPUT); 25 + digitalWrite (csPin, HIGH); 26 + pinMode (tickle_pin, OUTPUT); 27 + digitalWrite(tickle_pin, HIGH); 28 + pinMode (outputEnablePin, OUTPUT); 29 + digitalWrite(outputEnablePin, HIGH); 30 + // Enable Timer2 interrupt. 31 + // We want CTC mode (mode 2) where timer resets after compare 32 + TCCR2A = (TCCR2A & ~0x03) | 0x00; 33 + TCCR2B = (TCCR2B & ~0x08) | 0x00; 34 + TCCR2B = (TCCR2B & ~0x07) | 0x02; // selects a clock prescaler of 8. That's a frequency of 31372.55 35 + OCR2A = brightness; //128 36 + clearAllLEDs(); 37 + } 38 + 39 + void EverydayCalendar_lights::begin(){ 40 + TIMSK2 = (1<<OCIE2A) | (1<<TOIE2); // Enable Timers 41 + } 42 + 43 + void EverydayCalendar_lights::clearAllLEDs(){ 44 + memset(ledValues, 0, sizeof(ledValues)); 45 + } 46 + 47 + // Month is in range [0,11] 48 + // Day is in range [0,30] 49 + void EverydayCalendar_lights::setLED(uint8_t month, uint8_t day, bool enable){ 50 + if (month > 11 || day > 30){ 51 + return; 52 + } 53 + 54 + if (enable){ 55 + ledValues[month] = ledValues[month] | ((uint32_t)1 << day); 56 + }else{ 57 + ledValues[month] = ledValues[month] & ~((uint32_t)1 << day); 58 + } 59 + } 60 + 61 + void EverydayCalendar_lights::toggleLED(uint8_t month, uint8_t day){ 62 + bool ledState = (*(ledValues+month) & ((uint32_t)1 << (day))); 63 + setLED(month, day, !ledState); 64 + } 65 + 66 + void EverydayCalendar_lights::saveLedStatesToMemory(){ 67 + for(uint8_t month=0; month<12; month++){ 68 + int addr = EEPROM_START_ADR + (month * sizeof(uint32_t)); 69 + EEPROM.put(addr, ledValues[month]); 70 + } 71 + } 72 + 73 + void EverydayCalendar_lights::loadLedStatesFromMemory(){ 74 + // If the first month is completely set, then this is the first time we're running the code. 75 + // Clear the calendar memory 76 + uint32_t firstInt; 77 + EEPROM.get(EEPROM_START_ADR, firstInt); 78 + if(firstInt == 0xFFFFFFFF){ 79 + Serial.println("First time running everyday calendar. Clearing all days."); 80 + for(int i=0; i<sizeof(ledValues); i++){ 81 + EEPROM.write(EEPROM_START_ADR + i, 0x00); 82 + } 83 + } 84 + // Load calendar from memory 85 + for(int i=0; i<sizeof(ledValues); i++){ 86 + *((byte*)ledValues + i) = EEPROM.read(EEPROM_START_ADR + i); 87 + } 88 + 89 + for(int i=0; i<12; i++){ 90 + Serial.print("LED Column "); 91 + Serial.print(i); 92 + Serial.print(" = "); 93 + Serial.println(ledValues[i]); 94 + } 95 + } 96 + 97 + void EverydayCalendar_lights::setBrightness(uint8_t b){ 98 + if(b > 200){ 99 + b = 200; 100 + } 101 + b = ~b; 102 + if((brightness == 255) && (b != 255)){ 103 + TIMSK2 |= (1<<OCIE2A); 104 + } 105 + brightness = b; 106 + if(brightness == 255){ 107 + TIMSK2 &= ~(1<<OCIE2A); 108 + } 109 + } 110 + 111 + 112 + // Code to drive the LED multiplexing. 113 + // This code is called at a very fast period, activating each LED column one by one 114 + // This is done faster than the eye can perceive, and it appears that all twelve columns are illuminated at once. 115 + ISR(TIMER2_COMPA_vect) { 116 + digitalWrite(outputEnablePin, LOW); // Enable 117 + } 118 + ISR(TIMER2_OVF_vect) { 119 + static uint16_t activeColumn = 0; 120 + static byte spiBuf[6]; 121 + 122 + digitalWrite(outputEnablePin, HIGH); // Disable 123 + 124 + OCR2A = brightness; 125 + 126 + // "Tickle" the watchdog circuit to keep the LEDs enabled 127 + digitalWrite(tickle_pin, !digitalRead(tickle_pin)); 128 + 129 + // update the next column 130 + uint16_t month = (1 << activeColumn); 131 + uint8_t * pDays = (uint8_t*) (ledValues + activeColumn); 132 + 133 + // Send the LED control values into the shift registers 134 + digitalWrite (csPin, LOW); 135 + SPI.beginTransaction(spiSettings); 136 + memcpy(spiBuf, &month, 2); 137 + spiBuf[2] = pDays[3]; 138 + spiBuf[3] = pDays[2]; 139 + spiBuf[4] = pDays[1]; 140 + spiBuf[5] = pDays[0]; 141 + SPI.transfer(spiBuf, sizeof(spiBuf)); 142 + SPI.endTransaction(); 143 + digitalWrite (csPin, HIGH); 144 + 145 + activeColumn++; 146 + activeColumn %= 12; 147 + }
+21
firmware/libraries/EverydayCalendar/EverydayCalendar_lights.h
··· 1 + #ifndef __EVERYDAYCALENDAR_LIGHTS_H 2 + #define __EVERYDAYCALENDAR_LIGHTS_H 3 + #include <stdint.h> 4 + 5 + 6 + class EverydayCalendar_lights 7 + { 8 + public: 9 + void configure(); 10 + void begin(); 11 + void loadLedStatesFromMemory(); 12 + void saveLedStatesToMemory(); 13 + 14 + void setLED(uint8_t month, uint8_t day, bool enable); 15 + void toggleLED(uint8_t month, uint8_t day); 16 + void clearAllLEDs(); 17 + void setBrightness(uint8_t brightness); 18 + 19 + }; 20 + 21 + #endif
+218
firmware/libraries/EverydayCalendar/EverydayCalendar_touch.cpp
··· 1 + #include "EverydayCalendar_touch.h" 2 + #include <Arduino.h> 3 + 4 + typedef int16_t (*fxn_getChannelValue)(EverydayCalendar_touch * const cal_touch, uint8_t month, uint8_t day); 5 + 6 + static const bool controllersEnabled[4] = {1,1,1,1}; 7 + 8 + // IQS550 Touch Controller configurations 9 + static const int tcAddresses[4] = {0x74, 0x75, 0x76, 0x77}; 10 + static const int tcReadyPin[4] = {7, 5, 3, A0}; 11 + static const int tcResetPin[4] = {6, 4, 2, A1}; 12 + 13 + static const uint8_t tx_pinMappings[4][12] = { 14 + {0,1,2,3,4,5,11,10,9,8,7,6}, 15 + {5,4,3,2,1,0,6,7,8,9,10,11}, 16 + {0,1,2,3,4,5,11,10,9,8,7,6}, 17 + {5,4,3,2,1,0,6,7,8,9,10,11}, 18 + }; 19 + static const uint8_t rx_pinMappings[4][10] = { 20 + {0,1,2,3,4,5,6,7,8,9}, 21 + {9,8,7,6,5,4,3,2,1,0}, 22 + {0,1,2,3,4,5,6,7,8,9}, 23 + {9,8}, 24 + }; 25 + 26 + static const uint8_t tc3_enabledChannels[2][12] = { 27 + {1,0,1,0,1,0,1,1,0,1,0,1}, 28 + {0,0,0,0,1,0,1,0,0,0,0,0}, 29 + }; 30 + 31 + void EverydayCalendar_touch::initialize(){ 32 + // Initialize touch controllers, and hold in reset 33 + for(int i=0; i<4; i++){ 34 + tc[i] = IQS(tcAddresses[i], tcReadyPin[i], tcResetPin[i]); 35 + tc[i].initialize(); 36 + tc[i].holdReset(true); 37 + } 38 + } 39 + 40 + void EverydayCalendar_touch::configure(){ 41 + // Initialize, if not done already 42 + initialize(); 43 + 44 + // Configure touch controllers 45 + for(int i=0; i<4; i++){ 46 + if(controllersEnabled[i] == false){ continue; } 47 + tc[i].holdReset(false); // disable reset signal 48 + delay(100); 49 + tc[i].acknowledgeReset(); 50 + 51 + //Serial.println("Config Start"); 52 + tc[i].setManualControl(); 53 + tc[i].setTXPinMappings((uint8_t*)(tx_pinMappings[i]), 12); 54 + tc[i].setRXPinMappings((uint8_t*)(rx_pinMappings[i]), 10); 55 + tc[i].swapXY(true); 56 + tc[i].setAtiGlobalC(12); 57 + tc[i].setTouchMultipliers(60,30); 58 + tc[i].rxFloat(false); // rx pins grounded when inactive 59 + 60 + // Special configurations for lower touch sections 61 + if(i == 2){ 62 + // Disable nonexistant Feb 29 & 30 channels 63 + tc[i].enableChannel(1, 8, false); 64 + tc[i].enableChannel(1, 9, false); 65 + }else if(i==3){ 66 + // Disable day 31 on months that dont have them 67 + // Disable all channels in "day 32" row, except the brightness buttons 68 + tc[i].setTXRXChannelCount(12, 2); 69 + for(uint8_t rx=0; rx<2; rx++){ 70 + for(uint8_t tx=0; tx<12; tx++){ 71 + if(tc3_enabledChannels[rx][tx] == 0){ 72 + tc[i].enableChannel(tx, rx, false); 73 + } 74 + } 75 + } 76 + // Special sensitivity adjustment for the moon brightness button 77 + tc[i].setChannel_ATI_C_Adjustment(4,1,-1); 78 + } 79 + 80 + //delay(100); 81 + tc[i].runAtiAlgorithm(); 82 + delay(150); 83 + if(tc[i].atiErrorDetected()){ 84 + Serial.print("ATI Error! Controller # "); 85 + Serial.println(i); 86 + } 87 + tc[i].reseed(); 88 + //Serial.println("Config Done"); 89 + } 90 + } 91 + 92 + void EverydayCalendar_touch::begin(){ 93 + for(int i=0; i<4; i++){ 94 + if(controllersEnabled[i] == false){ continue; } 95 + tc[i].setupComplete(); 96 + tc[i].endSession(); 97 + } 98 + } 99 + 100 + // This whole procedure should take about 100 milliseconds 101 + bool EverydayCalendar_touch::scanForTouch(){ 102 + // Wait until all touch controllers are ready 103 + for(int i=0; i<4; i++){ 104 + if(controllersEnabled[i] == false){ continue; } 105 + if(tc[i].isReady() == false){ 106 + i=0; // One of the controllers isn't ready. Start again from the top. 107 + continue; 108 + } 109 + } 110 + 111 + for(int i=0; i<4; i++){ 112 + if(controllersEnabled[i] == false){ continue; } 113 + // Close session for controller 114 + tc[i].endSession(); 115 + // Initiates a reading 116 + while(tc[i].isReady() == false); 117 + tc[i].readTouch(); 118 + if(tc[i].atiErrorDetected()){ 119 + Serial.print(" ATI Error! \tDevice Address: 0x"); 120 + Serial.println(tcAddresses[i],16); 121 + } 122 + // Do not close the session. Leave the controller hanging, 123 + // so it isn't sampling at the same time as others 124 + } 125 + 126 + x = -1; 127 + y = -1; 128 + 129 + for(int i=0; i<4; i++){ 130 + if(controllersEnabled[i] == false){ continue; } 131 + if(tc[i].isTouched()){ 132 + x = tc[i].x; 133 + y = tc[i].y + (10*i); 134 + return true; 135 + } 136 + } 137 + return false; 138 + } 139 + 140 + void _printChannelValues(EverydayCalendar_touch * const cal_touch, fxn_getChannelValue getter_fxn){ 141 + int16_t value; 142 + Serial.println("\tjan\tfeb\tmar\tapr\tmay\tjun\tjul\taug\tsep\toct\tnov\tdec"); 143 + 144 + for(int day=0; day<32; day++){ 145 + Serial.print(day+1); 146 + Serial.print(":\t"); 147 + for(int month=0; month<12; month++){ 148 + if((month==1) && ((day==28) || (day==29))){ 149 + Serial.print("\t"); 150 + continue; 151 + }else if((day >= 30) && (tc3_enabledChannels[day%10][month]==0)){ 152 + Serial.print("\t"); 153 + continue; 154 + } 155 + value = getter_fxn(cal_touch, month, day); 156 + Serial.print(value); 157 + Serial.print("\t"); 158 + } 159 + Serial.print("\n"); 160 + } 161 + } 162 + 163 + int16_t _getAtiCAdjustmentValue(EverydayCalendar_touch * const cal_touch, uint8_t month, uint8_t day){ 164 + int8_t value; 165 + if (month > 11 || day > 31){ 166 + return 0xFFFF; 167 + } 168 + uint8_t controller = day / 10; 169 + uint8_t row = day % 10; 170 + cal_touch->tc[controller].registerRead(ATICAdjust_adr+(month*10)+(row), (uint8_t*)&value, 1); 171 + return (int16_t)value; 172 + } 173 + 174 + int16_t _getAtiCompensationValue(EverydayCalendar_touch * const cal_touch, uint8_t month, uint8_t day){ 175 + uint8_t value; 176 + if (month > 11 || day > 31){ 177 + return 0xFFFF; 178 + } 179 + uint8_t controller = day / 10; 180 + uint8_t row = day % 10; 181 + cal_touch->tc[controller].registerRead(ATICompensation_adr+(month*10)+(row), &value, 1); 182 + return (int16_t)value; 183 + } 184 + 185 + int16_t _getChannelCountValue(EverydayCalendar_touch * const cal_touch, uint8_t month, uint8_t day){ 186 + uint16_t value; 187 + uint8_t bytes[2]; 188 + if (month > 11 || day > 31){ 189 + return 0xFFFF; 190 + } 191 + uint8_t controller = day / 10; 192 + uint8_t row = day % 10; 193 + cal_touch->tc[controller].registerRead(Counts_adr+(month*20)+(row*2), bytes, 2); 194 + value = (bytes[0] << 8) + bytes[1]; 195 + return (int16_t)value; 196 + } 197 + 198 + void EverydayCalendar_touch::printAtiCAdjustmentValues(){ 199 + _printChannelValues(this, _getAtiCAdjustmentValue); 200 + } 201 + 202 + void EverydayCalendar_touch::printAtiCompensationValues(){ 203 + _printChannelValues(this, _getAtiCompensationValue); 204 + } 205 + 206 + void EverydayCalendar_touch::printChannelCountValues(){ 207 + _printChannelValues(this, _getChannelCountValue); 208 + } 209 + 210 + int16_t EverydayCalendar_touch::getAtiCAdjustmentValue(uint8_t month, uint8_t day){ 211 + return _getAtiCAdjustmentValue(this, month, day); 212 + } 213 + int16_t EverydayCalendar_touch::getAtiCompensationValue(uint8_t month, uint8_t day){ 214 + return _getAtiCompensationValue(this, month, day); 215 + } 216 + int16_t EverydayCalendar_touch::getChannelCountValue(uint8_t month, uint8_t day){ 217 + return _getChannelCountValue(this, month, day); 218 + }
+28
firmware/libraries/EverydayCalendar/EverydayCalendar_touch.h
··· 1 + #ifndef __EVERYDAYCALENDAR_TOUCH_H 2 + #define __EVERYDAYCALENDAR_TOUCH_H 3 + #include <stdint.h> 4 + #include <IQS5xx.h> 5 + 6 + 7 + class EverydayCalendar_touch 8 + { 9 + public: 10 + void initialize(); 11 + void configure(); 12 + void begin(); 13 + bool scanForTouch(); 14 + int8_t x; 15 + int8_t y; 16 + IQS tc[4]; // Touch Controllers 17 + 18 + int16_t getAtiCAdjustmentValue(uint8_t month, uint8_t day); 19 + int16_t getAtiCompensationValue(uint8_t month, uint8_t day); 20 + int16_t getChannelCountValue(uint8_t month, uint8_t day); 21 + 22 + void printAtiCAdjustmentValues(); 23 + void printAtiCompensationValues(); 24 + void printChannelCountValues(); 25 + 26 + }; 27 + 28 + #endif
+507
firmware/libraries/IQS5xx/IQS550_B000_Trackpad_40_15_2_2_BL.h
··· 1 + //This is the parsed HEX file in array form for programming to bootloader 2 + 3 + 4 + 5 + 6 + #ifndef HEX_ARRAY_H 7 + #define HEX_ARRAY_H 8 + 9 + 10 + const unsigned char hex_array[] PROGMEM = {0x82, 0x00, 0x85, 0x73, 0x82, 0x00, 0xB8, 0xD3, 0x82, 0x00, 0xB8, 0xD1, 0x82, 0x00, 0xB8, 0xD5, 0x82, 0x00, 0xB8, 0xD7, 0x82, 0x00, 0xB8, 0xD1, 0x82, 0x00, 0xB8, 0xF9, 0x82, 0x00, 0xB8, 0xD1, 11 + 0x82, 0x00, 0xB8, 0xFF, 0x82, 0x00, 0xB9, 0x01, 0x82, 0x00, 0xB9, 0x03, 0x82, 0x00, 0xB9, 0x05, 0x82, 0x00, 0xB9, 0x12, 0x82, 0x00, 0xB9, 0x14, 0x82, 0x00, 0xB9, 0x16, 0x82, 0x00, 0xB9, 0x18, 12 + 0x82, 0x00, 0xB9, 0x1A, 0x82, 0x00, 0xB9, 0x1C, 0x82, 0x00, 0xB8, 0xD1, 0x82, 0x00, 0xB8, 0xD1, 0x82, 0x00, 0xB8, 0xD1, 0x82, 0x00, 0xB9, 0x1E, 0x82, 0x00, 0xB9, 0x20, 0x82, 0x00, 0xB9, 0x22, 13 + 0x82, 0x00, 0xB9, 0x48, 0x82, 0x00, 0xB8, 0xD1, 0x82, 0x00, 0xB8, 0xD1, 0x82, 0x00, 0xB9, 0x4A, 0x82, 0x00, 0xB9, 0x51, 0x82, 0x00, 0xB9, 0x53, 0x82, 0x00, 0xB9, 0x55, 0x82, 0x00, 0xA2, 0xFA, 14 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 15 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 16 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 17 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 18 + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x86, 0xA0, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x02, 19 + 0x04, 0x08, 0x00, 0x0F, 0x42, 0x40, 0x00, 0x01, 0x86, 0xA1, 20 + 0x85, 0x3C, 0x62, 0x00, 0x01, 0x85, 0x70, 0x62, 0x00, 0xF1, 0x85, 0x72, 0x64, 0x01, 0x00, 0x85, 0x73, 0x00, 21 + 0x9B, 0xFB, 0x99, 0x17, 0x04, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x17, 0x04, 0x4D, 0x00, 0x00, 0x00, 0x00, 22 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x26, 0x00, 0x00, 0x0A, 0x02, 23 + 0x08, 0x04, 24 + 0xFF, 25 + 0xAE, 0x0F, 0xFF, 0x94, 0x90, 0xCE, 0x85, 0x2A, 0xAE, 0x85, 0x2C, 0xF6, 0x27, 0x20, 0xA5, 0x60, 0x27, 0x17, 0xBF, 0xEB, 0xEE, 0x03, 0xBF, 0xEE, 0xBE, 0xEB, 0xEE, 0x01, 0x90, 0xF6, 0xF7, 0x5C, 26 + 0x90, 0x5C, 0x90, 0xB3, 0xEE, 0x26, 0xF5, 0xBE, 0xEB, 0x1C, 0x00, 0x05, 0x20, 0xDD, 0xAE, 0x00, 0x35, 0x20, 0x02, 0xF7, 0x5C, 0xA3, 0x00, 0xF1, 0x26, 0xF9, 0xAE, 0x01, 0x01, 0x20, 0x02, 0xF7, 27 + 0x5C, 0xA3, 0x0B, 0x04, 0x26, 0xF9, 0xCD, 0xB9, 0x57, 0x20, 0xFE, 0x89, 0x13, 0x05, 0x23, 0x05, 0x72, 0xF0, 0x05, 0x20, 0x05, 0x1E, 0x05, 0x72, 0xF0, 0x01, 0x5B, 0x02, 0x81, 0x89, 0x52, 0x05, 28 + 0x9E, 0xAD, 0x7D, 0xEE, 0x49, 0x1F, 0x04, 0x7B, 0x07, 0xAD, 0x75, 0xEE, 0x49, 0x1F, 0x01, 0x7B, 0x06, 0xAD, 0x6D, 0x16, 0x01, 0xEF, 0x49, 0x7B, 0x07, 0xAD, 0x65, 0x16, 0x04, 0xEF, 0x49, 0x7B, 29 + 0x06, 0xAD, 0x5D, 0xEE, 0x4B, 0x1F, 0x04, 0x7B, 0x07, 0xAD, 0x55, 0xEE, 0x4B, 0x1F, 0x01, 0x7B, 0x06, 0xAD, 0x4D, 0x16, 0x01, 0xEF, 0x4B, 0x7B, 0x07, 0xAD, 0x45, 0x16, 0x04, 0xEF, 0x4B, 0x7B, 30 + 0x06, 0xAD, 0x3D, 0xE6, 0x57, 0x6B, 0x03, 0x89, 0x7B, 0x09, 0xAD, 0x34, 0xE6, 0x57, 0x85, 0xE7, 0x57, 0x7B, 0x07, 0xAD, 0x2B, 0x7B, 0x03, 0xE7, 0x57, 0x5F, 0x7B, 0x06, 0x97, 0x58, 0xEE, 0x3E, 31 + 0x1F, 0x04, 0x5F, 0x7B, 0x07, 0x97, 0x58, 0x7B, 0x06, 0x90, 0x5F, 0x90, 0x97, 0x90, 0x58, 0xEE, 0x3E, 0x90, 0xEF, 0x3E, 0x5F, 0x7B, 0x07, 0x97, 0x58, 0x16, 0x04, 0xEF, 0x3E, 0x5B, 0x07, 0x81, 32 + 0x97, 0xA6, 0x0F, 0x42, 0x81, 0x52, 0x0C, 0xAE, 0xFF, 0xFF, 0x1F, 0x02, 0xC6, 0x04, 0x41, 0xB1, 0x48, 0x25, 0x69, 0x0F, 0x0B, 0x20, 0x5B, 0x0F, 0x0C, 0x20, 0x3F, 0xCD, 0x87, 0xBC, 0x90, 0x93, 33 + 0x90, 0xEE, 0x4D, 0x90, 0x5C, 0x27, 0x2D, 0xEE, 0x4F, 0x89, 0x7B, 0x0D, 0xCD, 0x87, 0xBC, 0xEE, 0x4D, 0x89, 0x7B, 0x10, 0xCD, 0x87, 0xBC, 0xEE, 0x4B, 0x89, 0x7B, 0x12, 0xCD, 0x87, 0xBC, 0xEE, 34 + 0x49, 0xCD, 0x89, 0x66, 0x5B, 0x06, 0x1F, 0x04, 0x7B, 0x0C, 0x27, 0x04, 0x13, 0x02, 0x24, 0x08, 0x1F, 0x02, 0x20, 0x02, 0x7B, 0x0B, 0x6B, 0x06, 0x0C, 0x0C, 0x7B, 0x0C, 0xC1, 0x0A, 0x9A, 0x7B, 35 + 0x0B, 0x25, 0xB8, 0x11, 0x06, 0x27, 0x09, 0x7B, 0x06, 0x97, 0x7B, 0x0B, 0x95, 0xCD, 0x85, 0xD0, 0x0C, 0x0B, 0x7B, 0x0B, 0xC1, 0x0A, 0x9A, 0x25, 0x9E, 0x5B, 0x0C, 0x81, 0x0F, 0x0C, 0x20, 0x77, 36 + 0x0F, 0x0B, 0x20, 0x6A, 0x7B, 0x0C, 0xCD, 0x87, 0xBC, 0x90, 0x93, 0x90, 0xEE, 0x49, 0x90, 0x5C, 0x27, 0x4D, 0x7B, 0x0B, 0xCD, 0x87, 0xBC, 0xEE, 0x4F, 0x89, 0x7B, 0x0D, 0xCD, 0x87, 0xBC, 0xEE, 37 + 0x4D, 0x89, 0x7B, 0x10, 0xCD, 0x87, 0xBC, 0xEE, 0x4B, 0x89, 0x7B, 0x12, 0xCD, 0x87, 0xBC, 0xEE, 0x49, 0xCD, 0x89, 0x66, 0x5B, 0x06, 0x1F, 0x04, 0x7B, 0x0B, 0x26, 0x0F, 0x1F, 0x02, 0x96, 0xCD, 38 + 0x87, 0xB6, 0x1B, 0x0C, 0x24, 0x01, 0x5C, 0x02, 0x7F, 0x20, 0x21, 0x13, 0x02, 0x24, 0x1D, 0x1F, 0x02, 0x96, 0xCD, 0x87, 0xB6, 0x1B, 0x0C, 0x24, 0x01, 0x5C, 0x02, 0x7B, 0x0B, 0x20, 0x0C, 0x96, 39 + 0xCD, 0x87, 0xB6, 0x1B, 0x0C, 0x24, 0x01, 0x5C, 0x02, 0xA6, 0xFF, 0xF7, 0x0C, 0x0B, 0x7B, 0x0B, 0xC1, 0x0A, 0x9A, 0x25, 0x8F, 0x0C, 0x0C, 0x7B, 0x0C, 0xC1, 0x0A, 0x9A, 0x25, 0x82, 0x0F, 0x0B, 40 + 0x20, 0x57, 0x0F, 0x0C, 0x20, 0x4A, 0x96, 0xAD, 0x5A, 0x1B, 0x0C, 0x24, 0x01, 0x5C, 0x02, 0xF6, 0x11, 0x0B, 0x26, 0x3A, 0x7B, 0x0B, 0x97, 0x7B, 0x0C, 0x95, 0xCD, 0x85, 0xD0, 0x96, 0xAD, 0x43, 41 + 0x1B, 0x0C, 0x24, 0x01, 0x5C, 0x02, 0xF6, 0x6B, 0x01, 0x96, 0xAD, 0x37, 0x1B, 0x0C, 0x24, 0x01, 0x5C, 0x02, 0x89, 0x96, 0x1C, 0x00, 0x08, 0x9F, 0x5E, 0x1B, 0x0D, 0x24, 0x01, 0x5C, 0x02, 0xF6, 42 + 0x85, 0xF7, 0x96, 0xAD, 0x1E, 0x1B, 0x0B, 0x24, 0x01, 0x5C, 0x02, 0x7B, 0x01, 0xF7, 0x0C, 0x0C, 0x7B, 0x0C, 0xC1, 0x0A, 0x9A, 0x25, 0xAF, 0x0C, 0x0B, 0x7B, 0x0B, 0xC1, 0x0A, 0x9A, 0x25, 0xA2, 43 + 0xCC, 0x86, 0xCC, 0x1C, 0x00, 0x06, 0x9F, 0x5E, 0x81, 0x97, 0xA6, 0x0F, 0x42, 0x81, 0x88, 0x52, 0x16, 0x72, 0x05, 0x0A, 0x62, 0x03, 0xCC, 0x88, 0xCD, 0xBE, 0x35, 0xCD, 0xBC, 0xF8, 0x96, 0x1C, 44 + 0x00, 0x0D, 0xCD, 0xBC, 0x71, 0x7B, 0x17, 0xCD, 0x88, 0xD3, 0xEE, 0x53, 0xCD, 0xBC, 0xFF, 0x96, 0x1C, 0x00, 0x0D, 0xCD, 0xBB, 0x3B, 0xBE, 0xE9, 0x89, 0xBE, 0x37, 0xCD, 0xBC, 0xF8, 0x96, 0x1C, 45 + 0x00, 0x0B, 0xCD, 0xBC, 0x71, 0x7B, 0x19, 0xCD, 0x88, 0xD3, 0xEE, 0x51, 0xCD, 0xBC, 0xFF, 0x96, 0x1C, 0x00, 0x0B, 0xCD, 0xBB, 0x3B, 0xBE, 0xE9, 0x89, 0xBE, 0x35, 0xCD, 0xBC, 0xF8, 0x96, 0x1C, 46 + 0x00, 0x09, 0xCD, 0xBC, 0x71, 0x7B, 0x1B, 0xCD, 0x88, 0xD3, 0xEE, 0x4B, 0xCD, 0xBC, 0xFF, 0x96, 0x1C, 0x00, 0x09, 0xCD, 0xBB, 0x3B, 0xBE, 0xE9, 0x89, 0xBE, 0x37, 0xCD, 0xBC, 0xF8, 0x96, 0x1C, 47 + 0x00, 0x07, 0xCD, 0xBC, 0x71, 0x7B, 0x1D, 0xCD, 0x88, 0xD3, 0xEE, 0x49, 0xCD, 0xBC, 0xFF, 0x96, 0x1C, 0x00, 0x07, 0xCD, 0xBB, 0x3B, 0xBE, 0xE9, 0xCD, 0x89, 0x66, 0x5B, 0x06, 0xC3, 0x0A, 0x69, 48 + 0x23, 0x03, 0xCE, 0x0A, 0x69, 0x1F, 0x15, 0x5F, 0xC6, 0x0A, 0x68, 0x97, 0xBF, 0xEB, 0x1E, 0x15, 0xB3, 0xEB, 0x24, 0x04, 0x5F, 0x97, 0x1F, 0x15, 0x7B, 0x15, 0x97, 0x7B, 0x16, 0xC0, 0x0A, 0x68, 49 + 0x24, 0x01, 0x5A, 0xCD, 0xBC, 0xED, 0x96, 0x1C, 0x00, 0x0D, 0xCD, 0xBC, 0x71, 0x4F, 0x97, 0x4A, 0xC0, 0x0A, 0x67, 0x24, 0x01, 0x5A, 0xCD, 0xB9, 0xFB, 0x96, 0x1C, 0x00, 0x0D, 0xCD, 0xBA, 0x86, 50 + 0x96, 0x1C, 0x00, 0x11, 0xCD, 0xBC, 0x71, 0xC6, 0x0A, 0x69, 0x97, 0xC6, 0x0A, 0x6A, 0xC0, 0x0A, 0x68, 0x24, 0x01, 0x5A, 0xCD, 0xBC, 0xED, 0x96, 0x1C, 0x00, 0x0D, 0xCD, 0xBC, 0x71, 0x96, 0x1C, 51 + 0x00, 0x11, 0xCD, 0xBB, 0x29, 0x96, 0x1C, 0x00, 0x0D, 0xCD, 0xBB, 0x3B, 0x96, 0x1C, 0x00, 0x11, 0xCD, 0xBC, 0x71, 0x7B, 0x14, 0xCB, 0x0A, 0x67, 0x20, 0x03, 0xC6, 0x0A, 0x63, 0x5B, 0x17, 0x81, 52 + 0x97, 0xA6, 0x0F, 0x42, 0x90, 0xCE, 0x0A, 0x9E, 0x81, 0x89, 0x52, 0x10, 0x1E, 0x17, 0xF6, 0xB7, 0xEA, 0x3F, 0xE9, 0x3F, 0xE8, 0x3F, 0xE7, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBC, 0x71, 0x1E, 0x15, 53 + 0x90, 0xAE, 0x01, 0x00, 0xFE, 0xCD, 0xBC, 0xFF, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBA, 0x28, 0x96, 0x1C, 0x00, 0x0D, 0xCD, 0xBC, 0x71, 0x1E, 0x11, 0xFE, 0xCD, 0xBC, 0xFF, 0x96, 0x1C, 0x00, 0x09, 54 + 0xCD, 0xBC, 0x71, 0x7B, 0x19, 0xB7, 0xEA, 0x3F, 0xE9, 0x3F, 0xE8, 0x3F, 0xE7, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBC, 0x71, 0x96, 0x1C, 0x00, 0x09, 0xCD, 0xBB, 0x29, 0x96, 0x1C, 0x00, 0x05, 0xCD, 55 + 0xBA, 0x86, 0x96, 0x5C, 0xCD, 0xBC, 0x71, 0xA6, 0x01, 0x97, 0x4F, 0x10, 0x19, 0x24, 0x01, 0x5A, 0xCD, 0xB9, 0xFB, 0x96, 0x1C, 0x00, 0x0D, 0xCD, 0xBA, 0x86, 0x96, 0x5C, 0xCD, 0xBA, 0x28, 0x96, 56 + 0x1C, 0x00, 0x0D, 0xCD, 0xBC, 0x71, 0x1E, 0x15, 0x16, 0x0D, 0xFF, 0x1E, 0x17, 0x7B, 0x0F, 0xF7, 0x5B, 0x12, 0x81, 0x89, 0x52, 0x08, 0x1E, 0x0F, 0x89, 0x1E, 0x0B, 0xCD, 0x85, 0xBE, 0x5B, 0x02, 57 + 0x1F, 0x03, 0x1E, 0x11, 0x89, 0x1E, 0x0F, 0xCD, 0x85, 0xBE, 0x5B, 0x02, 0x1F, 0x07, 0x1E, 0x03, 0x13, 0x07, 0x23, 0x04, 0x1F, 0x05, 0x20, 0x0A, 0x1E, 0x07, 0x1F, 0x05, 0x1E, 0x03, 0x1F, 0x07, 58 + 0x1E, 0x05, 0x54, 0x13, 0x07, 0x1E, 0x05, 0x24, 0x24, 0x54, 0x54, 0x1F, 0x01, 0x1E, 0x05, 0x54, 0x72, 0xFB, 0x01, 0x13, 0x07, 0x1E, 0x07, 0x25, 0x02, 0x54, 0x54, 0x54, 0x54, 0x54, 0x1F, 0x01, 59 + 0x1E, 0x07, 0x54, 0x54, 0x72, 0xFB, 0x05, 0x72, 0xFB, 0x01, 0x5B, 0x0A, 0x81, 0x54, 0x54, 0x13, 0x07, 0x1E, 0x07, 0x24, 0x0B, 0x54, 0x54, 0x54, 0x54, 0x1F, 0x01, 0x1E, 0x07, 0x54, 0x20, 0xE2, 60 + 0x54, 0x54, 0x54, 0x54, 0x72, 0xFB, 0x05, 0x20, 0xE1, 0x72, 0x11, 0x04, 0x40, 0x52, 0x1A, 0x72, 0x15, 0x00, 0xF1, 0x0F, 0x1A, 0xCC, 0x8D, 0x4E, 0xCD, 0x8D, 0x60, 0xDE, 0x04, 0x46, 0x1F, 0x09, 61 + 0x7B, 0x1A, 0xCD, 0x8D, 0x60, 0xDE, 0x04, 0x48, 0x1F, 0x0B, 0x7B, 0x1A, 0xCD, 0x8D, 0x5B, 0x90, 0x93, 0x90, 0xEE, 0x4D, 0x90, 0x5C, 0x27, 0x03, 0xCC, 0x8A, 0x93, 0x90, 0x93, 0x90, 0xEE, 0x49, 62 + 0x90, 0x5C, 0x27, 0x7C, 0xBE, 0x37, 0xCD, 0xBC, 0xF8, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBC, 0x71, 0x7B, 0x1A, 0xCD, 0x8D, 0x5B, 0x90, 0xCE, 0x0A, 0x9E, 0xEE, 0x49, 0xCD, 0xBC, 0xFF, 0x96, 0xCD, 63 + 0x8D, 0x65, 0x1F, 0x03, 0x7B, 0x1A, 0xCD, 0x8D, 0x60, 0x16, 0x03, 0xCD, 0x8D, 0x86, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBC, 0x71, 0x7B, 0x1A, 0xCD, 0x8D, 0x5B, 0x90, 0xCE, 0x0A, 0xA0, 0xEE, 0x4B, 64 + 0xCD, 0xBC, 0xFF, 0x96, 0xCD, 0x8D, 0x65, 0x1F, 0x03, 0x7B, 0x1A, 0xCD, 0x8D, 0x60, 0x16, 0x03, 0xDF, 0x04, 0x48, 0x7B, 0x1A, 0xCD, 0x8D, 0x5B, 0xCD, 0x8D, 0x6E, 0x7B, 0x1A, 0xCD, 0x8D, 0x60, 65 + 0x7B, 0x1A, 0x90, 0x5F, 0x90, 0x97, 0x90, 0x58, 0x90, 0xEE, 0x3E, 0xDF, 0x04, 0x4A, 0xCD, 0x8D, 0x60, 0x89, 0x7B, 0x1C, 0xCD, 0x8D, 0x5B, 0xE6, 0x57, 0x85, 0xD7, 0x04, 0x4C, 0xCC, 0x8C, 0xFE, 66 + 0x90, 0x93, 0x90, 0xEE, 0x49, 0x90, 0x5C, 0x26, 0x03, 0xCC, 0x8C, 0xE0, 0x7B, 0x1A, 0xCD, 0x8D, 0x60, 0xDE, 0x04, 0x4A, 0xCD, 0xBC, 0xF8, 0xA6, 0x10, 0xCD, 0xBA, 0x77, 0x96, 0x1C, 0x00, 0x12, 67 + 0xCD, 0xBC, 0x71, 0x7B, 0x1A, 0x5F, 0x97, 0x58, 0xEE, 0x3E, 0xCD, 0xBC, 0xF8, 0xA6, 0x10, 0xCD, 0xBA, 0x77, 0x96, 0x1C, 0x00, 0x0E, 0xCD, 0xBC, 0x71, 0x96, 0x1C, 0x00, 0x0E, 0xCD, 0xBB, 0x29, 68 + 0xA6, 0x04, 0xCD, 0xBC, 0x62, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBC, 0x71, 0x96, 0x1C, 0x00, 0x12, 0xCD, 0xBB, 0x29, 0xA6, 0x04, 0xCD, 0xBC, 0x62, 0x96, 0x5C, 0xCD, 0xBC, 0x71, 0x96, 0x1C, 0x00, 69 + 0x12, 0xCD, 0xBB, 0x29, 0x96, 0x5C, 0xCD, 0xBB, 0x11, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBA, 0x28, 0x96, 0x1C, 0x00, 0x12, 0xCD, 0xBC, 0x71, 0x7B, 0x1A, 0xCD, 0x8D, 0x60, 0x16, 0x12, 0xDF, 0x04, 70 + 0x4A, 0xD6, 0x04, 0x4C, 0xCD, 0x8D, 0x7D, 0x96, 0x1C, 0x00, 0x12, 0xCD, 0xBC, 0x71, 0x7B, 0x1A, 0xCD, 0x8D, 0x5B, 0xE6, 0x57, 0xCD, 0x8D, 0x7D, 0x96, 0x1C, 0x00, 0x0E, 0xCD, 0xBC, 0x71, 0x96, 71 + 0x1C, 0x00, 0x0E, 0xCD, 0xBB, 0x29, 0xA6, 0x03, 0xCD, 0xBA, 0x77, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBC, 0x71, 0x96, 0x1C, 0x00, 0x12, 0xCD, 0xBB, 0x29, 0xA6, 0x03, 0xCD, 0xBA, 0x77, 0x96, 0x1C, 72 + 0x00, 0x05, 0xCD, 0xBA, 0x28, 0x96, 0x1C, 0x00, 0x12, 0xCD, 0xBC, 0x71, 0x7B, 0x1A, 0xCD, 0x8D, 0x60, 0x7B, 0x14, 0xD7, 0x04, 0x4C, 0x7B, 0x1A, 0x72, 0x01, 0x0A, 0x62, 0x69, 0xCD, 0x87, 0xC1, 73 + 0x6B, 0x0D, 0x7B, 0x1A, 0xCD, 0x8D, 0x5B, 0xEE, 0x51, 0x1F, 0x18, 0x7B, 0x1A, 0xCD, 0x8D, 0x5B, 0xEE, 0x53, 0x1F, 0x16, 0x7B, 0x0D, 0x88, 0x7B, 0x1B, 0xCD, 0x8D, 0x5B, 0x01, 0xAB, 0x55, 0x5F, 74 + 0x97, 0x89, 0x7B, 0x1D, 0xCD, 0x8D, 0x5B, 0x01, 0xAB, 0x51, 0x5F, 0x97, 0x89, 0x7B, 0x1F, 0xCD, 0x8D, 0x5B, 0x01, 0xAB, 0x49, 0x5F, 0x97, 0xCD, 0x88, 0xDC, 0x5B, 0x05, 0x7B, 0x0D, 0x88, 0x7B, 75 + 0x1B, 0xCD, 0x8D, 0x5B, 0x01, 0xAB, 0x56, 0x5F, 0x97, 0x89, 0x7B, 0x1D, 0xCD, 0x8D, 0x5B, 0x01, 0xAB, 0x53, 0x5F, 0x97, 0x89, 0x7B, 0x1F, 0xCD, 0x8D, 0x5B, 0x01, 0xAB, 0x4B, 0x5F, 0x97, 0xCD, 76 + 0x88, 0xDC, 0x5B, 0x05, 0x20, 0x13, 0xCD, 0x8D, 0x5B, 0xCD, 0x8D, 0x6E, 0xEE, 0x4D, 0x1F, 0x18, 0x7B, 0x1A, 0xCD, 0x8D, 0x5B, 0xEE, 0x4F, 0x1F, 0x16, 0x7B, 0x1A, 0xCD, 0x8D, 0x5B, 0xEE, 0x51, 77 + 0x72, 0x03, 0x0A, 0x62, 0x1D, 0x72, 0xFB, 0x18, 0x54, 0x1F, 0x07, 0x7B, 0x1A, 0xCD, 0x8D, 0x60, 0x16, 0x07, 0xDF, 0x04, 0x46, 0x7B, 0x1A, 0xCD, 0x8D, 0x5B, 0xEE, 0x53, 0x72, 0xFB, 0x16, 0x54, 78 + 0x20, 0x13, 0x1F, 0x07, 0x7B, 0x1A, 0xCD, 0x8D, 0x60, 0x16, 0x07, 0xDF, 0x04, 0x46, 0x7B, 0x1A, 0xCD, 0x8D, 0x5B, 0xEE, 0x53, 0x1F, 0x07, 0x7B, 0x1A, 0xCD, 0x8D, 0x60, 0x16, 0x07, 0xDF, 0x04, 79 + 0x48, 0xBE, 0x37, 0xCD, 0xBC, 0xF8, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBC, 0x71, 0x7B, 0x1A, 0xCD, 0x8D, 0x60, 0x90, 0xCE, 0x0A, 0x9E, 0xDE, 0x04, 0x46, 0xCD, 0xBC, 0xFF, 0x96, 0xCD, 0x8D, 0x65, 80 + 0x1F, 0x03, 0x7B, 0x1A, 0xCD, 0x8D, 0x60, 0x16, 0x03, 0xCD, 0x8D, 0x86, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBC, 0x71, 0x7B, 0x1A, 0xCD, 0x8D, 0x60, 0x90, 0xCE, 0x0A, 0xA0, 0xDE, 0x04, 0x48, 0xCD, 81 + 0xBC, 0xFF, 0x96, 0xCD, 0x8D, 0x65, 0x1F, 0x03, 0x7B, 0x1A, 0xCD, 0x8D, 0x60, 0x16, 0x03, 0xDF, 0x04, 0x48, 0xDE, 0x04, 0x46, 0x72, 0xF0, 0x09, 0x1F, 0x16, 0x7B, 0x1A, 0xCD, 0x8D, 0x60, 0xDE, 82 + 0x04, 0x48, 0x72, 0xF0, 0x0B, 0x1F, 0x18, 0x1E, 0x16, 0x01, 0x1A, 0x19, 0x01, 0x1A, 0x18, 0x01, 0x5D, 0x27, 0x04, 0x72, 0x14, 0x00, 0xF1, 0xC6, 0x04, 0x41, 0x4A, 0x26, 0x12, 0xCE, 0x04, 0x42, 83 + 0x72, 0xFB, 0x16, 0xCF, 0x04, 0x42, 0xCE, 0x04, 0x44, 0x72, 0xFB, 0x18, 0xCF, 0x04, 0x44, 0x7B, 0x1A, 0x5F, 0x97, 0x58, 0x90, 0x93, 0xEE, 0x9E, 0x72, 0xFB, 0x16, 0x90, 0xEF, 0x9E, 0x5F, 0x97, 84 + 0x58, 0x90, 0x93, 0xEE, 0x94, 0x72, 0xFB, 0x18, 0x90, 0xEF, 0x94, 0x20, 0x1E, 0x7B, 0x1A, 0xAD, 0x7C, 0x90, 0x5A, 0xDF, 0x04, 0x46, 0xDF, 0x04, 0x48, 0x90, 0x5F, 0xDF, 0x04, 0x4A, 0x72, 0x4F, 85 + 0x04, 0x4C, 0x5F, 0x7B, 0x1A, 0x97, 0x58, 0xEF, 0x94, 0xEF, 0x9E, 0x7B, 0x1A, 0x5F, 0x97, 0x58, 0x6D, 0x9E, 0x2A, 0x05, 0xEE, 0x9E, 0x50, 0x20, 0x02, 0xEE, 0x9E, 0x1F, 0x18, 0x5F, 0x97, 0x58, 86 + 0x6D, 0x94, 0x2A, 0x08, 0x5F, 0x97, 0x58, 0xEE, 0x94, 0x50, 0x20, 0x05, 0x5F, 0x97, 0x58, 0xEE, 0x94, 0x1F, 0x16, 0x5F, 0xC6, 0x0A, 0xA2, 0x97, 0xBF, 0xEB, 0x1E, 0x18, 0xB3, 0xEB, 0x22, 0x0A, 87 + 0x5F, 0x97, 0xBF, 0xEB, 0x1E, 0x16, 0xB3, 0xEB, 0x23, 0x0F, 0x7B, 0x1A, 0x5F, 0x97, 0x58, 0x90, 0x5F, 0xEF, 0x9E, 0xEF, 0x94, 0x72, 0x10, 0x04, 0x40, 0x0C, 0x1A, 0x7B, 0x1A, 0xC1, 0x0A, 0x9A, 88 + 0x24, 0x03, 0xCC, 0x89, 0xEB, 0x5B, 0x1A, 0x81, 0x97, 0xA6, 0x0F, 0x42, 0x81, 0x97, 0xA6, 0x07, 0x42, 0x81, 0x1C, 0x00, 0x05, 0xCD, 0xBB, 0x3B, 0xBE, 0xE9, 0x81, 0x90, 0x93, 0x90, 0xEE, 0x49, 89 + 0xEF, 0x51, 0x90, 0x93, 0x90, 0xEE, 0x4B, 0xEF, 0x53, 0x81, 0x5F, 0x97, 0x58, 0x58, 0x58, 0x58, 0xCC, 0xBC, 0xF8, 0xDF, 0x04, 0x46, 0xBE, 0x35, 0xCC, 0xBC, 0xF8, 0x89, 0x7B, 0x05, 0x27, 0x0E, 90 + 0x9E, 0xC7, 0x01, 0x03, 0x9F, 0xC7, 0x01, 0x02, 0x72, 0x5F, 0x01, 0x01, 0x20, 0x1D, 0xC6, 0x01, 0x01, 0xA1, 0x32, 0x25, 0x04, 0xA6, 0x01, 0x85, 0x81, 0x72, 0x5C, 0x01, 0x01, 0xC6, 0x01, 0x03, 91 + 0x11, 0x01, 0x26, 0x07, 0xC6, 0x01, 0x02, 0x11, 0x02, 0x27, 0xEA, 0x4F, 0x20, 0xE9, 0x89, 0x52, 0x07, 0x9E, 0x4D, 0x2B, 0x4F, 0x9F, 0x4D, 0x2B, 0x4B, 0xC6, 0x0A, 0x6D, 0x5F, 0x97, 0x5A, 0x7B, 92 + 0x09, 0x90, 0x5F, 0x4D, 0x2A, 0x02, 0x90, 0x53, 0xCD, 0x90, 0x16, 0x2F, 0x37, 0xCD, 0x90, 0x1E, 0x7B, 0x08, 0x90, 0x5F, 0x4D, 0x2A, 0x02, 0x90, 0x53, 0xCD, 0x90, 0x16, 0x2F, 0x26, 0xAE, 0x00, 93 + 0x01, 0x7B, 0x09, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0x7B, 0x08, 0x90, 0x5F, 0x4D, 0x2A, 0x02, 0x90, 0x53, 0x90, 0x97, 0x90, 0x58, 0x01, 0x90, 0xD4, 0x04, 0x8A, 0x01, 0x90, 0xD4, 0x04, 0x89, 94 + 0x01, 0x5D, 0x26, 0x04, 0x4F, 0x5B, 0x09, 0x81, 0x5F, 0x1F, 0x06, 0x7B, 0x09, 0x27, 0x77, 0x2A, 0x01, 0x53, 0xCD, 0x90, 0x25, 0x1F, 0x03, 0x5F, 0x7B, 0x08, 0x4D, 0x2A, 0x01, 0x53, 0xCD, 0x90, 95 + 0x0E, 0x72, 0xFB, 0x03, 0xDE, 0x05, 0xF1, 0x72, 0xFB, 0x06, 0x1F, 0x06, 0x7B, 0x08, 0x27, 0x24, 0x7B, 0x09, 0x5F, 0x4D, 0x2A, 0x01, 0x53, 0xCD, 0x90, 0x25, 0x1F, 0x03, 0x5F, 0x7B, 0x08, 0x4D, 96 + 0x2A, 0x01, 0x53, 0xCD, 0x90, 0x0E, 0x1D, 0x00, 0x14, 0x72, 0xFB, 0x03, 0xDE, 0x05, 0xF1, 0x72, 0xFB, 0x06, 0x1F, 0x06, 0xCD, 0x90, 0x1E, 0x7B, 0x08, 0x90, 0x5F, 0x4D, 0x2A, 0x02, 0x90, 0x53, 97 + 0xCD, 0x90, 0x16, 0x27, 0x21, 0x7B, 0x09, 0x5F, 0x4D, 0x2A, 0x01, 0x53, 0xCD, 0x90, 0x25, 0x1F, 0x03, 0x5F, 0x7B, 0x08, 0x4D, 0x2A, 0x01, 0x53, 0xCD, 0x90, 0x0E, 0x72, 0xFB, 0x03, 0xDE, 0x06, 98 + 0x05, 0x72, 0xFB, 0x06, 0x1F, 0x06, 0xC6, 0x0A, 0x6D, 0x5F, 0x97, 0x5A, 0x7B, 0x09, 0x90, 0x5F, 0x4D, 0x2A, 0x02, 0x90, 0x53, 0xCD, 0x90, 0x16, 0x27, 0x76, 0x5F, 0x4D, 0x2A, 0x01, 0x53, 0x97, 99 + 0x58, 0x1F, 0x03, 0x5F, 0x7B, 0x08, 0x4D, 0x2A, 0x01, 0x53, 0xCD, 0x90, 0x0E, 0x72, 0xFB, 0x03, 0xDE, 0x05, 0xF3, 0x72, 0xFB, 0x06, 0x1F, 0x06, 0x7B, 0x08, 0x27, 0x23, 0x7B, 0x09, 0x5F, 0x4D, 100 + 0x2A, 0x01, 0x53, 0x97, 0x58, 0x1F, 0x03, 0x5F, 0x7B, 0x08, 0x4D, 0x2A, 0x01, 0x53, 0xCD, 0x90, 0x0E, 0x1D, 0x00, 0x14, 0x72, 0xFB, 0x03, 0xDE, 0x05, 0xF3, 0x72, 0xFB, 0x06, 0x1F, 0x06, 0xCD, 101 + 0x90, 0x1E, 0x7B, 0x08, 0x90, 0x5F, 0x4D, 0x2A, 0x02, 0x90, 0x53, 0xCD, 0x90, 0x16, 0x27, 0x20, 0x7B, 0x09, 0x5F, 0x4D, 0x2A, 0x01, 0x53, 0x97, 0x58, 0x1F, 0x03, 0x5F, 0x7B, 0x08, 0x4D, 0x2A, 102 + 0x01, 0x53, 0xCD, 0x90, 0x0E, 0x72, 0xFB, 0x03, 0xDE, 0x06, 0x07, 0x72, 0xFB, 0x06, 0x1F, 0x06, 0x7B, 0x08, 0x27, 0x23, 0x7B, 0x09, 0x5F, 0x4D, 0x2A, 0x01, 0x53, 0x97, 0x58, 0x1F, 0x03, 0x5F, 103 + 0x7B, 0x08, 0x4D, 0x2A, 0x01, 0x53, 0xCD, 0x90, 0x0E, 0x1D, 0x00, 0x14, 0x72, 0xFB, 0x03, 0xDE, 0x05, 0xF1, 0x72, 0xFB, 0x06, 0x1F, 0x06, 0xCD, 0x90, 0x1E, 0x7B, 0x08, 0x90, 0x5F, 0x4D, 0x2A, 104 + 0x02, 0x90, 0x53, 0xCD, 0x90, 0x16, 0x27, 0x20, 0x7B, 0x09, 0x5F, 0x4D, 0x2A, 0x01, 0x53, 0x97, 0x58, 0x1F, 0x03, 0x5F, 0x7B, 0x08, 0x4D, 0x2A, 0x01, 0x53, 0xCD, 0x90, 0x0E, 0x72, 0xFB, 0x03, 105 + 0xDE, 0x06, 0x05, 0x72, 0xFB, 0x06, 0x1F, 0x06, 0xC6, 0x0A, 0x9B, 0x6B, 0x05, 0x72, 0x05, 0x00, 0xE6, 0x02, 0x0F, 0x05, 0x7B, 0x09, 0x5F, 0x4D, 0x2A, 0x01, 0x53, 0x97, 0x90, 0xAE, 0x00, 0x05, 106 + 0xCD, 0xB9, 0xDA, 0x1F, 0x03, 0x5F, 0x7B, 0x08, 0x4D, 0x2A, 0x01, 0x53, 0x97, 0x90, 0xAE, 0x00, 0x32, 0xCD, 0xB9, 0xDA, 0x72, 0xFB, 0x03, 0xDE, 0x01, 0x41, 0x1F, 0x01, 0x1E, 0x06, 0x57, 0x57, 107 + 0x57, 0x57, 0x57, 0x57, 0x7B, 0x05, 0x90, 0x5F, 0x90, 0x97, 0xCD, 0xB9, 0xDA, 0x72, 0xFB, 0x01, 0x1F, 0x06, 0x5F, 0x7B, 0x09, 0x4D, 0x2A, 0x01, 0x53, 0x97, 0x58, 0x1F, 0x03, 0x5F, 0x7B, 0x08, 108 + 0x4D, 0x2A, 0x01, 0x53, 0xAD, 0x35, 0x72, 0xFB, 0x03, 0xDE, 0x05, 0xF1, 0x13, 0x06, 0x2E, 0x03, 0xCC, 0x8E, 0x17, 0x7B, 0x09, 0x5F, 0x4D, 0x2A, 0x01, 0x53, 0x97, 0x1F, 0x03, 0x5F, 0x7B, 0x08, 109 + 0x4D, 0x2A, 0x01, 0x53, 0x97, 0x90, 0xAE, 0x00, 0x0A, 0xCD, 0xB9, 0xDA, 0x72, 0xFB, 0x0C, 0x72, 0xFB, 0x03, 0xC6, 0x04, 0x41, 0xF7, 0xA6, 0x01, 0xCC, 0x8E, 0x18, 0x97, 0x90, 0xAE, 0x00, 0x14, 110 + 0xCC, 0xB9, 0xDA, 0x90, 0x97, 0x90, 0xBF, 0xEE, 0xB3, 0xEE, 0x81, 0xC6, 0x0A, 0x6E, 0x5F, 0x97, 0x5A, 0x81, 0x97, 0x58, 0x1D, 0x00, 0x02, 0x81, 0x89, 0x52, 0x04, 0x5F, 0x1F, 0x03, 0x7B, 0x06, 111 + 0x97, 0x58, 0x1F, 0x01, 0x7B, 0x05, 0xCD, 0x91, 0x78, 0x72, 0xFB, 0x01, 0xDE, 0x05, 0xF1, 0x13, 0x03, 0x2C, 0x03, 0xCC, 0x91, 0x69, 0x72, 0x05, 0x0A, 0x99, 0x6B, 0x72, 0x01, 0x0A, 0x99, 0x23, 112 + 0xC6, 0x0A, 0x6E, 0xCD, 0x91, 0x9C, 0x10, 0x05, 0x24, 0x01, 0x5A, 0x02, 0x89, 0x7B, 0x08, 0x5F, 0x97, 0x58, 0x1F, 0x05, 0x7B, 0x07, 0xCD, 0x91, 0x78, 0x72, 0xFB, 0x05, 0x90, 0x85, 0xCD, 0x91, 113 + 0x7D, 0x20, 0x17, 0x7B, 0x06, 0x5F, 0x97, 0x58, 0x1F, 0x03, 0x7B, 0x05, 0xCD, 0x91, 0x78, 0x72, 0xFB, 0x03, 0x7B, 0x05, 0xDE, 0x05, 0xF1, 0xCD, 0x91, 0x88, 0x7B, 0x09, 0xCD, 0x91, 0x92, 0x72, 114 + 0x03, 0x0A, 0x99, 0x0C, 0xC6, 0x0A, 0x6D, 0xCD, 0x91, 0x9C, 0x10, 0x06, 0x24, 0x6C, 0x20, 0x69, 0x7B, 0x06, 0x5F, 0x97, 0x58, 0x1F, 0x03, 0x7B, 0x05, 0xCD, 0x91, 0x78, 0x72, 0xFB, 0x03, 0x7B, 115 + 0x06, 0xDE, 0x05, 0xF1, 0x20, 0x7D, 0x72, 0x01, 0x0A, 0x99, 0x23, 0xC6, 0x0A, 0x6D, 0xCD, 0x91, 0x9C, 0x10, 0x06, 0x24, 0x01, 0x5A, 0x02, 0x89, 0x7B, 0x08, 0x5F, 0x97, 0x58, 0x1F, 0x05, 0x7B, 116 + 0x07, 0xCD, 0x91, 0x78, 0x72, 0xFB, 0x05, 0x90, 0x85, 0xCD, 0x91, 0x7D, 0x20, 0x17, 0x7B, 0x06, 0x5F, 0x97, 0x58, 0x1F, 0x03, 0x7B, 0x05, 0xCD, 0x91, 0x78, 0x72, 0xFB, 0x03, 0x7B, 0x06, 0xDE, 117 + 0x05, 0xF1, 0xCD, 0x91, 0x88, 0x7B, 0x09, 0xCD, 0x91, 0x92, 0x72, 0x03, 0x0A, 0x99, 0x21, 0xC6, 0x0A, 0x6E, 0xCD, 0x91, 0x9C, 0x10, 0x05, 0x24, 0x01, 0x5A, 0x02, 0x89, 0x7B, 0x08, 0x5F, 0x97, 118 + 0x58, 0x1F, 0x05, 0x7B, 0x07, 0xAD, 0x5E, 0x72, 0xFB, 0x05, 0x90, 0x85, 0xAD, 0x5C, 0x20, 0x15, 0x7B, 0x06, 0x5F, 0x97, 0x58, 0x1F, 0x03, 0x7B, 0x05, 0xAD, 0x4A, 0x72, 0xFB, 0x03, 0x7B, 0x05, 119 + 0xDE, 0x05, 0xF1, 0xAD, 0x50, 0x7B, 0x09, 0x97, 0xA6, 0x04, 0x42, 0x1C, 0x01, 0x04, 0xCD, 0xBA, 0x60, 0x7B, 0x06, 0x5F, 0x97, 0x58, 0x1F, 0x03, 0x7B, 0x05, 0xAD, 0x29, 0x72, 0xFB, 0x03, 0x7B, 120 + 0x09, 0xDE, 0x05, 0xF1, 0x90, 0x5F, 0x90, 0x97, 0x90, 0x58, 0xBF, 0xEB, 0x93, 0xEE, 0x3E, 0x72, 0xBB, 0x00, 0xEB, 0x90, 0xEF, 0x3E, 0x7B, 0x0A, 0x27, 0x08, 0x7B, 0x09, 0x97, 0xA6, 0x0F, 0x42, 121 + 0x6C, 0x57, 0x5B, 0x06, 0x81, 0x97, 0xA6, 0x14, 0x42, 0x81, 0xDE, 0x05, 0xF1, 0xCD, 0xB9, 0xDA, 0x90, 0x93, 0xCC, 0xBA, 0x15, 0x90, 0x5F, 0x90, 0x97, 0xCD, 0xB9, 0xDA, 0xCC, 0xBA, 0x07, 0x97, 122 + 0xA6, 0x04, 0x42, 0x1C, 0x01, 0x18, 0xCC, 0xBA, 0x60, 0x5F, 0x97, 0x5A, 0x01, 0x81, 0x52, 0x07, 0x0F, 0x07, 0x20, 0x60, 0x5F, 0x97, 0x58, 0xEE, 0x3E, 0xCD, 0xBC, 0xF8, 0x96, 0x1C, 0x00, 0x03, 123 + 0xCD, 0xBC, 0x71, 0x7B, 0x07, 0x97, 0xA6, 0x04, 0x42, 0x1C, 0x01, 0x18, 0xCD, 0xBB, 0x29, 0x48, 0xCD, 0xBA, 0x77, 0x96, 0xAD, 0x48, 0x1F, 0x01, 0x7B, 0x07, 0x97, 0xA6, 0x0F, 0x42, 0x16, 0x01, 124 + 0xEF, 0x49, 0x5F, 0x7B, 0x07, 0x97, 0x58, 0xEE, 0x3E, 0xCD, 0xBC, 0xF8, 0x96, 0x1C, 0x00, 0x03, 0xCD, 0xBC, 0x71, 0x7B, 0x07, 0x97, 0xA6, 0x04, 0x42, 0x1C, 0x01, 0x04, 0xCD, 0xBB, 0x29, 0x48, 125 + 0xCD, 0xBA, 0x77, 0x96, 0xAD, 0x18, 0x1F, 0x01, 0x7B, 0x07, 0x97, 0xA6, 0x0F, 0x42, 0x16, 0x01, 0xEF, 0x4B, 0x0C, 0x07, 0x7B, 0x07, 0xC1, 0x04, 0x41, 0x25, 0x99, 0x5B, 0x07, 0x81, 0x1C, 0x00, 126 + 0x03, 0xCD, 0xBB, 0x3B, 0xBE, 0xE9, 0x81, 0x89, 0x72, 0x02, 0x00, 0xF1, 0x20, 0x9E, 0x4D, 0x2B, 0x1C, 0x9F, 0x4D, 0x2B, 0x18, 0x9E, 0xC1, 0x0A, 0x6E, 0x24, 0x12, 0x9F, 0xC1, 0x0A, 0x6D, 0x24, 127 + 0x0C, 0x4B, 0x00, 0x3B, 0x04, 0x41, 0x7B, 0x03, 0x95, 0xCD, 0x90, 0x2B, 0x85, 0x72, 0x13, 0x00, 0xF1, 0x85, 0x81, 0x89, 0xB6, 0x3C, 0x97, 0xB6, 0x3A, 0x95, 0xCD, 0x8D, 0xC1, 0x4A, 0x85, 0x26, 128 + 0x11, 0xB6, 0x39, 0xA1, 0x03, 0x26, 0x04, 0x3F, 0x39, 0x20, 0x02, 0x3C, 0x39, 0x72, 0x12, 0x00, 0xF1, 0x81, 0xB6, 0x39, 0x26, 0x06, 0x35, 0x03, 0x00, 0x39, 0x20, 0x02, 0x3A, 0x39, 0xB6, 0x3C, 129 + 0x97, 0xB6, 0x3A, 0x95, 0xCC, 0x92, 0x1A, 0x89, 0x52, 0x03, 0xA6, 0x01, 0x6B, 0x01, 0x3F, 0x39, 0x9E, 0x6B, 0x03, 0x9F, 0x6B, 0x02, 0x4B, 0x01, 0x7B, 0x04, 0x97, 0x7B, 0x03, 0x95, 0xCD, 0x8D, 130 + 0x8E, 0x84, 0xCC, 0x93, 0x4B, 0xB6, 0x39, 0x26, 0x19, 0x7B, 0x02, 0x4A, 0x97, 0x7B, 0x03, 0x95, 0xCD, 0x92, 0x1A, 0x0C, 0x03, 0x7B, 0x02, 0xB7, 0x3D, 0x7B, 0x03, 0xB7, 0x3B, 0x7B, 0x02, 0x4A, 131 + 0x20, 0x1A, 0xA1, 0x03, 0x26, 0x1C, 0x7B, 0x02, 0x97, 0x7B, 0x03, 0x95, 0xCD, 0x92, 0x1A, 0x0C, 0x02, 0x7B, 0x02, 0xB7, 0x3D, 0x7B, 0x03, 0x4A, 0xB7, 0x3B, 0x7B, 0x02, 0xB7, 0x3C, 0x7B, 0x03, 132 + 0x20, 0x3C, 0xA1, 0x02, 0x26, 0x1A, 0x7B, 0x02, 0x97, 0x7B, 0x03, 0x4A, 0x95, 0xCD, 0x92, 0x1A, 0x0A, 0x03, 0x7B, 0x02, 0x4A, 0xB7, 0x3D, 0x7B, 0x03, 0x4A, 0xB7, 0x3B, 0x7B, 0x02, 0x20, 0x19, 133 + 0x7B, 0x02, 0x4A, 0x97, 0x7B, 0x03, 0x4A, 0x95, 0xCD, 0x92, 0x1A, 0x0A, 0x02, 0x7B, 0x02, 0x4A, 0xB7, 0x3D, 0x7B, 0x03, 0xB7, 0x3B, 0x7B, 0x02, 0x4A, 0xB7, 0x3C, 0x7B, 0x03, 0x4A, 0xB7, 0x3A, 134 + 0x1E, 0x08, 0x89, 0xB6, 0x3D, 0x97, 0xB6, 0x3B, 0x95, 0xCD, 0x8D, 0xC1, 0x4A, 0x85, 0x26, 0x10, 0x1E, 0x08, 0x89, 0xB6, 0x3C, 0x97, 0xB6, 0x3A, 0x95, 0xCD, 0x8D, 0xC1, 0x4D, 0x85, 0x27, 0x18, 135 + 0x4B, 0x00, 0x7B, 0x04, 0x97, 0x7B, 0x03, 0x95, 0xCD, 0x8D, 0x8E, 0x5B, 0x01, 0x4A, 0x26, 0x03, 0x5B, 0x05, 0x81, 0x1E, 0x08, 0xCD, 0x92, 0x46, 0x7B, 0x01, 0x27, 0x03, 0xCC, 0x92, 0x98, 0x20, 136 + 0xEF, 0x88, 0x4F, 0x6B, 0x01, 0x97, 0xA6, 0x07, 0x42, 0x90, 0xAE, 0xFF, 0xFF, 0xDF, 0x04, 0x46, 0xDF, 0x04, 0x48, 0x90, 0x5F, 0xDF, 0x04, 0x4A, 0x72, 0x4F, 0x04, 0x4C, 0x7B, 0x01, 0x97, 0xA6, 137 + 0x0F, 0x42, 0x90, 0x5A, 0xEF, 0x49, 0xEF, 0x4B, 0xEF, 0x4D, 0xEF, 0x4F, 0xEF, 0x53, 0xEF, 0x51, 0x0C, 0x01, 0x7B, 0x01, 0xA1, 0x05, 0x25, 0xCD, 0x84, 0x81, 0x52, 0x04, 0xB6, 0xBE, 0x5F, 0x97, 138 + 0x90, 0xAE, 0x03, 0xE8, 0xCD, 0xBC, 0xFF, 0x96, 0x5C, 0xCD, 0xBC, 0x71, 0xBE, 0xC1, 0xCD, 0xBC, 0xF8, 0x96, 0x5C, 0xCD, 0xBA, 0x28, 0xAE, 0x01, 0x2C, 0xCD, 0xBC, 0x71, 0xC6, 0x0A, 0x9D, 0x5F, 139 + 0x97, 0xA6, 0x20, 0xCD, 0xB9, 0xA8, 0xAE, 0x01, 0x2C, 0xCD, 0xBA, 0x28, 0xAE, 0x01, 0x30, 0xCD, 0xBC, 0x71, 0x72, 0x10, 0x00, 0xF1, 0x5B, 0x04, 0x81, 0x88, 0x0F, 0x01, 0x20, 0x16, 0x97, 0xA6, 140 + 0x0F, 0x42, 0xE6, 0x57, 0xC1, 0x0A, 0x9C, 0x23, 0x09, 0x72, 0x12, 0x04, 0x40, 0xCD, 0x93, 0x8D, 0x84, 0x81, 0x0C, 0x01, 0x7B, 0x01, 0xC1, 0x04, 0x41, 0x25, 0xE3, 0x84, 0x81, 0x52, 0x9E, 0x96, 141 + 0x1C, 0x00, 0x06, 0x90, 0xAE, 0x84, 0x80, 0xA6, 0x96, 0xCD, 0xBD, 0x4A, 0x0F, 0x9E, 0x20, 0x3F, 0x97, 0xA6, 0x0F, 0x42, 0x90, 0x93, 0x90, 0xEE, 0x49, 0xEF, 0x4D, 0x90, 0x93, 0x90, 0xEE, 0x4B, 142 + 0xEF, 0x4F, 0xCD, 0x95, 0xC6, 0x7B, 0x9E, 0x97, 0xA6, 0x04, 0x42, 0x4F, 0xD7, 0x01, 0x1B, 0xD7, 0x01, 0x1A, 0xD7, 0x01, 0x19, 0xD7, 0x01, 0x18, 0xD7, 0x01, 0x07, 0xD7, 0x01, 0x06, 0xD7, 0x01, 143 + 0x05, 0xD7, 0x01, 0x04, 0x5F, 0x7B, 0x9E, 0x97, 0x58, 0x90, 0x5F, 0xEF, 0x3E, 0x0C, 0x9E, 0x7B, 0x9E, 0xC1, 0x0A, 0x9A, 0x25, 0xBA, 0x55, 0x04, 0x41, 0x00, 0x48, 0x72, 0x5F, 0x04, 0x41, 0x72, 144 + 0x15, 0x04, 0x40, 0x0F, 0x9D, 0xCC, 0x95, 0xA6, 0x5F, 0x97, 0x58, 0xD6, 0x04, 0x8A, 0xDA, 0x04, 0x89, 0x26, 0x03, 0xCC, 0x95, 0xA4, 0x0F, 0x05, 0xA6, 0xFF, 0x6B, 0x9C, 0x0F, 0x9E, 0xCC, 0x95, 145 + 0x9A, 0x96, 0x1C, 0x00, 0x06, 0x1F, 0x03, 0x7B, 0x9D, 0xCD, 0x95, 0xD1, 0x72, 0xFB, 0x03, 0x01, 0x1B, 0x9E, 0x24, 0x01, 0x5C, 0x02, 0xF6, 0x4C, 0x27, 0x1E, 0xA6, 0x01, 0x6B, 0x05, 0x96, 0x1C, 146 + 0x00, 0x06, 0x1F, 0x03, 0x7B, 0x9D, 0xCD, 0x95, 0xD1, 0x72, 0xFB, 0x03, 0x01, 0x1B, 0x9E, 0x24, 0x01, 0x5C, 0x02, 0xF6, 0x6B, 0x9C, 0x20, 0x67, 0x7B, 0x05, 0x4A, 0x26, 0x72, 0x7B, 0x9E, 0x5F, 147 + 0x97, 0x5A, 0x1F, 0x03, 0x96, 0x1C, 0x00, 0x06, 0x1F, 0x01, 0x7B, 0x9D, 0xCD, 0x95, 0xD1, 0x72, 0xFB, 0x01, 0x72, 0xFB, 0x03, 0xF6, 0x11, 0x9C, 0x26, 0x2D, 0xAE, 0x00, 0x01, 0x7B, 0x9E, 0x27, 148 + 0x04, 0x58, 0x4A, 0x26, 0xFC, 0x7B, 0x9D, 0xCD, 0x95, 0xB3, 0x27, 0x12, 0x96, 0x1C, 0x00, 0x06, 0x89, 0x7B, 0xA0, 0x97, 0x7B, 0x9F, 0x95, 0xCD, 0x8D, 0xC1, 0x4D, 0x85, 0x26, 0x09, 0x0F, 0x05, 149 + 0xA6, 0xFF, 0x6B, 0x9C, 0xCC, 0x95, 0x98, 0x96, 0x1C, 0x00, 0x06, 0x1F, 0x03, 0x7B, 0x9D, 0xCD, 0x95, 0xD1, 0x72, 0xFB, 0x03, 0x01, 0x1B, 0x9E, 0x24, 0x01, 0x5C, 0x02, 0x7B, 0x9C, 0xF7, 0x4B, 150 + 0x01, 0x7B, 0x9D, 0x88, 0x7B, 0xA0, 0x97, 0x7B, 0x9F, 0x95, 0xCD, 0x90, 0x2B, 0x20, 0x75, 0xAE, 0x00, 0x01, 0x7B, 0x9E, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0x7B, 0x9D, 0xCD, 0x95, 0xB3, 0x27, 151 + 0x64, 0x96, 0x1C, 0x00, 0x06, 0x89, 0x7B, 0xA0, 0x97, 0x7B, 0x9F, 0x95, 0xCD, 0x8D, 0xC1, 0x4D, 0x85, 0x27, 0x52, 0xC6, 0x04, 0x41, 0xC1, 0x0A, 0x9A, 0x26, 0x22, 0x72, 0x5F, 0x04, 0x41, 0x0F, 152 + 0x9E, 0x20, 0x08, 0x97, 0xA6, 0x0F, 0x42, 0xAD, 0x6A, 0x0C, 0x9E, 0x7B, 0x9E, 0xC1, 0x0A, 0x9A, 0x25, 0xF1, 0x72, 0x02, 0x04, 0x40, 0x04, 0x72, 0x14, 0x04, 0x40, 0x20, 0x40, 0x6B, 0x9C, 0xA6, 153 + 0x01, 0x6B, 0x05, 0x4B, 0x01, 0x7B, 0x9D, 0x88, 0x7B, 0xA0, 0x97, 0x7B, 0x9F, 0x95, 0xCD, 0x90, 0x2B, 0x85, 0x96, 0x1C, 0x00, 0x06, 0x89, 0x7B, 0xA0, 0x97, 0x7B, 0x9F, 0x95, 0xCD, 0x92, 0x7A, 154 + 0x72, 0x5C, 0x04, 0x41, 0x85, 0x0C, 0x9E, 0x7B, 0x9E, 0xC1, 0x0A, 0x6D, 0x24, 0x03, 0xCC, 0x94, 0x74, 0x0C, 0x9D, 0x7B, 0x9D, 0xC1, 0x0A, 0x6E, 0x24, 0x03, 0xCC, 0x94, 0x5B, 0x5B, 0x9E, 0x81, 155 + 0x90, 0x5F, 0x90, 0x97, 0x90, 0x58, 0x01, 0x90, 0xD4, 0x04, 0x8A, 0x01, 0x90, 0xD4, 0x04, 0x89, 0x01, 0x5D, 0x81, 0x90, 0xAE, 0xFF, 0xFF, 0xEF, 0x49, 0xEF, 0x4B, 0x6F, 0x57, 0x81, 0x97, 0xA6, 156 + 0x0A, 0x42, 0x81, 0x52, 0x08, 0xCD, 0x93, 0x54, 0xB6, 0xBE, 0x5F, 0x97, 0x90, 0xAE, 0x03, 0xE8, 0xCD, 0xBC, 0xFF, 0x96, 0x5C, 0xCD, 0xBC, 0x71, 0xBE, 0xC1, 0xCD, 0xBC, 0xF8, 0x96, 0x5C, 0xCD, 157 + 0xBA, 0x28, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBC, 0x71, 0xAE, 0x01, 0x30, 0xAD, 0x2C, 0x96, 0x24, 0x06, 0xAD, 0x1B, 0x23, 0x16, 0x20, 0x04, 0xAD, 0x15, 0x22, 0x08, 0x96, 0x1C, 0x00, 0x05, 0xAD, 158 + 0x19, 0x24, 0x08, 0x72, 0x11, 0x00, 0xF1, 0x72, 0x13, 0x04, 0x40, 0x5B, 0x08, 0x81, 0x1C, 0x00, 0x05, 0xCD, 0xBB, 0x29, 0xAE, 0x01, 0x30, 0xCC, 0xBA, 0x40, 0xCD, 0xBB, 0x29, 0xAE, 0x01, 0x2C, 159 + 0xCC, 0xBA, 0x40, 0x89, 0x72, 0x05, 0x0A, 0x99, 0x0A, 0xC6, 0x0A, 0x6E, 0x6B, 0x01, 0xC6, 0x0A, 0x6D, 0x20, 0x08, 0xC6, 0x0A, 0x6D, 0x6B, 0x01, 0xC6, 0x0A, 0x6E, 0x6B, 0x02, 0x5F, 0x7B, 0x01, 160 + 0x97, 0x5A, 0x4F, 0x02, 0xBF, 0x37, 0x5F, 0x7B, 0x02, 0x97, 0x5A, 0x4F, 0x02, 0xBF, 0x35, 0xCD, 0x93, 0xF0, 0x72, 0x07, 0x0A, 0x99, 0x03, 0xCD, 0x93, 0xCC, 0x72, 0x00, 0x00, 0xF1, 0x0B, 0xCD, 161 + 0x91, 0xA1, 0xCD, 0x86, 0x58, 0xCD, 0x89, 0xDC, 0x20, 0x03, 0xCD, 0x95, 0xD6, 0x85, 0x81, 0x88, 0x72, 0x03, 0x04, 0x40, 0x05, 0xAE, 0x9C, 0x55, 0xBF, 0x01, 0x4F, 0x6B, 0x01, 0xAD, 0x40, 0xCD, 162 + 0xBD, 0x59, 0xBE, 0xA8, 0xA3, 0x99, 0x17, 0x27, 0x03, 0xCD, 0x96, 0xF9, 0x72, 0x04, 0x04, 0x40, 0x0A, 0xBE, 0xA8, 0xA3, 0x80, 0x01, 0x25, 0x03, 0xFD, 0xBF, 0xA8, 0x7B, 0x01, 0xAD, 0x20, 0xCD, 163 + 0xBD, 0x3B, 0x0C, 0x01, 0x7B, 0x01, 0xA1, 0x02, 0x25, 0xD3, 0x72, 0x04, 0x04, 0x40, 0x05, 0x92, 0xCD, 0x01, 0xBF, 0x01, 0xC6, 0x04, 0x3D, 0xC4, 0x0A, 0xE7, 0xC7, 0x04, 0x3D, 0x84, 0x81, 0x97, 164 + 0xA6, 0x16, 0x42, 0x01, 0xAB, 0x03, 0x5F, 0x97, 0x90, 0xAE, 0x00, 0xA8, 0xA6, 0x16, 0x81, 0x89, 0xBE, 0xBA, 0xA6, 0x7D, 0xCD, 0xBC, 0x89, 0x72, 0xBB, 0x00, 0xB8, 0x13, 0x01, 0x24, 0x04, 0xA6, 165 + 0x01, 0x20, 0x01, 0x4F, 0x85, 0x81, 0x89, 0xB6, 0xC3, 0x97, 0x4F, 0x02, 0x1F, 0x01, 0x5F, 0xC6, 0x52, 0xE6, 0x97, 0x72, 0xFB, 0x01, 0x58, 0x72, 0xB0, 0x00, 0xB6, 0xBF, 0xBA, 0x5F, 0xC6, 0x04, 166 + 0x3C, 0x97, 0x1F, 0x01, 0xBE, 0xB8, 0x72, 0xFB, 0x01, 0xBF, 0xB8, 0x85, 0x81, 0x89, 0xB6, 0xC3, 0x97, 0x4F, 0x02, 0x1F, 0x01, 0x5F, 0xC6, 0x52, 0xE6, 0x97, 0x72, 0xFB, 0x01, 0x58, 0xBF, 0xB6, 167 + 0x5F, 0xBF, 0xB8, 0x85, 0x81, 0x52, 0x0A, 0xBE, 0xAC, 0x89, 0x92, 0xCE, 0xAA, 0xCD, 0x85, 0xBE, 0x5B, 0x02, 0x1F, 0x05, 0xBE, 0xAE, 0x89, 0xBE, 0xAA, 0xEE, 0x02, 0xCD, 0x85, 0xBE, 0x5B, 0x02, 168 + 0x1F, 0x07, 0xCD, 0xBC, 0xF8, 0x96, 0x5C, 0xCD, 0xBC, 0x71, 0x1E, 0x05, 0xA6, 0x40, 0xCD, 0xB9, 0xA8, 0x96, 0x5C, 0xCD, 0xBB, 0x3B, 0xBE, 0xE9, 0x1F, 0x09, 0xA3, 0x00, 0xFF, 0x24, 0x04, 0x7B, 169 + 0x0A, 0x20, 0x02, 0xA6, 0xFF, 0xB7, 0xB5, 0x1E, 0x05, 0xCD, 0xBC, 0xF8, 0x96, 0x5C, 0xCD, 0xBC, 0x71, 0x1E, 0x07, 0xA6, 0x40, 0xCD, 0xB9, 0xA8, 0x96, 0x5C, 0xCD, 0xBB, 0x3B, 0xBE, 0xE9, 0x1F, 170 + 0x09, 0xA3, 0x00, 0xFF, 0x24, 0x04, 0x7B, 0x0A, 0x20, 0x02, 0xA6, 0xFF, 0xB7, 0xB4, 0x5B, 0x0A, 0x81, 0xBE, 0xAA, 0xEE, 0x02, 0x89, 0x92, 0xCE, 0xAA, 0x89, 0xBE, 0xAE, 0x89, 0xBE, 0xAC, 0xCD, 171 + 0x89, 0x66, 0x5B, 0x06, 0xBF, 0xBC, 0xCC, 0x97, 0x38, 0x52, 0x05, 0xC6, 0x0A, 0xF7, 0x6B, 0x03, 0xCE, 0x0A, 0xF3, 0x1F, 0x01, 0xCE, 0x0A, 0xF5, 0x1F, 0x04, 0xBE, 0xA8, 0xA3, 0x97, 0xBC, 0x26, 172 + 0x0A, 0xCE, 0x0A, 0xEF, 0x1F, 0x01, 0xCE, 0x0A, 0xF1, 0x1F, 0x04, 0xC6, 0x04, 0x41, 0xA1, 0x02, 0x25, 0x0A, 0xC6, 0x0A, 0xFA, 0x6B, 0x03, 0xCE, 0x0A, 0xF8, 0x1F, 0x04, 0x90, 0xBE, 0xAA, 0x90, 173 + 0xFE, 0x90, 0x5C, 0x26, 0x03, 0x5F, 0x20, 0x14, 0xCD, 0x97, 0xA4, 0x1E, 0x01, 0xCD, 0x96, 0xE2, 0x4D, 0x26, 0x0C, 0xBE, 0x01, 0xA3, 0x9B, 0x8E, 0x26, 0x05, 0xBE, 0xA8, 0x5B, 0x05, 0x81, 0xBE, 174 + 0xBC, 0x13, 0x04, 0x25, 0xF5, 0xB6, 0xB4, 0x11, 0x03, 0x22, 0x38, 0x90, 0xBE, 0xAA, 0x90, 0xFE, 0x90, 0xB3, 0xAC, 0xBE, 0xA8, 0x24, 0x16, 0xA3, 0x98, 0x98, 0x27, 0x05, 0xA3, 0x97, 0xBC, 0x26, 175 + 0x22, 0xCD, 0x97, 0x20, 0x5F, 0xCF, 0x04, 0x44, 0xAE, 0x00, 0x04, 0x20, 0xCF, 0xA3, 0x98, 0x9B, 0x27, 0x05, 0xA3, 0x97, 0xBC, 0x26, 0x0C, 0xCD, 0x97, 0x20, 0x5F, 0xCF, 0x04, 0x44, 0xAE, 0x00, 176 + 0x08, 0x20, 0xB9, 0xB6, 0xB5, 0x11, 0x03, 0x22, 0xB1, 0x90, 0xBE, 0xAA, 0x90, 0xEE, 0x02, 0x90, 0xB3, 0xAE, 0x23, 0x18, 0xBE, 0xA8, 0xA3, 0x98, 0x9E, 0x27, 0x05, 0xA3, 0x97, 0xBC, 0x26, 0x9A, 177 + 0xCD, 0x97, 0x20, 0x5F, 0xCF, 0x04, 0x42, 0xAE, 0x00, 0x10, 0x20, 0x90, 0xBE, 0xA8, 0xA3, 0x98, 0xA1, 0x27, 0x05, 0xA3, 0x97, 0xBC, 0x26, 0x82, 0xCD, 0x97, 0x20, 0x5F, 0xCF, 0x04, 0x42, 0xAE, 178 + 0x00, 0x20, 0xCC, 0x98, 0x0F, 0xCC, 0x97, 0xBC, 0xCC, 0x97, 0xBC, 0xCC, 0x97, 0xBC, 0xCC, 0x97, 0xBC, 0x5F, 0xCF, 0x04, 0x44, 0xCF, 0x04, 0x42, 0x90, 0xBE, 0xAA, 0x90, 0xFE, 0x90, 0x5C, 0x26, 179 + 0x19, 0xCE, 0x0A, 0xE9, 0xCD, 0x96, 0xE2, 0x4D, 0x27, 0x10, 0xBE, 0xB0, 0x92, 0xCF, 0xAA, 0xBE, 0xAA, 0x90, 0xBE, 0xB2, 0xEF, 0x02, 0xAE, 0x00, 0x01, 0x81, 0x92, 0xCE, 0xAA, 0xBF, 0xB0, 0xBE, 180 + 0xAA, 0xEE, 0x02, 0xBF, 0xB2, 0xBE, 0xAE, 0x89, 0xBE, 0xAC, 0x89, 0xBE, 0xB2, 0x89, 0xBE, 0xB0, 0xCD, 0x89, 0x66, 0x5B, 0x06, 0xC3, 0x0A, 0xEB, 0x23, 0x04, 0xAE, 0x97, 0xBC, 0x81, 0xCE, 0x0A, 181 + 0xE9, 0x72, 0xBB, 0x0A, 0xED, 0xCD, 0x96, 0xE2, 0x4D, 0x26, 0x04, 0xAE, 0x00, 0x02, 0x81, 0xAE, 0x98, 0xA4, 0x81, 0x90, 0xBE, 0xAA, 0x90, 0xFE, 0x90, 0x5C, 0x26, 0x04, 0xAE, 0x99, 0x17, 0x81, 182 + 0xAE, 0x99, 0x06, 0x81, 0x90, 0xBE, 0xAA, 0x90, 0xFE, 0x90, 0x5C, 0x27, 0x1A, 0x92, 0xCE, 0xAA, 0xBF, 0xB0, 0xBF, 0xAC, 0xBE, 0xAA, 0xEE, 0x02, 0xBF, 0xB2, 0xBF, 0xAE, 0x3F, 0xB4, 0x3F, 0xB5, 183 + 0xCD, 0x97, 0x20, 0xAE, 0x98, 0xA4, 0x81, 0xAE, 0x99, 0x17, 0x81, 0xCC, 0x9B, 0x1E, 0xCC, 0x9B, 0x1E, 0xCC, 0x9B, 0x1E, 0x92, 0xCE, 0x05, 0xBF, 0x07, 0xBE, 0x05, 0xEE, 0x02, 0xBF, 0x09, 0x92, 184 + 0xCE, 0x1B, 0xBF, 0x1D, 0xBE, 0x1B, 0xEE, 0x02, 0xBF, 0x1F, 0x81, 0x72, 0x12, 0x04, 0x3E, 0xAE, 0x97, 0xBC, 0xBF, 0x03, 0xBF, 0x19, 0xCC, 0x99, 0x47, 0x52, 0x04, 0x90, 0xBE, 0x05, 0x92, 0xCE, 185 + 0x1B, 0x90, 0xFE, 0x90, 0xBF, 0xEB, 0x72, 0xBB, 0x00, 0xEB, 0x72, 0xB0, 0x00, 0x0B, 0x72, 0xB0, 0x00, 0x21, 0xA6, 0x02, 0xCD, 0xBC, 0x89, 0x1F, 0x01, 0xBE, 0x1B, 0x90, 0xBE, 0x05, 0xEE, 0x02, 186 + 0x90, 0xEE, 0x02, 0x90, 0xBF, 0xEB, 0x72, 0xBB, 0x00, 0xEB, 0x72, 0xB0, 0x00, 0x0D, 0x72, 0xB0, 0x00, 0x23, 0xA6, 0x02, 0xCD, 0xBC, 0x89, 0x1F, 0x03, 0x92, 0xCE, 0x05, 0xBF, 0x0B, 0xBE, 0x05, 187 + 0xEE, 0x02, 0xBF, 0x0D, 0x92, 0xCE, 0x1B, 0xBF, 0x21, 0xBE, 0x1B, 0xEE, 0x02, 0xBF, 0x23, 0xBE, 0x19, 0xA3, 0x80, 0x00, 0x24, 0x37, 0xBE, 0x03, 0xA3, 0x80, 0x00, 0x24, 0x30, 0xA3, 0x00, 0x03, 188 + 0x25, 0x2B, 0xB6, 0x04, 0xB4, 0x1A, 0xA5, 0x0C, 0x27, 0x0D, 0xCD, 0x99, 0x5E, 0x1E, 0x01, 0xCF, 0x04, 0x42, 0xAE, 0x99, 0x44, 0x20, 0x13, 0xB6, 0x04, 0xB4, 0x1A, 0xA5, 0x30, 0x27, 0x0E, 0xCD, 189 + 0x99, 0x5E, 0x1E, 0x03, 0xCF, 0x04, 0x44, 0xAE, 0x99, 0x41, 0x5B, 0x04, 0x81, 0xBE, 0x01, 0xA3, 0x99, 0x44, 0x26, 0x26, 0xBE, 0x03, 0xA3, 0x00, 0x04, 0x27, 0x11, 0xA3, 0x00, 0x08, 0x27, 0x0C, 190 + 0xBE, 0x19, 0xA3, 0x00, 0x04, 0x27, 0x05, 0xA3, 0x00, 0x08, 0x26, 0x03, 0xCD, 0x99, 0x5E, 0x1E, 0x01, 0xCF, 0x04, 0x42, 0x72, 0x12, 0x04, 0x3E, 0xBE, 0x01, 0xA3, 0x99, 0x41, 0x26, 0xCB, 0xBE, 191 + 0x03, 0xA3, 0x00, 0x10, 0x27, 0x11, 0xA3, 0x00, 0x20, 0x27, 0x0C, 0xBE, 0x19, 0xA3, 0x00, 0x10, 0x27, 0x05, 0xA3, 0x00, 0x20, 0x26, 0x03, 0xCD, 0x99, 0x5E, 0x1E, 0x03, 0xCF, 0x04, 0x44, 0x72, 192 + 0x12, 0x04, 0x3E, 0xBE, 0x01, 0x20, 0xA3, 0x52, 0x06, 0xBE, 0x1F, 0x89, 0xBE, 0x1D, 0x89, 0xBE, 0x09, 0x89, 0xBE, 0x07, 0xCD, 0x89, 0x66, 0x5B, 0x06, 0x1F, 0x01, 0xBE, 0x1B, 0xEE, 0x02, 0x89, 193 + 0x92, 0xCE, 0x1B, 0x89, 0xBE, 0x05, 0xEE, 0x02, 0x89, 0x92, 0xCE, 0x05, 0xCD, 0x89, 0x66, 0x5B, 0x06, 0x1F, 0x03, 0xBE, 0x01, 0xA3, 0x99, 0x3E, 0x26, 0x05, 0xCE, 0x0A, 0xFD, 0x20, 0x03, 0xCE, 194 + 0x0A, 0xFB, 0x1F, 0x05, 0x5F, 0xCF, 0x04, 0x44, 0x1E, 0x03, 0x72, 0xF0, 0x01, 0x16, 0x05, 0xCD, 0xB9, 0xBC, 0xCF, 0x04, 0x42, 0x27, 0x0C, 0x72, 0x14, 0x04, 0x3E, 0xCD, 0x99, 0x47, 0xAE, 0x99, 195 + 0x3E, 0x20, 0x02, 0xBE, 0x01, 0x5B, 0x06, 0x81, 0xBE, 0x03, 0xA3, 0x80, 0x00, 0x24, 0x29, 0xA3, 0x00, 0x02, 0x24, 0x0A, 0x5A, 0x26, 0x18, 0xBE, 0x19, 0xA3, 0x99, 0x17, 0x26, 0x11, 0xAE, 0x97, 196 + 0xBC, 0xBF, 0x03, 0xBE, 0x01, 0xA3, 0x9B, 0x5B, 0x26, 0x05, 0xAE, 0x9B, 0x1E, 0xBF, 0x01, 0xBE, 0x03, 0x26, 0x05, 0xAE, 0x99, 0x06, 0xBF, 0x03, 0xBE, 0x19, 0xA3, 0x80, 0x00, 0x24, 0x29, 0xA3, 197 + 0x00, 0x02, 0x24, 0x0A, 0x5A, 0x26, 0x18, 0xBE, 0x03, 0xA3, 0x99, 0x17, 0x26, 0x11, 0xAE, 0x97, 0xBC, 0xBF, 0x19, 0xBE, 0x01, 0xA3, 0x9B, 0x5B, 0x26, 0x05, 0xAE, 0x9B, 0x1E, 0xBF, 0x01, 0xBE, 198 + 0x19, 0x26, 0x05, 0xAE, 0x99, 0x06, 0xBF, 0x19, 0xBE, 0x01, 0x81, 0x72, 0x5F, 0x04, 0x3E, 0x5F, 0xCF, 0x04, 0x42, 0xCF, 0x04, 0x44, 0x90, 0xBE, 0x05, 0x90, 0xFE, 0x90, 0x5C, 0x27, 0x09, 0x90, 199 + 0xBE, 0x1B, 0x90, 0xFE, 0x90, 0x5C, 0x26, 0x03, 0xCC, 0x9C, 0x0A, 0x72, 0x05, 0x0A, 0xE8, 0x05, 0xCD, 0x9A, 0x5A, 0xBF, 0x01, 0x72, 0x03, 0x0A, 0xE8, 0x0B, 0x72, 0x5D, 0x04, 0x3E, 0x26, 0x05, 200 + 0xCD, 0x99, 0x6C, 0xBF, 0x01, 0xCC, 0x9A, 0xBB, 0x72, 0x5F, 0x04, 0x3E, 0xBE, 0x03, 0xB3, 0x19, 0x26, 0x26, 0xA3, 0x00, 0x01, 0x26, 0x14, 0x72, 0x01, 0x0A, 0xE8, 0x04, 0x72, 0x10, 0x04, 0x3E, 201 + 0xAE, 0x99, 0x17, 0xBF, 0x03, 0xBF, 0x19, 0xAE, 0x9C, 0x0A, 0x81, 0xA3, 0x97, 0xBC, 0x26, 0x08, 0xAE, 0x9B, 0x1E, 0xBF, 0x01, 0xCC, 0x9B, 0x1E, 0xCC, 0x9A, 0xBB, 0x72, 0x5F, 0x04, 0x3D, 0xBE, 202 + 0x19, 0xA3, 0x99, 0x17, 0x27, 0x0F, 0xAE, 0x98, 0xA4, 0xBF, 0x03, 0xBF, 0x19, 0xAE, 0x9B, 0x5B, 0xBF, 0x01, 0xCC, 0x9B, 0x5B, 0xBE, 0x03, 0xA3, 0x80, 0x00, 0x24, 0x49, 0x55, 0x00, 0x04, 0x04, 203 + 0x3D, 0x1D, 0x00, 0x04, 0x27, 0x1D, 0x1D, 0x00, 0x04, 0x27, 0x1D, 0x1D, 0x00, 0x08, 0x27, 0x1D, 0x1D, 0x00, 0x10, 0x27, 0x1D, 0x90, 0xBE, 0x05, 0x90, 0xFE, 0x90, 0x5C, 0x26, 0x19, 0xAE, 0x99, 204 + 0x17, 0x20, 0x17, 0xAE, 0x98, 0x98, 0x20, 0x18, 0xAE, 0x98, 0x9B, 0x20, 0x13, 0xAE, 0x98, 0x9E, 0x20, 0x0E, 0xAE, 0x98, 0xA1, 0x20, 0x09, 0xAE, 0x99, 0x06, 0xBF, 0x03, 0xAE, 0x9C, 0x0A, 0x81, 205 + 0xBF, 0x03, 0xCD, 0x99, 0x47, 0xBE, 0x01, 0x81, 0xBE, 0x03, 0xA3, 0x99, 0x17, 0x27, 0x04, 0xAE, 0x9B, 0x8E, 0x81, 0xAE, 0x9B, 0xFB, 0x81, 0x72, 0x5F, 0x04, 0x3E, 0xC6, 0x04, 0x3D, 0xA4, 0x02, 206 + 0xC7, 0x04, 0x3D, 0x90, 0xBE, 0x05, 0x90, 0xFE, 0x90, 0x5C, 0x26, 0x09, 0xAE, 0x99, 0x17, 0xBF, 0x03, 0x72, 0x5F, 0x04, 0x3D, 0x90, 0xBE, 0x1B, 0x90, 0xFE, 0x90, 0x5C, 0x26, 0x05, 0xAE, 0x99, 207 + 0x17, 0xBF, 0x19, 0xC6, 0x04, 0x41, 0x26, 0x04, 0xAE, 0x9B, 0xFB, 0x81, 0x72, 0x02, 0x04, 0x40, 0x0D, 0x72, 0x04, 0x04, 0x40, 0x08, 0xA1, 0x02, 0x26, 0x04, 0xAE, 0x9B, 0x5B, 0x81, 0xAE, 0x9C, 208 + 0x0A, 0x81, 0x72, 0x02, 0x00, 0xE6, 0x03, 0xCC, 0x9C, 0x0A, 0xAE, 0x9C, 0x55, 0x81, 0xAE, 0x01, 0x01, 0xCD, 0xB6, 0x97, 0x35, 0x07, 0x52, 0x8D, 0x35, 0x80, 0x52, 0x80, 0x35, 0x7D, 0x52, 0x8E, 209 + 0x72, 0x5F, 0x52, 0x8F, 0x72, 0x10, 0x52, 0x87, 0x72, 0x10, 0x52, 0x80, 0x72, 0x11, 0x52, 0x85, 0x35, 0x01, 0x52, 0x84, 0xAE, 0x01, 0x00, 0x72, 0x11, 0x52, 0x80, 0xCC, 0xB6, 0x97, 0xAE, 0x02, 210 + 0x01, 0xCD, 0xB6, 0x97, 0x35, 0xFF, 0x52, 0xE8, 0x35, 0x08, 0x52, 0xE7, 0xAE, 0x02, 0x00, 0x72, 0x10, 0x52, 0xE3, 0xCC, 0xB6, 0x97, 0x72, 0x1C, 0x50, 0xC3, 0x72, 0x10, 0x50, 0xC3, 0x72, 0x10, 211 + 0x50, 0xF0, 0x72, 0x10, 0x52, 0x58, 0x52, 0x08, 0x72, 0x10, 0x52, 0x5A, 0x72, 0x5F, 0x52, 0x5B, 0x72, 0x5F, 0x52, 0x5C, 0x72, 0x10, 0x52, 0x50, 0x72, 0x03, 0x52, 0x55, 0xFB, 0xC6, 0x52, 0x60, 212 + 0x5F, 0x97, 0x1F, 0x05, 0x7B, 0x06, 0x6B, 0x05, 0x0F, 0x06, 0x5F, 0xC6, 0x52, 0x61, 0x97, 0x01, 0x1A, 0x06, 0x01, 0x1A, 0x05, 0x01, 0x1F, 0x05, 0x72, 0x13, 0x52, 0x56, 0x72, 0x03, 0x52, 0x55, 213 + 0xFB, 0xC6, 0x52, 0x60, 0x5F, 0x97, 0x1F, 0x07, 0x7B, 0x08, 0x6B, 0x07, 0x0F, 0x08, 0x5F, 0xC6, 0x52, 0x61, 0x97, 0x01, 0x1A, 0x08, 0x01, 0x1A, 0x07, 0x01, 0x1F, 0x07, 0x72, 0x13, 0x52, 0x56, 214 + 0x72, 0x11, 0x52, 0x50, 0x72, 0x5F, 0x52, 0x58, 0x72, 0x5F, 0x52, 0x5A, 0x72, 0x11, 0x50, 0xC3, 0x72, 0x11, 0x50, 0xF0, 0x72, 0x1D, 0x50, 0xC3, 0x72, 0xF0, 0x05, 0x1F, 0x07, 0xCD, 0xBC, 0xF8, 215 + 0x96, 0x5C, 0xCD, 0xBC, 0x71, 0xAE, 0x69, 0x38, 0xBF, 0xE9, 0xAE, 0x00, 0x18, 0xBF, 0xE7, 0x96, 0x5C, 0xCD, 0xBB, 0x3B, 0xBE, 0xE9, 0xBF, 0xC4, 0x5B, 0x08, 0x81, 0x52, 0x06, 0xAE, 0x00, 0x28, 216 + 0xCF, 0x04, 0x30, 0xAE, 0x00, 0x0F, 0xCF, 0x04, 0x32, 0x35, 0x02, 0x04, 0x34, 0x35, 0x02, 0x04, 0x35, 0x35, 0xA5, 0x04, 0x36, 0x35, 0xFF, 0x04, 0x3B, 0x35, 0x80, 0x04, 0x3F, 0xCD, 0x93, 0x54, 217 + 0xAE, 0x09, 0x05, 0x1F, 0x03, 0xAE, 0xBE, 0x00, 0x1F, 0x05, 0x5F, 0x1F, 0x01, 0x1E, 0x05, 0xF6, 0x1E, 0x03, 0xF7, 0x5C, 0x1F, 0x03, 0x1E, 0x05, 0x5C, 0x1F, 0x05, 0x1E, 0x01, 0x5C, 0x1F, 0x01, 218 + 0xA3, 0x01, 0xFB, 0x25, 0xE8, 0x5B, 0x06, 0x81, 0x4B, 0xC0, 0x4B, 0xC7, 0xAE, 0x50, 0x00, 0xCD, 0xB7, 0x40, 0x85, 0x4B, 0x00, 0xAE, 0x50, 0x00, 0xCD, 0xB7, 0x8E, 0x84, 0x4B, 0xC0, 0x4B, 0xFF, 219 + 0xAE, 0x50, 0x0F, 0xCD, 0xB7, 0x40, 0x85, 0x4B, 0x00, 0xAE, 0x50, 0x0F, 0xCD, 0xB7, 0x8E, 0x84, 0x4B, 0xC0, 0x4B, 0xFF, 0xAE, 0x50, 0x05, 0xCD, 0xB7, 0x40, 0x85, 0x4B, 0x00, 0xAE, 0x50, 0x05, 220 + 0xCD, 0xB7, 0x8E, 0x84, 0x4F, 0xCD, 0xB6, 0xF5, 0x72, 0x5F, 0x50, 0xC3, 0xCD, 0xA1, 0xCB, 0xCD, 0x9C, 0xA9, 0xCD, 0x9D, 0x4E, 0xCD, 0xAD, 0x67, 0xCD, 0x9C, 0x61, 0xCD, 0x9C, 0x91, 0x72, 0x0B, 221 + 0x09, 0xBE, 0x18, 0x35, 0xCC, 0x50, 0xE0, 0x35, 0x55, 0x50, 0xE0, 0x35, 0x05, 0x50, 0xE1, 0x35, 0xA7, 0x50, 0xE2, 0x72, 0x5F, 0x50, 0xE0, 0x35, 0xAA, 0x50, 0xE0, 0xCC, 0x9F, 0xC2, 0xAE, 0x02, 222 + 0x01, 0xCD, 0xB6, 0x97, 0x72, 0x5F, 0x52, 0xE6, 0x3F, 0xC3, 0x72, 0x10, 0x52, 0xE0, 0x81, 0x52, 0x13, 0x0F, 0x09, 0xAE, 0x02, 0x00, 0x72, 0x11, 0x52, 0xE0, 0xCD, 0xB6, 0x97, 0x5F, 0x1F, 0x0E, 223 + 0x20, 0x09, 0x1E, 0x0E, 0x1C, 0x10, 0x00, 0x1F, 0x0E, 0x3A, 0xC3, 0xB6, 0xC3, 0x26, 0xF3, 0xC6, 0x52, 0xE6, 0x5F, 0x97, 0x58, 0x58, 0x58, 0x58, 0x72, 0xFB, 0x0E, 0x1F, 0x0E, 0x72, 0x0A, 0x08, 224 + 0x61, 0x0A, 0xB6, 0xCF, 0x27, 0x57, 0xB6, 0x34, 0xA1, 0x02, 0x26, 0x51, 0xAE, 0x03, 0xE8, 0x1F, 0x0C, 0x5F, 0x1F, 0x0A, 0x5C, 0x1F, 0x10, 0x1E, 0x0E, 0xCD, 0xBC, 0xF8, 0x96, 0x1C, 0x00, 0x0A, 225 + 0xCD, 0xBA, 0x40, 0x25, 0x03, 0xCC, 0x9F, 0x65, 0xBE, 0xC4, 0xCD, 0xBC, 0xF8, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBC, 0x71, 0x1E, 0x0E, 0xCD, 0xBC, 0xF8, 0x96, 0x5C, 0xCD, 0xBC, 0x71, 0x96, 0x1C, 226 + 0x00, 0x0A, 0xCD, 0xBB, 0x29, 0x96, 0x5C, 0xCD, 0xBB, 0x11, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBA, 0x86, 0xAE, 0x85, 0x16, 0xCD, 0xBB, 0x3B, 0xBE, 0xE9, 0x1F, 0x12, 0x20, 0x5F, 0x72, 0x03, 0x00, 227 + 0xE5, 0x1C, 0xB6, 0x34, 0xA1, 0x02, 0x25, 0x16, 0xCE, 0x09, 0xAA, 0x90, 0xAE, 0x03, 0xE8, 0xCD, 0xBC, 0xFF, 0x96, 0x1C, 0x00, 0x0A, 0xCD, 0xBC, 0x71, 0xCE, 0x09, 0xAA, 0x20, 0x97, 0xB6, 0xD2, 228 + 0x27, 0x13, 0xB6, 0x34, 0xA1, 0x03, 0x25, 0x0D, 0xAE, 0x9C, 0x40, 0x1F, 0x0C, 0x5F, 0x1F, 0x0A, 0xAE, 0x00, 0x28, 0x20, 0x80, 0xB6, 0x34, 0x5F, 0x97, 0x58, 0x90, 0xAE, 0x03, 0xE8, 0xDE, 0x09, 229 + 0xAA, 0xCD, 0xBC, 0xFF, 0x96, 0x1C, 0x00, 0x0A, 0xCD, 0xBC, 0x71, 0x5F, 0x97, 0x58, 0xDE, 0x09, 0xAA, 0xCC, 0x9E, 0x68, 0x0C, 0x09, 0x04, 0x12, 0x06, 0x13, 0x1E, 0x12, 0xA3, 0x00, 0x41, 0x24, 230 + 0xF3, 0xAE, 0x06, 0x01, 0xCD, 0xB6, 0x97, 0x1E, 0x12, 0xA3, 0x00, 0x02, 0x25, 0x09, 0x7B, 0x13, 0xA0, 0x02, 0xC7, 0x50, 0xF1, 0x20, 0x04, 0x72, 0x5F, 0x50, 0xF1, 0x7B, 0x09, 0x4C, 0xC7, 0x50, 231 + 0xF2, 0x72, 0x18, 0x50, 0xF0, 0x72, 0x02, 0x52, 0x17, 0x0D, 0xAE, 0x07, 0x01, 0xCD, 0xB8, 0xB3, 0x8E, 0xAE, 0x07, 0x00, 0xCD, 0xB8, 0xB3, 0x72, 0x19, 0x50, 0xF0, 0x72, 0x5F, 0x50, 0xF2, 0xAE, 232 + 0x06, 0x00, 0xCD, 0xB6, 0x97, 0x72, 0x17, 0x04, 0x40, 0xBE, 0xC1, 0x72, 0xFB, 0x10, 0xBF, 0xC1, 0x20, 0x22, 0x72, 0x16, 0x04, 0x40, 0x90, 0xAE, 0x03, 0xE8, 0x1E, 0x0E, 0x65, 0x1F, 0x10, 0xBE, 233 + 0xC1, 0x72, 0xFB, 0x10, 0xBF, 0xC1, 0x90, 0xAE, 0x03, 0xE8, 0x1E, 0x0E, 0x65, 0x93, 0x72, 0xBB, 0x00, 0xBF, 0xBF, 0xBF, 0x1E, 0x10, 0xA3, 0x01, 0x00, 0x25, 0x06, 0x35, 0xFF, 0x04, 0x3C, 0x20, 234 + 0x11, 0x7B, 0x11, 0xC7, 0x04, 0x3C, 0x20, 0x0A, 0x1D, 0x03, 0xE8, 0xBF, 0xBF, 0xBE, 0xC1, 0x5C, 0xBF, 0xC1, 0xBE, 0xBF, 0xA3, 0x03, 0xE9, 0x24, 0xEF, 0x20, 0x0A, 0x1D, 0x03, 0xE8, 0xBF, 0xC1, 235 + 0xCD, 0xB4, 0x19, 0x3C, 0xBE, 0xBE, 0xC1, 0xA3, 0x03, 0xE9, 0x24, 0xEF, 0x5B, 0x13, 0x81, 0x9B, 0x72, 0x01, 0x09, 0xBE, 0x21, 0x72, 0x13, 0x50, 0x02, 0x72, 0x03, 0x09, 0xBE, 0x06, 0x72, 0x13, 236 + 0x50, 0x03, 0x20, 0x04, 0x72, 0x12, 0x50, 0x03, 0x35, 0x0C, 0x50, 0xA0, 0x35, 0x02, 0x50, 0xA3, 0x72, 0x12, 0x50, 0x04, 0x20, 0x0C, 0x72, 0x12, 0x50, 0x02, 0x72, 0x12, 0x50, 0x03, 0x72, 0x13, 237 + 0x50, 0x04, 0x9A, 0x81, 0x89, 0xBE, 0xC6, 0xA3, 0x06, 0xD0, 0x24, 0x0A, 0x1C, 0x04, 0x30, 0x1F, 0x01, 0xF6, 0xB7, 0xC8, 0x20, 0x25, 0xA3, 0xF0, 0x00, 0x25, 0x0D, 0xA3, 0xF0, 0x0C, 0x24, 0x08, 238 + 0x1D, 0xA6, 0xDA, 0xF6, 0xB7, 0xC8, 0x20, 0x13, 0xA3, 0xF1, 0x02, 0x26, 0x0A, 0xBE, 0x2F, 0xF6, 0xB7, 0xC8, 0x5C, 0xBF, 0x2F, 0x20, 0x04, 0x35, 0xEE, 0x00, 0xC8, 0xBE, 0xC6, 0xA3, 0xEE, 0xEE, 239 + 0x27, 0x08, 0xA3, 0xF1, 0x02, 0x27, 0x03, 0x5C, 0xBF, 0xC6, 0x85, 0x81, 0x35, 0x56, 0x50, 0x52, 0x35, 0xAE, 0x50, 0x52, 0x35, 0xAE, 0x50, 0x53, 0x35, 0x56, 0x50, 0x53, 0x81, 0xC6, 0x50, 0x54, 240 + 0xA4, 0xF5, 0xC7, 0x50, 0x54, 0x81, 0x35, 0xCC, 0x50, 0xE0, 0x35, 0x55, 0x50, 0xE0, 0x72, 0x5F, 0x50, 0xE1, 0x72, 0x5F, 0x50, 0xE2, 0x20, 0xFE, 0x89, 0xBE, 0xC6, 0xA3, 0x03, 0x03, 0x24, 0x03, 241 + 0xCC, 0xA1, 0x2B, 0xA3, 0x06, 0xD0, 0x24, 0xF8, 0x1D, 0x03, 0x03, 0x1C, 0x07, 0x33, 0x1F, 0x01, 0xB6, 0xC8, 0xF7, 0xBE, 0xC6, 0x5C, 0xBF, 0xC6, 0x1E, 0x01, 0xA3, 0x0A, 0x8F, 0x25, 0x10, 0xA3, 242 + 0x0A, 0x94, 0x22, 0x0B, 0x72, 0x16, 0x00, 0xF1, 0x72, 0x10, 0x00, 0xE4, 0xCC, 0xA1, 0x43, 0xA3, 0x0A, 0x88, 0x26, 0x22, 0x72, 0x09, 0x0A, 0x88, 0x14, 0xB6, 0x34, 0xA1, 0x03, 0x25, 0x0E, 0xCD, 243 + 0xB3, 0x34, 0x72, 0x16, 0x00, 0xE4, 0x72, 0x14, 0x00, 0xE4, 0xCC, 0xA1, 0x43, 0xCD, 0xB3, 0x59, 0x72, 0x10, 0x00, 0xE4, 0x20, 0x7A, 0xA3, 0x09, 0xC6, 0x25, 0x0B, 0xA3, 0x0A, 0x5D, 0x22, 0x06, 244 + 0x72, 0x18, 0x00, 0xE4, 0x20, 0x6A, 0xA3, 0x0A, 0x62, 0x26, 0x06, 0x72, 0x16, 0x00, 0xE4, 0x20, 0x5F, 0xA3, 0x08, 0x6F, 0x25, 0x05, 0xA3, 0x09, 0x9B, 0x23, 0x0A, 0xA3, 0x0A, 0x6D, 0x25, 0x0B, 245 + 0xA3, 0x0A, 0x87, 0x22, 0x06, 0x72, 0x10, 0x00, 0xE4, 0x20, 0x45, 0xA3, 0x08, 0x65, 0x25, 0x05, 0xA3, 0x08, 0x6F, 0x23, 0x0F, 0xA3, 0x09, 0x9C, 0x27, 0x0A, 0xA3, 0x0A, 0x89, 0x25, 0x0F, 0xA3, 246 + 0x0A, 0x8C, 0x22, 0x0A, 0x72, 0x16, 0x00, 0xE4, 0x72, 0x14, 0x00, 0xE4, 0x20, 0x22, 0xA3, 0x09, 0xBE, 0x26, 0x1D, 0xCD, 0x9F, 0xC2, 0x20, 0x18, 0xA3, 0xF1, 0x00, 0x27, 0x05, 0xA3, 0xF1, 0x01, 247 + 0x26, 0x10, 0x1D, 0xF1, 0x00, 0x1C, 0x00, 0x2F, 0xB6, 0xC8, 0xF7, 0xBE, 0xC6, 0x5C, 0xBF, 0xC6, 0x85, 0x81, 0xA3, 0xF1, 0x02, 0x26, 0xF9, 0xBE, 0x2F, 0xA3, 0x0C, 0x00, 0x25, 0x0A, 0xA3, 0x50, 248 + 0x00, 0x25, 0x0F, 0xA3, 0x58, 0x00, 0x24, 0x0A, 0xB6, 0xC8, 0xF7, 0xBE, 0x2F, 0x5C, 0xBF, 0x2F, 0x20, 0xDE, 0xA3, 0xBE, 0x00, 0x25, 0xF4, 0xA3, 0xC0, 0x00, 0x24, 0xEF, 0xCD, 0xA0, 0x3F, 0xB6, 249 + 0xC8, 0x92, 0xC7, 0x2F, 0xCD, 0xA0, 0x50, 0x20, 0xE2, 0x89, 0xC6, 0x09, 0xBA, 0x5F, 0x97, 0x90, 0xAE, 0x00, 0x7D, 0xCD, 0xB9, 0xDA, 0x1F, 0x01, 0xAE, 0x7D, 0x00, 0x72, 0xF0, 0x01, 0x1F, 0x01, 250 + 0x7B, 0x01, 0xC7, 0x52, 0x8B, 0x7B, 0x02, 0xC7, 0x52, 0x8C, 0x85, 0x81, 0x72, 0x11, 0x52, 0x80, 0xCD, 0xA1, 0x7C, 0x72, 0x10, 0x52, 0x80, 0x81, 0xAE, 0x01, 0x01, 0xCD, 0xB6, 0x97, 0xCD, 0xA1, 251 + 0x7C, 0x72, 0x11, 0x52, 0x85, 0x72, 0x19, 0x00, 0xF1, 0x72, 0x10, 0x52, 0x80, 0x81, 0x72, 0x11, 0x52, 0x80, 0xAE, 0x01, 0x00, 0xCC, 0xB6, 0x97, 0x52, 0x03, 0xC6, 0xBF, 0xFF, 0x26, 0x02, 0xA6, 252 + 0x74, 0x6B, 0x03, 0xAE, 0x03, 0x01, 0xCD, 0xB6, 0x97, 0x4B, 0x00, 0x4B, 0x04, 0x4B, 0x00, 0x7B, 0x06, 0x5F, 0x97, 0x58, 0x89, 0xAE, 0x86, 0xA0, 0x89, 0xAE, 0x00, 0x01, 0x89, 0xCD, 0xB7, 0x96, 253 + 0x5B, 0x0C, 0x81, 0xAE, 0x06, 0x01, 0xCD, 0xB6, 0x97, 0x35, 0x02, 0x50, 0xF1, 0x35, 0x01, 0x50, 0xF2, 0x72, 0x18, 0x50, 0xF0, 0x8E, 0x72, 0x19, 0x50, 0xF0, 0x35, 0xF0, 0x50, 0xF2, 0xAE, 0x06, 254 + 0x00, 0xCC, 0xB6, 0x97, 0x72, 0x01, 0x08, 0x62, 0x15, 0x20, 0x0A, 0xAE, 0x07, 0x01, 0xCD, 0xB8, 0xB3, 0x8E, 0xCD, 0xA2, 0x32, 0x72, 0x00, 0x08, 0x62, 0xF1, 0x72, 0x10, 0x00, 0xE4, 0x81, 0x72, 255 + 0x12, 0x00, 0xF2, 0x72, 0x11, 0x00, 0xF2, 0xCE, 0x0A, 0xA5, 0xBF, 0xC6, 0x72, 0x5F, 0x52, 0x18, 0xCD, 0xA1, 0xAB, 0xAE, 0x07, 0x01, 0xCD, 0xB8, 0xB3, 0x72, 0x1C, 0x50, 0x00, 0x20, 0x2A, 0x35, 256 + 0xAA, 0x50, 0xE0, 0x72, 0x0B, 0x00, 0xF1, 0x15, 0x72, 0x01, 0x00, 0xF2, 0x10, 0x72, 0x02, 0x52, 0x19, 0x0B, 0xBE, 0xC6, 0xA3, 0xEE, 0xEE, 0x26, 0x04, 0x72, 0x13, 0x00, 0xF2, 0x72, 0x09, 0x00, 257 + 0xF1, 0x07, 0x72, 0x13, 0x00, 0xF2, 0xCD, 0xA1, 0xF6, 0x72, 0x02, 0x00, 0xF2, 0xD1, 0xAE, 0x07, 0x00, 0xCD, 0xB8, 0xB3, 0x72, 0x14, 0x52, 0x11, 0x72, 0x1D, 0x50, 0x00, 0x72, 0x08, 0x00, 0xF1, 258 + 0x0A, 0xCD, 0xA1, 0xC1, 0x5F, 0xCF, 0x04, 0x42, 0xCF, 0x04, 0x44, 0x72, 0x19, 0x04, 0x3F, 0x72, 0x1D, 0x04, 0x3F, 0x72, 0x1B, 0x00, 0xF1, 0x72, 0x07, 0x08, 0x61, 0x08, 0x72, 0x10, 0x00, 0xE4, 259 + 0x72, 0x17, 0x08, 0x61, 0x72, 0x09, 0x08, 0x61, 0x08, 0x72, 0x14, 0x00, 0xE4, 0x72, 0x19, 0x08, 0x61, 0x72, 0x0F, 0x08, 0x61, 0x08, 0x72, 0x1F, 0x04, 0x3F, 0x72, 0x1F, 0x08, 0x61, 0x72, 0x07, 260 + 0x00, 0xF1, 0x17, 0x72, 0x17, 0x00, 0xF1, 0xB6, 0x34, 0xA1, 0x03, 0x25, 0x09, 0x72, 0x09, 0x0A, 0x88, 0x04, 0xA6, 0x01, 0x20, 0x01, 0x4F, 0xCD, 0xAD, 0x1D, 0x72, 0x03, 0x08, 0x62, 0x03, 0xCD, 261 + 0xA0, 0x59, 0x72, 0x1F, 0x00, 0xF1, 0x81, 0x88, 0x0F, 0x01, 0x55, 0x52, 0x17, 0x04, 0x2C, 0x55, 0x52, 0x18, 0x04, 0x2E, 0x55, 0x52, 0x19, 0x04, 0x2F, 0x72, 0x1B, 0x00, 0xF1, 0xC6, 0x04, 0x2E, 262 + 0xA5, 0x09, 0x26, 0x05, 0x72, 0x01, 0x52, 0x85, 0x14, 0x72, 0x01, 0x52, 0x85, 0x07, 0x72, 0x11, 0x52, 0x85, 0xCD, 0xA4, 0x87, 0xC6, 0x52, 0x18, 0xA4, 0xF6, 0xC7, 0x52, 0x18, 0x72, 0x0B, 0x04, 263 + 0x2E, 0x04, 0x72, 0x1B, 0x52, 0x18, 0x72, 0x03, 0x04, 0x2C, 0x0B, 0x72, 0x10, 0x00, 0xF2, 0x35, 0x01, 0x04, 0x2D, 0x5F, 0xBF, 0xC9, 0xC6, 0x04, 0x2C, 0xA4, 0x84, 0xA1, 0x84, 0x27, 0x05, 0x72, 264 + 0x0F, 0x04, 0x2C, 0x15, 0x72, 0x5F, 0x04, 0x2D, 0xCD, 0x9F, 0xF7, 0xB6, 0xC8, 0xCD, 0xB8, 0xCD, 0xBE, 0xC9, 0x5C, 0xBF, 0xC9, 0xA6, 0x01, 0x6B, 0x01, 0xC6, 0x04, 0x2C, 0xA4, 0x44, 0xA1, 0x44, 265 + 0x27, 0x05, 0x72, 0x0D, 0x04, 0x2C, 0x3A, 0xC6, 0x04, 0x2D, 0x4A, 0x26, 0x23, 0xBE, 0xC9, 0x26, 0x0A, 0xCD, 0xB8, 0xC9, 0x97, 0x4F, 0x02, 0xBF, 0xC6, 0x20, 0x1D, 0xCD, 0xB8, 0xC9, 0x5F, 0x97, 266 + 0x01, 0xBA, 0xC7, 0x01, 0xBA, 0xC6, 0x01, 0xBF, 0xC6, 0x72, 0x5F, 0x04, 0x2D, 0x5F, 0x20, 0x0B, 0xCD, 0xB8, 0xC9, 0xB7, 0xC8, 0xCD, 0xA0, 0x6B, 0xBE, 0xC9, 0x5C, 0xBF, 0xC9, 0xA6, 0x01, 0x6B, 267 + 0x01, 0x72, 0x05, 0x04, 0x2E, 0x0D, 0xBE, 0xC9, 0x5A, 0xBF, 0xC9, 0x72, 0x15, 0x52, 0x18, 0x72, 0x1A, 0x00, 0xF1, 0x72, 0x09, 0x04, 0x2C, 0x14, 0x72, 0x14, 0x52, 0x11, 0xBE, 0xC6, 0xA3, 0xEE, 268 + 0xEE, 0x26, 0x09, 0x72, 0x02, 0x04, 0x2C, 0x04, 0x72, 0x13, 0x00, 0xF2, 0x7B, 0x01, 0x27, 0x03, 0xCD, 0xA1, 0x9F, 0x84, 0x81, 0x72, 0x03, 0x50, 0x01, 0x06, 0x72, 0x1A, 0x04, 0x40, 0x20, 0x04, 269 + 0x72, 0x1B, 0x04, 0x40, 0x72, 0x0A, 0x08, 0x61, 0x09, 0xB6, 0xCF, 0x26, 0x05, 0x72, 0x05, 0x00, 0xF2, 0x02, 0x4F, 0x81, 0x72, 0x03, 0x52, 0x17, 0x03, 0xA6, 0x01, 0x81, 0x72, 0x01, 0x09, 0xBF, 270 + 0x70, 0x72, 0x0F, 0x09, 0xBF, 0x05, 0x72, 0x0C, 0x00, 0xF2, 0x61, 0x72, 0x0D, 0x09, 0xBF, 0x05, 0x72, 0x0A, 0x00, 0xF2, 0x57, 0x72, 0x0B, 0x09, 0xBF, 0x05, 0x72, 0x08, 0x00, 0xF2, 0x4D, 0x72, 271 + 0x09, 0x09, 0xBF, 0x11, 0x72, 0x07, 0x00, 0xE6, 0x07, 0x72, 0x0F, 0x00, 0xE6, 0x3E, 0x20, 0x05, 0x72, 0x0E, 0x00, 0xE6, 0x37, 0x72, 0x07, 0x09, 0xBF, 0x0A, 0x72, 0x0C, 0x04, 0x3F, 0x2D, 0x72, 272 + 0x08, 0x04, 0x3F, 0x28, 0x72, 0x05, 0x09, 0xBF, 0x0C, 0x72, 0x04, 0x00, 0xF1, 0x1E, 0xC6, 0x04, 0x41, 0xB1, 0x48, 0x26, 0x17, 0x72, 0x03, 0x09, 0xBF, 0x08, 0xC6, 0x04, 0x3E, 0xCA, 0x04, 0x3D, 273 + 0x26, 0x0A, 0x72, 0x09, 0x09, 0xBE, 0x08, 0x72, 0x0F, 0x00, 0xF1, 0x03, 0xA6, 0x01, 0x81, 0x4F, 0x81, 0xA6, 0x01, 0x81, 0x72, 0x18, 0x00, 0xF1, 0xCC, 0xA1, 0xC1, 0x89, 0xAE, 0x00, 0x01, 0xB6, 274 + 0xDD, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0xB6, 0xDC, 0x90, 0x5F, 0x90, 0x97, 0x90, 0x58, 0x01, 0x90, 0xD4, 0x04, 0x8A, 0x01, 0x90, 0xD4, 0x04, 0x89, 0x01, 0x5D, 0x27, 0x04, 0xA6, 0x01, 0x20, 275 + 0x01, 0x4F, 0x5F, 0x97, 0xD6, 0x09, 0xC6, 0x6B, 0x01, 0xB6, 0xDC, 0x97, 0xA6, 0x0A, 0x42, 0x01, 0xBB, 0xDD, 0x24, 0x01, 0x5C, 0x02, 0xD6, 0x09, 0xC8, 0x1B, 0x01, 0x6B, 0x02, 0xBE, 0xE0, 0xCD, 276 + 0xB9, 0xA8, 0xA6, 0x07, 0xCD, 0xBC, 0x62, 0x90, 0xCE, 0x0B, 0x02, 0xBE, 0xE9, 0x90, 0xEF, 0x03, 0x85, 0x81, 0x5F, 0xCF, 0x53, 0x16, 0xCF, 0x53, 0x08, 0x81, 0x20, 0x01, 0x8F, 0x72, 0x01, 0x00, 277 + 0xE5, 0xFA, 0x81, 0xCE, 0x07, 0x1D, 0xCF, 0x08, 0x5F, 0x3F, 0xD4, 0x5F, 0xCF, 0x04, 0x87, 0x72, 0x17, 0x00, 0xE6, 0x72, 0x15, 0x00, 0xE4, 0x81, 0xCD, 0xA4, 0xE5, 0x3C, 0x31, 0xB6, 0x31, 0xC1, 278 + 0x0A, 0x6E, 0x25, 0x03, 0xA6, 0x01, 0x81, 0xAE, 0x00, 0x01, 0x90, 0x5F, 0x90, 0x97, 0x90, 0xD6, 0x0A, 0x79, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0xCF, 0x53, 0x16, 0x4F, 0x81, 0x89, 0x0F, 0x02, 279 + 0x20, 0x50, 0x5F, 0x97, 0xD6, 0x0A, 0x6F, 0x5F, 0x97, 0x89, 0xB6, 0x31, 0x97, 0xA6, 0x0A, 0x42, 0x01, 0x1B, 0x04, 0x24, 0x01, 0x5C, 0x02, 0xD6, 0x08, 0x6F, 0x85, 0xD7, 0x53, 0x50, 0xB6, 0x31, 280 + 0x97, 0xA6, 0x0A, 0x42, 0x01, 0x1B, 0x02, 0x24, 0x01, 0x5C, 0x02, 0xD6, 0x09, 0x05, 0xCB, 0x09, 0x9B, 0x6B, 0x01, 0xA1, 0x20, 0x2F, 0x06, 0xA6, 0x1F, 0x6B, 0x01, 0x20, 0x05, 0x4D, 0x2A, 0x02, 281 + 0x0F, 0x01, 0x7B, 0x02, 0x5F, 0x97, 0xD6, 0x0A, 0x6F, 0x5F, 0x97, 0x7B, 0x01, 0xD7, 0x53, 0x40, 0x0C, 0x02, 0x7B, 0x02, 0xC1, 0x0A, 0x6D, 0x25, 0xA9, 0x85, 0x81, 0x88, 0x0F, 0x01, 0xAE, 0x00, 282 + 0x01, 0x7B, 0x01, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0x01, 0xC4, 0x0A, 0x8A, 0x01, 0xC4, 0x0A, 0x89, 0x01, 0x5D, 0x27, 0x16, 0x7B, 0x01, 0x5F, 0x97, 0xD6, 0x08, 0x65, 0xD7, 0x53, 0x50, 0x5F, 283 + 0x7B, 0x01, 0x97, 0xC6, 0x09, 0x9C, 0xD7, 0x53, 0x40, 0x20, 0x0E, 0x7B, 0x01, 0x5F, 0x97, 0x72, 0x4F, 0x53, 0x50, 0x5F, 0x97, 0x72, 0x4F, 0x53, 0x40, 0x0C, 0x01, 0x7B, 0x01, 0xA1, 0x0A, 0x25, 284 + 0xBD, 0x84, 0x81, 0x88, 0x52, 0x04, 0x0F, 0x01, 0x20, 0x1E, 0x97, 0xA6, 0x0A, 0x42, 0x1C, 0x08, 0x6F, 0x1F, 0x03, 0x0F, 0x02, 0x20, 0x08, 0x7B, 0x05, 0xF7, 0x5C, 0x1F, 0x03, 0x0C, 0x02, 0x7B, 285 + 0x02, 0xC1, 0x0A, 0x6D, 0x25, 0xF1, 0x0C, 0x01, 0x7B, 0x01, 0xC1, 0x0A, 0x6E, 0x25, 0xDB, 0x5B, 0x05, 0x81, 0x88, 0x5F, 0x97, 0xD6, 0x09, 0xC4, 0x5F, 0x97, 0xB3, 0xDE, 0x2C, 0x68, 0xAE, 0x00, 286 + 0x01, 0xB6, 0xDD, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0xCD, 0xA6, 0xD3, 0x27, 0x17, 0xCE, 0x0B, 0x02, 0x4F, 0xF7, 0x0D, 0x01, 0x26, 0x07, 0x72, 0x10, 0x00, 0xE6, 0xCC, 0xA6, 0xC5, 0x72, 0x16, 287 + 0x00, 0xE6, 0xCC, 0xA6, 0xC5, 0xCE, 0x0B, 0x02, 0xF6, 0xA4, 0x0F, 0xF7, 0x4E, 0xC8, 0x0A, 0xA9, 0xA5, 0xF0, 0x26, 0x2A, 0xCD, 0xA6, 0xE8, 0x27, 0x05, 0x90, 0x58, 0x4A, 0x26, 0xFB, 0x90, 0x01, 288 + 0xDA, 0x04, 0x6A, 0x90, 0x01, 0xDA, 0x04, 0x69, 0xCD, 0xA6, 0xF4, 0xA4, 0xF0, 0xF7, 0x0D, 0x01, 0x26, 0x06, 0x72, 0x10, 0x00, 0xE6, 0x20, 0x50, 0x72, 0x16, 0x00, 0xE6, 0x20, 0x54, 0xF6, 0x4C, 289 + 0xF8, 0xA4, 0x0F, 0xF8, 0x20, 0x4B, 0xAE, 0x00, 0x01, 0xB6, 0xDD, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0xAD, 0x4D, 0x26, 0x06, 0xCE, 0x0B, 0x02, 0x4F, 0x20, 0x36, 0xCE, 0x0B, 0x02, 0xF6, 0xA4, 290 + 0xF0, 0xF7, 0x4E, 0xC8, 0x0A, 0xA9, 0xA5, 0x0F, 0x26, 0x24, 0xAD, 0x49, 0x27, 0x05, 0x90, 0x58, 0x4A, 0x26, 0xFB, 0x90, 0x53, 0x90, 0x01, 0xD4, 0x04, 0x6A, 0x90, 0x01, 0xD4, 0x04, 0x69, 0xAD, 291 + 0x40, 0xA4, 0x0F, 0xF7, 0x0D, 0x01, 0x26, 0x0A, 0x72, 0x1C, 0x00, 0xF2, 0x20, 0x04, 0xF6, 0xAB, 0x10, 0xF7, 0xA5, 0x0F, 0x26, 0x04, 0xA5, 0xF0, 0x27, 0x04, 0x72, 0x12, 0x00, 0xE5, 0x84, 0x81, 292 + 0xB6, 0xDC, 0x90, 0x5F, 0x90, 0x97, 0x90, 0x58, 0x01, 0x90, 0xD4, 0x04, 0x6A, 0x01, 0x90, 0xD4, 0x04, 0x69, 0x01, 0x5D, 0x81, 0xB6, 0xDC, 0x5F, 0x97, 0x58, 0x90, 0xAE, 0x00, 0x01, 0xB6, 0xDD, 293 + 0x81, 0x90, 0x01, 0xDF, 0x04, 0x69, 0xCE, 0x0B, 0x02, 0xF6, 0x81, 0x88, 0x0F, 0x01, 0x90, 0xCE, 0x0B, 0x02, 0x90, 0xEE, 0x03, 0x90, 0xB3, 0xDE, 0x2C, 0x56, 0xAE, 0x00, 0x01, 0xB6, 0xDD, 0x27, 294 + 0x04, 0x58, 0x4A, 0x26, 0xFC, 0xCD, 0xA8, 0x04, 0x27, 0x06, 0x72, 0x12, 0x00, 0xE6, 0x20, 0x50, 0xCE, 0x0B, 0x02, 0xE6, 0x01, 0xA4, 0xF3, 0xE7, 0x01, 0x4E, 0xC8, 0x0A, 0xAA, 0xA5, 0x30, 0x26, 295 + 0x26, 0xCD, 0xA8, 0x19, 0x27, 0x05, 0x90, 0x58, 0x4A, 0x26, 0xFB, 0x90, 0x01, 0xDA, 0x04, 0x8A, 0x90, 0x01, 0xDA, 0x04, 0x89, 0x90, 0x01, 0xDF, 0x04, 0x89, 0xCD, 0xA8, 0x25, 0xA6, 0x01, 0x6B, 296 + 0x01, 0x72, 0x12, 0x00, 0xE6, 0x20, 0x5B, 0xE6, 0x01, 0x4C, 0xE8, 0x01, 0xA4, 0x03, 0x20, 0x4E, 0xAE, 0x00, 0x01, 0xB6, 0xDD, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0xCD, 0xA8, 0x04, 0x26, 0x09, 297 + 0xCE, 0x0B, 0x02, 0xE6, 0x01, 0xA4, 0xF0, 0x20, 0x37, 0xCD, 0xA8, 0x25, 0x44, 0x44, 0xC8, 0x0A, 0xAA, 0xA5, 0x03, 0x26, 0x21, 0xCD, 0xA8, 0x19, 0x27, 0x05, 0x90, 0x58, 0x4A, 0x26, 0xFB, 0x90, 298 + 0x53, 0x90, 0x01, 0xD4, 0x04, 0x8A, 0x90, 0x01, 0xD4, 0x04, 0x89, 0x90, 0x01, 0xDF, 0x04, 0x89, 0xA6, 0x01, 0x6B, 0x01, 0x20, 0x0C, 0xE6, 0x01, 0xAB, 0x04, 0xE8, 0x01, 0xA4, 0x0F, 0xE8, 0x01, 299 + 0xE7, 0x01, 0xCE, 0x0B, 0x02, 0xE6, 0x01, 0xA5, 0x03, 0x27, 0x04, 0x72, 0x12, 0x00, 0xE5, 0xAE, 0x00, 0x01, 0xB6, 0xDD, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0xAD, 0x35, 0x27, 0x26, 0xBE, 0xDE, 300 + 0xB3, 0xCB, 0x23, 0x20, 0x72, 0x05, 0x0A, 0x99, 0x0B, 0xB6, 0xDC, 0x97, 0xA6, 0x10, 0x42, 0x9F, 0xBA, 0xDD, 0x20, 0x09, 0xB6, 0xDD, 0x97, 0xA6, 0x10, 0x42, 0x9F, 0xBA, 0xDC, 0xC7, 0x04, 0x3B, 301 + 0xBE, 0xDE, 0xBF, 0xCB, 0x7B, 0x01, 0x27, 0x07, 0xCD, 0xA4, 0x8E, 0x72, 0x1A, 0x00, 0xF2, 0x84, 0x81, 0xB6, 0xDC, 0x90, 0x5F, 0x90, 0x97, 0x90, 0x58, 0x01, 0x90, 0xD4, 0x04, 0x8A, 0x01, 0x90, 302 + 0xD4, 0x04, 0x89, 0x01, 0x5D, 0x81, 0xB6, 0xDC, 0x5F, 0x97, 0x58, 0x90, 0xAE, 0x00, 0x01, 0xB6, 0xDD, 0x81, 0xCE, 0x0B, 0x02, 0xE6, 0x01, 0xA4, 0xFC, 0xE7, 0x01, 0x81, 0x89, 0x52, 0x04, 0x9F, 303 + 0x5F, 0x97, 0x58, 0x1F, 0x01, 0x7B, 0x05, 0x97, 0xA6, 0x14, 0x42, 0x72, 0xFB, 0x01, 0xDE, 0x04, 0xC5, 0x1F, 0x03, 0x27, 0x09, 0xBE, 0xDA, 0x72, 0xFB, 0x03, 0xBF, 0xDA, 0x3C, 0xD9, 0x5B, 0x06, 304 + 0x81, 0x52, 0x03, 0x0F, 0x02, 0x0F, 0x01, 0x0F, 0x03, 0xCE, 0x09, 0xC2, 0x72, 0xBB, 0x00, 0xDE, 0x2D, 0x03, 0xCC, 0xA8, 0xFA, 0x5F, 0xBF, 0xDA, 0x3F, 0xD9, 0xC6, 0x0A, 0x6D, 0x97, 0x5A, 0xB6, 305 + 0xDD, 0x90, 0x5F, 0x90, 0x97, 0x90, 0xBF, 0xEE, 0xB3, 0xEE, 0x26, 0x04, 0xA6, 0x01, 0x6B, 0x01, 0xC6, 0x0A, 0x6E, 0x5F, 0x97, 0x5A, 0xB6, 0xDC, 0x90, 0x5F, 0x90, 0x97, 0x90, 0xBF, 0xEE, 0xB3, 306 + 0xEE, 0x26, 0x04, 0xA6, 0x01, 0x6B, 0x03, 0xB6, 0xDD, 0x27, 0x16, 0x4A, 0xCD, 0xA9, 0xD4, 0x27, 0x06, 0xB6, 0xDD, 0x4A, 0xCD, 0xA9, 0xB8, 0x7B, 0x03, 0x26, 0x06, 0xB6, 0xDD, 0x4A, 0xCD, 0xA9, 307 + 0xC0, 0x7B, 0x01, 0x26, 0x18, 0xB6, 0xDD, 0x4C, 0xCD, 0xA9, 0xD4, 0x27, 0x06, 0xB6, 0xDD, 0x4C, 0xCD, 0xA9, 0xB8, 0x7B, 0x03, 0x26, 0x06, 0xB6, 0xDD, 0x4C, 0xCD, 0xA9, 0xC0, 0xB6, 0xDC, 0x27, 308 + 0x05, 0xB6, 0xDD, 0xCD, 0xA9, 0xB8, 0x7B, 0x03, 0x26, 0x05, 0xB6, 0xDD, 0xCD, 0xA9, 0xC0, 0xB6, 0xD9, 0x27, 0x11, 0xBE, 0xDA, 0x62, 0xBF, 0xDA, 0x72, 0xB0, 0x09, 0xC2, 0xB3, 0xE2, 0x23, 0x07, 309 + 0xA6, 0x01, 0x20, 0x01, 0x4C, 0x6B, 0x02, 0x7B, 0x02, 0x27, 0x5A, 0xAE, 0x00, 0x01, 0xB6, 0xDD, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0xCD, 0xA9, 0xA3, 0x27, 0x06, 0x72, 0x14, 0x00, 0xE6, 0x20, 310 + 0x53, 0xCE, 0x0B, 0x02, 0xE6, 0x01, 0xA4, 0x3F, 0xE7, 0x01, 0x48, 0x48, 0xC8, 0x0A, 0xAA, 0xA5, 0xC0, 0x26, 0x26, 0xCD, 0xA9, 0xC8, 0x27, 0x05, 0x90, 0x58, 0x4A, 0x26, 0xFB, 0x90, 0x01, 0xDA, 311 + 0x04, 0xA8, 0x90, 0x01, 0xDA, 0x04, 0xA7, 0x90, 0x01, 0xDF, 0x04, 0xA7, 0xCD, 0xA9, 0xDE, 0x72, 0x18, 0x00, 0xF2, 0x72, 0x14, 0x00, 0xE6, 0x20, 0x54, 0xE6, 0x01, 0xAB, 0x10, 0xE8, 0x01, 0xA4, 312 + 0x3F, 0xE8, 0x01, 0x20, 0x46, 0xAE, 0x00, 0x01, 0xB6, 0xDD, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0xAD, 0x3E, 0x26, 0x09, 0xCE, 0x0B, 0x02, 0xE6, 0x01, 0xA4, 0x0F, 0x20, 0x2E, 0xAD, 0x6C, 0x4E, 313 + 0xC8, 0x0A, 0xAA, 0xA5, 0x0C, 0x26, 0x20, 0xAD, 0x4C, 0x27, 0x05, 0x90, 0x58, 0x4A, 0x26, 0xFB, 0x90, 0x53, 0x90, 0x01, 0xD4, 0x04, 0xA8, 0x90, 0x01, 0xD4, 0x04, 0xA7, 0x90, 0x01, 0xDF, 0x04, 314 + 0xA7, 0x72, 0x18, 0x00, 0xF2, 0x20, 0x06, 0xE6, 0x01, 0xAB, 0x40, 0xE7, 0x01, 0x5B, 0x03, 0x81, 0xB6, 0xDC, 0x90, 0x5F, 0x90, 0x97, 0x90, 0x58, 0x01, 0x90, 0xD4, 0x04, 0xA8, 0x01, 0x90, 0xD4, 315 + 0x04, 0xA7, 0x01, 0x5D, 0x81, 0x97, 0xB6, 0xDC, 0x4A, 0x95, 0xCC, 0xA8, 0x2F, 0x97, 0xB6, 0xDC, 0x4C, 0x95, 0xCC, 0xA8, 0x2F, 0xB6, 0xDC, 0x5F, 0x97, 0x58, 0x90, 0xAE, 0x00, 0x01, 0xB6, 0xDD, 316 + 0x81, 0x97, 0xB6, 0xDC, 0x95, 0xCD, 0xA8, 0x2F, 0xB6, 0xDC, 0x81, 0xCE, 0x0B, 0x02, 0xE6, 0x01, 0xA4, 0xCF, 0xE7, 0x01, 0x81, 0x52, 0x11, 0xB6, 0x34, 0xA1, 0x03, 0x26, 0x05, 0xC6, 0x0A, 0x65, 317 + 0x20, 0x03, 0xC6, 0x0A, 0x66, 0x6B, 0x0D, 0x45, 0xD4, 0xEA, 0x3F, 0xE9, 0x3F, 0xE8, 0x3F, 0xE7, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBC, 0x71, 0xCE, 0x08, 0x5F, 0x90, 0xAE, 0x01, 0x00, 0xCD, 0xBC, 318 + 0xFF, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBA, 0x28, 0x96, 0x1C, 0x00, 0x0E, 0xCD, 0xBC, 0x71, 0xCE, 0x07, 0x1D, 0xCD, 0xBC, 0xFF, 0x96, 0x1C, 0x00, 0x09, 0xCD, 0xBC, 0x71, 0x96, 0x1C, 0x00, 0x09, 319 + 0xCD, 0xBB, 0x29, 0x7B, 0x0D, 0xCD, 0xBC, 0x62, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBC, 0x71, 0x96, 0x1C, 0x00, 0x0E, 0xCD, 0xBB, 0x29, 0x7B, 0x0D, 0xCD, 0xBC, 0x62, 0x96, 0x5C, 0xCD, 0xBC, 0x71, 320 + 0x96, 0x1C, 0x00, 0x0E, 0xCD, 0xBB, 0x29, 0x96, 0x5C, 0xCD, 0xBB, 0x11, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBA, 0x28, 0x96, 0x1C, 0x00, 0x0E, 0xCD, 0xBC, 0x71, 0x1E, 0x0F, 0xCF, 0x08, 0x5F, 0x7B, 321 + 0x11, 0xB7, 0xD4, 0x5B, 0x11, 0x81, 0x72, 0x0B, 0x53, 0x04, 0x07, 0x35, 0xC0, 0x53, 0x04, 0xA6, 0x01, 0x81, 0x4F, 0x81, 0x52, 0x05, 0x5F, 0x1F, 0x03, 0xAE, 0x03, 0xFF, 0xA6, 0x0A, 0xC0, 0x0A, 322 + 0x6D, 0x27, 0x04, 0x57, 0x4A, 0x26, 0xFC, 0xB6, 0x31, 0x90, 0x5F, 0x90, 0x97, 0x90, 0x58, 0x01, 0x90, 0xD4, 0x0A, 0xAC, 0x01, 0x90, 0xD4, 0x0A, 0xAB, 0x01, 0x1F, 0x01, 0x0F, 0x05, 0xAE, 0x00, 323 + 0x01, 0x7B, 0x05, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0x01, 0x14, 0x02, 0x01, 0x14, 0x01, 0x01, 0x5D, 0x27, 0x1C, 0xAE, 0x00, 0x01, 0x7B, 0x05, 0x90, 0x5F, 0x90, 0x97, 0x90, 0xD6, 0x0A, 0x6F, 324 + 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0x01, 0x1A, 0x04, 0x01, 0x1A, 0x03, 0x01, 0x1F, 0x03, 0x0C, 0x05, 0x7B, 0x05, 0xA1, 0x0A, 0x25, 0xC7, 0x1E, 0x03, 0x01, 0xCA, 0x53, 0x09, 0x01, 0xCA, 0x53, 325 + 0x08, 0x01, 0xCF, 0x53, 0x08, 0x1E, 0x03, 0x26, 0x04, 0xA6, 0x01, 0x20, 0x01, 0x4F, 0x5B, 0x05, 0x81, 0x89, 0x0F, 0x01, 0xCD, 0xA5, 0x0B, 0x6B, 0x02, 0x26, 0x05, 0xCD, 0xAA, 0x87, 0x6B, 0x01, 326 + 0x7B, 0x01, 0x27, 0x04, 0x7B, 0x02, 0x27, 0xEC, 0x7B, 0x02, 0x26, 0x05, 0xCD, 0xA5, 0x30, 0x7B, 0x02, 0x85, 0x81, 0x52, 0x05, 0x0F, 0x05, 0xCC, 0xAB, 0xC3, 0xAE, 0x00, 0x01, 0x4D, 0x27, 0x04, 327 + 0x58, 0x4A, 0x26, 0xFC, 0xB6, 0x31, 0x90, 0x5F, 0x90, 0x97, 0x90, 0x58, 0x01, 0x90, 0xD4, 0x0A, 0xAC, 0x01, 0x90, 0xD4, 0x0A, 0xAB, 0x01, 0x5D, 0x27, 0x63, 0xB6, 0xCF, 0x27, 0x30, 0x7B, 0x05, 328 + 0x5F, 0x97, 0x58, 0x1F, 0x03, 0xCD, 0xAB, 0xE5, 0x72, 0xFB, 0x03, 0x7B, 0x05, 0xCD, 0xAB, 0xEC, 0x90, 0xBF, 0xEE, 0x90, 0x93, 0x90, 0xDE, 0x04, 0xC5, 0x72, 0xB9, 0x00, 0xEE, 0x90, 0x54, 0x7B, 329 + 0x05, 0x5F, 0x97, 0x58, 0x1F, 0x01, 0xAD, 0x6A, 0x72, 0xFB, 0x01, 0xDF, 0x07, 0x33, 0x7B, 0x05, 0x5F, 0x97, 0x58, 0x1F, 0x03, 0xAD, 0x5B, 0x72, 0xFB, 0x03, 0x7B, 0x05, 0xAD, 0x5B, 0xDF, 0x04, 330 + 0xC5, 0x72, 0x01, 0x00, 0xE4, 0x28, 0x7B, 0x05, 0x5F, 0x97, 0x58, 0x1F, 0x03, 0xAD, 0x43, 0x72, 0xFB, 0x03, 0x90, 0x93, 0x90, 0xDE, 0x04, 0xC5, 0xDF, 0x07, 0x33, 0x20, 0x11, 0x7B, 0x05, 0x5F, 331 + 0x97, 0x58, 0x1F, 0x03, 0xAD, 0x2C, 0x72, 0xFB, 0x03, 0x90, 0x5F, 0xDF, 0x04, 0xC5, 0x0C, 0x05, 0x7B, 0x05, 0xC1, 0x0A, 0x6D, 0x24, 0x03, 0xCC, 0xAB, 0x2D, 0x72, 0x01, 0x00, 0xE4, 0x10, 0xB6, 332 + 0x31, 0x5F, 0x97, 0x58, 0x90, 0x5F, 0xDF, 0x04, 0x69, 0xDF, 0x04, 0x89, 0xDF, 0x04, 0xA7, 0x5B, 0x05, 0x81, 0xB6, 0x31, 0x97, 0xA6, 0x14, 0x42, 0x81, 0x90, 0x5F, 0x90, 0x97, 0x90, 0xD6, 0x0A, 333 + 0x6F, 0x90, 0x5F, 0x90, 0x97, 0x90, 0x58, 0x90, 0xDE, 0x53, 0x20, 0x81, 0xBE, 0xD7, 0xCF, 0x07, 0x1D, 0x5F, 0xBF, 0xD5, 0x72, 0x17, 0x00, 0xE4, 0x81, 0x52, 0x10, 0xBE, 0xD7, 0x26, 0x07, 0x5F, 334 + 0xCF, 0x07, 0x1D, 0xCC, 0xAC, 0x99, 0xBE, 0xD5, 0x4F, 0x01, 0xCD, 0xBC, 0xF8, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBC, 0x71, 0xCE, 0x07, 0x1D, 0x90, 0xAE, 0x01, 0x00, 0xCD, 0xBC, 0xFF, 0x96, 0x1C, 335 + 0x00, 0x05, 0xCD, 0xBA, 0x28, 0x96, 0x1C, 0x00, 0x0D, 0xCD, 0xBC, 0x71, 0xBE, 0xD7, 0xCD, 0xBC, 0xFF, 0x96, 0x1C, 0x00, 0x09, 0xCD, 0xBC, 0x71, 0x55, 0x0A, 0x64, 0x00, 0xEA, 0x3F, 0xE9, 0x3F, 336 + 0xE8, 0x3F, 0xE7, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBC, 0x71, 0x96, 0x1C, 0x00, 0x09, 0xCD, 0xBB, 0x29, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBA, 0x86, 0x96, 0x5C, 0xCD, 0xBC, 0x71, 0xA6, 0x01, 0x97, 337 + 0x4F, 0xC0, 0x0A, 0x64, 0x24, 0x01, 0x5A, 0xCD, 0xB9, 0xFB, 0x96, 0x1C, 0x00, 0x0D, 0xCD, 0xBA, 0x86, 0x96, 0x5C, 0xCD, 0xBA, 0x28, 0x96, 0x1C, 0x00, 0x0D, 0xCD, 0xBC, 0x71, 0x1E, 0x0D, 0xCF, 338 + 0x07, 0x1D, 0x1E, 0x0F, 0xBF, 0xD5, 0x5B, 0x10, 0x81, 0x35, 0x03, 0x53, 0x0A, 0x35, 0xFF, 0x53, 0x0B, 0xAE, 0x03, 0xFF, 0xCF, 0x53, 0x0C, 0xCF, 0x53, 0x0E, 0x81, 0x5F, 0xCF, 0x53, 0x0A, 0xCF, 339 + 0x53, 0x0C, 0xCF, 0x53, 0x0E, 0x81, 0xC6, 0x0A, 0x5E, 0x5F, 0x97, 0x50, 0xB3, 0xDE, 0x2D, 0x4F, 0x3F, 0xD0, 0xAE, 0x00, 0x01, 0xB6, 0xDD, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0xB6, 0xDC, 0x90, 340 + 0x5F, 0x90, 0x97, 0x90, 0x58, 0x01, 0x90, 0xD4, 0x0A, 0xCA, 0x01, 0x90, 0xD4, 0x0A, 0xC9, 0x01, 0x5D, 0x26, 0x35, 0x72, 0x0C, 0x00, 0xE6, 0x27, 0x72, 0x04, 0x00, 0xE6, 0x22, 0x72, 0x0A, 0x00, 341 + 0xE6, 0x1D, 0xCE, 0x0B, 0x02, 0xE6, 0x02, 0x4C, 0xE8, 0x02, 0xA4, 0x0F, 0xE8, 0x02, 0xE7, 0x02, 0xA4, 0x0F, 0xA1, 0x0E, 0x25, 0x12, 0xE6, 0x02, 0xA4, 0xF0, 0xE7, 0x02, 0xA6, 0x01, 0x81, 0xCE, 342 + 0x0B, 0x02, 0xE6, 0x02, 0xA4, 0xF0, 0xE7, 0x02, 0x4F, 0x81, 0x72, 0x1F, 0x53, 0x00, 0x88, 0xC6, 0x53, 0x01, 0xA4, 0xDC, 0xC7, 0x53, 0x01, 0xC6, 0x0A, 0x8F, 0xA4, 0x23, 0xCA, 0x53, 0x01, 0xC7, 343 + 0x53, 0x01, 0x72, 0x05, 0x0A, 0x8F, 0x05, 0xAE, 0x03, 0xFF, 0x20, 0x01, 0x5F, 0xCF, 0x53, 0x12, 0x5F, 0x7B, 0x01, 0x97, 0xD6, 0x0A, 0x90, 0xC7, 0x53, 0x06, 0x5F, 0x7B, 0x01, 0x97, 0xD6, 0x0A, 344 + 0x92, 0xC7, 0x53, 0x02, 0x5F, 0x7B, 0x01, 0x97, 0xD6, 0x0A, 0x94, 0xC7, 0x53, 0x07, 0x84, 0x72, 0x1E, 0x53, 0x00, 0x81, 0xAE, 0x07, 0x01, 0xCD, 0xB6, 0x97, 0xCD, 0xB3, 0x59, 0x35, 0x80, 0x53, 345 + 0x00, 0x35, 0x20, 0x53, 0x04, 0x35, 0x84, 0x53, 0x01, 0xAE, 0x03, 0xFF, 0xCF, 0x53, 0x1C, 0x81, 0x88, 0x72, 0x04, 0x00, 0xE5, 0x07, 0x72, 0x07, 0x04, 0x3F, 0x02, 0x84, 0x81, 0x72, 0x05, 0x00, 346 + 0xE5, 0x07, 0x72, 0x0B, 0x04, 0x3F, 0x02, 0x84, 0x81, 0x7B, 0x01, 0x27, 0x04, 0x72, 0x1A, 0x08, 0x61, 0x84, 0x81, 0x52, 0x07, 0x0F, 0x07, 0x72, 0x02, 0x00, 0xE6, 0x00, 0x90, 0x1B, 0x00, 0xE6, 347 + 0x72, 0x00, 0x00, 0xE6, 0x00, 0x90, 0x19, 0x00, 0xE6, 0x72, 0x04, 0x00, 0xE6, 0x00, 0x90, 0x1D, 0x00, 0xE6, 0xB6, 0xE6, 0xA4, 0xF8, 0xB7, 0xE6, 0x35, 0xFF, 0x04, 0x3B, 0x5F, 0xBF, 0xCB, 0x72, 348 + 0x19, 0x00, 0xF2, 0x72, 0x1B, 0x00, 0xF2, 0x72, 0x1D, 0x00, 0xF2, 0x72, 0x13, 0x00, 0xE5, 0xC6, 0x09, 0x9D, 0x97, 0xC6, 0x09, 0x9E, 0xCB, 0x09, 0xA1, 0x24, 0x01, 0x5C, 0x02, 0x1F, 0x03, 0x01, 349 + 0xC6, 0x09, 0x9D, 0x97, 0xC6, 0x09, 0x9E, 0xC0, 0x09, 0xA1, 0x24, 0x01, 0x5A, 0x02, 0x1F, 0x05, 0x3F, 0xDC, 0xCC, 0xAF, 0x73, 0x8F, 0xB1, 0x31, 0x24, 0xFB, 0xAE, 0x00, 0x01, 0xB6, 0xDC, 0x27, 350 + 0x04, 0x58, 0x4A, 0x26, 0xFC, 0x01, 0xB4, 0xCE, 0x01, 0xB4, 0xCD, 0x01, 0x5D, 0x27, 0x03, 0xCC, 0xAF, 0x71, 0xB6, 0xDC, 0x97, 0xA6, 0x32, 0x42, 0x1C, 0x01, 0x3E, 0xCF, 0x0B, 0x02, 0x3F, 0xDD, 351 + 0xCC, 0xAF, 0x67, 0x5F, 0x97, 0x58, 0x1F, 0x01, 0xCD, 0xAF, 0xB4, 0x72, 0xFB, 0x01, 0xDE, 0x04, 0xC5, 0xBF, 0xE2, 0x26, 0x03, 0xCC, 0xAE, 0xFD, 0xB6, 0xDD, 0x5F, 0x97, 0x58, 0x1F, 0x01, 0xCD, 352 + 0xAF, 0xB4, 0x72, 0xFB, 0x01, 0xDE, 0x07, 0x33, 0xBF, 0xE0, 0xBE, 0xE2, 0x72, 0xB0, 0x00, 0xE0, 0xBF, 0xDE, 0x5F, 0xB6, 0xDD, 0x97, 0x58, 0x1F, 0x01, 0xCD, 0xAF, 0xB4, 0x72, 0xFB, 0x01, 0x90, 353 + 0xBE, 0xDE, 0xDF, 0x05, 0xF1, 0xCE, 0x0B, 0x02, 0xE6, 0x02, 0xA4, 0x0F, 0xE7, 0x02, 0xCD, 0xAC, 0xB9, 0x4D, 0x27, 0x08, 0x72, 0x17, 0x04, 0x3F, 0xA6, 0x01, 0x6B, 0x07, 0xB6, 0xCF, 0x26, 0x05, 354 + 0x72, 0x01, 0x00, 0xE4, 0x1B, 0xBE, 0xE0, 0x13, 0x03, 0x22, 0x04, 0x13, 0x05, 0x24, 0x11, 0x72, 0x07, 0x00, 0xF2, 0x08, 0x72, 0x16, 0x04, 0x3F, 0x3F, 0xD1, 0x20, 0x04, 0xA6, 0x01, 0x6B, 0x07, 355 + 0x72, 0x08, 0x00, 0xE4, 0x09, 0xB6, 0xCF, 0x26, 0x05, 0x72, 0x01, 0x00, 0xE4, 0x03, 0xCD, 0xA4, 0x8E, 0xB6, 0xCF, 0x27, 0x03, 0xCC, 0xAF, 0x5C, 0xCD, 0xA6, 0x05, 0xB6, 0x34, 0xA1, 0x03, 0x24, 356 + 0xF4, 0xCD, 0xA6, 0xFE, 0xAE, 0x00, 0x01, 0xB6, 0xDD, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0xB6, 0xDC, 0x90, 0x5F, 0x90, 0x97, 0x90, 0x58, 0x01, 0x90, 0xD4, 0x0A, 0xCA, 0x01, 0x90, 0xD4, 0x0A, 357 + 0xC9, 0x01, 0x5D, 0x27, 0x64, 0xCD, 0xA8, 0x54, 0x20, 0x5F, 0x5C, 0xB6, 0xDD, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0xB6, 0xDC, 0x90, 0x5F, 0x90, 0x97, 0x90, 0x58, 0x01, 0x90, 0xD4, 0x0A, 0xAC, 358 + 0x01, 0x90, 0xD4, 0x0A, 0xAB, 0x01, 0x5D, 0x27, 0x20, 0xCE, 0x0B, 0x02, 0xE6, 0x02, 0xAB, 0x10, 0xE7, 0x02, 0x4E, 0xA4, 0x0F, 0xA1, 0x0E, 0x25, 0x30, 0x72, 0x17, 0x04, 0x3F, 0xA6, 0x01, 0x6B, 359 + 0x07, 0xE6, 0x02, 0xA4, 0x0F, 0xE7, 0x02, 0x20, 0x20, 0xB6, 0xDD, 0x5F, 0x97, 0x58, 0x1F, 0x01, 0xAD, 0x6F, 0x72, 0xFB, 0x01, 0x90, 0x5F, 0xDF, 0x07, 0x33, 0x5F, 0xB6, 0xDD, 0x97, 0x58, 0x1F, 360 + 0x01, 0xAD, 0x5E, 0x72, 0xFB, 0x01, 0xDF, 0x05, 0xF1, 0xCE, 0x0B, 0x02, 0x1C, 0x00, 0x05, 0xCF, 0x0B, 0x02, 0x3C, 0xDD, 0xB6, 0xDD, 0xC1, 0x0A, 0x6D, 0x24, 0x03, 0xCC, 0xAE, 0x36, 0x3C, 0xDC, 361 + 0xB6, 0xDC, 0xC1, 0x0A, 0x6E, 0x24, 0x03, 0xCC, 0xAE, 0x09, 0x72, 0x17, 0x00, 0xF2, 0x72, 0x11, 0x00, 0xE4, 0x72, 0x05, 0x09, 0xBE, 0x05, 0x7B, 0x07, 0xCD, 0xAD, 0x83, 0x72, 0x05, 0x00, 0xE6, 362 + 0x05, 0x72, 0x09, 0x00, 0xF2, 0x0B, 0x3F, 0xD3, 0x72, 0x0D, 0x00, 0xE6, 0x04, 0x72, 0x18, 0x00, 0xF2, 0x72, 0x08, 0x00, 0xF2, 0x00, 0x90, 0x19, 0x04, 0x40, 0x72, 0x19, 0x00, 0xE4, 0x5B, 0x07, 363 + 0x81, 0xB6, 0xDC, 0x97, 0xA6, 0x14, 0x42, 0x81, 0x52, 0x06, 0x0F, 0x01, 0x5F, 0x1F, 0x04, 0x3F, 0xDD, 0x35, 0x0F, 0x00, 0xDC, 0x72, 0x17, 0x00, 0xE6, 0xB6, 0xD2, 0x27, 0x02, 0x3A, 0xD2, 0x72, 364 + 0x13, 0x00, 0xE5, 0x0F, 0x06, 0xAE, 0x00, 0x01, 0x7B, 0x06, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0x01, 0xC4, 0x0A, 0x8A, 0x01, 0xC4, 0x0A, 0x89, 0x01, 0x5D, 0x27, 0x08, 0x1E, 0x04, 0x72, 0xBB, 365 + 0x09, 0x9F, 0x1F, 0x04, 0x0C, 0x06, 0x7B, 0x06, 0xA1, 0x0A, 0x25, 0xD9, 0x7B, 0x04, 0x97, 0x7B, 0x05, 0xCB, 0x09, 0xA2, 0x24, 0x01, 0x5C, 0x02, 0x1F, 0x02, 0x01, 0x7B, 0x04, 0x97, 0x7B, 0x05, 366 + 0xC0, 0x09, 0xA2, 0x24, 0x01, 0x5A, 0x02, 0x1F, 0x04, 0x72, 0x0B, 0x00, 0xE5, 0x03, 0xCC, 0xB0, 0xAB, 0xAE, 0x01, 0x34, 0xCF, 0x0B, 0x02, 0x72, 0x07, 0x0A, 0x62, 0x0B, 0xB6, 0xD2, 0xA1, 0x0E, 367 + 0x27, 0x05, 0x72, 0x07, 0x00, 0xE4, 0x15, 0xCD, 0xAB, 0xFF, 0xCE, 0x07, 0x1D, 0xBF, 0xE2, 0xB6, 0xD2, 0xA1, 0x0A, 0x27, 0x0C, 0x72, 0x05, 0x00, 0xE4, 0x0A, 0x20, 0x05, 0xCD, 0xAC, 0x0C, 0x20, 368 + 0xE9, 0xCD, 0xA4, 0xF6, 0x72, 0x0B, 0x0A, 0x88, 0x09, 0xCE, 0x08, 0x5F, 0xB3, 0xE2, 0x23, 0x10, 0x20, 0x08, 0x72, 0x0F, 0x0A, 0x88, 0x09, 0xCE, 0x08, 0x5F, 0x72, 0xB0, 0x00, 0xE2, 0x20, 0x06, 369 + 0xBE, 0xE2, 0x72, 0xB0, 0x08, 0x5F, 0xBF, 0xDE, 0xA6, 0x01, 0xCD, 0xA6, 0x05, 0x72, 0x02, 0x00, 0xE5, 0x08, 0x72, 0x06, 0x00, 0xE6, 0x03, 0xCD, 0xA9, 0xE8, 0xCE, 0x08, 0x5F, 0x13, 0x02, 0x22, 370 + 0x08, 0x13, 0x04, 0x25, 0x04, 0xBE, 0xE2, 0x26, 0x0F, 0x72, 0x07, 0x00, 0xF2, 0x06, 0x72, 0x1A, 0x04, 0x3F, 0x20, 0x04, 0xA6, 0x01, 0x6B, 0x01, 0x72, 0x17, 0x00, 0xF2, 0x72, 0x07, 0x09, 0xBE, 371 + 0x05, 0x7B, 0x01, 0xCD, 0xAD, 0x83, 0x72, 0x07, 0x00, 0xE6, 0x07, 0x72, 0x0B, 0x04, 0x3F, 0x02, 0x3F, 0xD1, 0x5B, 0x06, 0x81, 0x52, 0x06, 0xC6, 0x01, 0x00, 0x4C, 0x72, 0x05, 0x00, 0xE5, 0x03, 372 + 0xCC, 0xB1, 0xE2, 0x26, 0x0B, 0xA6, 0x80, 0xC7, 0x01, 0x00, 0xCD, 0xA5, 0xD6, 0xCC, 0xB2, 0x33, 0xC6, 0x01, 0x00, 0x26, 0x21, 0xCD, 0xB2, 0xB8, 0x72, 0x10, 0x00, 0xE4, 0x72, 0x18, 0x04, 0x3F, 373 + 0x72, 0x5D, 0x0B, 0x00, 0x27, 0x09, 0x72, 0x16, 0x04, 0x3F, 0xB7, 0xD1, 0xCC, 0xB2, 0x33, 0x72, 0x17, 0x04, 0x3F, 0xCC, 0xB2, 0x33, 0x72, 0x5F, 0x0B, 0x00, 0x0F, 0x05, 0xCC, 0xB1, 0xD2, 0x0F, 374 + 0x06, 0xCC, 0xB1, 0xC6, 0xCE, 0x09, 0x9D, 0x1F, 0x03, 0x5F, 0x97, 0x58, 0x1F, 0x01, 0x7B, 0x05, 0x97, 0xA6, 0x14, 0x42, 0x72, 0xFB, 0x01, 0xDE, 0x04, 0xC5, 0x13, 0x03, 0x22, 0x18, 0x7B, 0x06, 375 + 0x5F, 0x97, 0x58, 0x1F, 0x01, 0x7B, 0x05, 0x97, 0xA6, 0x14, 0x42, 0x72, 0xFB, 0x01, 0xD6, 0x04, 0xC6, 0xDA, 0x04, 0xC5, 0x26, 0x15, 0x7B, 0x05, 0xCD, 0xB2, 0xB2, 0x1B, 0x06, 0x24, 0x01, 0x5C, 376 + 0x02, 0xC6, 0x01, 0x00, 0x43, 0xD4, 0x08, 0x6F, 0xD7, 0x08, 0x6F, 0x7B, 0x05, 0xCD, 0xB2, 0xB2, 0x1B, 0x06, 0x24, 0x01, 0x5C, 0x02, 0xC6, 0x01, 0x00, 0x44, 0xDA, 0x08, 0x6F, 0xD7, 0x08, 0x6F, 377 + 0xC6, 0x01, 0x00, 0x4A, 0x26, 0x4B, 0xAE, 0x00, 0x01, 0x7B, 0x06, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0x7B, 0x05, 0x90, 0x5F, 0x90, 0x97, 0x90, 0x58, 0x01, 0x90, 0xD4, 0x0A, 0xAC, 0x01, 0x90, 378 + 0xD4, 0x0A, 0xAB, 0x01, 0x5D, 0x27, 0x2A, 0x7B, 0x05, 0xCD, 0xB2, 0xB2, 0x1B, 0x06, 0x24, 0x01, 0x5C, 0x02, 0xD6, 0x08, 0x6F, 0xC1, 0x09, 0xA3, 0x23, 0x13, 0x7B, 0x05, 0xCD, 0xB2, 0xB2, 0x1B, 379 + 0x06, 0x24, 0x01, 0x5C, 0x02, 0xD6, 0x08, 0x6F, 0xC1, 0x09, 0xA4, 0x25, 0x04, 0x35, 0x01, 0x0B, 0x00, 0x0C, 0x06, 0x7B, 0x06, 0xC1, 0x0A, 0x6D, 0x24, 0x03, 0xCC, 0xB1, 0x17, 0x0C, 0x05, 0x7B, 380 + 0x05, 0xC1, 0x0A, 0x6E, 0x24, 0x03, 0xCC, 0xB1, 0x12, 0x72, 0x54, 0x01, 0x00, 0x20, 0x51, 0x26, 0x29, 0x35, 0x80, 0x01, 0x00, 0x0F, 0x06, 0xAE, 0x00, 0x01, 0x7B, 0x06, 0x27, 0x04, 0x58, 0x4A, 381 + 0x26, 0xFC, 0xCD, 0xB2, 0xC5, 0x27, 0x09, 0x7B, 0x06, 0x5F, 0x97, 0xA6, 0x80, 0xD7, 0x08, 0x65, 0x0C, 0x06, 0x7B, 0x06, 0xA1, 0x0A, 0x25, 0xDF, 0x20, 0x26, 0xC6, 0x01, 0x00, 0x26, 0x24, 0xCD, 382 + 0xB2, 0xB8, 0x72, 0x16, 0x00, 0xE4, 0x72, 0x14, 0x00, 0xE4, 0x72, 0x1C, 0x04, 0x3F, 0x72, 0x5D, 0x0B, 0x00, 0x27, 0x08, 0x72, 0x1A, 0x04, 0x3F, 0xB7, 0xD1, 0x20, 0x04, 0x72, 0x1B, 0x04, 0x3F, 383 + 0x5B, 0x06, 0x81, 0x72, 0x5F, 0x0B, 0x00, 0x4F, 0x6B, 0x06, 0x5F, 0x97, 0x58, 0x90, 0x93, 0x90, 0xDE, 0x53, 0x20, 0x90, 0xC3, 0x09, 0x9F, 0x22, 0x0A, 0xD6, 0x53, 0x21, 0xDA, 0x53, 0x20, 0x26, 384 + 0x0E, 0x7B, 0x06, 0x5F, 0x97, 0xC6, 0x01, 0x00, 0x43, 0xD4, 0x08, 0x65, 0xD7, 0x08, 0x65, 0x7B, 0x06, 0x5F, 0x97, 0xC6, 0x01, 0x00, 0x44, 0xDA, 0x08, 0x65, 0xD7, 0x08, 0x65, 0xC6, 0x01, 0x00, 385 + 0x4A, 0x26, 0x2B, 0xAE, 0x00, 0x01, 0x7B, 0x06, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0xAD, 0x42, 0x27, 0x1C, 0x7B, 0x06, 0x5F, 0x97, 0xD6, 0x08, 0x65, 0xC1, 0x09, 0xA3, 0x23, 0x0C, 0x7B, 0x06, 386 + 0x5F, 0x97, 0xD6, 0x08, 0x65, 0xC1, 0x09, 0xA4, 0x25, 0x04, 0x35, 0x01, 0x0B, 0x00, 0x0C, 0x06, 0x7B, 0x06, 0xA1, 0x0A, 0x25, 0x94, 0x72, 0x54, 0x01, 0x00, 0xCD, 0xAB, 0xFF, 0x20, 0x81, 0x97, 387 + 0xA6, 0x0A, 0x42, 0x01, 0x81, 0x35, 0xFF, 0x01, 0x00, 0x72, 0x1B, 0x08, 0x61, 0x72, 0x16, 0x00, 0xF2, 0x81, 0x01, 0xC4, 0x0A, 0x8A, 0x01, 0xC4, 0x0A, 0x89, 0x01, 0x5D, 0x81, 0x72, 0x0B, 0x08, 388 + 0x61, 0x0D, 0x72, 0x04, 0x00, 0xE5, 0x08, 0xCE, 0x09, 0x9D, 0x1C, 0x00, 0x32, 0x20, 0x03, 0xCE, 0x09, 0xA5, 0xCF, 0x53, 0x1A, 0x72, 0x04, 0x00, 0xE5, 0x29, 0x3F, 0x31, 0xC6, 0x0A, 0x6E, 0x4A, 389 + 0x27, 0x06, 0x72, 0x1B, 0x53, 0x00, 0x20, 0x04, 0x72, 0x1A, 0x53, 0x00, 0xAE, 0x00, 0x01, 0xC6, 0x0A, 0x79, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0xCF, 0x53, 0x16, 0xCD, 0xAA, 0x87, 0xCD, 0xA5, 390 + 0x30, 0x20, 0x14, 0x72, 0x0E, 0x0A, 0x88, 0x06, 0xCE, 0x0A, 0x8B, 0xCF, 0x53, 0x16, 0xCE, 0x0A, 0x89, 0xCF, 0x53, 0x08, 0xCD, 0xA5, 0x8E, 0x72, 0x06, 0x00, 0xE6, 0x00, 0x90, 0x1F, 0x00, 0xE6, 391 + 0x81, 0x72, 0x14, 0x00, 0xE5, 0x72, 0x0F, 0x0A, 0x88, 0x05, 0xCD, 0xAC, 0xAE, 0x20, 0x03, 0xCD, 0xAC, 0x9C, 0x72, 0x0D, 0x0A, 0x88, 0x06, 0x72, 0x16, 0x53, 0x01, 0x20, 0x04, 0x72, 0x17, 0x53, 392 + 0x01, 0xA6, 0x01, 0xCC, 0xAD, 0x1D, 0x72, 0x15, 0x00, 0xE5, 0xCD, 0xAC, 0x9C, 0x72, 0x17, 0x53, 0x01, 0x4F, 0xCC, 0xAD, 0x1D, 0x88, 0x35, 0x20, 0x53, 0x04, 0x72, 0x04, 0x00, 0xE5, 0x5B, 0xCD, 393 + 0xAA, 0x79, 0x4A, 0x26, 0x13, 0xAE, 0x00, 0x01, 0xB6, 0x31, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0x01, 0xBA, 0xCE, 0x01, 0xBA, 0xCD, 0x20, 0x12, 0xAE, 0x00, 0x01, 0xB6, 0x31, 0x27, 0x04, 0x58, 394 + 0x4A, 0x26, 0xFC, 0x53, 0x01, 0xB4, 0xCE, 0x01, 0xB4, 0xCD, 0x01, 0xBF, 0xCD, 0xCD, 0xAB, 0x26, 0xCD, 0xAB, 0x04, 0x44, 0x90, 0x11, 0x00, 0xE5, 0x72, 0x00, 0x00, 0xE5, 0x67, 0xC6, 0x0A, 0x6E, 395 + 0x5F, 0x97, 0x5A, 0xB6, 0x31, 0x90, 0x5F, 0x90, 0x97, 0x90, 0xBF, 0xEE, 0xB3, 0xEE, 0x26, 0x04, 0x72, 0x1A, 0x53, 0x00, 0x72, 0x1C, 0x53, 0x00, 0x20, 0x4A, 0xCD, 0xAA, 0x79, 0x44, 0x90, 0x1B, 396 + 0x00, 0xE5, 0x5F, 0xBF, 0xD7, 0x4F, 0x6B, 0x01, 0x5F, 0x97, 0x58, 0x90, 0x93, 0x90, 0xDE, 0x53, 0x20, 0xDF, 0x07, 0x1F, 0xAE, 0x00, 0x01, 0x4D, 0x27, 0x04, 0x58, 0x4A, 0x26, 0xFC, 0x01, 0xC4, 397 + 0x0A, 0x8A, 0x01, 0xC4, 0x0A, 0x89, 0x01, 0x5D, 0x27, 0x0E, 0x7B, 0x01, 0x5F, 0x97, 0x58, 0xDE, 0x53, 0x20, 0x72, 0xBB, 0x00, 0xD7, 0xBF, 0xD7, 0x0C, 0x01, 0x7B, 0x01, 0xA1, 0x0A, 0x25, 0xC8, 398 + 0x72, 0x10, 0x00, 0xE5, 0x84, 0x81, 0x72, 0x0E, 0x09, 0xBE, 0x21, 0xB6, 0x34, 0xA1, 0x03, 0x25, 0x1B, 0xC6, 0x09, 0xB8, 0x27, 0x16, 0x4A, 0x26, 0x04, 0x72, 0x5C, 0x09, 0xB8, 0x3C, 0xD0, 0xB6, 399 + 0xD0, 0xC1, 0x09, 0xB8, 0x25, 0x06, 0x3F, 0xD0, 0x35, 0x01, 0x00, 0xCF, 0xBE, 0x32, 0x27, 0x10, 0xCD, 0xBC, 0xF8, 0xAE, 0x85, 0x1A, 0xCD, 0xBA, 0x40, 0x27, 0x05, 0xBE, 0x32, 0x5A, 0xBF, 0x32, 400 + 0x72, 0x05, 0x00, 0xE6, 0x14, 0xC6, 0x09, 0xB9, 0x27, 0x0F, 0x3C, 0xD3, 0xB6, 0xD3, 0xC1, 0x09, 0xB9, 0x23, 0x06, 0x3F, 0xD3, 0x72, 0x10, 0x00, 0xE4, 0x72, 0x04, 0x00, 0xE5, 0x0A, 0x72, 0x07, 401 + 0x04, 0x3F, 0x05, 0x72, 0x04, 0x09, 0xBE, 0x0F, 0x72, 0x05, 0x00, 0xE5, 0x1D, 0x72, 0x0B, 0x04, 0x3F, 0x18, 0x72, 0x07, 0x09, 0xBE, 0x13, 0x3C, 0xD1, 0xB6, 0xD1, 0xC1, 0x09, 0xA7, 0x25, 0x0A, 402 + 0xB6, 0xCF, 0x26, 0x06, 0x72, 0x1A, 0x08, 0x61, 0xB7, 0xD1, 0x81, 0x88, 0xB6, 0x34, 0x5F, 0x97, 0xD6, 0x09, 0xB4, 0x6B, 0x01, 0xB6, 0x34, 0xA1, 0x04, 0x27, 0x05, 0x7B, 0x01, 0x4C, 0x26, 0x07, 403 + 0xAE, 0xFF, 0xFF, 0xBF, 0x32, 0x84, 0x81, 0xB6, 0x34, 0xA1, 0x03, 0x26, 0x17, 0x7B, 0x01, 0x97, 0xA6, 0x14, 0x42, 0xBF, 0x32, 0x72, 0x09, 0x0A, 0x88, 0x06, 0x35, 0x0F, 0x00, 0xD2, 0x20, 0xE5, 404 + 0x3F, 0xD2, 0x20, 0xE1, 0x7B, 0x01, 0x5F, 0x97, 0x20, 0xD9, 0x88, 0xB6, 0x34, 0x6B, 0x01, 0x72, 0x0F, 0x09, 0xBE, 0x03, 0xCC, 0xB5, 0xC0, 0xB6, 0xCF, 0x27, 0x3E, 0x4A, 0x26, 0x23, 0xB6, 0x34, 405 + 0xC7, 0x0B, 0x01, 0x3C, 0xCF, 0xA1, 0x02, 0x27, 0x04, 0x35, 0x02, 0x00, 0x34, 0x72, 0x06, 0x04, 0x3F, 0x03, 0xCC, 0xB5, 0xC7, 0x72, 0x05, 0x09, 0xBE, 0xF8, 0x72, 0x1A, 0x08, 0x61, 0xCC, 0xB5, 406 + 0xC7, 0x72, 0x0B, 0x08, 0x61, 0x02, 0x84, 0x81, 0x3C, 0xCF, 0xC6, 0x0B, 0x01, 0xA1, 0x03, 0x25, 0xED, 0x55, 0x0B, 0x01, 0x00, 0x34, 0xCC, 0xB5, 0xC7, 0xB6, 0x34, 0x26, 0x19, 0x72, 0x02, 0x00, 407 + 0xE6, 0x07, 0x72, 0x04, 0x00, 0xE6, 0x02, 0x20, 0x76, 0x72, 0x01, 0x04, 0x40, 0x06, 0xCD, 0xB4, 0x9E, 0xCC, 0xB5, 0xC7, 0x20, 0x6F, 0xA1, 0x01, 0x26, 0x28, 0x72, 0x02, 0x00, 0xE6, 0x02, 0x20, 408 + 0x5E, 0x72, 0x00, 0x04, 0x40, 0x0C, 0x72, 0x08, 0x00, 0xF2, 0x07, 0xB6, 0x48, 0xC1, 0x04, 0x41, 0x27, 0x02, 0x20, 0x1C, 0xBE, 0x32, 0x26, 0x5C, 0x35, 0x02, 0x00, 0x34, 0x72, 0x10, 0x00, 0xE4, 409 + 0x20, 0x52, 0xA1, 0x02, 0x26, 0x21, 0x72, 0x02, 0x00, 0xE6, 0x05, 0x72, 0x05, 0x00, 0xE6, 0x04, 0x3F, 0x34, 0x20, 0x40, 0xBE, 0x32, 0x26, 0x3C, 0x3C, 0x34, 0x72, 0x09, 0x0A, 0x88, 0x04, 0x72, 410 + 0x14, 0x00, 0xE4, 0x3F, 0xD0, 0x20, 0x2D, 0x72, 0x09, 0x0A, 0x88, 0x09, 0x72, 0x07, 0x00, 0xE6, 0x04, 0xB6, 0xD2, 0x27, 0x0A, 0x72, 0x08, 0x0A, 0x88, 0x0B, 0x72, 0x01, 0x00, 0xE6, 0x06, 0x35, 411 + 0x02, 0x00, 0x34, 0x20, 0x0F, 0xBE, 0x32, 0x26, 0x0B, 0x3C, 0x34, 0x20, 0x07, 0xC6, 0x08, 0x61, 0xA4, 0x07, 0xB7, 0x34, 0xB6, 0x34, 0x11, 0x01, 0x27, 0x2C, 0xB6, 0xCF, 0x26, 0x03, 0xCD, 0xB4, 412 + 0x9E, 0x72, 0x09, 0x0A, 0x88, 0x20, 0x7B, 0x01, 0xA1, 0x03, 0x25, 0x0B, 0xB6, 0x34, 0xA1, 0x03, 0x24, 0x05, 0xCD, 0xB3, 0x59, 0x20, 0x0F, 0x7B, 0x01, 0xA1, 0x03, 0x24, 0x09, 0xB6, 0x34, 0xA1, 413 + 0x03, 0x25, 0x03, 0xCD, 0xB3, 0x34, 0xB6, 0xCF, 0xA1, 0x03, 0x26, 0x02, 0x3F, 0xCF, 0xC6, 0x04, 0x3F, 0xA4, 0xF8, 0xC7, 0x04, 0x3F, 0xC6, 0x04, 0x3F, 0xBA, 0x34, 0xC7, 0x04, 0x3F, 0x84, 0x81, 414 + 0x72, 0x0A, 0x08, 0x61, 0x0F, 0xCD, 0xAD, 0xA6, 0xB6, 0x34, 0xA1, 0x03, 0x24, 0x0C, 0xCD, 0x96, 0x36, 0xCC, 0x96, 0x82, 0xCD, 0xA4, 0xED, 0xCD, 0xB0, 0xC8, 0x81, 0xCD, 0xA4, 0xED, 0xCD, 0xA4, 415 + 0xE5, 0x72, 0x0A, 0x08, 0x61, 0x03, 0xCC, 0xAF, 0xBB, 0xCC, 0xB0, 0xC8, 0xB6, 0x34, 0xA1, 0x03, 0x24, 0x28, 0x72, 0x0A, 0x08, 0x61, 0x4C, 0x72, 0x09, 0x0A, 0x88, 0x0C, 0x35, 0x03, 0x00, 0x34, 416 + 0xCD, 0xB3, 0x34, 0x72, 0x1A, 0x08, 0x61, 0x81, 0x72, 0x15, 0x00, 0xF2, 0x72, 0x0F, 0x09, 0xBE, 0x07, 0xC6, 0x08, 0x61, 0xA4, 0x07, 0xB7, 0x34, 0x20, 0x26, 0xA1, 0x03, 0x26, 0x25, 0x72, 0x0A, 417 + 0x08, 0x61, 0x20, 0x72, 0x15, 0x00, 0xF2, 0x72, 0x0F, 0x09, 0xBE, 0x0D, 0xC6, 0x08, 0x61, 0xA4, 0x07, 0xB7, 0x34, 0xA1, 0x03, 0x24, 0x09, 0x20, 0x04, 0x35, 0x02, 0x00, 0x34, 0xCD, 0xB3, 0x59, 418 + 0xCD, 0xB4, 0x9E, 0x81, 0x89, 0x88, 0x9E, 0xA4, 0xF0, 0x6B, 0x01, 0x26, 0x26, 0x7B, 0x03, 0x27, 0x0F, 0x7B, 0x02, 0xAD, 0x45, 0x27, 0x04, 0x48, 0x5A, 0x26, 0xFC, 0xCA, 0x50, 0xC3, 0x20, 0x0E, 419 + 0x7B, 0x02, 0xAD, 0x36, 0x27, 0x04, 0x48, 0x5A, 0x26, 0xFC, 0x43, 0xC4, 0x50, 0xC3, 0xC7, 0x50, 0xC3, 0x20, 0x24, 0x7B, 0x03, 0x27, 0x0F, 0x7B, 0x02, 0xAD, 0x1F, 0x27, 0x04, 0x48, 0x5A, 0x26, 420 + 0xFC, 0xCA, 0x50, 0xC4, 0x20, 0x0E, 0x7B, 0x02, 0xAD, 0x10, 0x27, 0x04, 0x48, 0x5A, 0x26, 0xFC, 0x43, 0xC4, 0x50, 0xC4, 0xC7, 0x50, 0xC4, 0x5B, 0x03, 0x81, 0xA4, 0x0F, 0x5F, 0x97, 0xA6, 0x01, 421 + 0x5D, 0x81, 0x88, 0xC6, 0x50, 0xC0, 0xA4, 0xFC, 0xC7, 0x50, 0xC0, 0x7B, 0x01, 0xC7, 0x50, 0xC0, 0x84, 0x81, 0x52, 0x09, 0xC6, 0x50, 0xC0, 0xA4, 0x03, 0x5F, 0x97, 0xD6, 0x85, 0x1E, 0x6B, 0x09, 422 + 0xB7, 0xEA, 0x3F, 0xE9, 0x3F, 0xE8, 0x3F, 0xE7, 0x96, 0x5C, 0xCD, 0xBC, 0x71, 0xAE, 0x24, 0x00, 0xBF, 0xE9, 0xAE, 0x00, 0xF4, 0xBF, 0xE7, 0x96, 0x5C, 0xCD, 0xBB, 0x3B, 0x96, 0x1C, 0x00, 0x05, 423 + 0xCD, 0xBC, 0x71, 0x96, 0x1C, 0x00, 0x05, 0xCD, 0xBB, 0x29, 0x5B, 0x09, 0x81, 0x89, 0x7B, 0x06, 0x2A, 0x18, 0xA5, 0x10, 0x27, 0x05, 0xF6, 0x1A, 0x05, 0x20, 0x06, 0x1E, 0x01, 0x7B, 0x05, 0x43, 424 + 0xF4, 0xF7, 0x1E, 0x01, 0xE6, 0x02, 0x1A, 0x05, 0x20, 0x07, 0x1E, 0x01, 0x7B, 0x05, 0x43, 0xE4, 0x02, 0xE7, 0x02, 0x7B, 0x06, 0xA5, 0x40, 0x27, 0x06, 0xE6, 0x03, 0x1A, 0x05, 0x20, 0x05, 0x7B, 425 + 0x05, 0x43, 0xE4, 0x03, 0xE7, 0x03, 0x7B, 0x06, 0xA5, 0x20, 0x27, 0x06, 0xE6, 0x04, 0x1A, 0x05, 0x20, 0x05, 0x7B, 0x05, 0x43, 0xE4, 0x04, 0xE7, 0x04, 0x85, 0x81, 0x89, 0x1E, 0x01, 0x7B, 0x05, 426 + 0xF7, 0x85, 0x81, 0x52, 0x0A, 0x0F, 0x07, 0xCD, 0xB7, 0x05, 0xAE, 0x85, 0x22, 0xCD, 0xBB, 0x3B, 0xB6, 0xEA, 0x6B, 0x08, 0xC6, 0x52, 0x12, 0xA4, 0xC0, 0xC7, 0x52, 0x12, 0xC6, 0x52, 0x12, 0x1A, 427 + 0x08, 0xC7, 0x52, 0x12, 0x72, 0x11, 0x52, 0x10, 0xC6, 0x52, 0x1C, 0xA4, 0x30, 0xC7, 0x52, 0x1C, 0x72, 0x5F, 0x52, 0x1B, 0x96, 0x1C, 0x00, 0x0D, 0xCD, 0xBB, 0x29, 0xAE, 0x85, 0x26, 0xCD, 0xBA, 428 + 0x40, 0x25, 0x60, 0xA6, 0x80, 0x6B, 0x07, 0x96, 0x0D, 0x13, 0x26, 0x1D, 0x1C, 0x00, 0x0D, 0xCD, 0xBB, 0x29, 0xA6, 0x03, 0xCD, 0xBC, 0xAE, 0x96, 0x5C, 0xCD, 0xBC, 0x71, 0x7B, 0x08, 0xCD, 0xB8, 429 + 0x9E, 0x96, 0xCD, 0xB8, 0xAC, 0x1F, 0x09, 0x20, 0x21, 0x1C, 0x00, 0x0D, 0xCD, 0xBB, 0x29, 0xA6, 0x19, 0xCD, 0xBC, 0xAE, 0x96, 0x5C, 0xCD, 0xBC, 0x71, 0x7B, 0x08, 0xCD, 0xB8, 0x9E, 0x96, 0xCD, 430 + 0xB8, 0xAC, 0x1F, 0x09, 0x7B, 0x07, 0xAA, 0x40, 0x6B, 0x07, 0x1E, 0x09, 0x26, 0x03, 0x5C, 0x1F, 0x09, 0x7B, 0x08, 0x97, 0xA6, 0x03, 0x42, 0xA6, 0x0A, 0xCD, 0xBC, 0x89, 0x5C, 0x1F, 0x05, 0x7B, 431 + 0x06, 0x20, 0x28, 0x96, 0x1C, 0x00, 0x0D, 0xCD, 0xBB, 0x29, 0x38, 0xEA, 0x39, 0xE9, 0x39, 0xE8, 0x96, 0x39, 0xE7, 0x5C, 0xCD, 0xBC, 0x71, 0x7B, 0x08, 0xAD, 0x50, 0x96, 0xAD, 0x5B, 0xA3, 0x00, 432 + 0x04, 0x24, 0x03, 0xAE, 0x00, 0x04, 0x1F, 0x09, 0x7B, 0x08, 0x4C, 0xC7, 0x52, 0x1D, 0x7B, 0x0A, 0xC7, 0x52, 0x1B, 0x7B, 0x09, 0xA4, 0x0F, 0x1A, 0x07, 0xC7, 0x52, 0x1C, 0x72, 0x10, 0x52, 0x10, 433 + 0x72, 0x15, 0x52, 0x11, 0xC6, 0x52, 0x11, 0x1A, 0x14, 0xC7, 0x52, 0x11, 0x7B, 0x12, 0xC7, 0x52, 0x13, 0x7B, 0x11, 0xA4, 0x03, 0x97, 0x4F, 0x02, 0x4F, 0x01, 0x48, 0x59, 0x9F, 0x6B, 0x04, 0x7B, 434 + 0x15, 0xAA, 0x40, 0x1A, 0x04, 0xC7, 0x52, 0x14, 0x5B, 0x0A, 0x81, 0xB7, 0xEA, 0x3F, 0xE9, 0x3F, 0xE8, 0x3F, 0xE7, 0xAE, 0x85, 0x22, 0xCC, 0xBA, 0x86, 0x5C, 0xCD, 0xBB, 0x3B, 0xBE, 0xE9, 0x81, 435 + 0x89, 0x9F, 0x4D, 0x27, 0x06, 0x9E, 0xCA, 0x52, 0x1A, 0x20, 0x06, 0x7B, 0x01, 0x43, 0xC4, 0x52, 0x1A, 0xC7, 0x52, 0x1A, 0x85, 0x81, 0xC6, 0x52, 0x16, 0x81, 0xC7, 0x52, 0x16, 0x81, 0x20, 0xFE, 436 + 0x20, 0xFE, 0x20, 0xFE, 0x8A, 0x84, 0xA4, 0xBF, 0x88, 0x86, 0x3B, 0x00, 0xED, 0xBE, 0xEB, 0x89, 0x3B, 0x00, 0xF0, 0xBE, 0xEE, 0x89, 0xCD, 0xB3, 0x68, 0x85, 0xBF, 0xEE, 0x32, 0x00, 0xF0, 0x85, 437 + 0xBF, 0xEB, 0x32, 0x00, 0xED, 0x80, 0x55, 0x50, 0xF0, 0x50, 0xF0, 0x80, 0x20, 0xFE, 0x20, 0xFE, 0x20, 0xFE, 0x35, 0x02, 0x50, 0xA3, 0x72, 0x11, 0x08, 0x62, 0x72, 0x1E, 0x00, 0xF1, 0x80, 0x20, 438 + 0xFE, 0x20, 0xFE, 0x20, 0xFE, 0x20, 0xFE, 0x20, 0xFE, 0x20, 0xFE, 0x20, 0xFE, 0x20, 0xFE, 0x8A, 0x84, 0xA4, 0xBF, 0x88, 0x86, 0x3B, 0x00, 0xED, 0xBE, 0xEB, 0x89, 0x3B, 0x00, 0xF0, 0xBE, 0xEE, 439 + 0x89, 0x72, 0x11, 0x52, 0x85, 0xCD, 0xA4, 0x87, 0x85, 0xBF, 0xEE, 0x32, 0x00, 0xF0, 0x85, 0xBF, 0xEB, 0x32, 0x00, 0xED, 0x80, 0x20, 0xFE, 0x3C, 0xC3, 0x35, 0xFE, 0x52, 0xE4, 0x80, 0x20, 0xFE, 440 + 0x20, 0xFE, 0x20, 0xFE, 0xCD, 0x9D, 0x9B, 0xCD, 0xA2, 0x32, 0x72, 0x0D, 0x09, 0xBE, 0xF8, 0x72, 0x1A, 0x08, 0x61, 0xCD, 0x9E, 0x11, 0x72, 0x11, 0x00, 0xE5, 0xCD, 0xB2, 0xD0, 0x72, 0x1C, 0x53, 441 + 0x00, 0x72, 0x04, 0x00, 0xE5, 0x05, 0xCD, 0xB6, 0x13, 0x20, 0x03, 0xCD, 0xB6, 0x2E, 0xCD, 0xA3, 0xE8, 0x4D, 0x27, 0x06, 0xCD, 0xA2, 0x32, 0xCD, 0xA2, 0x17, 0x72, 0x04, 0x00, 0xF2, 0x05, 0xCD, 442 + 0xB4, 0xDD, 0x20, 0x03, 0xCD, 0xB6, 0x3F, 0x72, 0x04, 0x00, 0xF2, 0x03, 0xCD, 0x9E, 0x22, 0x35, 0xAA, 0x50, 0xE0, 0x20, 0xBE, 0xBF, 0xE7, 0x42, 0xBF, 0xE9, 0x97, 0xB6, 0xE7, 0x3F, 0xE8, 0x42, 443 + 0x72, 0xBB, 0x00, 0xE8, 0xBF, 0xE8, 0x3F, 0xE7, 0x81, 0x88, 0x4F, 0x5D, 0x2A, 0x02, 0x4C, 0x50, 0x90, 0x5D, 0x2A, 0x04, 0xAB, 0x02, 0x90, 0x50, 0x65, 0x4D, 0x27, 0x09, 0x44, 0x24, 0x05, 0x90, 444 + 0x50, 0x44, 0x25, 0x01, 0x50, 0x84, 0x81, 0x88, 0xBF, 0xEC, 0x90, 0x9F, 0x5E, 0x42, 0xBF, 0xEB, 0x90, 0x9E, 0xBE, 0xEC, 0x42, 0x72, 0xBB, 0x00, 0xEB, 0xBF, 0xEB, 0x90, 0x9F, 0xBE, 0xEC, 0x3F, 445 + 0xED, 0x42, 0x72, 0xBB, 0x00, 0xEC, 0x84, 0x81, 0xB7, 0xEA, 0x9F, 0x5F, 0xB7, 0xE9, 0x2A, 0x01, 0x5A, 0xBF, 0xE7, 0x81, 0xBF, 0xE9, 0x2A, 0x06, 0xAE, 0xFF, 0xFF, 0xBF, 0xE7, 0x81, 0x5F, 0xBF, 446 + 0xE7, 0x81, 0x90, 0xBF, 0xE9, 0x2A, 0x08, 0x90, 0xAE, 0xFF, 0xFF, 0x90, 0xBF, 0xE7, 0x81, 0x90, 0x5F, 0x90, 0xBF, 0xE7, 0x81, 0xB6, 0xEA, 0xEB, 0x03, 0xB7, 0xEA, 0xB6, 0xE9, 0xE9, 0x02, 0xB7, 447 + 0xE9, 0xB6, 0xE8, 0xE9, 0x01, 0xB7, 0xE8, 0xB6, 0xE7, 0xF9, 0xB7, 0xE7, 0x81, 0xB6, 0xE7, 0xF1, 0x26, 0x1A, 0xB6, 0xE8, 0xE1, 0x01, 0x26, 0x0C, 0xB6, 0xE9, 0xE1, 0x02, 0x26, 0x06, 0xB6, 0xEA, 448 + 0xE1, 0x03, 0x27, 0x08, 0x9C, 0x24, 0x03, 0xA6, 0xFF, 0x81, 0xA6, 0x01, 0x81, 0xE6, 0x03, 0xBB, 0xEA, 0xE7, 0x03, 0xE6, 0x02, 0xB9, 0xE9, 0xE7, 0x02, 0xE6, 0x01, 0xB9, 0xE8, 0xE7, 0x01, 0xF6, 449 + 0xB9, 0xE7, 0xF7, 0x81, 0x4D, 0x27, 0x0B, 0x38, 0xEA, 0x39, 0xE9, 0x39, 0xE8, 0x39, 0xE7, 0x4A, 0x26, 0xF5, 0x81, 0xE6, 0x03, 0x88, 0xE6, 0x02, 0x88, 0xFE, 0x89, 0x1E, 0x03, 0xB6, 0xE7, 0x42, 450 + 0xBF, 0xEB, 0xBE, 0xE7, 0x7B, 0x03, 0x42, 0x72, 0xBB, 0x00, 0xEB, 0xBF, 0xEB, 0xBE, 0xE8, 0x7B, 0x02, 0x42, 0x72, 0xBB, 0x00, 0xEB, 0xBF, 0xEB, 0xBE, 0xE9, 0x7B, 0x01, 0x42, 0x72, 0xBB, 0x00, 451 + 0xEB, 0x9F, 0xB7, 0xE7, 0xBE, 0xE7, 0x7B, 0x04, 0x3F, 0xE8, 0x42, 0x72, 0xBB, 0x00, 0xE7, 0xBF, 0xE7, 0xBE, 0xE8, 0x7B, 0x03, 0x42, 0x72, 0xBB, 0x00, 0xE7, 0xBF, 0xE7, 0xBE, 0xE9, 0x7B, 0x02, 452 + 0x42, 0x72, 0xBB, 0x00, 0xE7, 0xBF, 0xE7, 0xBE, 0xE8, 0x7B, 0x04, 0x3F, 0xE9, 0x42, 0x72, 0xBB, 0x00, 0xE8, 0xBF, 0xE8, 0x24, 0x02, 0x3C, 0xE7, 0xBE, 0xE9, 0x7B, 0x03, 0x42, 0x72, 0xBB, 0x00, 453 + 0xE8, 0xBF, 0xE8, 0x24, 0x02, 0x3C, 0xE7, 0xBE, 0xE9, 0x7B, 0x04, 0x3F, 0xEA, 0x42, 0x72, 0xBB, 0x00, 0xE9, 0xBF, 0xE9, 0x24, 0x05, 0xBE, 0xE7, 0x5C, 0xBF, 0xE7, 0x5B, 0x04, 0x81, 0xB6, 0xEA, 454 + 0xE0, 0x03, 0xB7, 0xEA, 0xB6, 0xE9, 0xE2, 0x02, 0xB7, 0xE9, 0xB6, 0xE8, 0xE2, 0x01, 0xB7, 0xE8, 0xB6, 0xE7, 0xF2, 0xB7, 0xE7, 0x81, 0x88, 0xF6, 0xB7, 0xE7, 0xE6, 0x01, 0xB7, 0xE8, 0xE6, 0x02, 455 + 0xB7, 0xE9, 0xE6, 0x03, 0xB7, 0xEA, 0x84, 0x81, 0x52, 0x04, 0xE6, 0x03, 0x88, 0xE6, 0x02, 0x88, 0xE6, 0x01, 0x88, 0xF6, 0x96, 0x88, 0xCD, 0xBB, 0x66, 0x5B, 0x08, 0x81, 0x3F, 0xEB, 0x4D, 0x2A, 456 + 0x07, 0xCD, 0xBC, 0x3A, 0x72, 0x10, 0x00, 0xEB, 0xB6, 0xE7, 0x2A, 0x07, 0xCD, 0xBC, 0x4D, 0x72, 0x12, 0x00, 0xEB, 0x90, 0x89, 0xF6, 0x26, 0x67, 0xE6, 0x01, 0x26, 0x63, 0x90, 0xBE, 0xE7, 0x27, 457 + 0x1B, 0xE6, 0x02, 0x27, 0x2E, 0xB1, 0xE7, 0x22, 0x59, 0x26, 0x06, 0xE6, 0x03, 0xB1, 0xE8, 0x22, 0x51, 0x90, 0xAE, 0x00, 0x20, 0x4F, 0xE7, 0x06, 0xE7, 0x07, 0x20, 0x57, 0x89, 0xEE, 0x02, 0x90, 458 + 0xBE, 0xE9, 0x51, 0x65, 0xBF, 0xE9, 0x85, 0xEF, 0x06, 0x90, 0x5F, 0xEF, 0x04, 0x90, 0xBF, 0xE7, 0x90, 0x85, 0x81, 0xE7, 0x04, 0xE7, 0x05, 0xE7, 0x06, 0xE6, 0x03, 0x90, 0x62, 0x90, 0xBF, 0xE7, 459 + 0x90, 0x95, 0xB6, 0xE9, 0x90, 0x97, 0xE6, 0x03, 0x90, 0x62, 0x90, 0x01, 0xB7, 0xE9, 0xB6, 0xEA, 0x90, 0x97, 0xE6, 0x03, 0x90, 0x62, 0xE7, 0x07, 0x90, 0x9F, 0xB7, 0xEA, 0x90, 0x85, 0x81, 0x90, 460 + 0xBE, 0xE7, 0xEF, 0x06, 0x90, 0xBE, 0xE9, 0x90, 0xBF, 0xE7, 0x90, 0xAE, 0x00, 0x10, 0x4F, 0xB7, 0xE9, 0xB7, 0xEA, 0xE7, 0x05, 0x38, 0xEA, 0x39, 0xE9, 0x39, 0xE8, 0x39, 0xE7, 0x69, 0x07, 0x69, 461 + 0x06, 0x69, 0x05, 0x49, 0xF1, 0x25, 0x37, 0x26, 0x1C, 0xE7, 0x04, 0xE6, 0x05, 0xE1, 0x01, 0x25, 0x10, 0x26, 0x14, 0xE6, 0x06, 0xE1, 0x02, 0x25, 0x08, 0x26, 0x0C, 0xE6, 0x07, 0xE0, 0x03, 0x24, 462 + 0x0A, 0xE6, 0x04, 0x20, 0x19, 0xE7, 0x04, 0xE6, 0x07, 0xE0, 0x03, 0xE7, 0x07, 0xE6, 0x06, 0xE2, 0x02, 0xE7, 0x06, 0xE6, 0x05, 0xE2, 0x01, 0xE7, 0x05, 0xE6, 0x04, 0xF2, 0x3C, 0xEA, 0x90, 0x5A, 463 + 0x26, 0xB3, 0x90, 0x85, 0xE7, 0x04, 0x81, 0x73, 0x63, 0x01, 0x63, 0x02, 0x60, 0x03, 0x26, 0x09, 0x6C, 0x02, 0x26, 0x05, 0x6C, 0x01, 0x26, 0x01, 0x7C, 0x81, 0x33, 0xE7, 0x33, 0xE8, 0x33, 0xE9, 464 + 0x30, 0xEA, 0x26, 0x0A, 0x3C, 0xE9, 0x26, 0x06, 0x3C, 0xE8, 0x26, 0x02, 0x3C, 0xE7, 0x81, 0x4D, 0x27, 0x0B, 0x34, 0xE7, 0x36, 0xE8, 0x36, 0xE9, 0x36, 0xEA, 0x4A, 0x26, 0xF5, 0x81, 0x88, 0xB6, 465 + 0xE7, 0xF7, 0xB6, 0xE8, 0xE7, 0x01, 0xB6, 0xE9, 0xE7, 0x02, 0xB6, 0xEA, 0xE7, 0x03, 0x84, 0x81, 0x35, 0x80, 0x00, 0xEB, 0x20, 0x02, 0x3F, 0xEB, 0x5D, 0x2A, 0x09, 0x50, 0x72, 0x10, 0x00, 0xEB, 466 + 0x72, 0x12, 0x00, 0xEB, 0x4D, 0x2A, 0x05, 0x40, 0x90, 0x12, 0x00, 0xEB, 0x62, 0x37, 0xEB, 0x2A, 0x06, 0x5F, 0x97, 0x24, 0x05, 0x50, 0x81, 0x27, 0x01, 0x50, 0x81, 0x89, 0x90, 0x89, 0x90, 0x97, 467 + 0x97, 0xB6, 0xE7, 0x42, 0x9F, 0xB7, 0xE7, 0x93, 0xB6, 0xE8, 0x3F, 0xE8, 0x42, 0x72, 0xBB, 0x00, 0xE7, 0xBF, 0xE7, 0x93, 0xB6, 0xE9, 0x3F, 0xE9, 0x42, 0x72, 0xBB, 0x00, 0xE8, 0xBF, 0xE8, 0x24, 468 + 0x02, 0x3C, 0xE7, 0xB6, 0xEA, 0x93, 0x3F, 0xEA, 0x42, 0x72, 0xBB, 0x00, 0xE9, 0xBF, 0xE9, 0x24, 0x05, 0xBE, 0xE7, 0x5C, 0xBF, 0xE7, 0x90, 0x85, 0x85, 0x81, 0xB7, 0xEA, 0x41, 0xB7, 0xE9, 0x41, 469 + 0x3F, 0xE8, 0x3F, 0xE7, 0x81, 0xBF, 0xE9, 0x3F, 0xE8, 0x3F, 0xE7, 0x81, 0x88, 0xBF, 0xEB, 0x90, 0xBF, 0xEE, 0x90, 0x9F, 0x42, 0xBF, 0xE9, 0xB6, 0xEB, 0x97, 0xB6, 0xEE, 0x42, 0xBF, 0xE7, 0x4D, 470 + 0x27, 0x10, 0x97, 0xB6, 0xEC, 0x27, 0x0B, 0x42, 0x72, 0xBB, 0x00, 0xE8, 0xBF, 0xE8, 0x24, 0x02, 0x3C, 0xE7, 0xB6, 0xEB, 0x27, 0x10, 0x97, 0xB6, 0xEF, 0x27, 0x0B, 0x42, 0x72, 0xBB, 0x00, 0xE8, 471 + 0xBF, 0xE8, 0x24, 0x02, 0x3C, 0xE7, 0x84, 0x81, 0x89, 0xB7, 0xEB, 0x90, 0xF6, 0xF7, 0x5C, 0x90, 0x5C, 0x3A, 0xEB, 0x26, 0xF6, 0x85, 0x81, 0x89, 0xB7, 0xEB, 0x90, 0xF6, 0xF7, 0x5C, 0x90, 0x5C, 472 + 0x3A, 0xEB, 0x26, 0xF6, 0x85, 0x81, 0x90, 0x89, 0xB7, 0xEB, 0xF6, 0x90, 0xF7, 0x5C, 0x90, 0x5C, 0x3A, 0xEB, 0x26, 0xF6, 0x90, 0x85, 0x81, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 473 + 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 474 + 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 475 + 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 476 + 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 477 + 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 478 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 479 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 480 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 481 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 482 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x15, 0x01, 0xF4, 0x01, 0xF4, 0x4B, 0x32, 0x00, 0xFF, 483 + 0x07, 0xD0, 0x05, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x32, 0x00, 0x4B, 0x00, 0xC8, 0x01, 0x90, 0x05, 0x3C, 0x14, 0x1E, 0x08, 0x0A, 0x64, 0x00, 0x00, 0x00, 0x2C, 0x24, 0x00, 0x00, 0x00, 0x64, 0x17, 484 + 0x08, 0x12, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 485 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 486 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 487 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 488 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x0B, 0x80, 0x32, 489 + 0x08, 0x06, 0x07, 0x06, 0x00, 0x7C, 0x00, 0x00, 0x0A, 0x0F, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 490 + 0x0C, 0x0D, 0x0E, 0x20, 0x03, 0xFF, 0x55, 0x55, 0x00, 0x00, 0x00, 0x72, 0x72, 0x95, 0x95, 0x43, 0x43, 0x00, 0x00, 0x00, 0x08, 0x02, 0x06, 0x19, 0x0F, 0x03, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 491 + 0x00, 0x0D, 0x00, 0x00, 0x44, 0x00, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0xFF, 492 + 0x03, 0xFF, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 493 + 0x00, 0x00, 0x3F, 0x0F, 0x00, 0x64, 0x00, 0x19, 0x01, 0x2C, 0x00, 0x96, 0x01, 0x2C, 0x00, 0x00, 0x07, 0xD0, 0x17, 0x00, 0x32, 0x25, 0x00, 0x32, 0x00, 0x19, 0x00, 494 + 0x00, 0x00, 495 + 0x02, 0x02, 496 + 0x00, 497 + }; 498 + 499 + // Length of Data Array 500 + int counter = 489; 501 + 502 + 503 + const unsigned char crc_array[] = {0x04, 0x84, 0x80, 0xBD, 0x6A, 0x00, 0x3B, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 504 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 505 + 506 + 507 + #endif /* HEX_ARRAY_H */
+416
firmware/libraries/IQS5xx/IQS5xx.cpp
··· 1 + #include "IQS5xx.h" 2 + #include "IQS5xx_hal.h" 3 + #include "IQS550_B000_Trackpad_40_15_2_2_BL.h" 4 + 5 + IQS::IQS() 6 + { 7 + x = 15; 8 + y = 15; 9 + i2cDeviceAddr = 0x74; 10 + ready_pin = 255; 11 + reset_pin = 255; 12 + } 13 + IQS::IQS(uint8_t address, uint8_t readyPin, uint8_t resetPin) 14 + { 15 + x = 15; 16 + y = 15; 17 + i2cDeviceAddr = address; 18 + ready_pin = readyPin; 19 + reset_pin = resetPin; 20 + } 21 + 22 + void IQS::initialize() 23 + { 24 + IQS5xx_I2C_Setup(); 25 + IQS5xx_ReadySignal_Init(ready_pin); 26 + IQS5xx_ResetSignal_Init(reset_pin); 27 + IQS5xx_delay(20); 28 + } 29 + 30 + void IQS::holdReset(bool held) 31 + { 32 + bool state = held ? 0 : 1; 33 + IQS5xx_ResetSet(reset_pin, state); 34 + } 35 + 36 + bool IQS::isReady() 37 + { 38 + return IQS5xx_ReadySignal(ready_pin); 39 + } 40 + 41 + int8_t IQS::programFirmware(uint8_t newDeviceAddress) 42 + { 43 + uint8_t retval; 44 + static uint8_t writeBuffer[BL_BLOCK_SIZE_BYTES]; 45 + static uint8_t readBuffer[BL_BLOCK_SIZE_BYTES]; 46 + uint8_t bootloaderAddress = BL_ADDR(i2cDeviceAddr); 47 + uint16_t offset; 48 + uint16_t bootloaderVersion; 49 + bool bootloaderEntered, nvFail; 50 + 51 + // Reset 52 + holdReset(true); 53 + IQS5xx_delay(20); 54 + holdReset(false); 55 + IQS5xx_delay(1); 56 + 57 + bootloaderEntered = false; 58 + for (uint8_t t=0; t<10; t++){ 59 + if(IQS5xx_I2C_Read(bootloaderAddress, (uint8_t)BL_CMD_VERSION, readBuffer , 2) != 0){ 60 + continue; 61 + } 62 + bootloaderEntered = true; 63 + bootloaderVersion = (readBuffer[0] << 8) + readBuffer[1]; 64 + if(bootloaderVersion == BL_SUPPORTED_VERSION){ 65 + break; 66 + } 67 + } 68 + 69 + if(bootloaderEntered){ 70 + if(bootloaderVersion != BL_SUPPORTED_VERSION){ 71 + // Bootloader is an unsupported version 72 + return -1; 73 + } 74 + }else{ 75 + // bootloader couldn't be entered. 76 + return -2; 77 + } 78 + 79 + // 80 + // Now write the program area, which is address 0x8400 to 0xBFFF. 81 + // This is written in blocks of 64 bytes, and gives a total of 240 82 + // such blocks required to write. 83 + // 84 + for (uint8_t blockNo = 0; blockNo<240; blockNo++){ 85 + offset = (blockNo * BL_BLOCK_SIZE_BYTES); 86 + memcpy_P(writeBuffer, hex_array + offset, BL_BLOCK_SIZE_BYTES); 87 + if(blockNo == 239){ 88 + // This is the last block of NV settings. 89 + // The last byte of this block configures the IQS550's I2C address 90 + writeBuffer[BL_BLOCK_SIZE_BYTES-1] = newDeviceAddress; 91 + } 92 + if ((retval = IQS5xx_I2C_Write(bootloaderAddress, (uint16_t)BL_APP_START_ADDR + offset, writeBuffer, BL_BLOCK_SIZE_BYTES)) !=0){ 93 + // Communication error 94 + return -3; 95 + } 96 + // This delay is necessary to give the bootloader time to write 97 + // the 64 byte buffer into memory 98 + // This delay is only necessary after each block write 99 + IQS5xx_delay(7); 100 + } 101 + 102 + // 103 + // Now program the checksum descriptor, so that the CRC check can be run 104 + // 105 + IQS5xx_I2C_Write(bootloaderAddress, (uint16_t)BL_CHECKSUM_START_ADDR, crc_array, BL_BLOCK_SIZE_BYTES); 106 + IQS5xx_delay(7); 107 + 108 + // 109 + // Perform CRC check, a '0x00' returned is pass, '0x01' is fail 110 + // 111 + readBuffer[0] == 0xFF; 112 + IQS5xx_I2C_Read(bootloaderAddress, (uint8_t)BL_CMD_CRCCHECK, readBuffer, 1); 113 + if(readBuffer[0] != 0x00){ 114 + // CRC Failure 115 + return -4; 116 + } 117 + 118 + // 119 + // The IQS5xx-B000 non-volatile memory does not form part of the CRC 120 + // checksum, so a read back and compare is needed to verify this section, 121 + // which is located 0xBE00 to 0xBFFF (512 bytes, or 8x64 blocks) 122 + // 123 + nvFail = false; 124 + for (uint8_t blockNo = 232; blockNo<240; blockNo++){ 125 + offset = (blockNo * BL_BLOCK_SIZE_BYTES); 126 + memcpy_P(writeBuffer, hex_array + offset, BL_BLOCK_SIZE_BYTES); 127 + if(blockNo == 239){ 128 + // This is the last block of NV settings. 129 + // The last byte of this block configures the IQS550's I2C address 130 + writeBuffer[BL_BLOCK_SIZE_BYTES-1] = newDeviceAddress; 131 + } 132 + 133 + uint16_t memAddress = BL_APP_START_ADDR+offset; 134 + uint8_t writeBytes[3]; 135 + writeBytes[0] = BL_CMD_READ; 136 + writeBytes[1] = (uint8_t)(memAddress>>8); 137 + writeBytes[2] = (uint8_t)memAddress; 138 + IQS5xx_I2C_Write_Read(bootloaderAddress, writeBytes, sizeof(writeBytes), NULL, 0, readBuffer, 64); 139 + 140 + if(memcmp(writeBuffer, readBuffer, BL_BLOCK_SIZE_BYTES) != 0){ 141 + nvFail = true; 142 + IQS5xx_print("Block compare failure # "); 143 + IQS5xx_println(blockNo); 144 + } 145 + } 146 + if(nvFail){ 147 + // NV Settings read-back failure 148 + return -5; 149 + } 150 + 151 + // 152 + // Give command to enter application code, thus exiting bootloader 153 + // 154 + IQS5xx_I2C_Write(bootloaderAddress, (uint8_t)BL_CMD_EXIT, writeBuffer, 1); 155 + delay(1000); 156 + 157 + // Set device address to new address 158 + i2cDeviceAddr = newDeviceAddress; 159 + 160 + IQS_Version version; 161 + checkVersion(&version); 162 + if((version.product != 40) 163 + || (version.project != 15) 164 + || (version.major_version != 2) 165 + || (version.minor_version != 2)) 166 + { 167 + // Version check failure 168 + // Looks like the firmware did not actually stick 169 + return -6; 170 + } 171 + 172 + return 0; 173 + } 174 + 175 + void IQS::readTouch() 176 + { 177 + uint8_t maxTouch = 0xFF; 178 + IQS5xx_I2C_Read(i2cDeviceAddr, (uint16_t)MaxTouch_adr, &maxTouch, 1); 179 + x = maxTouch>>4; 180 + y = maxTouch&0x0F; 181 + } 182 + 183 + bool IQS::isTouched(){ 184 + return (x!=15) && (y!=15); 185 + } 186 + 187 + bool IQS::registerWriteWithMask(uint16_t registerAddr, uint8_t value, uint8_t mask){ 188 + uint8_t registerValue; 189 + uint8_t retval; 190 + if ((retval = IQS5xx_I2C_Read(i2cDeviceAddr, (uint16_t)registerAddr, &registerValue, 1)) !=0){ 191 + return false; 192 + } 193 + registerValue &= ~mask; 194 + registerValue |= (value & mask); 195 + if ((retval = IQS5xx_I2C_Write(i2cDeviceAddr, (uint16_t)registerAddr, &registerValue, 1)) !=0){ 196 + return false; 197 + } 198 + return true; 199 + } 200 + 201 + bool IQS::registerWrite(uint16_t registerAddr, const uint8_t* pData, uint8_t length){ 202 + return (IQS5xx_I2C_Write(i2cDeviceAddr, (uint16_t)registerAddr, pData, length) == 0); 203 + } 204 + bool IQS::registerWrite(uint16_t registerAddr, uint8_t byte){ 205 + return (IQS5xx_I2C_Write(i2cDeviceAddr, (uint16_t)registerAddr, &byte, 1) == 0); 206 + } 207 + bool IQS::registerWrite_twoBytesBigEndian(uint16_t registerAddr, uint16_t value){ 208 + uint16_t bigEndian= (value << 8) | ((value >> 8 ) & 0xFF); 209 + return (IQS5xx_I2C_Write(i2cDeviceAddr, (uint16_t)registerAddr, (uint8_t*)&bigEndian, 2) == 0); 210 + } 211 + 212 + bool IQS::registerRead(uint16_t registerAddr, uint8_t* pData, uint8_t length=1){ 213 + if(IQS5xx_I2C_Read(i2cDeviceAddr, (uint16_t)registerAddr, pData, length) !=0){ 214 + return false; 215 + } 216 + } 217 + bool IQS::registerRead_twoBytesBigEndian(uint16_t registerAddr, uint16_t* pValue){ 218 + uint16_t bigEndian=0; 219 + if(IQS5xx_I2C_Read(i2cDeviceAddr, (uint16_t)registerAddr, (uint8_t*)&bigEndian, 2) !=0){ 220 + return false; 221 + } 222 + uint16_t littleEndian = (bigEndian << 8) | ((bigEndian >> 8 ) & 0xFF); 223 + *pValue = littleEndian; 224 + return true; 225 + } 226 + 227 + void IQS::setupComplete(){ 228 + registerWriteWithMask(SystemConfig0_adr, SETUP_COMPLETE, SETUP_COMPLETE); 229 + } 230 + 231 + void IQS::setManualControl(){ 232 + registerWriteWithMask(SystemConfig0_adr, MANUAL_CONTROL, MANUAL_CONTROL); 233 + registerWriteWithMask(SystemControl0_adr, 0x00, 0x07); //Active Mode 234 + } 235 + 236 + void IQS::setTXRXChannelCount(uint8_t tx_count, uint8_t rx_count){ 237 + if((tx_count > 15) || (rx_count > 10)){ 238 + return; 239 + } 240 + registerWrite(TotalTx_adr, tx_count); 241 + registerWrite(TotalRx_adr, rx_count); 242 + } 243 + 244 + // p_txPinMappings should be an array of TX pin numbers. 245 + // count is number of active channels 246 + void IQS::setTXPinMappings(uint8_t* p_txPinMappings, uint8_t count){ 247 + if(count > 15){ 248 + return; 249 + } 250 + registerWrite(TxMapping_adr, p_txPinMappings, count); 251 + registerWrite(TotalTx_adr, count); 252 + } 253 + 254 + // p_rxPinMappings should be an array of RX pin numbers. 255 + // count is number of active channels 256 + void IQS::setRXPinMappings(uint8_t* p_rxPinMappings, uint8_t count){ 257 + if(count > 10){ 258 + return; 259 + } 260 + registerWrite(RxMapping_adr, p_rxPinMappings, count); 261 + registerWrite(TotalRx_adr, count); 262 + } 263 + 264 + void IQS::enableChannel(uint8_t txChannel, uint8_t rxChannel, bool enable){ 265 + if((txChannel >= 15) || (rxChannel >= 10)){ 266 + return; 267 + } 268 + uint16_t registerAddy = ActiveChannels_adr + (txChannel * 2); 269 + uint8_t mask, value; 270 + if(rxChannel >= 8){ 271 + mask = 1 << (rxChannel - 8); 272 + }else{ 273 + registerAddy += 1; 274 + mask = 1 << rxChannel; 275 + } 276 + value = enable ? mask : 0x00; 277 + registerWriteWithMask(registerAddy, value , mask); 278 + } 279 + 280 + void IQS::setChannel_ATI_C_Adjustment(uint8_t txChannel, uint8_t rxChannel, int8_t adjustment){ 281 + if((txChannel >= 15) || (rxChannel >= 10)){ 282 + return; 283 + } 284 + uint16_t registerAddy = ATICAdjust_adr + (txChannel * 10) + rxChannel; 285 + registerWrite(registerAddy, (uint8_t)adjustment); 286 + } 287 + 288 + void IQS::swapXY(bool swap){ 289 + uint8_t value = swap ? SWITCH_XY_AXIS : 0x00; 290 + registerWriteWithMask(XYConfig0_adr, value, SWITCH_XY_AXIS); 291 + } 292 + 293 + void IQS::enablePalmRejection(bool enable){ 294 + uint8_t value = enable ? PALM_REJECT : 0x00; 295 + registerWriteWithMask(XYConfig0_adr, value, PALM_REJECT); 296 + } 297 + 298 + void IQS::setAtiGlobalC(uint8_t global_c){ 299 + registerWrite(GlobalATIC_adr, global_c); 300 + } 301 + void IQS::setAtiTarget(uint16_t target){ 302 + 303 + } 304 + 305 + void IQS::setTouchMultipliers(uint8_t set, uint8_t clear){ 306 + registerWrite(GlobalTouchSet_adr, set); 307 + registerWrite(GlobalTouchClear_adr, clear); 308 + } 309 + 310 + void IQS::rxFloat(bool floatWhenInactive){ 311 + uint8_t value = floatWhenInactive ? RX_FLOAT : 0x00; 312 + registerWriteWithMask(HardwareSettingsA_adr, value, RX_FLOAT); 313 + } 314 + 315 + 316 + //***************************************************************************** 317 + // 318 + //! Acknowledge the reset flag 319 + //! 320 + //! This function simply sets the ACK_RESET bit found in the SYSTEM_CONTROL_0 321 + //! register. By setting this bit the SHOW_RESET flag is cleared in the 322 + //! SYSTEM_INFO_0 register. During normal operation, the SHOW_RESET bit can be 323 + //! monitored and if it becomes set, then an unexpected reset has occurred. 324 + //! If any device configuration is needed, it must then be repeated. 325 + //! 326 + //! \param None 327 + //! 328 + //! \return None 329 + // 330 + //***************************************************************************** 331 + void IQS::acknowledgeReset(){ 332 + registerWriteWithMask(SystemControl0_adr, ACK_RESET, ACK_RESET); 333 + } 334 + 335 + void IQS::runAtiAlgorithm(){ 336 + registerWriteWithMask(SystemControl0_adr, AUTO_ATI, AUTO_ATI); 337 + } 338 + 339 + void IQS::reseed(){ 340 + registerWriteWithMask(SystemControl0_adr, RESEED, RESEED); 341 + } 342 + 343 + bool IQS::atiErrorDetected(){ 344 + static uint8_t System_info_0 = 0; 345 + if(IQS5xx_I2C_Read(i2cDeviceAddr, (uint16_t)SystemInfo0_adr, &System_info_0, 1) != 0){ 346 + return false; 347 + } 348 + return System_info_0 & ATI_ERROR; 349 + } 350 + bool IQS::reAtiOccurred(){ 351 + static uint8_t System_info_0 = 0; 352 + IQS5xx_I2C_Read(i2cDeviceAddr, (uint16_t)SystemInfo0_adr, &System_info_0, 1); 353 + return System_info_0 & REATI_OCCURRED; 354 + } 355 + 356 + void IQS::readTxAtiCompensation(uint8_t txChannel, uint8_t compensations[10]){ 357 + if(txChannel >= 15){ 358 + return; 359 + } 360 + uint16_t registerAddy = ATICompensation_adr + (txChannel * 10); 361 + IQS5xx_I2C_Read(i2cDeviceAddr, (uint16_t)registerAddy, compensations, 10); 362 + } 363 + 364 + 365 + //***************************************************************************** 366 + // 367 + //! Terminate communication window 368 + //! 369 + //! The IQS5xx B000 does not close the communication window on the reception of 370 + //! the STOP bit; therefore this function sends the END COMMUNICATION WINDOW 371 + //! COMMAND (Please see datasheet for more information). RDY will go low after 372 + //! receiving any write to 0xEEEE followed by a STOP. 373 + //! 374 + //! \param None 375 + //! 376 + //! \return None 377 + // 378 + //***************************************************************************** 379 + void IQS::endSession() 380 + { 381 + IQS5xx_I2C_Write(i2cDeviceAddr, (uint16_t)EndWindow_adr, 0, 1); 382 + IQS5xx_delay(1); 383 + } 384 + 385 + //***************************************************************************** 386 + // 387 + //! Read and display version 388 + //! 389 + //! This function reads the version details from the IQS5xx and sends this to 390 + //! the display port. 391 + //! 392 + //! \param None 393 + //! 394 + //! \return None 395 + // 396 + //***************************************************************************** 397 + bool IQS::checkVersion(IQS_Version* pVersion) 398 + { 399 + uint8_t ui8DataBuffer[6]; 400 + // 401 + // Dont wait for RDY here, since the device could be in EventMode, and then 402 + // there will be no communication window to complete this. Rather do a 403 + // forced communication, where clock stretching will be done on the IQS5xx 404 + // until an appropriate time to complete the i2c. 405 + // 406 + uint8_t retval = IQS5xx_I2C_Read(i2cDeviceAddr, (uint16_t)ProductNumber_adr, &ui8DataBuffer[0] ,6); 407 + if(retval != 0){ 408 + IQS5xx_println("Error reading touch controller's version"); 409 + return false; 410 + } 411 + pVersion->product = (ui8DataBuffer[0]<<8) + ui8DataBuffer[1]; 412 + pVersion->project = (ui8DataBuffer[2]<<8) + ui8DataBuffer[3]; 413 + pVersion->major_version = ui8DataBuffer[4]; 414 + pVersion->minor_version = ui8DataBuffer[5]; 415 + return true; 416 + }
+394
firmware/libraries/IQS5xx/IQS5xx.h
··· 1 + //***************************************************************************** 2 + // 3 + //! The memory map registers, and bit definitions are defined in this header 4 + //! file. The access writes of the memory map are also indicated as follows: 5 + //! (READ) : Read only 6 + //! (READ/WRITE) : Read & Write 7 + //! (READ/WRITE/E2) : Read, Write & default loaded from non-volatile memory 8 + // 9 + //***************************************************************************** 10 + 11 + #ifndef __IQS5XX_H 12 + #define __IQS5XX_H 13 + 14 + 15 + //***************************************************************************** 16 + // 17 + //! ---------------------- IQS5xx-B000 BIT DEFINITIONS ----------------- 18 + // 19 + //***************************************************************************** 20 + 21 + // 22 + //! GestureEvents0 bit definitions 23 + // 24 + #define SWIPE_Y_NEG 0x20 25 + #define SWIPE_Y_POS 0x10 26 + #define SWIPE_X_POS 0x08 27 + #define SWIPE_X_NEG 0x04 28 + #define TAP_AND_HOLD 0x02 29 + #define SINGLE_TAP 0x01 30 + // 31 + //! GesturesEvents1 bit definitions 32 + // 33 + #define ZOOM 0x04 34 + #define SCROLL 0x02 35 + #define TWO_FINGER_TAP 0x01 36 + // 37 + //! SystemInfo0 bit definitions 38 + // 39 + #define SHOW_RESET 0x80 40 + #define ALP_REATI_OCCURRED 0x40 41 + #define ALP_ATI_ERROR 0x20 42 + #define REATI_OCCURRED 0x10 43 + #define ATI_ERROR 0x08 44 + #define CHARGING_MODE_2 0x04 45 + #define CHARGING_MODE_1 0x02 46 + #define CHARGING_MODE_0 0x01 47 + // 48 + //! SystemInfo1 bit definitions 49 + // 50 + #define SNAP_TOGGLE 0x10 51 + #define RR_MISSED 0x08 52 + #define TOO_MANY_FINGERS 0x04 53 + #define PALM_DETECT 0x02 54 + #define TP_MOVEMENT 0x01 55 + // 56 + //! SystemControl0 bit definitions 57 + // 58 + #define ACK_RESET 0x80 59 + #define AUTO_ATI 0x20 60 + #define ALP_RESEED 0x10 61 + #define RESEED 0x08 62 + #define MODE_SELECT_2 0x04 63 + #define MODE_SELECT_1 0x02 64 + #define MODE_SELECT_0 0x01 65 + // 66 + //! SystemControl1 bit definitions 67 + // 68 + #define RESET 0x02 69 + #define SUSPEND 0x01 70 + // 71 + //! SystemConfig0 bit definitions 72 + // 73 + #define MANUAL_CONTROL 0x80 74 + #define SETUP_COMPLETE 0x40 75 + #define WDT_ENABLE 0x20 76 + #define ALP_REATI 0x08 77 + #define REATI 0x04 78 + #define IO_WAKEUP_SELECT 0x02 79 + #define IO_WAKE 0x01 80 + // 81 + //! SystemConfig1 bit definitions 82 + // 83 + #define PROX_EVENT 0x80 84 + #define TOUCH_EVENT 0x40 85 + #define SNAP_EVENT 0x20 86 + #define ALP_PROX_EVENT 0x10 87 + #define REATI_EVENT 0x08 88 + #define TP_EVENT 0x04 89 + #define GESTURE_EVENT 0x02 90 + #define EVENT_MODE 0x01 91 + // 92 + //! FilterSettings0 bit definitions 93 + // 94 + #define ALP_COUNT_FILTER 0x08 95 + #define IIR_SELECT 0x04 96 + #define MAV_FILTER 0x02 97 + #define IIR_FILTER 0x01 98 + // 99 + //! ALPChannelSetup0 bit definitions 100 + // 101 + #define CHARGE_TYPE 0x80 102 + #define RX_GROUP 0x40 103 + #define PROX_REV 0x20 104 + #define ALP_ENABLE 0x10 105 + // 106 + //! IQS525RxToTx bit definitions 107 + // 108 + #define RX7_TX2 0x80 109 + #define RX6_TX3 0x40 110 + #define RX5_TX4 0x20 111 + #define RX4_TX5 0x10 112 + #define RX3_TX6 0x08 113 + #define RX2_TX7 0x04 114 + #define RX1_TX8 0x02 115 + #define RX0_TX9 0x01 116 + // 117 + //! HardwareSettingsA bit definitions 118 + // 119 + #define ND_ENABLE 0x20 120 + #define RX_FLOAT 0x04 121 + // 122 + //! HardwareSettingsB bit definitions 123 + // 124 + #define CK_FREQ_2 0x40 125 + #define CK_FREQ_1 0x20 126 + #define CK_FREQ_0 0x10 127 + #define ANA_DEAD_TIME 0x02 128 + #define INCR_PHASE 0x01 129 + // 130 + //! HardwareSettingsC bit definitions 131 + // 132 + #define STAB_TIME_1 0x80 133 + #define STAB_TIME_0 0x40 134 + #define OPAMP_BIAS_1 0x20 135 + #define OPAMP_BIAS_0 0x10 136 + #define VTRIP_3 0x08 137 + #define VTRIP_2 0x04 138 + #define VTRIP_1 0x02 139 + #define VTRIP_0 0x01 140 + // 141 + //! HardwareSettingsD bit definitions 142 + // 143 + #define UPLEN_2 0x40 144 + #define UPLEN_1 0x20 145 + #define UPLEN_0 0x10 146 + #define PASSLEN_2 0x04 147 + #define PASSLEN_1 0x02 148 + #define PASSLEN_0 0x01 149 + // 150 + //! XYConfig0 bit definitions 151 + // 152 + #define PALM_REJECT 0x08 153 + #define SWITCH_XY_AXIS 0x04 154 + #define FLIP_Y 0x02 155 + #define FLIP_X 0x01 156 + // 157 + //! SFGestureEnable bit definitions 158 + // 159 + #define SWIPE_Y_MINUS_EN 0x20 160 + #define SWIPE_Y_PLUS_EN 0x10 161 + #define SWIPE_X_PLUS_EN 0x08 162 + #define SWIPE_X_MINUS_EN 0x04 163 + #define TAP_AND_HOLD_EN 0x02 164 + #define SINGLE_TAP_EN 0x01 165 + // 166 + //! MFGestureEnable bit definitions 167 + // 168 + #define ZOOM_EN 0x04 169 + #define SCROLL_EN 0x02 170 + #define TWO_FINGER_TAP_EN 0x01 171 + 172 + //***************************************************************************** 173 + // 174 + //! ------------------ IQS5xx-B00 MEMORY MAP REGISTERS ------------------ 175 + // 176 + //***************************************************************************** 177 + 178 + /******************** DEVICE INFO REGISTERS ***************************/ 179 + #define ProductNumber_adr 0x0000 //(READ) //2 BYTES; 180 + #define ProjectNumber_adr 0x0002 //(READ) //2 BYTES; 181 + #define MajorVersion_adr 0x0004 //(READ) 182 + #define MinorVersion_adr 0x0005 //(READ) 183 + #define BLStatus_adr 0x0006 //(READ) 184 + /******************** ************************* ***************************/ 185 + #define MaxTouch_adr 0x000B //(READ) 186 + #define PrevCycleTime_adr 0x000C //(READ) 187 + /******************** GESTURES AND EVENT STATUS REGISTERS ***************************/ 188 + #define GestureEvents0_adr 0x000D //(READ) 189 + #define GestureEvents1_adr 0x000E //(READ) 190 + #define SystemInfo0_adr 0x000F //(READ) 191 + #define SystemInfo1_adr 0x0010 //(READ) 192 + /******************** XY DATA REGISTERS ***************************/ 193 + #define NoOfFingers_adr 0x0011 //(READ) 194 + #define RelativeX_adr 0x0012 //(READ) //2 BYTES; 195 + #define RelativeY_adr 0x0014 //(READ) //2 BYTES; 196 + /******************** INDIVIDUAL FINGER DATA ***************************/ 197 + #define AbsoluteX_adr 0x0016 //(READ) 2 BYTES //ADD 0x0007 FOR FINGER 2; 0x000E FOR FINGER 3; 0x0015 FOR FINGER 4 AND 0x001C FOR FINGER 5 198 + #define AbsoluteY_adr 0x0018 //(READ) 2 BYTES //ADD 0x0007 FOR FINGER 2; 0x000E FOR FINGER 3; 0x0015 FOR FINGER 4 AND 0x001C FOR FINGER 5 199 + #define TouchStrength_adr 0x001A //(READ) 2 BYTES //ADD 0x0007 FOR FINGER 2; 0x000E FOR FINGER 3; 0x0015 FOR FINGER 4 AND 0x001C FOR FINGER 5 200 + #define Area_adr 0x001C //(READ) //ADD 0x0007 FOR FINGER 2; 0x000E FOR FINGER 3; 0x0015 FOR FINGER 4 AND 0x001C FOR FINGER 5 201 + /******************** CHANNEL STATUS REGISTERS ***************************/ 202 + #define ProxStatus_adr 0x0039 //(READ) //32 BYTES; 203 + #define TouchStatus_adr 0x0059 //(READ) //30 BYTES; 204 + #define SnapStatus_adr 0x0077 //(READ) //30 BYTES; 205 + /******************** DATA STREAMING REGISTERS ***************************/ 206 + #define Counts_adr 0x0095 //(READ) //300 BYTES; 207 + #define Delta_adr 0x01C1 //(READ) //300 BYTES; 208 + #define ALPCount_adr 0x02ED //(READ) //2 BYTES; 209 + #define ALPIndivCounts_adr 0x02EF //(READ) //20 BYTES; 210 + #define References_adr 0x0303 //(READ/WRITE) //300 BYTES; 211 + #define ALPLTA_adr 0x042F //(READ/WRITE) //2 BYTES; 212 + /******************** SYSTEM CONTROL REGISTERS ***************************/ 213 + #define SystemControl0_adr 0x0431 //(READ/WRITE) 214 + #define SystemControl1_adr 0x0432 //(READ/WRITE) 215 + /******************** ATI SETTINGS REGISTERS ***************************/ 216 + #define ALPATIComp_adr 0x0435 //(READ/WRITE) //10 BYTES; 217 + #define ATICompensation_adr 0x043F //(READ/WRITE) //150 BYTES; 218 + #define ATICAdjust_adr 0x04D5 //(READ/WRITE/E2) //150 BYTES; 219 + #define GlobalATIC_adr 0x056B //(READ/WRITE/E2) 220 + #define ALPATIC_adr 0x056C //(READ/WRITE/E2) 221 + #define ATITarget_adr 0x056D //(READ/WRITE/E2) //2 BYTES; 222 + #define ALPATITarget_adr 0x056F //(READ/WRITE/E2) //2 BYTES; 223 + #define RefDriftLimit_adr 0x0571 //(READ/WRITE/E2) 224 + #define ALPLTADriftLimit_adr 0x0572 //(READ/WRITE/E2) 225 + #define ReATILowerLimit_adr 0x0573 //(READ/WRITE/E2) 226 + #define ReATIUpperLimit_adr 0x0574 //(READ/WRITE/E2) 227 + #define MaxCountLimit_adr 0x0575 //(READ/WRITE/E2) //2 BYTES; 228 + #define ReATIRetryTime_adr 0x0577 //(READ/WRITE/E2) 229 + /******************** TIMING SETTINGS REGISTERS ***************************/ 230 + #define ActiveRR_adr 0x057A //(READ/WRITE/E2) //2 BYTES; 231 + #define IdleTouchRR_adr 0x057C //(READ/WRITE/E2) //2 BYTES; 232 + #define IdleRR_adr 0x057E //(READ/WRITE/E2) //2 BYTES; 233 + #define LP1RR_adr 0x0580 //(READ/WRITE/E2) //2 BYTES; 234 + #define LP2RR_adr 0x0582 //(READ/WRITE/E2) //2 BYTES; 235 + #define ActiveTimeout_adr 0x0584 //(READ/WRITE/E2) 236 + #define IdleTouchTimeout_adr 0x0585 //(READ/WRITE/E2) 237 + #define IdleTimeout_adr 0x0586 //(READ/WRITE/E2) 238 + #define LP1Timeout_adr 0x0587 //(READ/WRITE/E2) 239 + #define RefUpdateTime_adr 0x0588 //(READ/WRITE/E2) 240 + #define SnapTimeout_adr 0x0589 //(READ/WRITE/E2) 241 + #define I2CTimeout_adr 0x058A //(READ/WRITE/E2) 242 + /******************** SYSTEM CONFIG REGISTERS ***************************/ 243 + #define SystemConfig0_adr 0x058E //(READ/WRITE/E2) 244 + #define SystemConfig1_adr 0x058F //(READ/WRITE/E2) 245 + /******************** THRESHOLD SETTINGS REGISTERS ***************************/ 246 + #define SnapThreshold_adr 0x0592 //(READ/WRITE/E2) //2 BYTES; 247 + #define ProxThreshold_adr 0x0594 //(READ/WRITE/E2) 248 + #define ALPProxThreshold_adr 0x0595 //(READ/WRITE/E2) 249 + #define GlobalTouchSet_adr 0x0596 //(READ/WRITE/E2) 250 + #define GlobalTouchClear_adr 0x0597 //(READ/WRITE/E2) 251 + #define IndivTouchAdjust_adr 0x0598 //(READ/WRITE/E2) //150 BYTES; 252 + /******************** FILTER SETTINGS REGISTERS ***************************/ 253 + #define FilterSettings0_adr 0x0632 //(READ/WRITE/E2) 254 + #define XYStaticBeta_adr 0x0633 //(READ/WRITE/E2) 255 + #define ALPCountBeta_adr 0x0634 //(READ/WRITE/E2) 256 + #define ALP1LTABeta_adr 0x0635 //(READ/WRITE/E2) 257 + #define ALP2LTABeta_adr 0x0636 //(READ/WRITE/E2) 258 + #define DynamicBottomBeta_adr 0x0637 //(READ/WRITE/E2) 259 + #define DynamicLowerSpeed_adr 0x0638 //(READ/WRITE/E2) 260 + #define DynamicUpperSpeed_adr 0x0639 //(READ/WRITE/E2) //2 BYTES; 261 + /******************** CHANNEL SET UP (RX-TX MAPPING) REGISTERS ***************************/ 262 + #define TotalRx_adr 0x063D //(READ/WRITE/E2) 263 + #define TotalTx_adr 0x063E //(READ/WRITE/E2) 264 + #define RxMapping_adr 0x063F //(READ/WRITE/E2) //10 BYTES; 265 + #define TxMapping_adr 0x0649 //(READ/WRITE/E2) //15 BYTES; 266 + #define ALPChannelSetup0_adr 0x0658 //(READ/WRITE/E2) 267 + #define ALPRxSelect_adr 0x0659 //(READ/WRITE/E2) //2 BYTES; 268 + #define ALPTxSelect_adr 0x065B //(READ/WRITE/E2) //2 BYTES; 269 + #define IQS525RxToTx_adr 0x065D //(READ/WRITE/E2) 270 + /******************** HARDWARE SETTINGS REGISTERS ***************************/ 271 + #define HardwareSettingsA_adr 0x065F //(READ/WRITE/E2) 272 + #define HardwareSettingsB1_adr 0x0660 //(READ/WRITE/E2) 273 + #define HardwareSettingsB2_adr 0x0661 //(READ/WRITE/E2) 274 + #define HardwareSettingsC1_adr 0x0662 //(READ/WRITE/E2) 275 + #define HardwareSettingsC2_adr 0x0663 //(READ/WRITE/E2) 276 + #define HardwareSettingsD1_adr 0x0664 //(READ/WRITE/E2) 277 + #define HardwareSettingsD2_adr 0x0665 //(READ/WRITE/E2) 278 + /******************** XY CONFIG REGISTERS ***************************/ 279 + #define XYConfig0_adr 0x0669 //(READ/WRITE/E2) 280 + #define MaxMultitouches_adr 0x066A //(READ/WRITE/E2) 281 + #define FingerSplitFactor_adr 0x066B //(READ/WRITE/E2) 282 + #define PalmRejectThreshold_adr 0x066C //(READ/WRITE/E2) 283 + #define PalmRejectTimeout_adr 0x066D //(READ/WRITE/E2) 284 + #define XResolution_adr 0x066E //(READ/WRITE/E2) //2 BYTES; 285 + #define YResolution_adr 0x0670 //(READ/WRITE/E2) //2 BYTES; 286 + #define StationaryTouchThr_adr 0x0672 //(READ/WRITE/E2) 287 + /*********************************************************************/ 288 + #define DefaultReadAdr_adr 0x0675 //(READ/WRITE/E2) 289 + /******************** DEBOUNCE SETTING REGISTERS ***************************/ 290 + #define ProxDb_adr 0x0679 //(READ/WRITE/E2) 291 + #define TouchSnapDb_adr 0x067A //(READ/WRITE/E2) 292 + /******************** CHANNEL CONFIG REGISTERS ***************************/ 293 + #define ActiveChannels_adr 0x067B //(READ/WRITE/E2) //30 BYTES; 294 + #define SnapChannels_adr 0x0699 //(READ/WRITE/E2) //30 BYTES; 295 + /******************** GESTURE SETTING REGISTERS ***************************/ 296 + #define SFGestureEnable_adr 0x06B7 //(READ/WRITE/E2) 297 + #define MFGestureEnable_adr 0x06B8 //(READ/WRITE/E2) 298 + #define TapTime_adr 0x06B9 //(READ/WRITE/E2) //2 BYTES; 299 + #define TapDistance_adr 0x06BB //(READ/WRITE/E2) //2 BYTES; 300 + #define HoldTime_adr 0x06BD //(READ/WRITE/E2) //2 BYTES; 301 + #define SwipeInitTime_adr 0x06BF //(READ/WRITE/E2) //2 BYTES; 302 + #define SwipeInitDistance_adr 0x06C1 //(READ/WRITE/E2) //2 BYTES; 303 + #define SwipeConsTime_adr 0x06C2 //(READ/WRITE/E2) //2 BYTES; 304 + #define SwipeConsDistance_adr 0x06C5 //(READ/WRITE/E2) //2 BYTES; 305 + #define SwipeAngle_adr 0x06C7 //(READ/WRITE/E2) 306 + #define ScrollInitDistance_adr 0x06C8 //(READ/WRITE/E2) //2 BYTES; 307 + #define ScrollAngle_adr 0x06CA //(READ/WRITE/E2) 308 + #define ZoomInitDistance_adr 0x06CB //(READ/WRITE/E2) //2 BYTES; 309 + #define ZoomConsDistance_adr 0x06CD //(READ/WRITE/E2) //2 BYTES; 310 + 311 + 312 + 313 + #define EndWindow_adr 0xEEEE 314 + 315 + #define BL_SUPPORTED_VERSION 0x0200 316 + #define BL_CHECKSUM_START_ADDR 0x83C0 317 + #define BL_APP_START_ADDR 0x8400 318 + #define BL_APP_NV_SETTINGS_START_ADDR 0xBE00 319 + #define BL_BLOCK_SIZE_BYTES 64 320 + #define BL_ADDR(addr) (addr^0x40) 321 + #define BL_CMD_VERSION (uint8_t)0x00 322 + #define BL_CMD_READ (uint8_t)0x01 323 + #define BL_CMD_EXIT (uint8_t)0x02 324 + #define BL_CMD_CRCCHECK (uint8_t)0x03 325 + 326 + #include <stdint.h> 327 + 328 + typedef struct { 329 + uint16_t product; 330 + uint16_t project; 331 + uint8_t major_version; 332 + uint8_t minor_version; 333 + } IQS_Version; 334 + 335 + 336 + class IQS 337 + { 338 + public: 339 + uint8_t x; 340 + uint8_t y; 341 + uint8_t i2cDeviceAddr; 342 + uint8_t ready_pin; 343 + uint8_t reset_pin; 344 + 345 + IQS(); 346 + IQS(uint8_t address, uint8_t readyPin, uint8_t resetPin); 347 + void initialize(); 348 + void holdReset(bool held); 349 + bool isReady(); 350 + void endSession(); 351 + void acknowledgeReset(); 352 + bool checkVersion(IQS_Version* pVersion); 353 + 354 + // Firmware programming 355 + int8_t programFirmware(uint8_t newDeviceAddress); 356 + 357 + // ATI 358 + void reseed(); 359 + void runAtiAlgorithm(); 360 + bool atiErrorDetected(); 361 + bool reAtiOccurred(); 362 + void readTxAtiCompensation(uint8_t txChannel, uint8_t compensations[10]); 363 + 364 + //Reading touches 365 + void readTouch(); 366 + bool isTouched(); 367 + 368 + // Settings 369 + void setupComplete(); 370 + void setManualControl(); 371 + void setTXRXChannelCount(uint8_t tx_count, uint8_t rx_count); 372 + void setTXPinMappings(uint8_t* p_txPinMappings, uint8_t count); 373 + void setRXPinMappings(uint8_t* p_rxPinMappings, uint8_t count); 374 + void enableChannel(uint8_t txChannel, uint8_t rxChannel, bool enable); 375 + void setChannel_ATI_C_Adjustment(uint8_t txChannel, uint8_t rxChannel, int8_t adjustment); 376 + void swapXY(bool swap); 377 + void enablePalmRejection(bool enable); 378 + void setAtiTarget(uint16_t target); 379 + void setAtiGlobalC(uint8_t global_c); 380 + void setTouchMultipliers(uint8_t set, uint8_t clear); 381 + void rxFloat(bool floatWhenInactive); 382 + 383 + // Low-level control 384 + bool registerWrite(uint16_t registerAddr, uint8_t byte); 385 + bool registerWrite(uint16_t registerAddr, const uint8_t* pData, uint8_t length); 386 + bool registerWriteWithMask(uint16_t registerAddr, uint8_t value, uint8_t mask); 387 + bool registerWrite_twoBytesBigEndian(uint16_t registerAddr, uint16_t value); 388 + bool registerRead(uint16_t registerAddr, uint8_t* pData, uint8_t length=1); 389 + bool registerRead_twoBytesBigEndian(uint16_t registerAddr, uint16_t* pValue); 390 + 391 + }; 392 + 393 + 394 + #endif
+113
firmware/libraries/IQS5xx/IQS5xx_hal.cpp
··· 1 + #include "IQS5xx_hal.h" 2 + #include <Arduino.h> 3 + #include <inttypes.h> 4 + #include <Wire_BigBuffer.h> 5 + 6 + static bool i2c_Initialized = false; 7 + 8 + void IQS5xx_I2C_Setup(void) 9 + { 10 + if(i2c_Initialized){ 11 + return; 12 + } 13 + Wire.begin(); 14 + Wire.setClock(400000); 15 + i2c_Initialized = true; 16 + } 17 + 18 + 19 + uint8_t IQS5xx_I2C_Write_Read(uint8_t deviceAddr, const uint8_t * iaddrData, uint8_t iaddrLength, const uint8_t * writeData, uint8_t writeLength, uint8_t *pReadData, uint8_t readLength) 20 + { 21 + bool retval = 0; 22 + uint8_t *pData_iterator = pReadData; 23 + Wire.beginTransmission(deviceAddr); 24 + if(Wire.write(iaddrData, (unsigned int)iaddrLength) != iaddrLength 25 + || Wire.write(writeData, (unsigned int)writeLength) != writeLength){ 26 + Wire.endTransmission(true); 27 + IQS5xx_print("I2C read error\tDevice Address: 0x"); 28 + IQS5xx_print(deviceAddr,16); 29 + IQS5xx_print("\tError Code: "); 30 + IQS5xx_print(4); 31 + IQS5xx_print("\tLine# "); 32 + IQS5xx_println(__LINE__); 33 + return 4; 34 + } 35 + if((retval = Wire.endTransmission(false)) != 0){ 36 + Wire.endTransmission(true); 37 + IQS5xx_print("I2C read error.\tDevice Address: 0x"); 38 + IQS5xx_print(deviceAddr,16); 39 + IQS5xx_print("\tError Code: "); 40 + IQS5xx_print(retval); 41 + IQS5xx_print("\tLine# "); 42 + IQS5xx_println(__LINE__); 43 + return retval; 44 + } 45 + if(readLength != 0 && pReadData!=NULL){ 46 + Wire.requestFrom(deviceAddr, readLength, (uint8_t)true); 47 + while(Wire.available() && (pData_iterator < (pReadData + readLength))){ 48 + *pData_iterator = Wire.read(); 49 + pData_iterator++; 50 + } 51 + if(pData_iterator != (pReadData + readLength)){ 52 + IQS5xx_print("I2C read error.\tDevice Address: 0x"); 53 + IQS5xx_print(deviceAddr,16); 54 + IQS5xx_print("\tError Code: "); 55 + IQS5xx_print(4); 56 + IQS5xx_print("\tLine# "); 57 + IQS5xx_print(__LINE__); 58 + IQS5xx_print("\tBytes RX'ed: "); 59 + IQS5xx_print(pData_iterator - pReadData); 60 + IQS5xx_print("/"); 61 + IQS5xx_println(readLength); 62 + return 4; // Didn't receive enough bytes 63 + } 64 + }else{ 65 + if((retval = Wire.endTransmission(true)) != 0){ 66 + IQS5xx_print("I2C write error\tDevice Address: 0x"); 67 + IQS5xx_print(deviceAddr,16); 68 + IQS5xx_print("\tError Code: "); 69 + IQS5xx_print(4); 70 + IQS5xx_print("\tLine# "); 71 + IQS5xx_println(__LINE__); 72 + return 4; 73 + } 74 + } 75 + return 0; 76 + } 77 + 78 + uint8_t IQS5xx_I2C_Write(uint8_t deviceAddr, uint8_t registerAddr, const uint8_t* pData, uint8_t length) 79 + { 80 + return IQS5xx_I2C_Write_Read(deviceAddr, &registerAddr, sizeof(registerAddr), pData, length, NULL, 0); 81 + } 82 + 83 + uint8_t IQS5xx_I2C_Write(uint8_t deviceAddr, uint16_t registerAddr, const uint8_t* pData, uint8_t length) 84 + { 85 + uint16_t registerAddr_bigEndian = (registerAddr << 8) | ((registerAddr >> 8 ) & 0xFF); 86 + return IQS5xx_I2C_Write_Read(deviceAddr, (uint8_t*)&registerAddr_bigEndian, sizeof(registerAddr_bigEndian), pData, length, NULL, 0); 87 + } 88 + 89 + uint8_t IQS5xx_I2C_Read(uint8_t deviceAddr, uint8_t registerAddr, uint8_t *pData, uint8_t length) 90 + { 91 + return IQS5xx_I2C_Write_Read(deviceAddr, &registerAddr, 1, NULL, 0, pData, length); 92 + } 93 + 94 + uint8_t IQS5xx_I2C_Read(uint8_t deviceAddr, uint16_t registerAddr, uint8_t *pData, uint8_t length) 95 + { 96 + uint16_t registerAddr_bigEndian = (registerAddr << 8) | ((registerAddr >> 8 ) & 0xFF); 97 + return IQS5xx_I2C_Write_Read(deviceAddr, (uint8_t*)&registerAddr_bigEndian, 2, NULL, 0, pData, length); 98 + } 99 + 100 + void IQS5xx_ReadySignal_Init(uint8_t readyPin){ 101 + pinMode(readyPin, INPUT); 102 + } 103 + 104 + bool IQS5xx_ReadySignal(uint8_t readyPin){ 105 + return digitalRead(readyPin) == HIGH; 106 + } 107 + 108 + void IQS5xx_ResetSignal_Init(uint8_t resetPin){ 109 + pinMode(resetPin, OUTPUT); 110 + } 111 + void IQS5xx_ResetSet(uint8_t resetPin, uint8_t state){ 112 + digitalWrite(resetPin, state); 113 + }
+27
firmware/libraries/IQS5xx/IQS5xx_hal.h
··· 1 + #ifndef IQS5XX_HAL_h 2 + #define IQS5XX_HAL_h 3 + #include <stdint.h> 4 + #include <Arduino.h> 5 + 6 + #if defined(IQS5xx_LOGGING) && IQS5xx_LOGGING 7 + #define IQS5xx_print(...) Serial.print(__VA_ARGS__) 8 + #define IQS5xx_println(...) Serial.println(__VA_ARGS__) 9 + #else 10 + #define IQS5xx_print(...) 11 + #define IQS5xx_println(...) 12 + #endif 13 + 14 + #define IQS5xx_delay(ms) delay(ms) 15 + 16 + void IQS5xx_I2C_Setup(); 17 + uint8_t IQS5xx_I2C_Write_Read(uint8_t deviceAddr, const uint8_t * iaddrData, uint8_t iaddrLength, const uint8_t * writeData, uint8_t writeLength, uint8_t *pReadData, uint8_t readLength); 18 + uint8_t IQS5xx_I2C_Write(uint8_t deviceAddr, uint8_t registerAddr, const uint8_t* pData, uint8_t length); 19 + uint8_t IQS5xx_I2C_Write(uint8_t deviceAddr, uint16_t registerAddr, const uint8_t* pData, uint8_t length); 20 + uint8_t IQS5xx_I2C_Read(uint8_t deviceAddr, uint8_t registerAddr, uint8_t *pData, uint8_t length); 21 + uint8_t IQS5xx_I2C_Read(uint8_t deviceAddr, uint16_t registerAddr, uint8_t *pData, uint8_t length); 22 + void IQS5xx_ReadySignal_Init(uint8_t readyPin); 23 + bool IQS5xx_ReadySignal(uint8_t readyPin); 24 + void IQS5xx_ResetSignal_Init(uint8_t resetPin); 25 + void IQS5xx_ResetSet(uint8_t resetPin, uint8_t state); 26 + 27 + #endif // IQS5XX_HAL_h
+330
firmware/libraries/Wire_BigBuffer/Wire_BigBuffer.cpp
··· 1 + /* 2 + TwoWire.cpp - TWI/I2C library for Wiring & Arduino 3 + Copyright (c) 2006 Nicholas Zambetti. All right reserved. 4 + 5 + This library is free software; you can redistribute it and/or 6 + modify it under the terms of the GNU Lesser General Public 7 + License as published by the Free Software Foundation; either 8 + version 2.1 of the License, or (at your option) any later version. 9 + 10 + This library is distributed in the hope that it will be useful, 11 + but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 + Lesser General Public License for more details. 14 + 15 + You should have received a copy of the GNU Lesser General Public 16 + License along with this library; if not, write to the Free Software 17 + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 + 19 + Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts 20 + */ 21 + 22 + extern "C" { 23 + #include <stdlib.h> 24 + #include <string.h> 25 + #include <inttypes.h> 26 + #include "utility/twi.h" 27 + } 28 + 29 + #include "Wire_BigBuffer.h" 30 + 31 + // Initialize Class Variables ////////////////////////////////////////////////// 32 + 33 + uint8_t TwoWire::rxBuffer[BUFFER_LENGTH]; 34 + uint8_t TwoWire::rxBufferIndex = 0; 35 + uint8_t TwoWire::rxBufferLength = 0; 36 + 37 + uint8_t TwoWire::txAddress = 0; 38 + uint8_t TwoWire::txBuffer[BUFFER_LENGTH]; 39 + uint8_t TwoWire::txBufferIndex = 0; 40 + uint8_t TwoWire::txBufferLength = 0; 41 + 42 + uint8_t TwoWire::transmitting = 0; 43 + void (*TwoWire::user_onRequest)(void); 44 + void (*TwoWire::user_onReceive)(int); 45 + 46 + // Constructors //////////////////////////////////////////////////////////////// 47 + 48 + TwoWire::TwoWire() 49 + { 50 + } 51 + 52 + // Public Methods ////////////////////////////////////////////////////////////// 53 + 54 + void TwoWire::begin(void) 55 + { 56 + rxBufferIndex = 0; 57 + rxBufferLength = 0; 58 + 59 + txBufferIndex = 0; 60 + txBufferLength = 0; 61 + 62 + twi_init(); 63 + } 64 + 65 + void TwoWire::begin(uint8_t address) 66 + { 67 + twi_setAddress(address); 68 + twi_attachSlaveTxEvent(onRequestService); 69 + twi_attachSlaveRxEvent(onReceiveService); 70 + begin(); 71 + } 72 + 73 + void TwoWire::begin(int address) 74 + { 75 + begin((uint8_t)address); 76 + } 77 + 78 + void TwoWire::end(void) 79 + { 80 + twi_disable(); 81 + } 82 + 83 + void TwoWire::setClock(uint32_t clock) 84 + { 85 + twi_setFrequency(clock); 86 + } 87 + 88 + uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint32_t iaddress, uint8_t isize, uint8_t sendStop) 89 + { 90 + if (isize > 0) { 91 + // send internal address; this mode allows sending a repeated start to access 92 + // some devices' internal registers. This function is executed by the hardware 93 + // TWI module on other processors (for example Due's TWI_IADR and TWI_MMR registers) 94 + 95 + beginTransmission(address); 96 + 97 + // the maximum size of internal address is 3 bytes 98 + if (isize > 3){ 99 + isize = 3; 100 + } 101 + 102 + // write internal register address - most significant byte first 103 + while (isize-- > 0) 104 + write((uint8_t)(iaddress >> (isize*8))); 105 + endTransmission(false); 106 + } 107 + 108 + // clamp to buffer length 109 + if(quantity > BUFFER_LENGTH){ 110 + quantity = BUFFER_LENGTH; 111 + } 112 + // perform blocking read into buffer 113 + uint8_t read = twi_readFrom(address, rxBuffer, quantity, sendStop); 114 + // set rx buffer iterator vars 115 + rxBufferIndex = 0; 116 + rxBufferLength = read; 117 + 118 + return read; 119 + } 120 + 121 + uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop) { 122 + return requestFrom((uint8_t)address, (uint8_t)quantity, (uint32_t)0, (uint8_t)0, (uint8_t)sendStop); 123 + } 124 + 125 + uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity) 126 + { 127 + return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)true); 128 + } 129 + 130 + uint8_t TwoWire::requestFrom(int address, int quantity) 131 + { 132 + return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)true); 133 + } 134 + 135 + uint8_t TwoWire::requestFrom(int address, int quantity, int sendStop) 136 + { 137 + return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)sendStop); 138 + } 139 + 140 + void TwoWire::beginTransmission(uint8_t address) 141 + { 142 + // indicate that we are transmitting 143 + transmitting = 1; 144 + // set address of targeted slave 145 + txAddress = address; 146 + // reset tx buffer iterator vars 147 + txBufferIndex = 0; 148 + txBufferLength = 0; 149 + } 150 + 151 + void TwoWire::beginTransmission(int address) 152 + { 153 + beginTransmission((uint8_t)address); 154 + } 155 + 156 + // 157 + // Originally, 'endTransmission' was an f(void) function. 158 + // It has been modified to take one parameter indicating 159 + // whether or not a STOP should be performed on the bus. 160 + // Calling endTransmission(false) allows a sketch to 161 + // perform a repeated start. 162 + // 163 + // WARNING: Nothing in the library keeps track of whether 164 + // the bus tenure has been properly ended with a STOP. It 165 + // is very possible to leave the bus in a hung state if 166 + // no call to endTransmission(true) is made. Some I2C 167 + // devices will behave oddly if they do not see a STOP. 168 + // 169 + uint8_t TwoWire::endTransmission(uint8_t sendStop) 170 + { 171 + // transmit buffer (blocking) 172 + uint8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, 1, sendStop); 173 + // reset tx buffer iterator vars 174 + txBufferIndex = 0; 175 + txBufferLength = 0; 176 + // indicate that we are done transmitting 177 + transmitting = 0; 178 + return ret; 179 + } 180 + 181 + // This provides backwards compatibility with the original 182 + // definition, and expected behaviour, of endTransmission 183 + // 184 + uint8_t TwoWire::endTransmission(void) 185 + { 186 + return endTransmission(true); 187 + } 188 + 189 + // must be called in: 190 + // slave tx event callback 191 + // or after beginTransmission(address) 192 + size_t TwoWire::write(uint8_t data) 193 + { 194 + if(transmitting){ 195 + // in master transmitter mode 196 + // don't bother if buffer is full 197 + if(txBufferLength >= BUFFER_LENGTH){ 198 + setWriteError(); 199 + return 0; 200 + } 201 + // put byte in tx buffer 202 + txBuffer[txBufferIndex] = data; 203 + ++txBufferIndex; 204 + // update amount in buffer 205 + txBufferLength = txBufferIndex; 206 + }else{ 207 + // in slave send mode 208 + // reply to master 209 + twi_transmit(&data, 1); 210 + } 211 + return 1; 212 + } 213 + 214 + // must be called in: 215 + // slave tx event callback 216 + // or after beginTransmission(address) 217 + size_t TwoWire::write(const uint8_t *data, size_t quantity) 218 + { 219 + uint8_t qtyTransmitted = 0; 220 + if(transmitting){ 221 + // in master transmitter mode 222 + for(size_t i = 0; i < quantity; ++i){ 223 + qtyTransmitted += write(data[i]); 224 + } 225 + }else{ 226 + // in slave send mode 227 + // reply to master 228 + twi_transmit(data, quantity); 229 + } 230 + return qtyTransmitted; 231 + } 232 + 233 + // must be called in: 234 + // slave rx event callback 235 + // or after requestFrom(address, numBytes) 236 + int TwoWire::available(void) 237 + { 238 + return rxBufferLength - rxBufferIndex; 239 + } 240 + 241 + // must be called in: 242 + // slave rx event callback 243 + // or after requestFrom(address, numBytes) 244 + int TwoWire::read(void) 245 + { 246 + int value = -1; 247 + 248 + // get each successive byte on each call 249 + if(rxBufferIndex < rxBufferLength){ 250 + value = rxBuffer[rxBufferIndex]; 251 + ++rxBufferIndex; 252 + } 253 + 254 + return value; 255 + } 256 + 257 + // must be called in: 258 + // slave rx event callback 259 + // or after requestFrom(address, numBytes) 260 + int TwoWire::peek(void) 261 + { 262 + int value = -1; 263 + 264 + if(rxBufferIndex < rxBufferLength){ 265 + value = rxBuffer[rxBufferIndex]; 266 + } 267 + 268 + return value; 269 + } 270 + 271 + void TwoWire::flush(void) 272 + { 273 + // XXX: to be implemented. 274 + } 275 + 276 + // behind the scenes function that is called when data is received 277 + void TwoWire::onReceiveService(uint8_t* inBytes, int numBytes) 278 + { 279 + // don't bother if user hasn't registered a callback 280 + if(!user_onReceive){ 281 + return; 282 + } 283 + // don't bother if rx buffer is in use by a master requestFrom() op 284 + // i know this drops data, but it allows for slight stupidity 285 + // meaning, they may not have read all the master requestFrom() data yet 286 + if(rxBufferIndex < rxBufferLength){ 287 + return; 288 + } 289 + // copy twi rx buffer into local read buffer 290 + // this enables new reads to happen in parallel 291 + for(uint8_t i = 0; i < numBytes; ++i){ 292 + rxBuffer[i] = inBytes[i]; 293 + } 294 + // set rx iterator vars 295 + rxBufferIndex = 0; 296 + rxBufferLength = numBytes; 297 + // alert user program 298 + user_onReceive(numBytes); 299 + } 300 + 301 + // behind the scenes function that is called when data is requested 302 + void TwoWire::onRequestService(void) 303 + { 304 + // don't bother if user hasn't registered a callback 305 + if(!user_onRequest){ 306 + return; 307 + } 308 + // reset tx buffer iterator vars 309 + // !!! this will kill any pending pre-master sendTo() activity 310 + txBufferIndex = 0; 311 + txBufferLength = 0; 312 + // alert user program 313 + user_onRequest(); 314 + } 315 + 316 + // sets function called on slave write 317 + void TwoWire::onReceive( void (*function)(int) ) 318 + { 319 + user_onReceive = function; 320 + } 321 + 322 + // sets function called on slave read 323 + void TwoWire::onRequest( void (*function)(void) ) 324 + { 325 + user_onRequest = function; 326 + } 327 + 328 + // Preinstantiate Objects ////////////////////////////////////////////////////// 329 + 330 + TwoWire Wire = TwoWire();
+84
firmware/libraries/Wire_BigBuffer/Wire_BigBuffer.h
··· 1 + /* 2 + TwoWire.h - TWI/I2C library for Arduino & Wiring 3 + Copyright (c) 2006 Nicholas Zambetti. All right reserved. 4 + 5 + This library is free software; you can redistribute it and/or 6 + modify it under the terms of the GNU Lesser General Public 7 + License as published by the Free Software Foundation; either 8 + version 2.1 of the License, or (at your option) any later version. 9 + 10 + This library is distributed in the hope that it will be useful, 11 + but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 + Lesser General Public License for more details. 14 + 15 + You should have received a copy of the GNU Lesser General Public 16 + License along with this library; if not, write to the Free Software 17 + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 + 19 + Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts 20 + */ 21 + 22 + #ifndef TwoWire_h 23 + #define TwoWire_h 24 + 25 + #include <inttypes.h> 26 + #include "Stream.h" 27 + 28 + #define BUFFER_LENGTH 70 29 + 30 + // WIRE_HAS_END means Wire has end() 31 + #define WIRE_HAS_END 1 32 + 33 + class TwoWire : public Stream 34 + { 35 + private: 36 + static uint8_t rxBuffer[]; 37 + static uint8_t rxBufferIndex; 38 + static uint8_t rxBufferLength; 39 + 40 + static uint8_t txAddress; 41 + static uint8_t txBuffer[]; 42 + static uint8_t txBufferIndex; 43 + static uint8_t txBufferLength; 44 + 45 + static uint8_t transmitting; 46 + static void (*user_onRequest)(void); 47 + static void (*user_onReceive)(int); 48 + static void onRequestService(void); 49 + static void onReceiveService(uint8_t*, int); 50 + public: 51 + TwoWire(); 52 + void begin(); 53 + void begin(uint8_t); 54 + void begin(int); 55 + void end(); 56 + void setClock(uint32_t); 57 + void beginTransmission(uint8_t); 58 + void beginTransmission(int); 59 + uint8_t endTransmission(void); 60 + uint8_t endTransmission(uint8_t); 61 + uint8_t requestFrom(uint8_t, uint8_t); 62 + uint8_t requestFrom(uint8_t, uint8_t, uint8_t); 63 + uint8_t requestFrom(uint8_t, uint8_t, uint32_t, uint8_t, uint8_t); 64 + uint8_t requestFrom(int, int); 65 + uint8_t requestFrom(int, int, int); 66 + virtual size_t write(uint8_t); 67 + virtual size_t write(const uint8_t *, size_t); 68 + virtual int available(void); 69 + virtual int read(void); 70 + virtual int peek(void); 71 + virtual void flush(void); 72 + void onReceive( void (*)(int) ); 73 + void onRequest( void (*)(void) ); 74 + 75 + inline size_t write(unsigned long n) { return write((uint8_t)n); } 76 + inline size_t write(long n) { return write((uint8_t)n); } 77 + inline size_t write(unsigned int n) { return write((uint8_t)n); } 78 + inline size_t write(int n) { return write((uint8_t)n); } 79 + using Print::write; 80 + }; 81 + 82 + extern TwoWire Wire; 83 + 84 + #endif
+561
firmware/libraries/Wire_BigBuffer/utility/twi.c
··· 1 + /* 2 + twi.c - TWI/I2C library for Wiring & Arduino 3 + Copyright (c) 2006 Nicholas Zambetti. All right reserved. 4 + 5 + This library is free software; you can redistribute it and/or 6 + modify it under the terms of the GNU Lesser General Public 7 + License as published by the Free Software Foundation; either 8 + version 2.1 of the License, or (at your option) any later version. 9 + 10 + This library is distributed in the hope that it will be useful, 11 + but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 + Lesser General Public License for more details. 14 + 15 + You should have received a copy of the GNU Lesser General Public 16 + License along with this library; if not, write to the Free Software 17 + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 + 19 + Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts 20 + */ 21 + 22 + #include <math.h> 23 + #include <stdlib.h> 24 + #include <inttypes.h> 25 + #include <avr/io.h> 26 + #include <avr/interrupt.h> 27 + #include <compat/twi.h> 28 + #include "Arduino.h" // for digitalWrite 29 + 30 + #ifndef cbi 31 + #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) 32 + #endif 33 + 34 + #ifndef sbi 35 + #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) 36 + #endif 37 + 38 + #include "pins_arduino.h" 39 + #include "twi.h" 40 + 41 + static volatile uint8_t twi_state; 42 + static volatile uint8_t twi_slarw; 43 + static volatile uint8_t twi_sendStop; // should the transaction end with a stop 44 + static volatile uint8_t twi_inRepStart; // in the middle of a repeated start 45 + 46 + static void (*twi_onSlaveTransmit)(void); 47 + static void (*twi_onSlaveReceive)(uint8_t*, int); 48 + 49 + static uint8_t twi_masterBuffer[TWI_BUFFER_LENGTH]; 50 + static volatile uint8_t twi_masterBufferIndex; 51 + static volatile uint8_t twi_masterBufferLength; 52 + 53 + static uint8_t twi_txBuffer[TWI_BUFFER_LENGTH]; 54 + static volatile uint8_t twi_txBufferIndex; 55 + static volatile uint8_t twi_txBufferLength; 56 + 57 + static uint8_t twi_rxBuffer[TWI_BUFFER_LENGTH]; 58 + static volatile uint8_t twi_rxBufferIndex; 59 + 60 + static volatile uint8_t twi_error; 61 + 62 + /* 63 + * Function twi_init 64 + * Desc readys twi pins and sets twi bitrate 65 + * Input none 66 + * Output none 67 + */ 68 + void twi_init(void) 69 + { 70 + // initialize state 71 + twi_state = TWI_READY; 72 + twi_sendStop = true; // default value 73 + twi_inRepStart = false; 74 + 75 + // activate internal pullups for twi. 76 + digitalWrite(SDA, 1); 77 + digitalWrite(SCL, 1); 78 + 79 + // initialize twi prescaler and bit rate 80 + cbi(TWSR, TWPS0); 81 + cbi(TWSR, TWPS1); 82 + TWBR = ((F_CPU / TWI_FREQ) - 16) / 2; 83 + 84 + /* twi bit rate formula from atmega128 manual pg 204 85 + SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR)) 86 + note: TWBR should be 10 or higher for master mode 87 + It is 72 for a 16mhz Wiring board with 100kHz TWI */ 88 + 89 + // enable twi module, acks, and twi interrupt 90 + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA); 91 + } 92 + 93 + /* 94 + * Function twi_disable 95 + * Desc disables twi pins 96 + * Input none 97 + * Output none 98 + */ 99 + void twi_disable(void) 100 + { 101 + // disable twi module, acks, and twi interrupt 102 + TWCR &= ~(_BV(TWEN) | _BV(TWIE) | _BV(TWEA)); 103 + 104 + // deactivate internal pullups for twi. 105 + digitalWrite(SDA, 0); 106 + digitalWrite(SCL, 0); 107 + } 108 + 109 + /* 110 + * Function twi_slaveInit 111 + * Desc sets slave address and enables interrupt 112 + * Input none 113 + * Output none 114 + */ 115 + void twi_setAddress(uint8_t address) 116 + { 117 + // set twi slave address (skip over TWGCE bit) 118 + TWAR = address << 1; 119 + } 120 + 121 + /* 122 + * Function twi_setClock 123 + * Desc sets twi bit rate 124 + * Input Clock Frequency 125 + * Output none 126 + */ 127 + void twi_setFrequency(uint32_t frequency) 128 + { 129 + TWBR = ((F_CPU / frequency) - 16) / 2; 130 + 131 + /* twi bit rate formula from atmega128 manual pg 204 132 + SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR)) 133 + note: TWBR should be 10 or higher for master mode 134 + It is 72 for a 16mhz Wiring board with 100kHz TWI */ 135 + } 136 + 137 + /* 138 + * Function twi_readFrom 139 + * Desc attempts to become twi bus master and read a 140 + * series of bytes from a device on the bus 141 + * Input address: 7bit i2c device address 142 + * data: pointer to byte array 143 + * length: number of bytes to read into array 144 + * sendStop: Boolean indicating whether to send a stop at the end 145 + * Output number of bytes read 146 + */ 147 + uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sendStop) 148 + { 149 + uint8_t i; 150 + 151 + // ensure data will fit into buffer 152 + if(TWI_BUFFER_LENGTH < length){ 153 + return 0; 154 + } 155 + 156 + // wait until twi is ready, become master receiver 157 + while(TWI_READY != twi_state){ 158 + continue; 159 + } 160 + twi_state = TWI_MRX; 161 + twi_sendStop = sendStop; 162 + // reset error state (0xFF.. no error occured) 163 + twi_error = 0xFF; 164 + 165 + // initialize buffer iteration vars 166 + twi_masterBufferIndex = 0; 167 + twi_masterBufferLength = length-1; // This is not intuitive, read on... 168 + // On receive, the previously configured ACK/NACK setting is transmitted in 169 + // response to the received byte before the interrupt is signalled. 170 + // Therefor we must actually set NACK when the _next_ to last byte is 171 + // received, causing that NACK to be sent in response to receiving the last 172 + // expected byte of data. 173 + 174 + // build sla+w, slave device address + w bit 175 + twi_slarw = TW_READ; 176 + twi_slarw |= address << 1; 177 + 178 + if (true == twi_inRepStart) { 179 + // if we're in the repeated start state, then we've already sent the start, 180 + // (@@@ we hope), and the TWI statemachine is just waiting for the address byte. 181 + // We need to remove ourselves from the repeated start state before we enable interrupts, 182 + // since the ISR is ASYNC, and we could get confused if we hit the ISR before cleaning 183 + // up. Also, don't enable the START interrupt. There may be one pending from the 184 + // repeated start that we sent ourselves, and that would really confuse things. 185 + twi_inRepStart = false; // remember, we're dealing with an ASYNC ISR 186 + do { 187 + TWDR = twi_slarw; 188 + } while(TWCR & _BV(TWWC)); 189 + TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE); // enable INTs, but not START 190 + } 191 + else 192 + // send start condition 193 + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA); 194 + 195 + // wait for read operation to complete 196 + while(TWI_MRX == twi_state){ 197 + continue; 198 + } 199 + 200 + if (twi_masterBufferIndex < length) 201 + length = twi_masterBufferIndex; 202 + 203 + // copy twi buffer to data 204 + for(i = 0; i < length; ++i){ 205 + data[i] = twi_masterBuffer[i]; 206 + } 207 + 208 + return length; 209 + } 210 + 211 + /* 212 + * Function twi_writeTo 213 + * Desc attempts to become twi bus master and write a 214 + * series of bytes to a device on the bus 215 + * Input address: 7bit i2c device address 216 + * data: pointer to byte array 217 + * length: number of bytes in array 218 + * wait: boolean indicating to wait for write or not 219 + * sendStop: boolean indicating whether or not to send a stop at the end 220 + * Output 0 .. success 221 + * 1 .. length to long for buffer 222 + * 2 .. address send, NACK received 223 + * 3 .. data send, NACK received 224 + * 4 .. other twi error (lost bus arbitration, bus error, ..) 225 + */ 226 + uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait, uint8_t sendStop) 227 + { 228 + uint8_t i; 229 + 230 + // ensure data will fit into buffer 231 + if(TWI_BUFFER_LENGTH < length){ 232 + return 1; 233 + } 234 + 235 + // wait until twi is ready, become master transmitter 236 + while(TWI_READY != twi_state){ 237 + continue; 238 + } 239 + twi_state = TWI_MTX; 240 + twi_sendStop = sendStop; 241 + // reset error state (0xFF.. no error occured) 242 + twi_error = 0xFF; 243 + 244 + // initialize buffer iteration vars 245 + twi_masterBufferIndex = 0; 246 + twi_masterBufferLength = length; 247 + 248 + // copy data to twi buffer 249 + for(i = 0; i < length; ++i){ 250 + twi_masterBuffer[i] = data[i]; 251 + } 252 + 253 + // build sla+w, slave device address + w bit 254 + twi_slarw = TW_WRITE; 255 + twi_slarw |= address << 1; 256 + 257 + // if we're in a repeated start, then we've already sent the START 258 + // in the ISR. Don't do it again. 259 + // 260 + if (true == twi_inRepStart) { 261 + // if we're in the repeated start state, then we've already sent the start, 262 + // (@@@ we hope), and the TWI statemachine is just waiting for the address byte. 263 + // We need to remove ourselves from the repeated start state before we enable interrupts, 264 + // since the ISR is ASYNC, and we could get confused if we hit the ISR before cleaning 265 + // up. Also, don't enable the START interrupt. There may be one pending from the 266 + // repeated start that we sent outselves, and that would really confuse things. 267 + twi_inRepStart = false; // remember, we're dealing with an ASYNC ISR 268 + do { 269 + TWDR = twi_slarw; 270 + } while(TWCR & _BV(TWWC)); 271 + TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE); // enable INTs, but not START 272 + } 273 + else 274 + // send start condition 275 + TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA); // enable INTs 276 + 277 + // wait for write operation to complete 278 + while(wait && (TWI_MTX == twi_state)){ 279 + continue; 280 + } 281 + 282 + if (twi_error == 0xFF) 283 + return 0; // success 284 + else if (twi_error == TW_MT_SLA_NACK) 285 + return 2; // error: address send, nack received 286 + else if (twi_error == TW_MT_DATA_NACK) 287 + return 3; // error: data send, nack received 288 + else 289 + return 4; // other twi error 290 + } 291 + 292 + /* 293 + * Function twi_transmit 294 + * Desc fills slave tx buffer with data 295 + * must be called in slave tx event callback 296 + * Input data: pointer to byte array 297 + * length: number of bytes in array 298 + * Output 1 length too long for buffer 299 + * 2 not slave transmitter 300 + * 0 ok 301 + */ 302 + uint8_t twi_transmit(const uint8_t* data, uint8_t length) 303 + { 304 + uint8_t i; 305 + 306 + // ensure data will fit into buffer 307 + if(TWI_BUFFER_LENGTH < (twi_txBufferLength+length)){ 308 + return 1; 309 + } 310 + 311 + // ensure we are currently a slave transmitter 312 + if(TWI_STX != twi_state){ 313 + return 2; 314 + } 315 + 316 + // set length and copy data into tx buffer 317 + for(i = 0; i < length; ++i){ 318 + twi_txBuffer[twi_txBufferLength+i] = data[i]; 319 + } 320 + twi_txBufferLength += length; 321 + 322 + return 0; 323 + } 324 + 325 + /* 326 + * Function twi_attachSlaveRxEvent 327 + * Desc sets function called before a slave read operation 328 + * Input function: callback function to use 329 + * Output none 330 + */ 331 + void twi_attachSlaveRxEvent( void (*function)(uint8_t*, int) ) 332 + { 333 + twi_onSlaveReceive = function; 334 + } 335 + 336 + /* 337 + * Function twi_attachSlaveTxEvent 338 + * Desc sets function called before a slave write operation 339 + * Input function: callback function to use 340 + * Output none 341 + */ 342 + void twi_attachSlaveTxEvent( void (*function)(void) ) 343 + { 344 + twi_onSlaveTransmit = function; 345 + } 346 + 347 + /* 348 + * Function twi_reply 349 + * Desc sends byte or readys receive line 350 + * Input ack: byte indicating to ack or to nack 351 + * Output none 352 + */ 353 + void twi_reply(uint8_t ack) 354 + { 355 + // transmit master read ready signal, with or without ack 356 + if(ack){ 357 + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT) | _BV(TWEA); 358 + }else{ 359 + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT); 360 + } 361 + } 362 + 363 + /* 364 + * Function twi_stop 365 + * Desc relinquishes bus master status 366 + * Input none 367 + * Output none 368 + */ 369 + void twi_stop(void) 370 + { 371 + // send stop condition 372 + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTO); 373 + 374 + // wait for stop condition to be exectued on bus 375 + // TWINT is not set after a stop condition! 376 + while(TWCR & _BV(TWSTO)){ 377 + continue; 378 + } 379 + 380 + // update twi state 381 + twi_state = TWI_READY; 382 + } 383 + 384 + /* 385 + * Function twi_releaseBus 386 + * Desc releases bus control 387 + * Input none 388 + * Output none 389 + */ 390 + void twi_releaseBus(void) 391 + { 392 + // release bus 393 + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT); 394 + 395 + // update twi state 396 + twi_state = TWI_READY; 397 + } 398 + 399 + ISR(TWI_vect) 400 + { 401 + switch(TW_STATUS){ 402 + // All Master 403 + case TW_START: // sent start condition 404 + case TW_REP_START: // sent repeated start condition 405 + // copy device address and r/w bit to output register and ack 406 + TWDR = twi_slarw; 407 + twi_reply(1); 408 + break; 409 + 410 + // Master Transmitter 411 + case TW_MT_SLA_ACK: // slave receiver acked address 412 + case TW_MT_DATA_ACK: // slave receiver acked data 413 + // if there is data to send, send it, otherwise stop 414 + if(twi_masterBufferIndex < twi_masterBufferLength){ 415 + // copy data to output register and ack 416 + TWDR = twi_masterBuffer[twi_masterBufferIndex++]; 417 + twi_reply(1); 418 + }else{ 419 + if (twi_sendStop) 420 + twi_stop(); 421 + else { 422 + twi_inRepStart = true; // we're gonna send the START 423 + // don't enable the interrupt. We'll generate the start, but we 424 + // avoid handling the interrupt until we're in the next transaction, 425 + // at the point where we would normally issue the start. 426 + TWCR = _BV(TWINT) | _BV(TWSTA)| _BV(TWEN) ; 427 + twi_state = TWI_READY; 428 + } 429 + } 430 + break; 431 + case TW_MT_SLA_NACK: // address sent, nack received 432 + twi_error = TW_MT_SLA_NACK; 433 + twi_stop(); 434 + break; 435 + case TW_MT_DATA_NACK: // data sent, nack received 436 + twi_error = TW_MT_DATA_NACK; 437 + twi_stop(); 438 + break; 439 + case TW_MT_ARB_LOST: // lost bus arbitration 440 + twi_error = TW_MT_ARB_LOST; 441 + twi_releaseBus(); 442 + break; 443 + 444 + // Master Receiver 445 + case TW_MR_DATA_ACK: // data received, ack sent 446 + // put byte into buffer 447 + twi_masterBuffer[twi_masterBufferIndex++] = TWDR; 448 + case TW_MR_SLA_ACK: // address sent, ack received 449 + // ack if more bytes are expected, otherwise nack 450 + if(twi_masterBufferIndex < twi_masterBufferLength){ 451 + twi_reply(1); 452 + }else{ 453 + twi_reply(0); 454 + } 455 + break; 456 + case TW_MR_DATA_NACK: // data received, nack sent 457 + // put final byte into buffer 458 + twi_masterBuffer[twi_masterBufferIndex++] = TWDR; 459 + if (twi_sendStop) 460 + twi_stop(); 461 + else { 462 + twi_inRepStart = true; // we're gonna send the START 463 + // don't enable the interrupt. We'll generate the start, but we 464 + // avoid handling the interrupt until we're in the next transaction, 465 + // at the point where we would normally issue the start. 466 + TWCR = _BV(TWINT) | _BV(TWSTA)| _BV(TWEN) ; 467 + twi_state = TWI_READY; 468 + } 469 + break; 470 + case TW_MR_SLA_NACK: // address sent, nack received 471 + twi_stop(); 472 + break; 473 + // TW_MR_ARB_LOST handled by TW_MT_ARB_LOST case 474 + 475 + // Slave Receiver 476 + case TW_SR_SLA_ACK: // addressed, returned ack 477 + case TW_SR_GCALL_ACK: // addressed generally, returned ack 478 + case TW_SR_ARB_LOST_SLA_ACK: // lost arbitration, returned ack 479 + case TW_SR_ARB_LOST_GCALL_ACK: // lost arbitration, returned ack 480 + // enter slave receiver mode 481 + twi_state = TWI_SRX; 482 + // indicate that rx buffer can be overwritten and ack 483 + twi_rxBufferIndex = 0; 484 + twi_reply(1); 485 + break; 486 + case TW_SR_DATA_ACK: // data received, returned ack 487 + case TW_SR_GCALL_DATA_ACK: // data received generally, returned ack 488 + // if there is still room in the rx buffer 489 + if(twi_rxBufferIndex < TWI_BUFFER_LENGTH){ 490 + // put byte in buffer and ack 491 + twi_rxBuffer[twi_rxBufferIndex++] = TWDR; 492 + twi_reply(1); 493 + }else{ 494 + // otherwise nack 495 + twi_reply(0); 496 + } 497 + break; 498 + case TW_SR_STOP: // stop or repeated start condition received 499 + // ack future responses and leave slave receiver state 500 + twi_releaseBus(); 501 + // put a null char after data if there's room 502 + if(twi_rxBufferIndex < TWI_BUFFER_LENGTH){ 503 + twi_rxBuffer[twi_rxBufferIndex] = '\0'; 504 + } 505 + // callback to user defined callback 506 + twi_onSlaveReceive(twi_rxBuffer, twi_rxBufferIndex); 507 + // since we submit rx buffer to "wire" library, we can reset it 508 + twi_rxBufferIndex = 0; 509 + break; 510 + case TW_SR_DATA_NACK: // data received, returned nack 511 + case TW_SR_GCALL_DATA_NACK: // data received generally, returned nack 512 + // nack back at master 513 + twi_reply(0); 514 + break; 515 + 516 + // Slave Transmitter 517 + case TW_ST_SLA_ACK: // addressed, returned ack 518 + case TW_ST_ARB_LOST_SLA_ACK: // arbitration lost, returned ack 519 + // enter slave transmitter mode 520 + twi_state = TWI_STX; 521 + // ready the tx buffer index for iteration 522 + twi_txBufferIndex = 0; 523 + // set tx buffer length to be zero, to verify if user changes it 524 + twi_txBufferLength = 0; 525 + // request for txBuffer to be filled and length to be set 526 + // note: user must call twi_transmit(bytes, length) to do this 527 + twi_onSlaveTransmit(); 528 + // if they didn't change buffer & length, initialize it 529 + if(0 == twi_txBufferLength){ 530 + twi_txBufferLength = 1; 531 + twi_txBuffer[0] = 0x00; 532 + } 533 + // transmit first byte from buffer, fall 534 + case TW_ST_DATA_ACK: // byte sent, ack returned 535 + // copy data to output register 536 + TWDR = twi_txBuffer[twi_txBufferIndex++]; 537 + // if there is more to send, ack, otherwise nack 538 + if(twi_txBufferIndex < twi_txBufferLength){ 539 + twi_reply(1); 540 + }else{ 541 + twi_reply(0); 542 + } 543 + break; 544 + case TW_ST_DATA_NACK: // received nack, we are done 545 + case TW_ST_LAST_DATA: // received ack, but we are done already! 546 + // ack future responses 547 + twi_reply(1); 548 + // leave slave receiver state 549 + twi_state = TWI_READY; 550 + break; 551 + 552 + // All 553 + case TW_NO_INFO: // no state information 554 + break; 555 + case TW_BUS_ERROR: // bus error, illegal stop/start 556 + twi_error = TW_BUS_ERROR; 557 + twi_stop(); 558 + break; 559 + } 560 + } 561 +
+54
firmware/libraries/Wire_BigBuffer/utility/twi.h
··· 1 + /* 2 + twi.h - TWI/I2C library for Wiring & Arduino 3 + Copyright (c) 2006 Nicholas Zambetti. All right reserved. 4 + 5 + This library is free software; you can redistribute it and/or 6 + modify it under the terms of the GNU Lesser General Public 7 + License as published by the Free Software Foundation; either 8 + version 2.1 of the License, or (at your option) any later version. 9 + 10 + This library is distributed in the hope that it will be useful, 11 + but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 + Lesser General Public License for more details. 14 + 15 + You should have received a copy of the GNU Lesser General Public 16 + License along with this library; if not, write to the Free Software 17 + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 + */ 19 + 20 + #ifndef twi_h 21 + #define twi_h 22 + 23 + #include <inttypes.h> 24 + 25 + //#define ATMEGA8 26 + 27 + #ifndef TWI_FREQ 28 + #define TWI_FREQ 100000L 29 + #endif 30 + 31 + #ifndef TWI_BUFFER_LENGTH 32 + #define TWI_BUFFER_LENGTH 70 33 + #endif 34 + 35 + #define TWI_READY 0 36 + #define TWI_MRX 1 37 + #define TWI_MTX 2 38 + #define TWI_SRX 3 39 + #define TWI_STX 4 40 + 41 + void twi_init(void); 42 + void twi_disable(void); 43 + void twi_setAddress(uint8_t); 44 + void twi_setFrequency(uint32_t); 45 + uint8_t twi_readFrom(uint8_t, uint8_t*, uint8_t, uint8_t); 46 + uint8_t twi_writeTo(uint8_t, uint8_t*, uint8_t, uint8_t, uint8_t); 47 + uint8_t twi_transmit(const uint8_t*, uint8_t); 48 + void twi_attachSlaveRxEvent( void (*)(uint8_t*, int) ); 49 + void twi_attachSlaveTxEvent( void (*)(void) ); 50 + void twi_reply(uint8_t); 51 + void twi_stop(void); 52 + void twi_releaseBus(void); 53 + 54 + #endif
+132
firmware/sketches/EverydayCalendar/EverydayCalendar.ino
··· 1 + #include <EverydayCalendar_lights.h> 2 + #include <EverydayCalendar_touch.h> 3 + 4 + typedef struct { 5 + int8_t x; 6 + int8_t y; 7 + } Point; 8 + 9 + EverydayCalendar_touch cal_touch; 10 + EverydayCalendar_lights cal_lights; 11 + int16_t brightness = 128; 12 + 13 + void setup() { 14 + Serial.begin(9600); 15 + Serial.println("Sketch setup started"); 16 + 17 + // Initialize LED functionality 18 + cal_lights.configure(); 19 + cal_lights.setBrightness(200); 20 + cal_lights.begin(); 21 + 22 + // Perform startup animation 23 + honeyDrip(); 24 + 25 + // Fade out 26 + for(int b = 200; b >= 0; b--){ 27 + cal_lights.setBrightness(b); 28 + delay(4); 29 + } 30 + 31 + // Initialize touch functionality 32 + cal_touch.configure(); 33 + cal_touch.begin(); 34 + cal_lights.loadLedStatesFromMemory(); 35 + delay(1500); 36 + 37 + // Fade in 38 + for(int b = 0; b <= brightness; b++){ 39 + cal_lights.setBrightness(b); 40 + delay(4); 41 + } 42 + 43 + Serial.println("Sketch setup complete"); 44 + } 45 + 46 + void loop() { 47 + static Point previouslyHeldButton = {0xFF, 0xFF}; // 0xFF and 0xFF if no button is held 48 + static uint16_t touchCount = 1; 49 + static const uint8_t debounceCount = 3; 50 + static const uint16_t clearCalendarCount = 1300; // ~40 seconds. This is in units of touch sampling interval ~= 30ms. 51 + Point buttonPressed = {0xFF, 0xFF}; 52 + bool touch = cal_touch.scanForTouch(); 53 + // Handle a button press 54 + if(touch) 55 + { 56 + // Brightness Buttons 57 + if(cal_touch.y == 31){ 58 + if(cal_touch.x == 4){ 59 + brightness -= 3; 60 + }else if(cal_touch.x == 6){ 61 + brightness += 2; 62 + } 63 + brightness = constrain(brightness, 0, 200); 64 + Serial.print("Brightness: "); 65 + Serial.println(brightness); 66 + cal_lights.setBrightness((uint8_t)brightness); 67 + } 68 + // If all buttons aren't touched, reset debounce touch counter 69 + if(previouslyHeldButton.x == -1){ 70 + touchCount = 0; 71 + } 72 + 73 + // If this button is been held, or it's just starting to be pressed and is the only button being touched 74 + if(((previouslyHeldButton.x == cal_touch.x) && (previouslyHeldButton.y == cal_touch.y)) 75 + || (debounceCount == 0)) 76 + { 77 + // The button has been held for a certain number of consecutive checks 78 + // This is called debouncing 79 + if (touchCount == debounceCount){ 80 + // Button is activated 81 + cal_lights.toggleLED((uint8_t)cal_touch.x, (uint8_t)cal_touch.y); 82 + cal_lights.saveLedStatesToMemory(); 83 + Serial.print("x: "); 84 + Serial.print(cal_touch.x); 85 + Serial.print("\ty: "); 86 + Serial.println(cal_touch.y); 87 + } 88 + 89 + // Check if the special "Reset" January 1 button is being held 90 + if((cal_touch.x == 0) && (cal_touch.y == 0) && (touchCount == clearCalendarCount)){ 91 + Serial.println("Resetting all LED states"); 92 + clearAnimation(); 93 + } 94 + 95 + if(touchCount < 65535){ 96 + touchCount++; 97 + Serial.println(touchCount); 98 + } 99 + } 100 + } 101 + 102 + previouslyHeldButton.x = cal_touch.x; 103 + previouslyHeldButton.y = cal_touch.y; 104 + } 105 + 106 + void honeyDrip(){ 107 + uint16_t interval_ms = 25; 108 + static const uint8_t monthDayOffset[12] = {0, 3, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0}; 109 + // Turn on all LEDs one by one in the span of a few second 110 + for(int day = 0; day < 31; day++){ 111 + for(int month = 0; month < 12; month++){ 112 + int8_t adjustedDay = day - monthDayOffset[month]; 113 + if(adjustedDay >= 0 ){ 114 + cal_lights.setLED(month, adjustedDay, true); 115 + } 116 + } 117 + delay(interval_ms); 118 + interval_ms = interval_ms + 2; 119 + } 120 + } 121 + 122 + void clearAnimation(){ 123 + uint16_t interval_ms = 25; 124 + static const uint8_t monthMaxDay[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 125 + for(int month = 11; month >= 0; month--){ 126 + for(int day = monthMaxDay[month]-1; day >=0; day--){ 127 + cal_lights.setLED(month, day, false); 128 + delay(interval_ms); 129 + } 130 + } 131 + cal_lights.saveLedStatesToMemory(); 132 + }
+95
firmware/sketches/FrontTest/FrontTest.ino
··· 1 + #include <EverydayCalendar_lights.h> 2 + #include <EverydayCalendar_touch.h> 3 + 4 + EverydayCalendar_touch cal_touch; 5 + EverydayCalendar_lights cal_lights; 6 + 7 + static const uint8_t monthMaxDay[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 8 + static const int16_t channelCountTarget = 500; 9 + static const int16_t channelCountTolerableDeviation = 50; 10 + 11 + void setup() { 12 + IQS_Version version; 13 + Serial.begin(9600); 14 + // Serial.begin(19200);/ 15 + Serial.println("Sketch setup started"); 16 + delay(100); 17 + cal_touch.initialize(); 18 + delay(100); 19 + 20 + for(uint8_t i=0; i<4; i++){ 21 + if(programTouchController(i) == 0){ 22 + Serial.print("Programmed touch controller #"); 23 + Serial.println(i); 24 + cal_touch.tc[i].holdReset(true); 25 + delay(15); 26 + } 27 + } 28 + 29 + for(uint8_t i=0; i<4; i++){ 30 + cal_touch.tc[i].holdReset(false); 31 + } 32 + delay(20); 33 + 34 + // Initialize LED functionality 35 + cal_lights.configure(); 36 + cal_lights.setBrightness(100); 37 + cal_lights.begin(); 38 + 39 + cal_touch.configure(); 40 + cal_touch.begin(); 41 + delay(100); 42 + 43 + cal_touch.printChannelCountValues(); 44 + Serial.println("\n"); 45 + cal_touch.printAtiCompensationValues(); 46 + Serial.println("\n"); 47 + 48 + cal_touch.scanForTouch(); 49 + 50 + for(int month=0; month<12; month++){ 51 + for(int day=0; day<monthMaxDay[month]; day++){ 52 + for(int retry=0; retry<3; retry++){ 53 + int16_t channelCount = cal_touch.getChannelCountValue(month, day); 54 + int16_t difference = channelCount - channelCountTarget; 55 + uint16_t deviation = abs(difference); 56 + if(deviation < channelCountTolerableDeviation){ 57 + cal_lights.setLED(month, day, true); 58 + break; 59 + } 60 + cal_touch.scanForTouch(); // re-scan 61 + Serial.print("Retry # "); 62 + Serial.print(retry); 63 + Serial.print("\t for month: "); 64 + Serial.print(month); 65 + Serial.print("\t day: "); 66 + Serial.print(day); 67 + Serial.print("\t count: "); 68 + Serial.print(channelCount); 69 + Serial.print("\n"); 70 + } 71 + } 72 + } 73 + 74 + 75 + 76 + Serial.println("Sketch setup complete"); 77 + } 78 + 79 + void loop() { 80 + // put your main code here, to run repeatedly: 81 + 82 + } 83 + 84 + uint8_t programTouchController(uint8_t c){ 85 + static const uint8_t targetAddresses[] = {0x74, 0x75, 0x76, 0x77}; 86 + int8_t retval[4]; 87 + for(uint8_t addy=0x74; addy<=0x77; addy++){ 88 + cal_touch.tc[c].i2cDeviceAddr = addy; 89 + retval[c] = cal_touch.tc[c].programFirmware(targetAddresses[c]); 90 + if( retval[c] == 0){ 91 + return 0; 92 + } 93 + } 94 + return retval[0]; 95 + }
+27
firmware/sketches/RearTest/RearTest.ino
··· 1 + #include <EverydayCalendar_lights.h> 2 + 3 + EverydayCalendar_lights cal_lights; 4 + 5 + void setup() { 6 + Serial.begin(9600); 7 + Serial.println("Sketch setup started"); 8 + 9 + // Initialize LED functionality 10 + cal_lights.configure(); 11 + cal_lights.setBrightness(200); 12 + cal_lights.begin(); 13 + 14 + static const uint8_t monthMaxDay[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 15 + for(int month = 0; month <12; month++){ 16 + for(int day=0; day< monthMaxDay[month]; day++){ 17 + cal_lights.setLED(month, day, true); 18 + } 19 + } 20 + 21 + Serial.println("Sketch setup complete"); 22 + } 23 + 24 + void loop() { 25 + // put your main code here, to run repeatedly: 26 + 27 + }
+44
firmware/sketches/programmingTest/programmingTest.ino
··· 1 + #include <EverydayCalendar_touch.h> 2 + 3 + EverydayCalendar_touch cal_touch; 4 + 5 + void setup() { 6 + IQS_Version version; 7 + Serial.begin(9600); 8 + Serial.println("Sketch setup started"); 9 + delay(100); 10 + cal_touch.initialize(); 11 + delay(100); 12 + 13 + cal_touch.tc[0].i2cDeviceAddr = 0x74; 14 + int8_t retval = cal_touch.tc[0].programFirmware(0x74); 15 + if(retval != 0){ 16 + Serial.print("Programming failure. Error code: "); 17 + Serial.println(retval); 18 + return; 19 + } 20 + 21 + 22 + cal_touch.tc[0].holdReset(true); 23 + delay(20); 24 + cal_touch.tc[0].holdReset(false); 25 + delay(200); 26 + while(!cal_touch.tc[0].isReady()){}; 27 + cal_touch.tc[0].checkVersion(&version); 28 + Serial.println("Programming success"); 29 + Serial.print("Product:"); 30 + Serial.println(version.product); 31 + Serial.print("Project:"); 32 + Serial.println(version.project); 33 + Serial.print("Version:"); 34 + Serial.print(version.major_version); 35 + Serial.print("."); 36 + Serial.println(version.minor_version); 37 + 38 + 39 + } 40 + 41 + void loop() { 42 + // put your main code here, to run repeatedly: 43 + 44 + }
images/board_config.png

This is a binary file and will not be displayed.

images/clockconfig.png

This is a binary file and will not be displayed.

images/edc.gif

This is a binary file and will not be displayed.

images/serialmonitor.png

This is a binary file and will not be displayed.

schematics/front/EverydayCalendar_Front-Schematic-v0.5.1.PDF

This is a binary file and will not be displayed.

schematics/rear/EverydayCalendar_Rear-Schematic-v0.5.1.PDF

This is a binary file and will not be displayed.