diff --git a/Boss.h b/Boss.h new file mode 100644 index 0000000..d98c5e5 --- /dev/null +++ b/Boss.h @@ -0,0 +1,42 @@ +#include "Arduino.h" + +class Boss +{ + public: + void Spawn(); + void Hit(); + void Kill(); + bool Alive(); + int _pos; + int _lives; + int _ticks; + private: + bool _alive; +}; + +void Boss::Spawn(){ + _pos = 800; + _lives = 3; + _alive = 1; +} + +void Boss::Hit(){ + _lives --; + if(_lives == 0) { + Kill(); + return; + } + if(_lives == 2){ + _pos = 200; + }else if(_lives == 1){ + _pos = 600; + } +} + +bool Boss::Alive(){ + return _alive; +} + +void Boss::Kill(){ + _alive = 0; +} diff --git a/Conveyor.h b/Conveyor.h new file mode 100644 index 0000000..1060715 --- /dev/null +++ b/Conveyor.h @@ -0,0 +1,24 @@ +#include "Arduino.h" +#include "settings.h" + +class Conveyor +{ + public: + void Spawn(int startPoint, int endPoint, int dir); + void Kill(); + int _startPoint; + int _endPoint; + int _dir; + bool _alive; +}; + +void Conveyor::Spawn(int startPoint, int endPoint, int dir){ + _startPoint = startPoint; + _endPoint = endPoint; + _dir = constrain(dir, -MAX_PLAYER_SPEED+1, MAX_PLAYER_SPEED - 1); // must allow some player speed + _alive = true; +} + +void Conveyor::Kill(){ + _alive = false; +} diff --git a/Enemy.h b/Enemy.h new file mode 100644 index 0000000..1573364 --- /dev/null +++ b/Enemy.h @@ -0,0 +1,55 @@ +#include "Arduino.h" + +class Enemy +{ + public: + void Spawn(int pos, int dir, int speed, int wobble); + void Tick(); + void Kill(); + bool Alive(); + int _pos; + int _wobble; + int playerSide; + private: + int _dir; + int _speed; + int _alive; + int _origin; +}; + +void Enemy::Spawn(int pos, int dir, int speed, int wobble){ + _pos = pos; + _dir = dir; // 0 = left, 1 = right + _wobble = wobble; // 0 = no, >0 = yes, value is width of wobble + _origin = pos; + _speed = speed; + _alive = 1; +} + +void Enemy::Tick(){ + if(_alive){ + if(_wobble > 0){ + _pos = _origin + (sin((millis()/3000.0)*_speed)*_wobble); + }else{ + if(_dir == 0){ + _pos -= _speed; + }else{ + _pos += _speed; + } + if(_pos > 1000) { + Kill(); + } + if(_pos <= 0) { + Kill(); + } + } + } +} + +bool Enemy::Alive(){ + return _alive; +} + +void Enemy::Kill(){ + _alive = 0; +} diff --git a/Lava.h b/Lava.h new file mode 100644 index 0000000..b762868 --- /dev/null +++ b/Lava.h @@ -0,0 +1,39 @@ +#include "Arduino.h" + +class Lava +{ + public: + void Spawn(int left, int right, int ontime, int offtime, int offset, int state); + void Kill(); + int Alive(); + int _left; + int _right; + int _ontime; + int _offtime; + int _offset; + long _lastOn; + int _state; + static const int OFF = 0; + static const int ON = 1; + private: + int _alive; +}; + +void Lava::Spawn(int left, int right, int ontime, int offtime, int offset, int state){ + _left = left; + _right = right; + _ontime = ontime; + _offtime = offtime; + _offset = offset; + _alive = 1; + _lastOn = millis()-offset; + _state = state; +} + +void Lava::Kill(){ + _alive = 0; +} + +int Lava::Alive(){ + return _alive; +} diff --git a/Particle.h b/Particle.h new file mode 100644 index 0000000..b9b4ff2 --- /dev/null +++ b/Particle.h @@ -0,0 +1,59 @@ +#include "Arduino.h" +#define FRICTION 1 + +class Particle +{ + public: + void Spawn(int pos); + void Tick(int USE_GRAVITY); + void Kill(); + bool Alive(); + int _pos; + int _power; + private: + int _life; + int _alive; + int _sp; +}; + +void Particle::Spawn(int pos){ + _pos = pos; + _sp = random(-200, 200); + _power = 255; + _alive = 1; + _life = 220 - abs(_sp); +} + +void Particle::Tick(int USE_GRAVITY){ + if(_alive){ + _life ++; + if(_sp > 0){ + _sp -= _life/10; + }else{ + _sp += _life/10; + } + if(USE_GRAVITY && _pos > 500) _sp -= 10; + _power = 100 - _life; + if(_power <= 0){ + Kill(); + }else{ + _pos += _sp/7.0; + if(_pos > 1000){ + _pos = 1000; + _sp = 0-(_sp/2); + } + else if(_pos < 0){ + _pos = 0; + _sp = 0-(_sp/2); + } + } + } +} + +bool Particle::Alive(){ + return _alive; +} + +void Particle::Kill(){ + _alive = 0; +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..0f165e4 --- /dev/null +++ b/README.md @@ -0,0 +1,106 @@ +# TWANG32 +An ESP32 based, 1D, LED strip, dungeon crawler. inspired by Line Wobbler by Robin B + +This was ported from the [TWANG fork](https://github.com/bdring/TWANG) by bdring of [Buildlog.net Blog](http://www.buildlog.net/blog?s=twang) + +![TWANG LED Game](http://www.buildlog.net/blog/wp-content/uploads/2018/01/20180111_130909-1.jpg?s=200) + +## Why ESP32? +- Lower Cost than Arduino Mega +- Faster Processor +- More Memory +- Smaller (allows a smaller enclosure that is easier to print and more portable) +- DAC pins for better sound capabilities. +- Wifi and Bluetooth. + +The current state of the code is a basic port of the Arduino version. Several of the libraries did not work, so ESP32 versions are included in the code. + +**Coming Soon:** + +- Wireless features + - A wireless version of the serial port features of TWANG. I think the easiest way is to make it a Wifi access point with a simple web page interface. This allows control by any smartphone or computer with no client side work required. + - 2 Player features by linking controllers. TBD +- Digitized Audio + - Currently the port uses the same square wave tones of the the Arduino version. + - I want to convert to digitized high quality sound effects. + - Possibly mix multiple sounds so things like lava and movement sound good at the same time. +- Custom PCB + - Make wiring easier. + - More robust. + - Integrated audio amplifier. +- Python (it might be fun to make a python version) + + +## Required libraries: +* [FastLED](http://fastled.io/) +* [RunningMedian](http://playground.arduino.cc/Main/RunningMedian) + +## Hardware used: +* ESP32, I typically use the NodeMCU 32s module +* LED light strip. The more the better, maximum of 1000. Tested with 1x & 2x 144/meter, 12x 60/meter and 5m x 114/meter strips. This has been tested with APA102C and Neopixel type strips. Anything compatible wiht the FastLED library should work. +* MPU6050 accelerometer +* Spring doorstop, I used [these](http://smile.amazon.com/gp/product/B00J4Y5BU2) +* Speaker and amplifier. I use a PAM8403 module. (ESP32 cannot drive a speaker as loudly as an Arduino) + +See [Buildlog.net Blog](http://www.buildlog.net/blog?s=twang) for more details. + +Super easy to use kits and ready to play units will be available on Tindie soon. + +![TWANG 32 Controller](http://www.buildlog.net/blog/wp-content/uploads/2018/03/20180319_080636.jpg) + +## Enclosure +They will be on Thingiverse soon. + +![TWANG32](http://www.buildlog.net/blog/wp-content/uploads/2018/03/twang32_enclosure.jpg) + +## Overview +The following is a quick overview of the code to help you understand and tweak the game to your needs. + +The game is played on a 1000 unit line, the position of enemies, the player, lava etc range from 0 to 1000 and the LEDs that represent them are derived using the getLED() function. You don't need to worry about this but it's good to know for things like the width of the attack and player max move speed. Regardles of the number of LEDs, everything takes place in this 1000 unit wide line. + +**LED SETUP** Defines the quantity of LEDs as well as the data and clock pins used. I've tested several APA102-C strips and the color order sometimes changes from BGR to GBR, if the player is not blue, the exit green and the enemies red, this is the bit you want to change. Brightness should range from 50 to 255, use a lower number if playing at night or wanting to use a smaller power supply. "DIRECTION" can be set to 0 or 1 to flip the game orientation. In setup() there is a "FastLED.addLeds()" line, in there you could change it to another brand of LED strip like the cheaper WS2812. + +The game also has 3 regular LEDs for life indicators (the player gets 3 lives which reset each time they level up). The pins for these LEDs are stored in lifeLEDs[] and are updated in the updateLives() function + +**JOYSTICK SETUP** All parameters are commented in the code, you can set it to work in both forward/backward as well as side-to-side mode by changing JOYSTICK_ORIENTATION. Adjust the ATTACK_THRESHOLD if the "Twaning" is overly sensitive and the JOYSTICK_DEADZONE if the player slowly drifts when there is no input (because it's hard to get the MPU6050 dead level) + +**WOBBLE ATTACK** Sets the width, duration (ms) of the attack + +**POOLS** These are the object pools for enemies, particles, lava, conveyors etc. You can modify the quanity of any of them if your levels use more or if you want to save some memory, just remember to update the respective counts to avoid errors. + +**USE_GRAVITY** 0/1 to set if particles created by the player getting killed should fall towards the start point, the BEND_POINT variable can be set to mark the point at which the strip of LEDs goes from been horizontal to vertical. The game is 1000 units wide (regardless of number of LED's) so 500 would be the mid point. If this is confusing just set USE_GRAVITY to 0 + +## Modifying / Creating levels +Find the loadLevel() function, in there you can see a switch statement with the 10 levels I created. +They all call different functions and variables to setup the level. Each one is described below: + +**playerPosition;** Where the player starts on the 0 to 1000 line. If not set it defaults to 0. I set it to 200 in the first level so the player can see movement even if the first action they take is to push the joystick left + +**spawnEnemy(position, direction, speed, wobble);** (10 enemies max) +* position: 0 to 1000 +* direction: 0/1, initial direction of travel +* speed: >=0, speed of the enemy, remember the game is 1000 wide and runs at 60fps. I recommend between 1 and 4 +* wobble: 0=regular moving enemy, 1=sine wave enemy, in this case speed sets the width of the wave + +**spawnPool[poolNumber].Spawn(position, rate, speed, direction);** (2 spawners max) +* A spawn pool is a point which spawns enemies forever +* position: 0 to 1000 +* rate: milliseconds between spawns, 1000 = 1 second +* speed: speed of the enemis it spawns +* direction: 0=towards start, 1=away from start + +**spawnLava(startPoint, endPoint, ontime, offtime, offset);** (4 lava pools max) +* startPoint: 0 to 1000 +* endPoint: 0 to 1000, combined with startPoint this sets the location and size of the lava +* ontime: How long (ms) the lava is ON for +* offtime: How long the lava is ON for +* offset: How long (ms) after the level starts before the lava turns on, use this to create patterns with multiple lavas + +**spawnConveyor(startPoint, endPoint, direction);** (2 conveyors max) +* startPoint, endPoint: Same as lava +* direction: The direction and speed of the travel. Negative moves to base and positive moves towards exit. Must be less than +/- max player speed. + +**spawnBoss(); ** (only one, don't edit boss level) +* There are no parameters for a boss, they always spawn in the same place and have 3 lives. Tweak the values of Boss.h to modify + +Feel free to edit, comment on the YouTube video (link at top) if you have any questions. \ No newline at end of file diff --git a/SoundData.h b/SoundData.h new file mode 100644 index 0000000..73129cc --- /dev/null +++ b/SoundData.h @@ -0,0 +1,1329 @@ + +unsigned char PROGMEM sndStart[14444] = { + 0x52, 0x49, 0x46, 0x46, 0x64, 0x38, 0x00, 0x00, 0x57, 0x41, 0x56, 0x45, + 0x66, 0x6D, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x40, 0x1F, 0x00, 0x00, 0x40, 0x1F, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, + 0x64, 0x61, 0x74, 0x61, 0x40, 0x38, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, + 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7F, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x81, 0x80, 0x80, + 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x81, 0x80, 0x80, 0x80, + 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x7F, 0x7F, 0x80, 0x81, 0x81, 0x81, 0x80, 0x80, + 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x82, 0x81, 0x81, 0x80, 0x80, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x7D, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x81, 0x82, 0x81, 0x81, 0x80, + 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x7D, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x82, 0x82, 0x81, 0x81, + 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x7F, + 0x80, 0x7F, 0x7D, 0x7D, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x81, 0x83, 0x81, 0x81, 0x80, + 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x7F, 0x80, + 0x7F, 0x7C, 0x7D, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x83, 0x82, 0x81, 0x81, 0x80, 0x80, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7D, + 0x7C, 0x7D, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x7F, 0x80, 0x7F, 0x82, 0x83, 0x82, 0x81, 0x80, 0x80, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x7D, 0x7C, 0x7D, + 0x7E, 0x7E, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x7F, 0x80, 0x83, 0x83, 0x82, 0x81, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x7F, 0x7C, 0x7C, 0x7D, 0x7E, 0x7F, 0x7F, + 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x83, 0x83, + 0x82, 0x82, 0x81, 0x80, 0x7F, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x80, 0x7C, 0x7B, 0x7D, 0x7D, 0x7E, 0x7F, 0x80, 0x80, 0x80, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x82, 0x84, 0x82, 0x82, 0x81, 0x80, + 0x80, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x7F, 0x7B, + 0x7C, 0x7D, 0x7E, 0x7E, 0x7F, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x7F, 0x82, 0x85, 0x83, 0x82, 0x81, 0x81, 0x80, 0x7F, 0x7F, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x7C, 0x7B, 0x7C, 0x7D, + 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x80, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x7D, 0x7A, 0x7C, 0x7C, 0x7E, 0x7E, 0x7F, + 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x82, 0x85, + 0x83, 0x83, 0x81, 0x81, 0x80, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, + 0x7E, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x80, 0x7E, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x80, + 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x85, 0x84, 0x83, + 0x82, 0x81, 0x80, 0x80, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, + 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7A, 0x7A, 0x7C, 0x7D, 0x7E, 0x7F, 0x7F, 0x80, 0x81, 0x81, + 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x81, 0x86, 0x84, 0x83, 0x82, 0x81, + 0x80, 0x80, 0x7F, 0x7E, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, + 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7A, + 0x7A, 0x7B, 0x7C, 0x7E, 0x7E, 0x7F, 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, + 0x80, 0x80, 0x80, 0x84, 0x86, 0x84, 0x83, 0x82, 0x81, 0x80, 0x7F, 0x7F, + 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x7B, 0x79, 0x7B, 0x7C, 0x7D, + 0x7E, 0x7F, 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x84, + 0x87, 0x84, 0x84, 0x82, 0x81, 0x80, 0x80, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, + 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, + 0x7F, 0x7E, 0x80, 0x7B, 0x78, 0x7B, 0x7B, 0x7D, 0x7E, 0x7F, 0x7F, 0x80, + 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x85, 0x87, 0x84, 0x84, 0x82, + 0x81, 0x80, 0x80, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, + 0x7D, 0x7D, 0x7D, 0x7E, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7D, 0x78, + 0x79, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, + 0x80, 0x82, 0x87, 0x86, 0x85, 0x84, 0x82, 0x81, 0x80, 0x80, 0x7F, 0x7E, + 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7F, 0x7E, 0x78, 0x78, 0x7A, 0x7B, 0x7D, 0x7E, 0x7F, + 0x7F, 0x80, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x80, 0x82, 0x88, 0x86, 0x85, 0x84, + 0x82, 0x81, 0x80, 0x80, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, + 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7D, 0x77, + 0x78, 0x7A, 0x7B, 0x7C, 0x7D, 0x7F, 0x7F, 0x80, 0x81, 0x81, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x87, 0x88, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80, 0x7F, 0x7E, + 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7B, 0x76, 0x79, 0x7A, 0x7B, 0x7D, 0x7E, + 0x7F, 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x81, 0x82, 0x81, 0x81, 0x81, 0x81, 0x88, 0x88, 0x85, + 0x85, 0x83, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7D, + 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x7D, 0x7E, 0x7E, 0x7F, + 0x7B, 0x76, 0x79, 0x7A, 0x7B, 0x7C, 0x7E, 0x7F, 0x7F, 0x80, 0x81, 0x82, + 0x82, 0x82, 0x82, 0x83, 0x82, 0x83, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x81, 0x81, 0x81, 0x81, 0x88, 0x88, 0x86, 0x85, 0x83, 0x82, 0x81, 0x80, + 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, 0x7D, 0x7C, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, + 0x7D, 0x7D, 0x7E, 0x7D, 0x7E, 0x7E, 0x7F, 0x7B, 0x76, 0x78, 0x79, 0x7B, + 0x7C, 0x7D, 0x7F, 0x7F, 0x80, 0x81, 0x82, 0x82, 0x82, 0x82, 0x83, 0x83, + 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x80, 0x83, + 0x89, 0x87, 0x86, 0x84, 0x83, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7D, 0x7D, + 0x7D, 0x7D, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, + 0x7E, 0x7D, 0x7F, 0x7B, 0x75, 0x78, 0x79, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x82, 0x82, 0x82, 0x82, 0x81, 0x82, 0x80, 0x84, 0x8A, 0x87, 0x86, 0x84, + 0x83, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7C, 0x7C, + 0x7C, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x7D, 0x7F, 0x7A, + 0x75, 0x78, 0x79, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x82, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, + 0x82, 0x81, 0x81, 0x89, 0x8A, 0x87, 0x86, 0x84, 0x83, 0x81, 0x81, 0x7F, + 0x7F, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, + 0x7C, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x77, 0x74, 0x78, 0x78, 0x7B, 0x7C, + 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, 0x81, 0x88, 0x8B, 0x88, + 0x87, 0x85, 0x84, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, 0x7C, + 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7D, 0x7E, + 0x76, 0x74, 0x77, 0x78, 0x7A, 0x7B, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x81, + 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x82, 0x82, 0x81, 0x89, 0x8B, 0x88, 0x87, 0x85, 0x84, 0x82, 0x81, 0x80, + 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, + 0x7C, 0x7C, 0x7D, 0x7C, 0x7D, 0x7C, 0x73, 0x75, 0x77, 0x78, 0x7A, 0x7B, + 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x83, 0x8B, 0x8B, 0x89, 0x87, + 0x85, 0x84, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, + 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x74, 0x73, + 0x76, 0x77, 0x79, 0x7A, 0x7C, 0x7D, 0x7F, 0x7F, 0x80, 0x81, 0x82, 0x82, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x83, + 0x8B, 0x8C, 0x89, 0x88, 0x86, 0x85, 0x83, 0x82, 0x80, 0x80, 0x7F, 0x7E, + 0x7D, 0x7D, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, + 0x7D, 0x7D, 0x74, 0x73, 0x76, 0x77, 0x79, 0x7A, 0x7C, 0x7D, 0x7F, 0x7F, + 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x84, 0x83, 0x83, + 0x83, 0x83, 0x82, 0x83, 0x8C, 0x8C, 0x89, 0x88, 0x86, 0x85, 0x83, 0x82, + 0x80, 0x80, 0x7F, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7B, + 0x7C, 0x7C, 0x7C, 0x7C, 0x7D, 0x7B, 0x72, 0x73, 0x76, 0x77, 0x79, 0x7A, + 0x7C, 0x7D, 0x7F, 0x7F, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, + 0x83, 0x84, 0x83, 0x83, 0x83, 0x83, 0x82, 0x84, 0x8D, 0x8B, 0x8A, 0x88, + 0x86, 0x85, 0x83, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, + 0x7C, 0x7C, 0x7B, 0x7C, 0x7B, 0x7C, 0x7C, 0x7C, 0x7C, 0x7D, 0x75, 0x72, + 0x75, 0x76, 0x78, 0x79, 0x7B, 0x7C, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x82, + 0x83, 0x83, 0x83, 0x83, 0x84, 0x83, 0x84, 0x83, 0x84, 0x83, 0x84, 0x82, + 0x87, 0x8E, 0x8B, 0x8A, 0x88, 0x86, 0x84, 0x83, 0x82, 0x80, 0x7F, 0x7E, + 0x7E, 0x7D, 0x7C, 0x7C, 0x7C, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7C, + 0x7C, 0x7C, 0x7C, 0x73, 0x72, 0x75, 0x76, 0x78, 0x79, 0x7B, 0x7C, 0x7E, + 0x7F, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x83, 0x84, 0x82, 0x8A, 0x8F, 0x8B, 0x8A, 0x87, 0x86, 0x84, + 0x83, 0x82, 0x81, 0x7F, 0x7F, 0x7E, 0x7D, 0x7C, 0x7C, 0x7B, 0x7B, 0x7B, + 0x7B, 0x7B, 0x7B, 0x7B, 0x7C, 0x7B, 0x7C, 0x7B, 0x71, 0x72, 0x74, 0x76, + 0x78, 0x79, 0x7B, 0x7C, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x83, 0x84, 0x82, 0x88, 0x8F, + 0x8C, 0x8B, 0x88, 0x87, 0x85, 0x84, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7D, + 0x7D, 0x7C, 0x7C, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7C, 0x7B, + 0x7D, 0x75, 0x70, 0x73, 0x74, 0x77, 0x78, 0x7A, 0x7B, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x83, 0x84, 0x82, 0x8A, 0x90, 0x8C, 0x8B, 0x88, 0x87, 0x85, 0x84, + 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7B, 0x7B, 0x7B, + 0x7B, 0x7B, 0x7B, 0x7B, 0x7C, 0x7B, 0x7C, 0x72, 0x70, 0x73, 0x74, 0x77, + 0x78, 0x7A, 0x7B, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x83, 0x83, + 0x83, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x83, 0x84, 0x8F, 0x8E, + 0x8C, 0x8A, 0x88, 0x87, 0x85, 0x83, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7D, + 0x7D, 0x7C, 0x7C, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7C, + 0x72, 0x6F, 0x73, 0x74, 0x76, 0x78, 0x7A, 0x7B, 0x7D, 0x7E, 0x7F, 0x80, + 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x84, 0x83, + 0x84, 0x82, 0x8B, 0x91, 0x8D, 0x8C, 0x89, 0x88, 0x86, 0x85, 0x83, 0x82, + 0x80, 0x7F, 0x7F, 0x7E, 0x7D, 0x7C, 0x7C, 0x7C, 0x7B, 0x7B, 0x7B, 0x7B, + 0x7B, 0x7B, 0x7B, 0x7C, 0x73, 0x6E, 0x72, 0x73, 0x76, 0x77, 0x79, 0x7A, + 0x7C, 0x7D, 0x7E, 0x80, 0x80, 0x81, 0x82, 0x83, 0x83, 0x84, 0x83, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x8F, 0x90, 0x8D, 0x8C, 0x89, 0x88, + 0x86, 0x84, 0x83, 0x82, 0x80, 0x7F, 0x7E, 0x7E, 0x7D, 0x7C, 0x7C, 0x7B, + 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7C, 0x7B, 0x6F, 0x6F, 0x72, 0x73, + 0x76, 0x77, 0x79, 0x7A, 0x7C, 0x7D, 0x7F, 0x80, 0x81, 0x81, 0x82, 0x83, + 0x83, 0x84, 0x84, 0x84, 0x84, 0x85, 0x84, 0x85, 0x83, 0x89, 0x92, 0x8E, + 0x8D, 0x8B, 0x89, 0x87, 0x86, 0x84, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7D, + 0x7C, 0x7C, 0x7B, 0x7C, 0x7B, 0x7B, 0x7A, 0x7B, 0x7A, 0x7C, 0x78, 0x6D, + 0x70, 0x71, 0x73, 0x75, 0x77, 0x79, 0x7A, 0x7C, 0x7D, 0x7F, 0x7F, 0x81, + 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x85, 0x84, 0x85, 0x83, 0x87, + 0x92, 0x90, 0x8E, 0x8C, 0x8A, 0x88, 0x86, 0x85, 0x83, 0x82, 0x81, 0x80, + 0x7F, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7B, 0x7B, 0x7A, 0x7B, 0x7A, 0x7C, + 0x77, 0x6C, 0x6F, 0x71, 0x73, 0x75, 0x77, 0x78, 0x7A, 0x7B, 0x7D, 0x7E, + 0x7F, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x85, 0x84, 0x85, + 0x83, 0x88, 0x93, 0x90, 0x8E, 0x8C, 0x8A, 0x89, 0x87, 0x85, 0x84, 0x83, + 0x81, 0x80, 0x7F, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7B, 0x7C, 0x7B, 0x7B, + 0x7A, 0x7C, 0x75, 0x6C, 0x70, 0x71, 0x73, 0x74, 0x77, 0x78, 0x7A, 0x7B, + 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x83, 0x84, + 0x84, 0x85, 0x83, 0x8C, 0x93, 0x8F, 0x8E, 0x8B, 0x8A, 0x88, 0x87, 0x85, + 0x84, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7E, 0x7D, 0x7C, 0x7C, 0x7C, 0x7B, + 0x7B, 0x7B, 0x7A, 0x7C, 0x71, 0x6C, 0x70, 0x71, 0x74, 0x75, 0x77, 0x78, + 0x7A, 0x7B, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, + 0x83, 0x84, 0x84, 0x85, 0x83, 0x8B, 0x93, 0x8F, 0x8E, 0x8C, 0x8A, 0x88, + 0x87, 0x85, 0x84, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, + 0x7B, 0x7C, 0x7B, 0x7B, 0x7A, 0x7C, 0x79, 0x6D, 0x6E, 0x70, 0x72, 0x74, + 0x75, 0x78, 0x79, 0x7B, 0x7C, 0x7E, 0x7E, 0x80, 0x80, 0x82, 0x82, 0x83, + 0x83, 0x84, 0x84, 0x84, 0x84, 0x84, 0x85, 0x83, 0x8E, 0x94, 0x8F, 0x8F, + 0x8C, 0x8B, 0x88, 0x87, 0x85, 0x84, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7D, + 0x7D, 0x7C, 0x7C, 0x7B, 0x7B, 0x7A, 0x7B, 0x7A, 0x7C, 0x76, 0x6B, 0x6E, + 0x70, 0x72, 0x74, 0x76, 0x77, 0x79, 0x7B, 0x7C, 0x7E, 0x7E, 0x80, 0x80, + 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x85, 0x84, 0x85, 0x84, 0x87, 0x93, + 0x92, 0x90, 0x8E, 0x8C, 0x8A, 0x88, 0x87, 0x85, 0x84, 0x82, 0x81, 0x80, + 0x7F, 0x7E, 0x7D, 0x7C, 0x7C, 0x7B, 0x7B, 0x7B, 0x7A, 0x7B, 0x7A, 0x7C, + 0x71, 0x6A, 0x6E, 0x6F, 0x72, 0x73, 0x76, 0x77, 0x79, 0x7A, 0x7C, 0x7D, + 0x7E, 0x80, 0x80, 0x81, 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, 0x85, 0x85, + 0x85, 0x84, 0x90, 0x95, 0x90, 0x90, 0x8D, 0x8C, 0x89, 0x88, 0x86, 0x85, + 0x83, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7D, 0x7C, 0x7C, 0x7B, 0x7B, 0x7A, + 0x7B, 0x7A, 0x7B, 0x79, 0x6C, 0x6B, 0x6F, 0x70, 0x72, 0x74, 0x76, 0x77, + 0x79, 0x7A, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x83, 0x84, + 0x84, 0x85, 0x84, 0x85, 0x83, 0x88, 0x95, 0x92, 0x90, 0x8F, 0x8D, 0x8B, + 0x89, 0x88, 0x86, 0x85, 0x83, 0x82, 0x80, 0x80, 0x7F, 0x7E, 0x7D, 0x7D, + 0x7C, 0x7B, 0x7B, 0x7B, 0x7B, 0x7A, 0x7C, 0x73, 0x69, 0x6E, 0x6F, 0x71, + 0x73, 0x75, 0x76, 0x78, 0x7A, 0x7B, 0x7C, 0x7D, 0x7F, 0x7F, 0x81, 0x81, + 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x84, 0x91, 0x95, 0x91, + 0x90, 0x8D, 0x8C, 0x8A, 0x88, 0x86, 0x85, 0x84, 0x83, 0x81, 0x80, 0x7F, + 0x7E, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7B, 0x7B, 0x7A, 0x7C, 0x70, 0x6A, + 0x6E, 0x6F, 0x72, 0x73, 0x75, 0x76, 0x78, 0x79, 0x7B, 0x7C, 0x7E, 0x7F, + 0x80, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x83, 0x85, 0x83, 0x8F, + 0x95, 0x91, 0x90, 0x8D, 0x8C, 0x8A, 0x89, 0x87, 0x86, 0x84, 0x83, 0x81, + 0x80, 0x7F, 0x7F, 0x7E, 0x7D, 0x7C, 0x7C, 0x7C, 0x7B, 0x7B, 0x7A, 0x7C, + 0x6E, 0x6A, 0x6E, 0x6F, 0x72, 0x73, 0x75, 0x76, 0x78, 0x79, 0x7B, 0x7C, + 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, + 0x85, 0x93, 0x95, 0x91, 0x90, 0x8E, 0x8C, 0x8A, 0x89, 0x87, 0x86, 0x84, + 0x83, 0x81, 0x80, 0x7F, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7B, 0x7B, 0x7A, + 0x7B, 0x78, 0x6A, 0x6B, 0x6D, 0x6F, 0x71, 0x73, 0x75, 0x76, 0x78, 0x79, + 0x7B, 0x7C, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, + 0x86, 0x83, 0x8F, 0x97, 0x93, 0x92, 0x8F, 0x8E, 0x8C, 0x8A, 0x88, 0x87, + 0x85, 0x84, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7E, 0x7C, 0x7C, 0x7B, 0x7C, + 0x7A, 0x7C, 0x72, 0x68, 0x6C, 0x6D, 0x6F, 0x71, 0x73, 0x74, 0x76, 0x77, + 0x79, 0x7A, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x82, 0x83, 0x83, + 0x85, 0x83, 0x8A, 0x97, 0x93, 0x92, 0x90, 0x8F, 0x8D, 0x8B, 0x89, 0x88, + 0x86, 0x85, 0x84, 0x82, 0x81, 0x80, 0x7F, 0x7F, 0x7E, 0x7D, 0x7C, 0x7D, + 0x7B, 0x7D, 0x74, 0x68, 0x6C, 0x6D, 0x6F, 0x71, 0x72, 0x74, 0x76, 0x77, + 0x78, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x81, 0x83, 0x82, + 0x84, 0x82, 0x8B, 0x97, 0x92, 0x92, 0x8F, 0x8E, 0x8C, 0x8B, 0x89, 0x87, + 0x86, 0x85, 0x84, 0x82, 0x81, 0x80, 0x7F, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, + 0x7B, 0x7D, 0x73, 0x68, 0x6D, 0x6D, 0x70, 0x71, 0x73, 0x75, 0x76, 0x78, + 0x79, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x81, 0x82, 0x82, 0x82, + 0x84, 0x82, 0x8F, 0x96, 0x92, 0x92, 0x8F, 0x8E, 0x8B, 0x8A, 0x88, 0x87, + 0x85, 0x84, 0x83, 0x81, 0x81, 0x7F, 0x7F, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, + 0x7B, 0x7C, 0x6D, 0x69, 0x6D, 0x6D, 0x70, 0x71, 0x74, 0x75, 0x77, 0x78, + 0x7A, 0x7B, 0x7C, 0x7E, 0x7F, 0x80, 0x81, 0x81, 0x82, 0x83, 0x83, 0x83, + 0x85, 0x83, 0x90, 0x98, 0x93, 0x93, 0x90, 0x8F, 0x8C, 0x8B, 0x89, 0x87, + 0x86, 0x84, 0x83, 0x82, 0x80, 0x80, 0x7E, 0x7E, 0x7D, 0x7D, 0x7B, 0x7C, + 0x7A, 0x7C, 0x74, 0x67, 0x6B, 0x6B, 0x6E, 0x6F, 0x72, 0x73, 0x75, 0x76, + 0x78, 0x7A, 0x7B, 0x7C, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x82, 0x83, 0x84, + 0x84, 0x85, 0x85, 0x95, 0x97, 0x94, 0x93, 0x90, 0x8F, 0x8D, 0x8C, 0x8A, + 0x88, 0x86, 0x85, 0x84, 0x83, 0x81, 0x80, 0x7F, 0x7F, 0x7D, 0x7D, 0x7C, + 0x7C, 0x7A, 0x7C, 0x70, 0x66, 0x6B, 0x6B, 0x6E, 0x6F, 0x71, 0x72, 0x75, + 0x76, 0x78, 0x79, 0x7A, 0x7B, 0x7D, 0x7E, 0x7F, 0x7F, 0x81, 0x81, 0x82, + 0x82, 0x84, 0x82, 0x89, 0x98, 0x95, 0x94, 0x92, 0x90, 0x8E, 0x8D, 0x8B, + 0x8A, 0x88, 0x87, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7E, + 0x7D, 0x7C, 0x7C, 0x7B, 0x6B, 0x69, 0x6C, 0x6D, 0x6F, 0x70, 0x72, 0x73, + 0x76, 0x76, 0x78, 0x79, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x7F, 0x81, 0x81, + 0x82, 0x81, 0x83, 0x81, 0x8A, 0x98, 0x94, 0x93, 0x91, 0x8F, 0x8D, 0x8C, + 0x8A, 0x89, 0x87, 0x86, 0x85, 0x83, 0x82, 0x81, 0x81, 0x7F, 0x7F, 0x7E, + 0x7E, 0x7D, 0x7D, 0x7B, 0x7E, 0x71, 0x67, 0x6C, 0x6C, 0x6F, 0x70, 0x73, + 0x74, 0x76, 0x77, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, + 0x81, 0x82, 0x83, 0x82, 0x84, 0x82, 0x92, 0x98, 0x93, 0x93, 0x90, 0x8F, + 0x8C, 0x8B, 0x89, 0x88, 0x86, 0x85, 0x83, 0x83, 0x81, 0x80, 0x7F, 0x7F, + 0x7E, 0x7D, 0x7C, 0x7C, 0x7B, 0x7C, 0x7A, 0x69, 0x68, 0x6B, 0x6C, 0x6F, + 0x70, 0x73, 0x74, 0x76, 0x77, 0x79, 0x7A, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, + 0x81, 0x82, 0x82, 0x83, 0x83, 0x85, 0x83, 0x89, 0x99, 0x96, 0x95, 0x92, + 0x91, 0x8F, 0x8D, 0x8B, 0x8A, 0x88, 0x86, 0x85, 0x84, 0x82, 0x81, 0x80, + 0x7F, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7A, 0x7C, 0x6C, 0x66, 0x6A, 0x6A, + 0x6D, 0x6E, 0x71, 0x72, 0x74, 0x76, 0x77, 0x79, 0x7A, 0x7C, 0x7D, 0x7E, + 0x7F, 0x80, 0x81, 0x82, 0x83, 0x83, 0x84, 0x83, 0x93, 0x9A, 0x95, 0x95, + 0x92, 0x91, 0x8F, 0x8E, 0x8C, 0x8A, 0x89, 0x87, 0x86, 0x84, 0x83, 0x82, + 0x81, 0x80, 0x7F, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x6B, 0x66, 0x6A, 0x6A, + 0x6D, 0x6E, 0x70, 0x71, 0x73, 0x75, 0x76, 0x78, 0x79, 0x7A, 0x7B, 0x7D, + 0x7D, 0x7F, 0x7F, 0x81, 0x81, 0x82, 0x82, 0x83, 0x94, 0x98, 0x94, 0x94, + 0x91, 0x91, 0x8E, 0x8D, 0x8B, 0x8A, 0x89, 0x87, 0x86, 0x85, 0x84, 0x83, + 0x82, 0x81, 0x80, 0x7F, 0x7F, 0x7D, 0x7E, 0x7C, 0x6A, 0x68, 0x6B, 0x6C, + 0x6E, 0x6F, 0x71, 0x72, 0x74, 0x75, 0x77, 0x78, 0x79, 0x7B, 0x7B, 0x7D, + 0x7D, 0x7F, 0x7F, 0x80, 0x80, 0x82, 0x80, 0x86, 0x97, 0x95, 0x93, 0x92, + 0x90, 0x8F, 0x8D, 0x8C, 0x8A, 0x89, 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, + 0x81, 0x80, 0x7F, 0x7F, 0x7F, 0x7D, 0x7F, 0x70, 0x67, 0x6C, 0x6C, 0x6F, + 0x6F, 0x72, 0x73, 0x75, 0x76, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7E, 0x7E, + 0x7F, 0x80, 0x81, 0x81, 0x83, 0x80, 0x8E, 0x99, 0x94, 0x94, 0x91, 0x90, + 0x8E, 0x8D, 0x8B, 0x89, 0x88, 0x86, 0x85, 0x84, 0x83, 0x81, 0x81, 0x7F, + 0x7F, 0x7D, 0x7E, 0x7C, 0x7E, 0x74, 0x65, 0x69, 0x6A, 0x6C, 0x6E, 0x70, + 0x71, 0x73, 0x75, 0x76, 0x78, 0x79, 0x7B, 0x7C, 0x7D, 0x7E, 0x80, 0x80, + 0x82, 0x81, 0x84, 0x81, 0x8B, 0x9A, 0x96, 0x96, 0x93, 0x92, 0x90, 0x8F, + 0x8D, 0x8B, 0x8A, 0x88, 0x87, 0x85, 0x84, 0x83, 0x82, 0x80, 0x80, 0x7E, + 0x7F, 0x7C, 0x7E, 0x72, 0x65, 0x69, 0x69, 0x6C, 0x6D, 0x6F, 0x70, 0x72, + 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A, 0x7B, 0x7C, 0x7E, 0x7E, 0x80, 0x7F, + 0x82, 0x80, 0x8B, 0x9A, 0x95, 0x95, 0x93, 0x92, 0x90, 0x8F, 0x8D, 0x8C, + 0x8B, 0x89, 0x88, 0x86, 0x86, 0x84, 0x84, 0x82, 0x82, 0x80, 0x80, 0x7E, + 0x80, 0x79, 0x67, 0x69, 0x6B, 0x6C, 0x6E, 0x6F, 0x71, 0x72, 0x74, 0x74, + 0x76, 0x77, 0x79, 0x79, 0x7B, 0x7B, 0x7D, 0x7D, 0x7E, 0x7F, 0x80, 0x81, + 0x80, 0x92, 0x98, 0x94, 0x94, 0x91, 0x90, 0x8E, 0x8D, 0x8B, 0x8A, 0x89, + 0x88, 0x86, 0x85, 0x84, 0x83, 0x83, 0x81, 0x81, 0x7F, 0x80, 0x7E, 0x80, + 0x75, 0x66, 0x6A, 0x6B, 0x6D, 0x6F, 0x70, 0x72, 0x73, 0x75, 0x76, 0x78, + 0x79, 0x7A, 0x7B, 0x7D, 0x7D, 0x7E, 0x7F, 0x80, 0x80, 0x81, 0x81, 0x82, + 0x94, 0x98, 0x94, 0x94, 0x91, 0x90, 0x8E, 0x8D, 0x8B, 0x8A, 0x88, 0x87, + 0x85, 0x84, 0x83, 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7E, 0x7C, 0x7F, 0x73, + 0x64, 0x69, 0x69, 0x6C, 0x6D, 0x6F, 0x71, 0x72, 0x74, 0x76, 0x77, 0x78, + 0x7A, 0x7B, 0x7D, 0x7D, 0x7F, 0x7F, 0x81, 0x81, 0x83, 0x81, 0x87, 0x9A, + 0x98, 0x96, 0x95, 0x93, 0x92, 0x8F, 0x8E, 0x8C, 0x8B, 0x89, 0x88, 0x86, + 0x85, 0x84, 0x83, 0x81, 0x81, 0x7F, 0x7E, 0x7E, 0x7C, 0x7D, 0x6B, 0x64, + 0x69, 0x68, 0x6B, 0x6C, 0x6F, 0x6F, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78, + 0x7A, 0x7B, 0x7C, 0x7E, 0x7E, 0x80, 0x7F, 0x82, 0x80, 0x8C, 0x9B, 0x97, + 0x97, 0x94, 0x93, 0x91, 0x90, 0x8F, 0x8D, 0x8C, 0x8A, 0x89, 0x87, 0x87, + 0x85, 0x85, 0x83, 0x82, 0x81, 0x81, 0x7F, 0x7F, 0x7D, 0x69, 0x67, 0x6A, + 0x6A, 0x6D, 0x6D, 0x6F, 0x70, 0x72, 0x73, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7B, 0x7B, 0x7D, 0x7D, 0x7F, 0x7E, 0x80, 0x7F, 0x86, 0x98, 0x96, 0x95, + 0x94, 0x92, 0x91, 0x8F, 0x8E, 0x8C, 0x8B, 0x89, 0x89, 0x87, 0x86, 0x85, + 0x84, 0x83, 0x82, 0x82, 0x80, 0x81, 0x7E, 0x81, 0x78, 0x66, 0x69, 0x6A, + 0x6C, 0x6E, 0x6F, 0x71, 0x72, 0x74, 0x75, 0x76, 0x77, 0x79, 0x7A, 0x7B, + 0x7C, 0x7D, 0x7E, 0x7E, 0x7F, 0x7F, 0x81, 0x7F, 0x8C, 0x9A, 0x95, 0x95, + 0x92, 0x91, 0x8F, 0x8E, 0x8C, 0x8B, 0x8A, 0x88, 0x87, 0x85, 0x85, 0x83, + 0x83, 0x81, 0x81, 0x80, 0x7F, 0x7F, 0x7D, 0x7F, 0x6D, 0x65, 0x6A, 0x69, + 0x6D, 0x6D, 0x70, 0x71, 0x73, 0x74, 0x76, 0x77, 0x78, 0x7A, 0x7B, 0x7C, + 0x7D, 0x7F, 0x7F, 0x81, 0x80, 0x82, 0x80, 0x87, 0x9A, 0x99, 0x97, 0x95, + 0x93, 0x92, 0x90, 0x8F, 0x8C, 0x8C, 0x89, 0x89, 0x86, 0x86, 0x84, 0x83, + 0x82, 0x81, 0x80, 0x7F, 0x7E, 0x7D, 0x7E, 0x6B, 0x63, 0x68, 0x68, 0x6B, + 0x6B, 0x6E, 0x6F, 0x71, 0x72, 0x74, 0x75, 0x77, 0x78, 0x79, 0x7B, 0x7C, + 0x7D, 0x7E, 0x7F, 0x80, 0x82, 0x80, 0x93, 0x9B, 0x97, 0x97, 0x94, 0x94, + 0x91, 0x91, 0x8F, 0x8E, 0x8C, 0x8B, 0x89, 0x88, 0x87, 0x86, 0x84, 0x83, + 0x82, 0x81, 0x81, 0x7E, 0x80, 0x6E, 0x64, 0x69, 0x68, 0x6B, 0x6C, 0x6E, + 0x6E, 0x71, 0x71, 0x73, 0x74, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, + 0x7D, 0x7E, 0x7F, 0x7F, 0x93, 0x99, 0x95, 0x95, 0x93, 0x92, 0x90, 0x90, + 0x8D, 0x8D, 0x8B, 0x8A, 0x89, 0x88, 0x86, 0x86, 0x85, 0x84, 0x83, 0x82, + 0x81, 0x80, 0x80, 0x6B, 0x67, 0x6A, 0x6A, 0x6D, 0x6E, 0x70, 0x70, 0x73, + 0x73, 0x75, 0x76, 0x77, 0x78, 0x7A, 0x7A, 0x7C, 0x7C, 0x7D, 0x7D, 0x7F, + 0x7E, 0x82, 0x97, 0x97, 0x95, 0x94, 0x92, 0x91, 0x8F, 0x8E, 0x8C, 0x8B, + 0x89, 0x88, 0x87, 0x86, 0x84, 0x84, 0x82, 0x83, 0x80, 0x81, 0x7E, 0x81, + 0x74, 0x64, 0x69, 0x69, 0x6C, 0x6D, 0x6F, 0x70, 0x72, 0x73, 0x75, 0x76, + 0x78, 0x78, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7E, 0x81, 0x7F, 0x86, 0x9A, + 0x98, 0x97, 0x95, 0x94, 0x92, 0x90, 0x8F, 0x8D, 0x8C, 0x8A, 0x89, 0x88, + 0x86, 0x85, 0x84, 0x83, 0x81, 0x81, 0x7F, 0x7F, 0x7D, 0x67, 0x65, 0x68, + 0x69, 0x6B, 0x6C, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, + 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x96, 0x9A, 0x97, 0x96, 0x94, + 0x93, 0x91, 0x91, 0x8F, 0x8E, 0x8C, 0x8B, 0x8A, 0x89, 0x87, 0x86, 0x85, + 0x84, 0x83, 0x82, 0x81, 0x80, 0x6A, 0x66, 0x6A, 0x6A, 0x6C, 0x6C, 0x6E, + 0x6F, 0x71, 0x72, 0x73, 0x74, 0x76, 0x76, 0x78, 0x79, 0x7A, 0x7A, 0x7C, + 0x7C, 0x7E, 0x7D, 0x91, 0x99, 0x95, 0x95, 0x92, 0x92, 0x90, 0x8F, 0x8D, + 0x8D, 0x8B, 0x8A, 0x89, 0x88, 0x87, 0x86, 0x85, 0x84, 0x83, 0x83, 0x81, + 0x83, 0x71, 0x65, 0x6B, 0x6A, 0x6D, 0x6D, 0x70, 0x70, 0x72, 0x73, 0x75, + 0x75, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7D, 0x7F, 0x7E, 0x84, + 0x99, 0x97, 0x96, 0x94, 0x93, 0x91, 0x90, 0x8E, 0x8D, 0x8C, 0x8A, 0x89, + 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x81, 0x7E, 0x81, 0x6E, 0x63, + 0x68, 0x68, 0x6B, 0x6B, 0x6E, 0x6E, 0x71, 0x72, 0x74, 0x74, 0x77, 0x77, + 0x79, 0x7A, 0x7C, 0x7C, 0x7E, 0x7E, 0x80, 0x7F, 0x84, 0x9A, 0x9A, 0x98, + 0x97, 0x95, 0x94, 0x92, 0x91, 0x8F, 0x8E, 0x8C, 0x8B, 0x89, 0x88, 0x86, + 0x86, 0x84, 0x84, 0x82, 0x82, 0x7F, 0x81, 0x6F, 0x63, 0x68, 0x67, 0x6A, + 0x6A, 0x6D, 0x6D, 0x6F, 0x70, 0x72, 0x73, 0x75, 0x75, 0x77, 0x78, 0x7A, + 0x7A, 0x7C, 0x7C, 0x7E, 0x7D, 0x84, 0x9A, 0x98, 0x97, 0x95, 0x94, 0x93, + 0x92, 0x90, 0x8F, 0x8E, 0x8C, 0x8B, 0x8A, 0x89, 0x88, 0x87, 0x85, 0x85, + 0x83, 0x84, 0x81, 0x83, 0x6F, 0x65, 0x69, 0x69, 0x6C, 0x6C, 0x6E, 0x6E, + 0x70, 0x71, 0x73, 0x73, 0x75, 0x76, 0x77, 0x78, 0x79, 0x79, 0x7B, 0x7B, + 0x7E, 0x7B, 0x87, 0x9A, 0x96, 0x96, 0x93, 0x93, 0x91, 0x90, 0x8E, 0x8D, + 0x8C, 0x8B, 0x89, 0x89, 0x87, 0x86, 0x85, 0x84, 0x84, 0x83, 0x82, 0x81, + 0x81, 0x6B, 0x65, 0x69, 0x69, 0x6C, 0x6C, 0x6F, 0x6F, 0x72, 0x72, 0x74, + 0x75, 0x77, 0x77, 0x79, 0x79, 0x7B, 0x7B, 0x7D, 0x7D, 0x7F, 0x7D, 0x85, + 0x9B, 0x98, 0x97, 0x96, 0x94, 0x93, 0x91, 0x90, 0x8E, 0x8D, 0x8B, 0x8A, + 0x88, 0x88, 0x86, 0x85, 0x83, 0x83, 0x81, 0x82, 0x7F, 0x82, 0x76, 0x62, + 0x67, 0x67, 0x69, 0x6A, 0x6C, 0x6D, 0x6F, 0x70, 0x72, 0x73, 0x74, 0x76, + 0x77, 0x79, 0x79, 0x7B, 0x7B, 0x7D, 0x7D, 0x80, 0x7D, 0x8D, 0x9D, 0x98, + 0x99, 0x96, 0x96, 0x93, 0x92, 0x91, 0x90, 0x8E, 0x8D, 0x8B, 0x8A, 0x89, + 0x87, 0x87, 0x85, 0x84, 0x82, 0x83, 0x80, 0x82, 0x6F, 0x62, 0x68, 0x67, + 0x6A, 0x6A, 0x6C, 0x6D, 0x6F, 0x6F, 0x71, 0x72, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7A, 0x7C, 0x7C, 0x7E, 0x7D, 0x93, 0x9B, 0x97, 0x97, 0x94, + 0x94, 0x92, 0x92, 0x90, 0x8F, 0x8D, 0x8D, 0x8B, 0x8A, 0x89, 0x88, 0x86, + 0x86, 0x84, 0x84, 0x82, 0x83, 0x7E, 0x67, 0x67, 0x68, 0x6A, 0x6B, 0x6C, + 0x6E, 0x6F, 0x70, 0x71, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, + 0x7B, 0x7B, 0x7D, 0x7C, 0x92, 0x9A, 0x96, 0x96, 0x93, 0x93, 0x91, 0x90, + 0x8E, 0x8D, 0x8C, 0x8B, 0x8A, 0x89, 0x87, 0x87, 0x85, 0x85, 0x83, 0x84, + 0x81, 0x84, 0x70, 0x64, 0x69, 0x68, 0x6B, 0x6B, 0x6E, 0x6E, 0x70, 0x71, + 0x73, 0x74, 0x75, 0x76, 0x78, 0x79, 0x7A, 0x7A, 0x7C, 0x7C, 0x7F, 0x7C, + 0x8F, 0x9C, 0x97, 0x98, 0x95, 0x94, 0x92, 0x91, 0x90, 0x8E, 0x8D, 0x8C, + 0x8A, 0x89, 0x88, 0x87, 0x85, 0x85, 0x83, 0x83, 0x80, 0x83, 0x71, 0x62, + 0x67, 0x67, 0x69, 0x6A, 0x6C, 0x6D, 0x6E, 0x70, 0x71, 0x72, 0x74, 0x75, + 0x76, 0x77, 0x79, 0x79, 0x7B, 0x7B, 0x7E, 0x7B, 0x8F, 0x9D, 0x97, 0x98, + 0x95, 0x95, 0x93, 0x92, 0x91, 0x8F, 0x8E, 0x8D, 0x8C, 0x8A, 0x89, 0x88, + 0x87, 0x86, 0x85, 0x84, 0x82, 0x84, 0x70, 0x63, 0x69, 0x67, 0x6A, 0x6A, + 0x6D, 0x6D, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x75, 0x75, 0x77, 0x77, 0x79, + 0x79, 0x7B, 0x7A, 0x80, 0x97, 0x98, 0x96, 0x96, 0x93, 0x93, 0x91, 0x91, + 0x8E, 0x8E, 0x8C, 0x8C, 0x8A, 0x8A, 0x88, 0x87, 0x86, 0x85, 0x85, 0x83, + 0x85, 0x70, 0x64, 0x6A, 0x68, 0x6C, 0x6B, 0x6E, 0x6E, 0x70, 0x71, 0x73, + 0x74, 0x75, 0x76, 0x77, 0x78, 0x78, 0x7B, 0x7A, 0x7D, 0x7A, 0x88, 0x9B, + 0x97, 0x97, 0x95, 0x94, 0x92, 0x91, 0x90, 0x8E, 0x8D, 0x8B, 0x8B, 0x89, + 0x89, 0x86, 0x87, 0x84, 0x85, 0x82, 0x84, 0x7D, 0x65, 0x65, 0x68, 0x68, + 0x6A, 0x6B, 0x6D, 0x6E, 0x70, 0x70, 0x73, 0x73, 0x75, 0x75, 0x77, 0x78, + 0x7A, 0x7A, 0x7C, 0x7C, 0x7E, 0x97, 0x9B, 0x97, 0x98, 0x95, 0x95, 0x92, + 0x92, 0x90, 0x8F, 0x8D, 0x8D, 0x8B, 0x8A, 0x89, 0x88, 0x87, 0x86, 0x85, + 0x83, 0x84, 0x6D, 0x64, 0x69, 0x67, 0x6A, 0x6A, 0x6D, 0x6D, 0x6F, 0x6F, + 0x71, 0x72, 0x73, 0x74, 0x75, 0x77, 0x77, 0x79, 0x79, 0x7C, 0x79, 0x8C, + 0x9B, 0x96, 0x97, 0x95, 0x94, 0x93, 0x91, 0x90, 0x8F, 0x8E, 0x8C, 0x8C, + 0x8A, 0x8A, 0x88, 0x88, 0x86, 0x86, 0x84, 0x84, 0x82, 0x69, 0x65, 0x69, + 0x68, 0x6B, 0x6B, 0x6E, 0x6E, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, + 0x78, 0x78, 0x7A, 0x79, 0x7D, 0x79, 0x87, 0x9C, 0x97, 0x97, 0x95, 0x94, + 0x93, 0x91, 0x91, 0x8F, 0x8E, 0x8C, 0x8C, 0x8A, 0x89, 0x88, 0x87, 0x86, + 0x85, 0x84, 0x83, 0x84, 0x6E, 0x63, 0x68, 0x67, 0x6A, 0x6A, 0x6C, 0x6D, + 0x6F, 0x70, 0x71, 0x73, 0x74, 0x75, 0x76, 0x78, 0x78, 0x7A, 0x7A, 0x7C, + 0x7B, 0x80, 0x99, 0x9B, 0x98, 0x98, 0x95, 0x95, 0x93, 0x92, 0x90, 0x90, + 0x8E, 0x8D, 0x8B, 0x8A, 0x89, 0x88, 0x87, 0x85, 0x86, 0x83, 0x86, 0x73, + 0x62, 0x67, 0x67, 0x69, 0x6A, 0x6B, 0x6C, 0x6E, 0x6F, 0x70, 0x72, 0x72, + 0x74, 0x74, 0x77, 0x76, 0x79, 0x78, 0x7B, 0x7A, 0x7E, 0x98, 0x9A, 0x97, + 0x97, 0x95, 0x95, 0x92, 0x92, 0x90, 0x90, 0x8E, 0x8D, 0x8C, 0x8B, 0x8A, + 0x88, 0x88, 0x86, 0x87, 0x83, 0x87, 0x77, 0x63, 0x68, 0x67, 0x6A, 0x6A, + 0x6C, 0x6D, 0x6E, 0x70, 0x70, 0x72, 0x72, 0x75, 0x74, 0x77, 0x76, 0x79, + 0x78, 0x7B, 0x7A, 0x7E, 0x98, 0x9A, 0x97, 0x97, 0x94, 0x94, 0x92, 0x91, + 0x90, 0x8F, 0x8D, 0x8C, 0x8B, 0x8A, 0x89, 0x88, 0x88, 0x85, 0x86, 0x83, + 0x86, 0x7B, 0x63, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6D, 0x6E, 0x6F, 0x70, + 0x72, 0x73, 0x74, 0x75, 0x76, 0x78, 0x78, 0x7A, 0x79, 0x7D, 0x79, 0x8B, + 0x9D, 0x98, 0x99, 0x96, 0x96, 0x94, 0x93, 0x91, 0x90, 0x8F, 0x8E, 0x8C, + 0x8B, 0x8A, 0x89, 0x88, 0x87, 0x85, 0x86, 0x83, 0x86, 0x75, 0x62, 0x67, + 0x66, 0x68, 0x69, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x74, + 0x75, 0x77, 0x77, 0x79, 0x79, 0x7C, 0x79, 0x8C, 0x9D, 0x98, 0x99, 0x96, + 0x96, 0x94, 0x93, 0x92, 0x91, 0x90, 0x8E, 0x8D, 0x8C, 0x8B, 0x8A, 0x89, + 0x88, 0x86, 0x86, 0x84, 0x86, 0x70, 0x62, 0x68, 0x67, 0x69, 0x6A, 0x6C, + 0x6C, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x74, 0x74, 0x76, 0x76, 0x77, 0x79, + 0x79, 0x7B, 0x79, 0x90, 0x9D, 0x97, 0x98, 0x95, 0x95, 0x93, 0x93, 0x91, + 0x90, 0x8F, 0x8D, 0x8D, 0x8B, 0x8B, 0x89, 0x89, 0x87, 0x87, 0x85, 0x85, + 0x83, 0x69, 0x64, 0x68, 0x67, 0x6A, 0x6A, 0x6C, 0x6C, 0x6F, 0x6F, 0x71, + 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x79, 0x78, 0x7B, 0x78, 0x8B, 0x9D, + 0x98, 0x99, 0x96, 0x96, 0x94, 0x93, 0x91, 0x90, 0x8F, 0x8D, 0x8D, 0x8B, + 0x8B, 0x89, 0x89, 0x86, 0x87, 0x84, 0x87, 0x7B, 0x63, 0x66, 0x66, 0x68, + 0x69, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x71, 0x73, 0x73, 0x76, 0x75, + 0x78, 0x77, 0x7B, 0x78, 0x83, 0x9C, 0x99, 0x98, 0x97, 0x96, 0x95, 0x93, + 0x92, 0x90, 0x90, 0x8E, 0x8E, 0x8C, 0x8C, 0x8A, 0x8A, 0x87, 0x88, 0x85, + 0x86, 0x82, 0x67, 0x65, 0x67, 0x67, 0x6A, 0x6A, 0x6C, 0x6C, 0x6E, 0x6E, + 0x71, 0x71, 0x73, 0x73, 0x75, 0x75, 0x77, 0x77, 0x79, 0x79, 0x7C, 0x97, + 0x9A, 0x97, 0x97, 0x95, 0x95, 0x93, 0x92, 0x90, 0x90, 0x8E, 0x8E, 0x8C, + 0x8C, 0x8A, 0x8A, 0x88, 0x88, 0x86, 0x86, 0x84, 0x69, 0x64, 0x68, 0x67, + 0x6A, 0x6A, 0x6C, 0x6C, 0x6F, 0x6F, 0x71, 0x71, 0x73, 0x73, 0x75, 0x75, + 0x78, 0x77, 0x7A, 0x79, 0x7E, 0x99, 0x9A, 0x98, 0x97, 0x96, 0x95, 0x93, + 0x92, 0x91, 0x90, 0x8E, 0x8E, 0x8C, 0x8C, 0x89, 0x8A, 0x87, 0x88, 0x84, + 0x88, 0x75, 0x62, 0x67, 0x66, 0x69, 0x69, 0x6B, 0x6B, 0x6D, 0x6E, 0x70, + 0x70, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x79, 0x78, 0x7D, 0x99, 0x9A, + 0x98, 0x97, 0x96, 0x95, 0x93, 0x93, 0x91, 0x90, 0x8F, 0x8E, 0x8C, 0x8C, + 0x8A, 0x8A, 0x88, 0x89, 0x85, 0x89, 0x72, 0x62, 0x68, 0x67, 0x6A, 0x69, + 0x6C, 0x6C, 0x6E, 0x6E, 0x70, 0x70, 0x72, 0x72, 0x74, 0x74, 0x77, 0x76, + 0x79, 0x76, 0x82, 0x9C, 0x98, 0x98, 0x96, 0x95, 0x94, 0x93, 0x91, 0x91, + 0x8F, 0x8E, 0x8D, 0x8C, 0x8B, 0x8A, 0x89, 0x88, 0x87, 0x86, 0x85, 0x68, + 0x64, 0x67, 0x68, 0x6A, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x71, 0x73, + 0x73, 0x75, 0x75, 0x78, 0x77, 0x7A, 0x77, 0x8E, 0x9D, 0x97, 0x99, 0x96, + 0x96, 0x94, 0x94, 0x91, 0x91, 0x8F, 0x8F, 0x8D, 0x8C, 0x8B, 0x8A, 0x88, + 0x88, 0x86, 0x87, 0x82, 0x66, 0x64, 0x67, 0x67, 0x69, 0x69, 0x6B, 0x6C, + 0x6E, 0x6E, 0x70, 0x70, 0x72, 0x72, 0x75, 0x74, 0x77, 0x76, 0x79, 0x77, + 0x82, 0x9C, 0x99, 0x99, 0x97, 0x96, 0x95, 0x94, 0x93, 0x91, 0x91, 0x8F, + 0x8F, 0x8D, 0x8D, 0x8B, 0x8B, 0x88, 0x89, 0x86, 0x89, 0x76, 0x62, 0x68, + 0x66, 0x69, 0x69, 0x6B, 0x6B, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, + 0x75, 0x75, 0x77, 0x77, 0x79, 0x77, 0x90, 0x9D, 0x97, 0x99, 0x95, 0x96, + 0x93, 0x93, 0x91, 0x91, 0x8F, 0x8F, 0x8D, 0x8D, 0x8B, 0x8B, 0x89, 0x89, + 0x87, 0x87, 0x83, 0x66, 0x65, 0x67, 0x67, 0x69, 0x6A, 0x6C, 0x6C, 0x6E, + 0x6E, 0x70, 0x71, 0x73, 0x73, 0x75, 0x75, 0x77, 0x76, 0x7A, 0x76, 0x86, + 0x9E, 0x99, 0x9A, 0x97, 0x97, 0x95, 0x94, 0x93, 0x91, 0x90, 0x8F, 0x8E, + 0x8D, 0x8C, 0x8A, 0x8A, 0x88, 0x89, 0x85, 0x89, 0x75, 0x61, 0x67, 0x65, + 0x68, 0x68, 0x6A, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x74, + 0x74, 0x76, 0x76, 0x79, 0x76, 0x8E, 0x9E, 0x98, 0x99, 0x96, 0x97, 0x94, + 0x94, 0x92, 0x92, 0x90, 0x8F, 0x8E, 0x8D, 0x8D, 0x8B, 0x8B, 0x89, 0x8A, + 0x86, 0x8A, 0x78, 0x62, 0x67, 0x66, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6E, + 0x6E, 0x70, 0x70, 0x72, 0x72, 0x74, 0x74, 0x76, 0x75, 0x79, 0x76, 0x81, + 0x9C, 0x99, 0x99, 0x97, 0x96, 0x95, 0x94, 0x93, 0x91, 0x91, 0x8F, 0x8F, + 0x8D, 0x8D, 0x8A, 0x8B, 0x88, 0x89, 0x86, 0x88, 0x80, 0x64, 0x65, 0x66, + 0x67, 0x69, 0x69, 0x6B, 0x6C, 0x6E, 0x6E, 0x70, 0x70, 0x72, 0x72, 0x75, + 0x74, 0x77, 0x76, 0x79, 0x77, 0x7E, 0x9B, 0x9B, 0x99, 0x99, 0x97, 0x96, + 0x94, 0x94, 0x92, 0x92, 0x8F, 0x8F, 0x8D, 0x8D, 0x8B, 0x8B, 0x89, 0x89, + 0x86, 0x88, 0x82, 0x65, 0x63, 0x66, 0x66, 0x68, 0x68, 0x6A, 0x6A, 0x6D, + 0x6D, 0x6F, 0x6F, 0x71, 0x71, 0x73, 0x73, 0x75, 0x75, 0x78, 0x77, 0x7B, + 0x99, 0x9C, 0x99, 0x99, 0x97, 0x97, 0x94, 0x95, 0x92, 0x92, 0x90, 0x90, + 0x8E, 0x8E, 0x8C, 0x8C, 0x8A, 0x8A, 0x88, 0x88, 0x85, 0x68, 0x63, 0x67, + 0x66, 0x69, 0x68, 0x6B, 0x6B, 0x6D, 0x6D, 0x6F, 0x6F, 0x71, 0x71, 0x73, + 0x73, 0x75, 0x75, 0x77, 0x76, 0x7D, 0x9A, 0x9A, 0x99, 0x98, 0x96, 0x95, + 0x94, 0x93, 0x92, 0x91, 0x8F, 0x8F, 0x8D, 0x8D, 0x8B, 0x8B, 0x89, 0x8A, + 0x87, 0x8A, 0x72, 0x61, 0x67, 0x66, 0x69, 0x68, 0x6B, 0x6B, 0x6D, 0x6D, + 0x70, 0x70, 0x72, 0x72, 0x74, 0x74, 0x76, 0x75, 0x78, 0x76, 0x7E, 0x9C, + 0x9A, 0x9A, 0x98, 0x97, 0x96, 0x95, 0x94, 0x92, 0x91, 0x90, 0x8F, 0x8E, + 0x8D, 0x8B, 0x8B, 0x89, 0x89, 0x87, 0x88, 0x6B, 0x62, 0x66, 0x65, 0x68, + 0x68, 0x6A, 0x6A, 0x6C, 0x6D, 0x6F, 0x6F, 0x71, 0x71, 0x73, 0x73, 0x75, + 0x74, 0x78, 0x74, 0x8B, 0x9E, 0x98, 0x9A, 0x97, 0x97, 0x95, 0x95, 0x93, + 0x93, 0x91, 0x91, 0x8F, 0x8F, 0x8D, 0x8D, 0x8A, 0x8B, 0x88, 0x8B, 0x7C, + 0x62, 0x67, 0x66, 0x68, 0x68, 0x6A, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, + 0x71, 0x72, 0x72, 0x74, 0x74, 0x76, 0x76, 0x7A, 0x99, 0x9B, 0x98, 0x98, + 0x96, 0x96, 0x94, 0x93, 0x92, 0x91, 0x90, 0x8F, 0x8E, 0x8D, 0x8C, 0x8B, + 0x8B, 0x89, 0x8A, 0x84, 0x66, 0x64, 0x67, 0x67, 0x69, 0x69, 0x6B, 0x6C, + 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x73, 0x73, 0x75, 0x75, 0x78, 0x75, 0x7F, + 0x9C, 0x9B, 0x99, 0x99, 0x97, 0x97, 0x94, 0x94, 0x92, 0x92, 0x90, 0x8F, + 0x8E, 0x8D, 0x8C, 0x8A, 0x8B, 0x87, 0x8B, 0x75, 0x60, 0x67, 0x65, 0x68, + 0x68, 0x69, 0x6A, 0x6B, 0x6D, 0x6D, 0x6F, 0x6F, 0x71, 0x71, 0x73, 0x73, + 0x75, 0x75, 0x78, 0x96, 0x9C, 0x98, 0x99, 0x96, 0x97, 0x94, 0x94, 0x92, + 0x92, 0x91, 0x90, 0x8F, 0x8E, 0x8D, 0x8B, 0x8C, 0x88, 0x8C, 0x7C, 0x62, + 0x67, 0x66, 0x68, 0x69, 0x6A, 0x6B, 0x6B, 0x6E, 0x6D, 0x70, 0x6F, 0x72, + 0x71, 0x74, 0x73, 0x75, 0x75, 0x77, 0x95, 0x9C, 0x97, 0x99, 0x96, 0x96, + 0x94, 0x93, 0x92, 0x91, 0x90, 0x8F, 0x8E, 0x8C, 0x8D, 0x8A, 0x8B, 0x87, + 0x8B, 0x7B, 0x61, 0x65, 0x65, 0x67, 0x68, 0x69, 0x6B, 0x6B, 0x6D, 0x6D, + 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x77, 0x75, 0x92, 0x9E, 0x99, + 0x9A, 0x97, 0x97, 0x96, 0x95, 0x94, 0x92, 0x92, 0x90, 0x90, 0x8E, 0x8D, + 0x8C, 0x8B, 0x8A, 0x89, 0x88, 0x69, 0x62, 0x66, 0x65, 0x68, 0x68, 0x69, + 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x71, 0x72, 0x73, 0x74, 0x75, + 0x76, 0x95, 0x9C, 0x98, 0x99, 0x97, 0x97, 0x95, 0x95, 0x93, 0x92, 0x91, + 0x90, 0x90, 0x8E, 0x8E, 0x8C, 0x8C, 0x8A, 0x8A, 0x87, 0x68, 0x63, 0x67, + 0x66, 0x69, 0x69, 0x6B, 0x6B, 0x6D, 0x6E, 0x6E, 0x70, 0x70, 0x72, 0x72, + 0x74, 0x73, 0x76, 0x74, 0x7C, 0x9B, 0x9B, 0x99, 0x98, 0x97, 0x96, 0x95, + 0x94, 0x92, 0x91, 0x90, 0x8F, 0x8F, 0x8D, 0x8D, 0x8B, 0x8B, 0x88, 0x8A, + 0x82, 0x63, 0x64, 0x65, 0x66, 0x68, 0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, + 0x6F, 0x70, 0x72, 0x72, 0x74, 0x73, 0x77, 0x74, 0x80, 0x9D, 0x9A, 0x9A, + 0x99, 0x98, 0x97, 0x96, 0x94, 0x94, 0x92, 0x91, 0x90, 0x90, 0x8E, 0x8E, + 0x8C, 0x8C, 0x89, 0x8C, 0x80, 0x62, 0x66, 0x65, 0x67, 0x67, 0x69, 0x6A, + 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x6F, 0x71, 0x71, 0x73, 0x73, 0x75, 0x74, + 0x7B, 0x9B, 0x9A, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, + 0x90, 0x8F, 0x8F, 0x8D, 0x8D, 0x8B, 0x8B, 0x89, 0x8B, 0x6D, 0x62, 0x67, + 0x66, 0x69, 0x68, 0x6B, 0x6A, 0x6D, 0x6D, 0x6F, 0x6F, 0x71, 0x70, 0x73, + 0x72, 0x75, 0x73, 0x77, 0x73, 0x88, 0x9E, 0x99, 0x9A, 0x97, 0x97, 0x95, + 0x95, 0x93, 0x93, 0x91, 0x91, 0x8F, 0x8F, 0x8D, 0x8D, 0x8A, 0x8C, 0x88, + 0x8C, 0x7C, 0x61, 0x65, 0x65, 0x67, 0x67, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, + 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x74, 0x73, 0x76, 0x73, 0x8A, 0x9F, 0x98, + 0x9A, 0x97, 0x98, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 0x8E, 0x8F, + 0x8C, 0x8D, 0x8A, 0x8C, 0x83, 0x65, 0x65, 0x67, 0x67, 0x69, 0x69, 0x6B, + 0x6A, 0x6D, 0x6C, 0x6F, 0x6E, 0x71, 0x70, 0x73, 0x71, 0x75, 0x72, 0x7A, + 0x99, 0x9A, 0x98, 0x98, 0x96, 0x96, 0x93, 0x94, 0x92, 0x92, 0x90, 0x90, + 0x8E, 0x8E, 0x8C, 0x8C, 0x8B, 0x8A, 0x89, 0x6B, 0x63, 0x68, 0x66, 0x69, + 0x68, 0x6B, 0x6B, 0x6D, 0x6D, 0x6F, 0x6F, 0x71, 0x71, 0x73, 0x73, 0x74, + 0x75, 0x75, 0x93, 0x9D, 0x98, 0x99, 0x96, 0x97, 0x94, 0x94, 0x92, 0x92, + 0x91, 0x90, 0x8F, 0x8D, 0x8D, 0x8B, 0x8C, 0x88, 0x8D, 0x7A, 0x61, 0x66, + 0x65, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6D, 0x6D, 0x6F, 0x6E, 0x71, 0x70, + 0x73, 0x72, 0x75, 0x74, 0x79, 0x97, 0x9B, 0x98, 0x99, 0x96, 0x97, 0x95, + 0x95, 0x93, 0x93, 0x91, 0x91, 0x90, 0x8E, 0x8E, 0x8C, 0x8D, 0x89, 0x8E, + 0x7B, 0x62, 0x67, 0x66, 0x68, 0x69, 0x6A, 0x6B, 0x6B, 0x6D, 0x6D, 0x6F, + 0x6F, 0x71, 0x70, 0x73, 0x72, 0x75, 0x73, 0x78, 0x97, 0x9B, 0x97, 0x98, + 0x96, 0x96, 0x94, 0x94, 0x92, 0x92, 0x90, 0x90, 0x8F, 0x8E, 0x8D, 0x8B, + 0x8C, 0x89, 0x8D, 0x7A, 0x62, 0x67, 0x66, 0x68, 0x69, 0x6A, 0x6B, 0x6B, + 0x6D, 0x6D, 0x6F, 0x6F, 0x71, 0x71, 0x73, 0x72, 0x75, 0x74, 0x79, 0x97, + 0x9C, 0x98, 0x99, 0x96, 0x97, 0x94, 0x95, 0x92, 0x93, 0x91, 0x90, 0x8F, + 0x8E, 0x8D, 0x8C, 0x8C, 0x89, 0x8D, 0x74, 0x61, 0x67, 0x65, 0x68, 0x68, + 0x6A, 0x6A, 0x6B, 0x6C, 0x6D, 0x6F, 0x6E, 0x71, 0x70, 0x73, 0x71, 0x75, + 0x72, 0x7D, 0x9A, 0x99, 0x98, 0x98, 0x96, 0x96, 0x94, 0x94, 0x92, 0x92, + 0x90, 0x91, 0x8F, 0x8F, 0x8D, 0x8D, 0x8C, 0x8B, 0x8C, 0x6F, 0x63, 0x68, + 0x66, 0x6A, 0x68, 0x6B, 0x6B, 0x6D, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x71, + 0x73, 0x72, 0x76, 0x71, 0x88, 0x9D, 0x97, 0x99, 0x96, 0x96, 0x95, 0x94, + 0x93, 0x92, 0x91, 0x8F, 0x90, 0x8D, 0x8E, 0x8B, 0x8D, 0x89, 0x8C, 0x83, + 0x65, 0x65, 0x67, 0x67, 0x69, 0x69, 0x6B, 0x6A, 0x6D, 0x6C, 0x6F, 0x6E, + 0x71, 0x70, 0x72, 0x72, 0x74, 0x74, 0x76, 0x95, 0x9C, 0x97, 0x99, 0x96, + 0x97, 0x94, 0x95, 0x93, 0x93, 0x91, 0x91, 0x8F, 0x8E, 0x8E, 0x8C, 0x8D, + 0x89, 0x8D, 0x78, 0x62, 0x68, 0x66, 0x68, 0x68, 0x6A, 0x6A, 0x6B, 0x6D, + 0x6D, 0x6F, 0x6E, 0x71, 0x70, 0x73, 0x71, 0x75, 0x71, 0x7F, 0x9B, 0x98, + 0x98, 0x97, 0x96, 0x96, 0x94, 0x94, 0x92, 0x92, 0x90, 0x91, 0x8E, 0x8F, + 0x8D, 0x8D, 0x8C, 0x8B, 0x8A, 0x6C, 0x63, 0x68, 0x67, 0x6A, 0x69, 0x6B, + 0x6B, 0x6D, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x71, 0x73, 0x72, 0x76, 0x72, + 0x7F, 0x9C, 0x99, 0x98, 0x98, 0x96, 0x96, 0x94, 0x94, 0x92, 0x92, 0x90, + 0x90, 0x8F, 0x8E, 0x8D, 0x8C, 0x8C, 0x8A, 0x8C, 0x72, 0x62, 0x68, 0x66, + 0x69, 0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6D, 0x6F, 0x6F, 0x71, 0x71, 0x72, + 0x72, 0x74, 0x74, 0x76, 0x94, 0x9C, 0x97, 0x99, 0x96, 0x97, 0x95, 0x95, + 0x93, 0x93, 0x91, 0x91, 0x90, 0x8F, 0x8F, 0x8C, 0x8E, 0x8A, 0x8E, 0x7F, + 0x63, 0x67, 0x67, 0x68, 0x69, 0x69, 0x6B, 0x6B, 0x6D, 0x6D, 0x6F, 0x6E, + 0x70, 0x70, 0x72, 0x72, 0x73, 0x75, 0x72, 0x8E, 0x9D, 0x97, 0x99, 0x96, + 0x96, 0x94, 0x94, 0x93, 0x92, 0x91, 0x90, 0x90, 0x8E, 0x8F, 0x8C, 0x8D, + 0x8A, 0x8D, 0x84, 0x66, 0x65, 0x67, 0x67, 0x69, 0x69, 0x6B, 0x6B, 0x6D, + 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x71, 0x73, 0x72, 0x75, 0x71, 0x88, 0x9D, + 0x97, 0x99, 0x96, 0x96, 0x95, 0x94, 0x93, 0x92, 0x92, 0x90, 0x90, 0x8E, + 0x8F, 0x8C, 0x8D, 0x8B, 0x8B, 0x89, 0x6A, 0x63, 0x68, 0x66, 0x69, 0x68, + 0x6B, 0x6A, 0x6C, 0x6C, 0x6E, 0x6E, 0x6F, 0x70, 0x71, 0x73, 0x72, 0x75, + 0x71, 0x83, 0x9C, 0x98, 0x99, 0x97, 0x96, 0x95, 0x94, 0x94, 0x92, 0x92, + 0x90, 0x91, 0x8F, 0x8F, 0x8D, 0x8E, 0x8B, 0x8C, 0x89, 0x6B, 0x64, 0x68, + 0x67, 0x6A, 0x69, 0x6B, 0x6B, 0x6D, 0x6D, 0x6E, 0x6F, 0x70, 0x70, 0x71, + 0x73, 0x72, 0x75, 0x71, 0x87, 0x9D, 0x97, 0x99, 0x96, 0x96, 0x95, 0x94, + 0x93, 0x92, 0x92, 0x90, 0x90, 0x8E, 0x8F, 0x8D, 0x8D, 0x8B, 0x8C, 0x87, + 0x69, 0x65, 0x68, 0x67, 0x6A, 0x69, 0x6B, 0x6B, 0x6D, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x71, 0x73, 0x72, 0x75, 0x72, 0x89, 0x9D, 0x97, 0x99, 0x96, + 0x96, 0x95, 0x94, 0x93, 0x92, 0x92, 0x90, 0x90, 0x8E, 0x8F, 0x8C, 0x8E, + 0x8A, 0x8E, 0x81, 0x65, 0x67, 0x67, 0x68, 0x69, 0x69, 0x6B, 0x6B, 0x6D, + 0x6D, 0x6F, 0x6E, 0x70, 0x70, 0x72, 0x72, 0x73, 0x74, 0x75, 0x93, 0x9B, + 0x97, 0x99, 0x96, 0x96, 0x94, 0x94, 0x93, 0x93, 0x91, 0x91, 0x90, 0x8F, + 0x8F, 0x8D, 0x8E, 0x8A, 0x8E, 0x79, 0x62, 0x68, 0x66, 0x69, 0x69, 0x6A, + 0x6B, 0x6C, 0x6D, 0x6D, 0x6F, 0x6F, 0x70, 0x70, 0x72, 0x71, 0x75, 0x70, + 0x83, 0x9C, 0x97, 0x98, 0x96, 0x96, 0x94, 0x94, 0x93, 0x92, 0x91, 0x90, + 0x90, 0x8F, 0x8F, 0x8D, 0x8E, 0x8A, 0x8E, 0x75, 0x63, 0x69, 0x67, 0x6A, + 0x69, 0x6B, 0x6B, 0x6D, 0x6D, 0x6E, 0x6E, 0x70, 0x70, 0x71, 0x72, 0x73, + 0x74, 0x74, 0x93, 0x9B, 0x96, 0x98, 0x95, 0x96, 0x94, 0x94, 0x92, 0x92, + 0x90, 0x91, 0x8F, 0x8F, 0x8D, 0x8E, 0x8B, 0x8E, 0x83, 0x65, 0x67, 0x67, + 0x68, 0x69, 0x6A, 0x6B, 0x6B, 0x6D, 0x6D, 0x6F, 0x6E, 0x70, 0x70, 0x72, + 0x71, 0x75, 0x70, 0x86, 0x9C, 0x96, 0x98, 0x95, 0x96, 0x94, 0x94, 0x93, + 0x93, 0x91, 0x91, 0x90, 0x8F, 0x8E, 0x8D, 0x8D, 0x8B, 0x8C, 0x6E, 0x64, + 0x69, 0x67, 0x6A, 0x69, 0x6B, 0x6B, 0x6D, 0x6D, 0x6F, 0x6E, 0x70, 0x70, + 0x72, 0x71, 0x74, 0x71, 0x7A, 0x99, 0x98, 0x97, 0x97, 0x95, 0x95, 0x94, + 0x94, 0x92, 0x92, 0x90, 0x91, 0x8E, 0x8F, 0x8D, 0x8E, 0x8A, 0x8F, 0x7B, + 0x63, 0x69, 0x67, 0x6A, 0x69, 0x6B, 0x6B, 0x6D, 0x6D, 0x6E, 0x6E, 0x70, + 0x70, 0x71, 0x72, 0x73, 0x73, 0x74, 0x93, 0x9A, 0x97, 0x98, 0x95, 0x96, + 0x94, 0x94, 0x92, 0x93, 0x90, 0x91, 0x8F, 0x90, 0x8D, 0x8E, 0x8B, 0x8E, + 0x81, 0x64, 0x68, 0x67, 0x69, 0x69, 0x6A, 0x6B, 0x6C, 0x6C, 0x6D, 0x6E, + 0x6F, 0x70, 0x70, 0x72, 0x71, 0x74, 0x71, 0x8F, 0x9B, 0x96, 0x98, 0x95, + 0x96, 0x93, 0x94, 0x92, 0x93, 0x91, 0x91, 0x8F, 0x90, 0x8D, 0x8E, 0x8B, + 0x8E, 0x84, 0x66, 0x68, 0x68, 0x69, 0x6A, 0x6A, 0x6B, 0x6C, 0x6D, 0x6D, + 0x6F, 0x6F, 0x70, 0x70, 0x72, 0x71, 0x74, 0x70, 0x89, 0x9C, 0x96, 0x98, + 0x95, 0x96, 0x93, 0x94, 0x92, 0x92, 0x90, 0x91, 0x8F, 0x8F, 0x8D, 0x8E, + 0x8B, 0x8D, 0x85, 0x66, 0x67, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, + 0x6D, 0x6E, 0x6F, 0x70, 0x70, 0x72, 0x71, 0x74, 0x71, 0x8F, 0x9B, 0x96, + 0x98, 0x95, 0x96, 0x94, 0x94, 0x92, 0x93, 0x91, 0x91, 0x8F, 0x90, 0x8D, + 0x8F, 0x8B, 0x8F, 0x76, 0x64, 0x69, 0x67, 0x6A, 0x69, 0x6B, 0x6B, 0x6D, + 0x6C, 0x6E, 0x6E, 0x70, 0x6F, 0x72, 0x70, 0x74, 0x6F, 0x84, 0x9B, 0x96, + 0x97, 0x95, 0x95, 0x94, 0x93, 0x92, 0x92, 0x91, 0x90, 0x8F, 0x8F, 0x8E, + 0x8E, 0x8B, 0x8F, 0x73, 0x64, 0x6A, 0x68, 0x6B, 0x6A, 0x6C, 0x6C, 0x6D, + 0x6E, 0x6F, 0x6F, 0x70, 0x71, 0x72, 0x72, 0x74, 0x71, 0x8E, 0x9B, 0x96, + 0x98, 0x95, 0x96, 0x94, 0x94, 0x93, 0x92, 0x91, 0x90, 0x90, 0x8F, 0x8E, + 0x8D, 0x8C, 0x8C, 0x6D, 0x65, 0x69, 0x68, 0x6A, 0x6A, 0x6B, 0x6B, 0x6C, + 0x6D, 0x6E, 0x6F, 0x6F, 0x70, 0x70, 0x72, 0x72, 0x75, 0x95, 0x99, 0x96, + 0x97, 0x95, 0x95, 0x94, 0x93, 0x92, 0x92, 0x91, 0x90, 0x90, 0x8E, 0x8F, + 0x8C, 0x8F, 0x84, 0x66, 0x68, 0x69, 0x69, 0x6A, 0x6B, 0x6C, 0x6C, 0x6D, + 0x6E, 0x6F, 0x70, 0x70, 0x72, 0x70, 0x74, 0x6F, 0x83, 0x9B, 0x96, 0x97, + 0x95, 0x95, 0x94, 0x93, 0x92, 0x91, 0x91, 0x90, 0x8F, 0x8F, 0x8D, 0x8E, + 0x8B, 0x8E, 0x74, 0x63, 0x69, 0x67, 0x6A, 0x69, 0x6B, 0x6B, 0x6C, 0x6D, + 0x6E, 0x6F, 0x6F, 0x70, 0x71, 0x72, 0x72, 0x73, 0x92, 0x9A, 0x96, 0x97, + 0x95, 0x96, 0x94, 0x94, 0x93, 0x92, 0x92, 0x90, 0x90, 0x8F, 0x8F, 0x8D, + 0x8F, 0x88, 0x68, 0x68, 0x69, 0x69, 0x6B, 0x6A, 0x6C, 0x6C, 0x6D, 0x6E, + 0x6E, 0x6F, 0x6F, 0x71, 0x70, 0x73, 0x6F, 0x7E, 0x9A, 0x96, 0x96, 0x95, + 0x94, 0x94, 0x93, 0x93, 0x91, 0x91, 0x90, 0x90, 0x8E, 0x8E, 0x8E, 0x8C, + 0x8E, 0x72, 0x64, 0x6A, 0x68, 0x6A, 0x6A, 0x6C, 0x6C, 0x6D, 0x6E, 0x6E, + 0x70, 0x70, 0x71, 0x71, 0x73, 0x72, 0x75, 0x94, 0x9A, 0x96, 0x98, 0x95, + 0x96, 0x94, 0x94, 0x93, 0x92, 0x91, 0x90, 0x90, 0x8E, 0x8F, 0x8C, 0x90, + 0x7F, 0x65, 0x69, 0x68, 0x69, 0x6A, 0x6B, 0x6B, 0x6C, 0x6D, 0x6D, 0x6E, + 0x6F, 0x6F, 0x71, 0x70, 0x73, 0x6F, 0x87, 0x9B, 0x95, 0x97, 0x94, 0x95, + 0x93, 0x93, 0x92, 0x92, 0x91, 0x91, 0x8F, 0x8F, 0x8E, 0x8F, 0x8C, 0x90, + 0x76, 0x64, 0x6A, 0x68, 0x6B, 0x6A, 0x6C, 0x6C, 0x6E, 0x6D, 0x6F, 0x6F, + 0x70, 0x70, 0x72, 0x71, 0x74, 0x70, 0x8B, 0x9B, 0x95, 0x98, 0x95, 0x96, + 0x93, 0x94, 0x92, 0x92, 0x90, 0x91, 0x8F, 0x8F, 0x8D, 0x8E, 0x8A, 0x8F, + 0x79, 0x63, 0x69, 0x67, 0x69, 0x69, 0x6B, 0x6A, 0x6C, 0x6C, 0x6E, 0x6D, + 0x6F, 0x6F, 0x71, 0x70, 0x73, 0x6F, 0x87, 0x9B, 0x95, 0x98, 0x95, 0x96, + 0x94, 0x94, 0x92, 0x93, 0x91, 0x92, 0x90, 0x91, 0x8E, 0x90, 0x8C, 0x91, + 0x7E, 0x65, 0x6A, 0x68, 0x6B, 0x6A, 0x6C, 0x6C, 0x6D, 0x6D, 0x6F, 0x6E, + 0x70, 0x6F, 0x71, 0x70, 0x74, 0x6F, 0x83, 0x9B, 0x95, 0x97, 0x94, 0x95, + 0x93, 0x93, 0x91, 0x92, 0x90, 0x90, 0x8E, 0x8F, 0x8D, 0x8E, 0x8B, 0x8F, + 0x7A, 0x63, 0x69, 0x67, 0x6A, 0x69, 0x6B, 0x6B, 0x6D, 0x6D, 0x6E, 0x6E, + 0x70, 0x6F, 0x72, 0x70, 0x74, 0x70, 0x87, 0x9C, 0x96, 0x98, 0x96, 0x96, + 0x94, 0x95, 0x93, 0x93, 0x92, 0x92, 0x90, 0x90, 0x8E, 0x8F, 0x8C, 0x90, + 0x77, 0x64, 0x6A, 0x68, 0x6A, 0x6A, 0x6B, 0x6B, 0x6C, 0x6D, 0x6D, 0x6E, + 0x6F, 0x6F, 0x70, 0x70, 0x72, 0x70, 0x8E, 0x99, 0x94, 0x96, 0x94, 0x94, + 0x93, 0x93, 0x91, 0x91, 0x90, 0x90, 0x8F, 0x8F, 0x8E, 0x8E, 0x8C, 0x8D, + 0x6F, 0x66, 0x6A, 0x69, 0x6B, 0x6B, 0x6C, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, + 0x70, 0x71, 0x71, 0x73, 0x72, 0x77, 0x97, 0x98, 0x97, 0x97, 0x95, 0x95, + 0x94, 0x93, 0x93, 0x92, 0x91, 0x90, 0x90, 0x8E, 0x8F, 0x8C, 0x8E, 0x87, + 0x67, 0x67, 0x68, 0x68, 0x69, 0x6A, 0x6B, 0x6B, 0x6C, 0x6D, 0x6D, 0x6E, + 0x6E, 0x70, 0x6F, 0x72, 0x6E, 0x7E, 0x99, 0x95, 0x96, 0x95, 0x95, 0x94, + 0x93, 0x93, 0x92, 0x92, 0x91, 0x90, 0x90, 0x8F, 0x90, 0x8D, 0x91, 0x7A, + 0x65, 0x6B, 0x69, 0x6B, 0x6B, 0x6C, 0x6D, 0x6D, 0x6E, 0x6F, 0x6F, 0x70, + 0x71, 0x71, 0x71, 0x73, 0x71, 0x8E, 0x9A, 0x95, 0x97, 0x94, 0x95, 0x93, + 0x93, 0x92, 0x91, 0x90, 0x8F, 0x8F, 0x8E, 0x8E, 0x8C, 0x8D, 0x89, 0x6A, + 0x66, 0x68, 0x68, 0x6A, 0x69, 0x6B, 0x6B, 0x6C, 0x6D, 0x6D, 0x6F, 0x6F, + 0x70, 0x70, 0x73, 0x70, 0x7B, 0x99, 0x97, 0x97, 0x96, 0x96, 0x95, 0x94, + 0x94, 0x93, 0x92, 0x92, 0x91, 0x91, 0x8F, 0x90, 0x8D, 0x90, 0x84, 0x66, + 0x6A, 0x69, 0x6B, 0x6A, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, 0x6E, 0x6F, 0x6F, + 0x70, 0x70, 0x71, 0x70, 0x77, 0x97, 0x96, 0x96, 0x95, 0x94, 0x93, 0x93, + 0x92, 0x91, 0x91, 0x90, 0x8F, 0x8F, 0x8E, 0x8E, 0x8D, 0x8D, 0x8B, 0x6A, + 0x67, 0x69, 0x69, 0x6A, 0x6B, 0x6C, 0x6C, 0x6D, 0x6E, 0x6F, 0x6F, 0x70, + 0x71, 0x72, 0x72, 0x74, 0x72, 0x91, 0x9A, 0x97, 0x98, 0x96, 0x96, 0x94, + 0x95, 0x93, 0x93, 0x91, 0x92, 0x90, 0x90, 0x8E, 0x8F, 0x8C, 0x8F, 0x73, + 0x65, 0x6A, 0x67, 0x6A, 0x69, 0x6B, 0x6A, 0x6C, 0x6C, 0x6D, 0x6D, 0x6F, + 0x6E, 0x70, 0x6F, 0x72, 0x6E, 0x85, 0x9A, 0x94, 0x96, 0x94, 0x95, 0x93, + 0x93, 0x92, 0x92, 0x91, 0x91, 0x90, 0x90, 0x8E, 0x90, 0x8C, 0x91, 0x78, + 0x65, 0x6B, 0x69, 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, 0x6E, 0x70, 0x6F, 0x71, + 0x70, 0x72, 0x71, 0x74, 0x6F, 0x84, 0x9B, 0x96, 0x98, 0x95, 0x95, 0x94, + 0x94, 0x92, 0x92, 0x90, 0x91, 0x8F, 0x8F, 0x8D, 0x8F, 0x8B, 0x8F, 0x7A, + 0x63, 0x69, 0x67, 0x69, 0x69, 0x6A, 0x6A, 0x6C, 0x6C, 0x6D, 0x6D, 0x6F, + 0x6E, 0x71, 0x6F, 0x73, 0x6E, 0x86, 0x9B, 0x95, 0x97, 0x95, 0x96, 0x94, + 0x94, 0x93, 0x93, 0x92, 0x92, 0x91, 0x91, 0x8F, 0x91, 0x8D, 0x91, 0x79, + 0x66, 0x6B, 0x69, 0x6C, 0x6B, 0x6D, 0x6C, 0x6D, 0x6D, 0x6F, 0x6E, 0x70, + 0x6F, 0x71, 0x70, 0x73, 0x6E, 0x88, 0x9A, 0x94, 0x96, 0x93, 0x94, 0x92, + 0x92, 0x91, 0x91, 0x90, 0x90, 0x8E, 0x8F, 0x8D, 0x8E, 0x8B, 0x8F, 0x74, + 0x64, 0x6A, 0x68, 0x6A, 0x6A, 0x6B, 0x6B, 0x6D, 0x6D, 0x6E, 0x6F, 0x70, + 0x70, 0x72, 0x71, 0x74, 0x71, 0x8C, 0x9B, 0x96, 0x98, 0x96, 0x96, 0x95, + 0x95, 0x94, 0x93, 0x92, 0x92, 0x91, 0x90, 0x90, 0x8F, 0x8E, 0x8D, 0x6E, + 0x66, 0x6A, 0x68, 0x6B, 0x6A, 0x6B, 0x6B, 0x6C, 0x6C, 0x6D, 0x6E, 0x6E, + 0x6F, 0x6E, 0x71, 0x6E, 0x77, 0x96, 0x96, 0x94, 0x95, 0x93, 0x94, 0x92, + 0x92, 0x91, 0x91, 0x90, 0x90, 0x8F, 0x8F, 0x8E, 0x8D, 0x8F, 0x74, 0x65, + 0x6B, 0x69, 0x6C, 0x6B, 0x6D, 0x6D, 0x6E, 0x6F, 0x6F, 0x70, 0x70, 0x72, + 0x71, 0x74, 0x70, 0x7F, 0x9A, 0x97, 0x97, 0x96, 0x95, 0x95, 0x93, 0x94, + 0x92, 0x92, 0x90, 0x91, 0x8E, 0x90, 0x8C, 0x8F, 0x88, 0x69, 0x67, 0x69, + 0x68, 0x6A, 0x69, 0x6B, 0x6A, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, 0x6F, 0x6F, + 0x71, 0x6E, 0x89, 0x99, 0x94, 0x96, 0x93, 0x95, 0x93, 0x93, 0x92, 0x92, + 0x92, 0x91, 0x91, 0x8F, 0x91, 0x8D, 0x92, 0x7F, 0x67, 0x6C, 0x6A, 0x6C, + 0x6C, 0x6D, 0x6E, 0x6E, 0x6F, 0x6F, 0x70, 0x6F, 0x72, 0x70, 0x73, 0x70, + 0x7A, 0x98, 0x97, 0x96, 0x96, 0x94, 0x94, 0x92, 0x93, 0x91, 0x91, 0x8F, + 0x90, 0x8E, 0x8F, 0x8C, 0x8D, 0x8A, 0x6C, 0x65, 0x69, 0x67, 0x6A, 0x69, + 0x6B, 0x6A, 0x6C, 0x6C, 0x6E, 0x6E, 0x6F, 0x6F, 0x70, 0x72, 0x70, 0x8B, + 0x9A, 0x94, 0x97, 0x94, 0x96, 0x94, 0x94, 0x93, 0x93, 0x92, 0x91, 0x92, + 0x90, 0x91, 0x8E, 0x92, 0x7D, 0x66, 0x6C, 0x6A, 0x6C, 0x6B, 0x6C, 0x6D, + 0x6D, 0x6E, 0x6E, 0x6F, 0x6E, 0x71, 0x6F, 0x72, 0x6E, 0x7B, 0x97, 0x95, + 0x95, 0x94, 0x93, 0x93, 0x91, 0x92, 0x90, 0x91, 0x8F, 0x8F, 0x8D, 0x8E, + 0x8C, 0x8E, 0x89, 0x6A, 0x66, 0x69, 0x68, 0x6B, 0x6A, 0x6C, 0x6B, 0x6E, + 0x6D, 0x6F, 0x6E, 0x70, 0x70, 0x72, 0x71, 0x75, 0x94, 0x99, 0x96, 0x97, + 0x95, 0x96, 0x94, 0x95, 0x93, 0x93, 0x92, 0x92, 0x91, 0x90, 0x90, 0x8E, + 0x90, 0x74, 0x66, 0x6B, 0x69, 0x6C, 0x6A, 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, + 0x6E, 0x6E, 0x6F, 0x6F, 0x71, 0x6E, 0x89, 0x98, 0x93, 0x95, 0x92, 0x93, + 0x91, 0x92, 0x91, 0x91, 0x90, 0x8F, 0x8F, 0x8E, 0x8F, 0x8C, 0x90, 0x76, + 0x65, 0x6B, 0x68, 0x6B, 0x6B, 0x6D, 0x6C, 0x6E, 0x6E, 0x6F, 0x70, 0x70, + 0x71, 0x71, 0x74, 0x70, 0x88, 0x9B, 0x95, 0x98, 0x95, 0x96, 0x94, 0x94, + 0x93, 0x93, 0x92, 0x91, 0x91, 0x8F, 0x90, 0x8D, 0x91, 0x7A, 0x65, 0x6A, + 0x68, 0x6A, 0x6A, 0x6B, 0x6B, 0x6C, 0x6C, 0x6C, 0x6D, 0x6D, 0x6F, 0x6E, + 0x71, 0x6C, 0x82, 0x98, 0x93, 0x95, 0x93, 0x94, 0x92, 0x92, 0x92, 0x91, + 0x91, 0x90, 0x90, 0x8F, 0x90, 0x8D, 0x91, 0x78, 0x66, 0x6C, 0x6A, 0x6D, + 0x6B, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, 0x6F, 0x71, 0x70, 0x73, 0x71, 0x77, + 0x97, 0x97, 0x96, 0x96, 0x95, 0x94, 0x93, 0x93, 0x92, 0x92, 0x90, 0x91, + 0x8E, 0x90, 0x8C, 0x90, 0x77, 0x64, 0x6A, 0x67, 0x6A, 0x69, 0x6B, 0x6A, + 0x6C, 0x6B, 0x6D, 0x6D, 0x6E, 0x6E, 0x70, 0x6E, 0x75, 0x94, 0x95, 0x94, + 0x94, 0x93, 0x94, 0x93, 0x93, 0x92, 0x92, 0x91, 0x91, 0x8F, 0x91, 0x8E, + 0x92, 0x7A, 0x67, 0x6C, 0x6A, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, + 0x6F, 0x71, 0x70, 0x72, 0x70, 0x76, 0x96, 0x97, 0x95, 0x95, 0x94, 0x94, + 0x92, 0x93, 0x91, 0x91, 0x8F, 0x90, 0x8E, 0x8F, 0x8B, 0x90, 0x78, 0x64, + 0x6A, 0x67, 0x6A, 0x69, 0x6B, 0x6A, 0x6C, 0x6C, 0x6D, 0x6D, 0x6F, 0x6E, + 0x71, 0x6E, 0x79, 0x97, 0x95, 0x96, 0x94, 0x94, 0x94, 0x93, 0x93, 0x92, + 0x92, 0x91, 0x92, 0x90, 0x91, 0x8E, 0x92, 0x75, 0x67, 0x6C, 0x6A, 0x6D, + 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, 0x6F, 0x71, 0x6F, 0x72, 0x6E, 0x80, + 0x99, 0x94, 0x96, 0x93, 0x94, 0x92, 0x92, 0x91, 0x91, 0x8F, 0x90, 0x8E, + 0x8F, 0x8D, 0x8E, 0x88, 0x69, 0x67, 0x69, 0x69, 0x6A, 0x6A, 0x6B, 0x6B, + 0x6D, 0x6C, 0x6E, 0x6E, 0x70, 0x6F, 0x72, 0x6E, 0x88, 0x9A, 0x94, 0x97, + 0x94, 0x96, 0x93, 0x94, 0x93, 0x93, 0x92, 0x93, 0x90, 0x92, 0x8F, 0x92, + 0x86, 0x68, 0x6B, 0x6A, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, 0x6E, 0x6E, 0x6F, + 0x6F, 0x6F, 0x70, 0x70, 0x71, 0x91, 0x97, 0x94, 0x94, 0x93, 0x93, 0x91, + 0x92, 0x90, 0x90, 0x8F, 0x8F, 0x8E, 0x8F, 0x8C, 0x8F, 0x72, 0x65, 0x6A, + 0x68, 0x6B, 0x6A, 0x6C, 0x6B, 0x6D, 0x6D, 0x6F, 0x6E, 0x70, 0x6F, 0x73, + 0x6E, 0x82, 0x9A, 0x95, 0x97, 0x95, 0x96, 0x94, 0x95, 0x93, 0x94, 0x92, + 0x92, 0x91, 0x92, 0x8F, 0x91, 0x8A, 0x6A, 0x6A, 0x6B, 0x6B, 0x6C, 0x6C, + 0x6D, 0x6D, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, 0x6E, 0x71, 0x6D, 0x86, 0x98, + 0x93, 0x95, 0x92, 0x93, 0x91, 0x92, 0x90, 0x91, 0x8F, 0x90, 0x8E, 0x8F, + 0x8D, 0x8F, 0x88, 0x69, 0x68, 0x6A, 0x6A, 0x6B, 0x6B, 0x6C, 0x6C, 0x6E, + 0x6D, 0x6F, 0x6F, 0x71, 0x6F, 0x73, 0x6F, 0x81, 0x9A, 0x95, 0x97, 0x95, + 0x96, 0x94, 0x94, 0x93, 0x93, 0x92, 0x92, 0x91, 0x90, 0x91, 0x8E, 0x91, + 0x75, 0x66, 0x6B, 0x69, 0x6C, 0x6A, 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, + 0x6F, 0x6D, 0x70, 0x6D, 0x78, 0x96, 0x94, 0x94, 0x93, 0x93, 0x92, 0x91, + 0x92, 0x90, 0x91, 0x8F, 0x90, 0x8E, 0x90, 0x8C, 0x91, 0x7B, 0x65, 0x6B, + 0x69, 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, 0x6E, 0x6F, 0x6F, 0x70, 0x70, 0x72, + 0x71, 0x75, 0x95, 0x98, 0x96, 0x96, 0x95, 0x95, 0x93, 0x94, 0x92, 0x93, + 0x91, 0x92, 0x8F, 0x91, 0x8D, 0x91, 0x82, 0x66, 0x6A, 0x69, 0x6A, 0x6A, + 0x6B, 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, 0x6D, 0x6E, 0x6E, 0x70, 0x6E, 0x8D, + 0x97, 0x93, 0x95, 0x92, 0x94, 0x91, 0x93, 0x91, 0x92, 0x90, 0x91, 0x8F, + 0x91, 0x8D, 0x91, 0x83, 0x67, 0x6B, 0x6A, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, + 0x6E, 0x6F, 0x6F, 0x70, 0x71, 0x70, 0x72, 0x70, 0x8E, 0x99, 0x95, 0x97, + 0x94, 0x95, 0x93, 0x94, 0x92, 0x92, 0x90, 0x91, 0x8F, 0x90, 0x8D, 0x91, + 0x83, 0x66, 0x6A, 0x68, 0x6A, 0x6A, 0x6B, 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, + 0x6D, 0x6F, 0x6E, 0x70, 0x6E, 0x8C, 0x98, 0x93, 0x95, 0x93, 0x94, 0x92, + 0x93, 0x91, 0x92, 0x91, 0x92, 0x8F, 0x91, 0x8E, 0x93, 0x7F, 0x67, 0x6C, + 0x6A, 0x6D, 0x6C, 0x6E, 0x6D, 0x6E, 0x6E, 0x6F, 0x6F, 0x70, 0x70, 0x71, + 0x71, 0x73, 0x93, 0x98, 0x95, 0x96, 0x94, 0x94, 0x92, 0x93, 0x91, 0x92, + 0x90, 0x91, 0x8E, 0x90, 0x8C, 0x91, 0x7B, 0x65, 0x6B, 0x68, 0x6B, 0x69, + 0x6C, 0x6B, 0x6C, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, 0x6E, 0x76, 0x95, + 0x95, 0x95, 0x94, 0x94, 0x94, 0x93, 0x93, 0x92, 0x92, 0x91, 0x91, 0x90, + 0x91, 0x8F, 0x91, 0x73, 0x68, 0x6C, 0x6A, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, + 0x6E, 0x70, 0x6E, 0x71, 0x6F, 0x72, 0x6E, 0x80, 0x99, 0x94, 0x96, 0x93, + 0x94, 0x92, 0x93, 0x91, 0x91, 0x90, 0x90, 0x8F, 0x8F, 0x8E, 0x8E, 0x8C, + 0x6C, 0x67, 0x6A, 0x69, 0x6B, 0x6A, 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, + 0x70, 0x6E, 0x72, 0x6D, 0x81, 0x99, 0x94, 0x96, 0x94, 0x95, 0x93, 0x94, + 0x93, 0x93, 0x92, 0x91, 0x91, 0x90, 0x91, 0x8E, 0x92, 0x78, 0x67, 0x6C, + 0x6A, 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, 0x6E, 0x6E, 0x6F, 0x6F, 0x70, + 0x70, 0x70, 0x8F, 0x97, 0x93, 0x95, 0x93, 0x94, 0x91, 0x92, 0x90, 0x91, + 0x8F, 0x90, 0x8E, 0x90, 0x8D, 0x90, 0x86, 0x67, 0x69, 0x69, 0x6A, 0x6B, + 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, 0x6F, 0x6E, 0x70, 0x6F, 0x72, 0x6E, 0x84, + 0x9A, 0x94, 0x97, 0x94, 0x95, 0x93, 0x94, 0x93, 0x93, 0x92, 0x92, 0x91, + 0x90, 0x90, 0x8F, 0x90, 0x72, 0x67, 0x6C, 0x6A, 0x6C, 0x6B, 0x6D, 0x6C, + 0x6E, 0x6D, 0x6E, 0x6D, 0x6F, 0x6E, 0x71, 0x6E, 0x76, 0x95, 0x95, 0x94, + 0x94, 0x93, 0x93, 0x92, 0x92, 0x91, 0x91, 0x90, 0x91, 0x8E, 0x90, 0x8D, + 0x92, 0x7E, 0x66, 0x6B, 0x69, 0x6C, 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, + 0x6E, 0x6F, 0x70, 0x70, 0x71, 0x72, 0x92, 0x98, 0x95, 0x96, 0x94, 0x95, + 0x93, 0x94, 0x92, 0x93, 0x91, 0x92, 0x8F, 0x91, 0x8E, 0x91, 0x85, 0x68, + 0x6A, 0x6A, 0x6B, 0x6B, 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, 0x6E, 0x6F, + 0x6E, 0x70, 0x6E, 0x8A, 0x98, 0x93, 0x95, 0x92, 0x94, 0x92, 0x93, 0x91, + 0x92, 0x90, 0x91, 0x8F, 0x90, 0x8E, 0x90, 0x8B, 0x6B, 0x69, 0x6B, 0x6A, + 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, 0x6F, 0x72, 0x6E, + 0x84, 0x9A, 0x94, 0x96, 0x93, 0x95, 0x93, 0x94, 0x92, 0x92, 0x91, 0x91, + 0x90, 0x90, 0x8F, 0x90, 0x8B, 0x6B, 0x69, 0x6A, 0x6A, 0x6B, 0x6B, 0x6C, + 0x6C, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x71, 0x6D, 0x83, 0x99, 0x93, + 0x96, 0x93, 0x94, 0x92, 0x93, 0x92, 0x92, 0x91, 0x91, 0x90, 0x90, 0x8F, + 0x90, 0x8C, 0x6C, 0x69, 0x6B, 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, 0x6D, + 0x6F, 0x6E, 0x70, 0x6F, 0x72, 0x6E, 0x8A, 0x99, 0x94, 0x96, 0x93, 0x94, + 0x92, 0x93, 0x91, 0x92, 0x90, 0x91, 0x8F, 0x91, 0x8D, 0x92, 0x7B, 0x66, + 0x6C, 0x69, 0x6C, 0x6A, 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, 0x70, 0x6E, + 0x71, 0x6D, 0x7F, 0x98, 0x93, 0x96, 0x93, 0x94, 0x92, 0x93, 0x92, 0x92, + 0x91, 0x92, 0x8F, 0x91, 0x8E, 0x92, 0x7F, 0x67, 0x6C, 0x6A, 0x6C, 0x6B, + 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, 0x6E, 0x72, 0x6D, 0x82, 0x99, + 0x93, 0x96, 0x93, 0x94, 0x92, 0x93, 0x91, 0x92, 0x90, 0x91, 0x8F, 0x91, + 0x8D, 0x92, 0x7C, 0x66, 0x6C, 0x69, 0x6C, 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, + 0x6E, 0x6D, 0x70, 0x6E, 0x71, 0x6D, 0x85, 0x99, 0x93, 0x96, 0x93, 0x94, + 0x93, 0x93, 0x92, 0x92, 0x91, 0x91, 0x90, 0x91, 0x8E, 0x91, 0x74, 0x67, + 0x6C, 0x6A, 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, 0x6F, + 0x71, 0x6F, 0x8D, 0x98, 0x94, 0x95, 0x93, 0x94, 0x93, 0x93, 0x92, 0x92, + 0x91, 0x91, 0x90, 0x90, 0x8F, 0x8F, 0x6F, 0x68, 0x6B, 0x6A, 0x6C, 0x6B, + 0x6C, 0x6D, 0x6D, 0x6E, 0x6E, 0x6F, 0x6F, 0x70, 0x6F, 0x74, 0x94, 0x96, + 0x95, 0x94, 0x94, 0x93, 0x93, 0x92, 0x92, 0x91, 0x91, 0x90, 0x91, 0x8E, + 0x92, 0x85, 0x68, 0x6B, 0x6A, 0x6C, 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, + 0x6E, 0x70, 0x6E, 0x71, 0x6D, 0x7B, 0x98, 0x94, 0x95, 0x94, 0x94, 0x93, + 0x93, 0x92, 0x92, 0x91, 0x91, 0x90, 0x91, 0x8E, 0x92, 0x7C, 0x66, 0x6C, + 0x6A, 0x6C, 0x6B, 0x6D, 0x6C, 0x6D, 0x6D, 0x6E, 0x6E, 0x6F, 0x6F, 0x71, + 0x6E, 0x8B, 0x98, 0x93, 0x95, 0x93, 0x94, 0x93, 0x93, 0x92, 0x91, 0x91, + 0x90, 0x90, 0x8F, 0x8F, 0x8D, 0x6E, 0x69, 0x6B, 0x6A, 0x6C, 0x6B, 0x6C, + 0x6D, 0x6D, 0x6E, 0x6E, 0x6F, 0x6E, 0x70, 0x6E, 0x77, 0x96, 0x95, 0x95, + 0x94, 0x94, 0x93, 0x93, 0x92, 0x92, 0x91, 0x92, 0x90, 0x91, 0x8E, 0x93, + 0x81, 0x67, 0x6C, 0x6A, 0x6C, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, 0x6E, 0x6F, + 0x6F, 0x6F, 0x70, 0x6F, 0x8C, 0x98, 0x93, 0x95, 0x93, 0x94, 0x92, 0x92, + 0x92, 0x91, 0x91, 0x90, 0x90, 0x8F, 0x90, 0x8C, 0x6C, 0x68, 0x6B, 0x6A, + 0x6C, 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, 0x6F, 0x6E, 0x71, 0x6D, 0x7F, + 0x98, 0x93, 0x95, 0x93, 0x94, 0x93, 0x92, 0x92, 0x91, 0x92, 0x91, 0x91, + 0x90, 0x90, 0x90, 0x73, 0x67, 0x6D, 0x6A, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, + 0x6D, 0x6E, 0x6F, 0x6E, 0x71, 0x6D, 0x84, 0x98, 0x93, 0x95, 0x93, 0x93, + 0x92, 0x92, 0x92, 0x90, 0x91, 0x8F, 0x91, 0x8D, 0x92, 0x82, 0x67, 0x6B, + 0x6A, 0x6B, 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, 0x6D, 0x70, 0x6E, + 0x75, 0x94, 0x96, 0x94, 0x95, 0x93, 0x94, 0x92, 0x93, 0x91, 0x92, 0x91, + 0x91, 0x90, 0x90, 0x90, 0x72, 0x68, 0x6D, 0x6A, 0x6D, 0x6B, 0x6D, 0x6C, + 0x6E, 0x6E, 0x6E, 0x6F, 0x6F, 0x70, 0x6D, 0x87, 0x98, 0x92, 0x95, 0x92, + 0x94, 0x92, 0x92, 0x91, 0x91, 0x91, 0x8F, 0x91, 0x8D, 0x92, 0x7A, 0x66, + 0x6C, 0x69, 0x6B, 0x6B, 0x6C, 0x6C, 0x6D, 0x6E, 0x6D, 0x6F, 0x6D, 0x71, + 0x6D, 0x7C, 0x97, 0x94, 0x95, 0x94, 0x94, 0x94, 0x92, 0x93, 0x91, 0x93, + 0x90, 0x92, 0x8F, 0x93, 0x86, 0x69, 0x6C, 0x6C, 0x6C, 0x6D, 0x6C, 0x6E, + 0x6D, 0x6F, 0x6D, 0x70, 0x6E, 0x71, 0x6E, 0x75, 0x93, 0x96, 0x93, 0x94, + 0x92, 0x94, 0x91, 0x93, 0x90, 0x92, 0x8F, 0x91, 0x8F, 0x90, 0x8C, 0x6E, + 0x68, 0x6B, 0x69, 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x6F, + 0x6F, 0x71, 0x8F, 0x97, 0x93, 0x95, 0x93, 0x94, 0x92, 0x94, 0x92, 0x93, + 0x91, 0x92, 0x91, 0x91, 0x90, 0x72, 0x69, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, + 0x6D, 0x6F, 0x6E, 0x6F, 0x6F, 0x6F, 0x70, 0x6F, 0x8C, 0x98, 0x93, 0x95, + 0x92, 0x94, 0x91, 0x92, 0x91, 0x91, 0x90, 0x90, 0x90, 0x8E, 0x90, 0x74, + 0x66, 0x6C, 0x69, 0x6C, 0x6A, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, 0x6E, 0x6E, + 0x70, 0x6D, 0x88, 0x98, 0x93, 0x96, 0x93, 0x94, 0x93, 0x93, 0x92, 0x92, + 0x92, 0x91, 0x92, 0x8F, 0x93, 0x7A, 0x68, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, + 0x6D, 0x6E, 0x6E, 0x6E, 0x6F, 0x6F, 0x71, 0x6D, 0x87, 0x98, 0x93, 0x95, + 0x92, 0x93, 0x92, 0x92, 0x91, 0x91, 0x91, 0x8F, 0x90, 0x8D, 0x92, 0x7B, + 0x66, 0x6B, 0x69, 0x6B, 0x6B, 0x6B, 0x6C, 0x6C, 0x6D, 0x6C, 0x6F, 0x6D, + 0x71, 0x6C, 0x7A, 0x96, 0x94, 0x94, 0x94, 0x93, 0x94, 0x92, 0x93, 0x91, + 0x93, 0x91, 0x92, 0x90, 0x92, 0x8C, 0x6E, 0x6A, 0x6D, 0x6B, 0x6D, 0x6C, + 0x6E, 0x6D, 0x6F, 0x6E, 0x6F, 0x6F, 0x6F, 0x71, 0x6D, 0x86, 0x98, 0x93, + 0x95, 0x93, 0x93, 0x92, 0x92, 0x91, 0x90, 0x91, 0x8F, 0x90, 0x8D, 0x91, + 0x85, 0x68, 0x69, 0x6A, 0x6A, 0x6B, 0x6A, 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, + 0x6D, 0x70, 0x6E, 0x72, 0x90, 0x97, 0x93, 0x95, 0x93, 0x94, 0x92, 0x94, + 0x92, 0x93, 0x92, 0x92, 0x91, 0x90, 0x92, 0x77, 0x68, 0x6E, 0x6B, 0x6D, + 0x6D, 0x6E, 0x6E, 0x6E, 0x6F, 0x6E, 0x70, 0x6E, 0x71, 0x6D, 0x7C, 0x97, + 0x94, 0x94, 0x94, 0x93, 0x93, 0x91, 0x92, 0x90, 0x91, 0x8F, 0x91, 0x8D, + 0x90, 0x89, 0x6B, 0x68, 0x6B, 0x69, 0x6B, 0x6A, 0x6C, 0x6B, 0x6D, 0x6C, + 0x6E, 0x6D, 0x6F, 0x6F, 0x6F, 0x8D, 0x97, 0x93, 0x95, 0x93, 0x94, 0x93, + 0x94, 0x92, 0x93, 0x92, 0x91, 0x92, 0x90, 0x94, 0x7B, 0x68, 0x6E, 0x6B, + 0x6E, 0x6D, 0x6E, 0x6E, 0x6E, 0x6F, 0x6E, 0x70, 0x6E, 0x72, 0x6D, 0x7D, + 0x97, 0x94, 0x94, 0x93, 0x93, 0x93, 0x91, 0x92, 0x90, 0x91, 0x8F, 0x90, + 0x8D, 0x90, 0x88, 0x6A, 0x68, 0x6A, 0x69, 0x6B, 0x6A, 0x6C, 0x6B, 0x6D, + 0x6C, 0x6E, 0x6D, 0x70, 0x6D, 0x74, 0x92, 0x96, 0x93, 0x95, 0x93, 0x94, + 0x92, 0x94, 0x92, 0x93, 0x91, 0x92, 0x91, 0x91, 0x91, 0x74, 0x69, 0x6E, + 0x6B, 0x6E, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x6F, 0x6F, 0x6F, 0x71, 0x6D, + 0x85, 0x98, 0x92, 0x95, 0x92, 0x93, 0x92, 0x92, 0x91, 0x90, 0x90, 0x8F, + 0x90, 0x8D, 0x91, 0x7B, 0x65, 0x6B, 0x69, 0x6A, 0x6A, 0x6B, 0x6B, 0x6B, + 0x6D, 0x6C, 0x6E, 0x6D, 0x70, 0x6C, 0x7B, 0x97, 0x94, 0x94, 0x94, 0x93, + 0x94, 0x93, 0x94, 0x92, 0x93, 0x91, 0x93, 0x90, 0x94, 0x88, 0x6B, 0x6C, + 0x6D, 0x6D, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, 0x6E, 0x70, 0x6E, 0x71, 0x6E, + 0x78, 0x95, 0x95, 0x94, 0x94, 0x92, 0x93, 0x91, 0x92, 0x90, 0x91, 0x8F, + 0x90, 0x8D, 0x90, 0x88, 0x6A, 0x68, 0x6A, 0x69, 0x6B, 0x6A, 0x6C, 0x6B, + 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x6F, 0x8E, 0x97, 0x92, 0x95, 0x92, + 0x94, 0x92, 0x94, 0x92, 0x93, 0x92, 0x92, 0x92, 0x90, 0x94, 0x7A, 0x69, + 0x6E, 0x6C, 0x6E, 0x6D, 0x6E, 0x6E, 0x6E, 0x70, 0x6E, 0x71, 0x6E, 0x72, + 0x6D, 0x79, 0x96, 0x95, 0x94, 0x94, 0x92, 0x93, 0x91, 0x92, 0x90, 0x91, + 0x8F, 0x90, 0x8F, 0x8E, 0x8F, 0x72, 0x66, 0x6B, 0x68, 0x6B, 0x6A, 0x6B, + 0x6B, 0x6C, 0x6C, 0x6C, 0x6E, 0x6D, 0x70, 0x6B, 0x7D, 0x97, 0x93, 0x94, + 0x94, 0x93, 0x94, 0x93, 0x94, 0x92, 0x93, 0x91, 0x93, 0x91, 0x92, 0x8F, + 0x71, 0x6A, 0x6E, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x6F, 0x6F, 0x6F, 0x70, + 0x6F, 0x71, 0x6D, 0x84, 0x99, 0x93, 0x95, 0x93, 0x93, 0x92, 0x91, 0x91, + 0x90, 0x91, 0x8E, 0x90, 0x8C, 0x91, 0x82, 0x67, 0x69, 0x69, 0x69, 0x6A, + 0x6A, 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, 0x8E, 0x97, + 0x93, 0x95, 0x93, 0x94, 0x93, 0x94, 0x93, 0x93, 0x93, 0x92, 0x93, 0x90, + 0x95, 0x80, 0x69, 0x6E, 0x6C, 0x6E, 0x6E, 0x6E, 0x6F, 0x6E, 0x70, 0x6E, + 0x71, 0x6E, 0x72, 0x6D, 0x79, 0x96, 0x95, 0x94, 0x94, 0x92, 0x93, 0x91, + 0x92, 0x90, 0x91, 0x8E, 0x90, 0x8D, 0x8F, 0x8B, 0x6C, 0x67, 0x6A, 0x68, + 0x6B, 0x69, 0x6B, 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, 0x6D, 0x70, 0x6C, 0x84, + 0x98, 0x92, 0x95, 0x93, 0x94, 0x93, 0x93, 0x93, 0x92, 0x93, 0x91, 0x93, + 0x90, 0x95, 0x85, 0x6A, 0x6D, 0x6D, 0x6D, 0x6E, 0x6E, 0x6F, 0x6E, 0x70, + 0x6E, 0x71, 0x6E, 0x71, 0x6E, 0x75, 0x94, 0x96, 0x93, 0x94, 0x92, 0x93, + 0x91, 0x92, 0x90, 0x91, 0x8F, 0x90, 0x8E, 0x8E, 0x8E, 0x70, 0x66, 0x6B, + 0x68, 0x6B, 0x69, 0x6B, 0x6A, 0x6C, 0x6C, 0x6D, 0x6D, 0x6D, 0x6F, 0x6C, + 0x85, 0x98, 0x92, 0x95, 0x93, 0x94, 0x93, 0x93, 0x93, 0x92, 0x93, 0x92, + 0x93, 0x90, 0x95, 0x84, 0x6A, 0x6E, 0x6D, 0x6E, 0x6E, 0x6E, 0x6F, 0x6E, + 0x70, 0x6E, 0x71, 0x6E, 0x72, 0x6D, 0x7C, 0x97, 0x94, 0x94, 0x93, 0x93, + 0x92, 0x91, 0x92, 0x90, 0x91, 0x8E, 0x90, 0x8D, 0x91, 0x83, 0x67, 0x69, + 0x69, 0x69, 0x6A, 0x6A, 0x6B, 0x6B, 0x6C, 0x6B, 0x6E, 0x6C, 0x6F, 0x6B, + 0x7D, 0x97, 0x92, 0x94, 0x93, 0x94, 0x93, 0x93, 0x93, 0x92, 0x93, 0x92, + 0x93, 0x91, 0x94, 0x78, 0x69, 0x6F, 0x6C, 0x6F, 0x6D, 0x6F, 0x6E, 0x70, + 0x6F, 0x70, 0x6F, 0x71, 0x6F, 0x73, 0x92, 0x96, 0x94, 0x95, 0x92, 0x93, + 0x91, 0x92, 0x90, 0x91, 0x8F, 0x90, 0x8D, 0x91, 0x85, 0x68, 0x69, 0x69, + 0x69, 0x6A, 0x6A, 0x6B, 0x6A, 0x6C, 0x6B, 0x6D, 0x6B, 0x6F, 0x6A, 0x7F, + 0x97, 0x92, 0x94, 0x92, 0x93, 0x92, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, + 0x91, 0x93, 0x75, 0x6A, 0x6F, 0x6C, 0x6F, 0x6D, 0x70, 0x6E, 0x70, 0x6F, + 0x71, 0x6F, 0x72, 0x6E, 0x79, 0x97, 0x95, 0x95, 0x94, 0x94, 0x93, 0x92, + 0x92, 0x91, 0x91, 0x8F, 0x91, 0x8D, 0x92, 0x7B, 0x65, 0x6B, 0x68, 0x6B, + 0x69, 0x6B, 0x6A, 0x6B, 0x6B, 0x6C, 0x6C, 0x6C, 0x6D, 0x6D, 0x8B, 0x95, + 0x91, 0x94, 0x91, 0x93, 0x91, 0x93, 0x91, 0x92, 0x91, 0x92, 0x90, 0x93, + 0x8B, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, 0x6E, 0x6F, 0x6F, 0x70, 0x6F, 0x71, + 0x70, 0x72, 0x6E, 0x88, 0x99, 0x94, 0x96, 0x93, 0x95, 0x93, 0x93, 0x92, + 0x92, 0x91, 0x91, 0x8F, 0x90, 0x8E, 0x6E, 0x68, 0x6B, 0x69, 0x6B, 0x69, + 0x6B, 0x6A, 0x6C, 0x6A, 0x6D, 0x6B, 0x6E, 0x6A, 0x7D, 0x96, 0x90, 0x93, + 0x91, 0x92, 0x91, 0x92, 0x91, 0x91, 0x91, 0x91, 0x90, 0x90, 0x90, 0x72, + 0x6A, 0x6E, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, 0x6F, 0x71, 0x6F, 0x72, + 0x6F, 0x7A, 0x98, 0x95, 0x96, 0x95, 0x95, 0x94, 0x93, 0x93, 0x92, 0x92, + 0x91, 0x92, 0x8F, 0x92, 0x76, 0x67, 0x6C, 0x69, 0x6C, 0x6A, 0x6C, 0x6A, + 0x6C, 0x6B, 0x6D, 0x6B, 0x6E, 0x6A, 0x75, 0x93, 0x91, 0x92, 0x91, 0x91, + 0x91, 0x91, 0x91, 0x90, 0x91, 0x8F, 0x91, 0x8F, 0x92, 0x77, 0x68, 0x6D, + 0x6B, 0x6E, 0x6C, 0x6F, 0x6E, 0x70, 0x6F, 0x71, 0x6F, 0x72, 0x6F, 0x78, + 0x97, 0x96, 0x96, 0x96, 0x95, 0x95, 0x94, 0x94, 0x93, 0x93, 0x91, 0x93, + 0x8F, 0x93, 0x78, 0x68, 0x6D, 0x6A, 0x6C, 0x6A, 0x6C, 0x6B, 0x6D, 0x6B, + 0x6D, 0x6B, 0x6E, 0x6A, 0x79, 0x95, 0x90, 0x92, 0x90, 0x91, 0x90, 0x91, + 0x90, 0x90, 0x8F, 0x90, 0x8F, 0x90, 0x8D, 0x6D, 0x6A, 0x6B, 0x6B, 0x6D, + 0x6D, 0x6E, 0x6E, 0x6F, 0x6F, 0x70, 0x6F, 0x71, 0x70, 0x8F, 0x98, 0x95, + 0x96, 0x95, 0x96, 0x94, 0x95, 0x93, 0x94, 0x92, 0x93, 0x90, 0x94, 0x78, + 0x69, 0x6E, 0x6B, 0x6D, 0x6C, 0x6D, 0x6C, 0x6D, 0x6C, 0x6E, 0x6C, 0x6F, + 0x6B, 0x88, 0x95, 0x90, 0x93, 0x90, 0x91, 0x8F, 0x91, 0x8E, 0x90, 0x8E, + 0x90, 0x8C, 0x92, 0x79, 0x66, 0x6C, 0x69, 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, + 0x6D, 0x6F, 0x6E, 0x71, 0x6D, 0x86, 0x99, 0x94, 0x96, 0x94, 0x96, 0x94, + 0x95, 0x93, 0x94, 0x92, 0x94, 0x91, 0x95, 0x7B, 0x6A, 0x6F, 0x6C, 0x6E, + 0x6D, 0x6E, 0x6D, 0x6F, 0x6D, 0x6F, 0x6D, 0x70, 0x6B, 0x87, 0x96, 0x91, + 0x93, 0x91, 0x92, 0x90, 0x91, 0x8F, 0x90, 0x8E, 0x90, 0x8D, 0x90, 0x74, + 0x66, 0x6B, 0x69, 0x6B, 0x6A, 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, 0x70, + 0x6C, 0x8A, 0x97, 0x93, 0x95, 0x93, 0x95, 0x93, 0x94, 0x93, 0x94, 0x92, + 0x94, 0x91, 0x94, 0x76, 0x6B, 0x6F, 0x6D, 0x6F, 0x6E, 0x6F, 0x6E, 0x6F, + 0x6E, 0x70, 0x6F, 0x71, 0x6E, 0x8C, 0x96, 0x93, 0x94, 0x92, 0x92, 0x91, + 0x91, 0x90, 0x90, 0x8F, 0x8F, 0x8F, 0x8C, 0x6B, 0x68, 0x69, 0x69, 0x6A, + 0x6A, 0x6B, 0x6B, 0x6C, 0x6C, 0x6C, 0x6D, 0x6D, 0x71, 0x92, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x92, 0x93, 0x92, 0x93, 0x91, 0x93, 0x8B, 0x6C, + 0x6E, 0x6D, 0x6E, 0x6E, 0x6F, 0x6F, 0x70, 0x6F, 0x71, 0x6F, 0x72, 0x6E, + 0x7B, 0x98, 0x94, 0x96, 0x93, 0x94, 0x92, 0x93, 0x91, 0x92, 0x90, 0x91, + 0x8E, 0x92, 0x7D, 0x66, 0x6C, 0x69, 0x6B, 0x69, 0x6C, 0x6A, 0x6C, 0x6A, + 0x6D, 0x6B, 0x6F, 0x69, 0x81, 0x96, 0x90, 0x93, 0x91, 0x92, 0x91, 0x92, + 0x91, 0x92, 0x90, 0x92, 0x90, 0x93, 0x76, 0x69, 0x6E, 0x6C, 0x6E, 0x6D, + 0x6F, 0x6E, 0x70, 0x6F, 0x71, 0x70, 0x71, 0x71, 0x90, 0x98, 0x95, 0x96, + 0x94, 0x95, 0x93, 0x94, 0x93, 0x93, 0x92, 0x91, 0x91, 0x8F, 0x6F, 0x6A, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6C, 0x6B, 0x6C, 0x6C, 0x6D, 0x6C, 0x6E, 0x6C, + 0x8B, 0x94, 0x91, 0x92, 0x90, 0x91, 0x90, 0x91, 0x90, 0x91, 0x8F, 0x91, + 0x8E, 0x92, 0x76, 0x68, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, + 0x71, 0x6F, 0x72, 0x6D, 0x85, 0x9A, 0x94, 0x97, 0x94, 0x96, 0x94, 0x95, + 0x93, 0x94, 0x92, 0x94, 0x90, 0x95, 0x83, 0x69, 0x6D, 0x6B, 0x6D, 0x6B, + 0x6D, 0x6C, 0x6D, 0x6C, 0x6E, 0x6C, 0x6E, 0x6B, 0x76, 0x94, 0x91, 0x92, + 0x91, 0x91, 0x90, 0x91, 0x8F, 0x90, 0x8F, 0x90, 0x8E, 0x90, 0x8A, 0x6A, + 0x6A, 0x6A, 0x6B, 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, 0x6F, 0x6E, 0x70, 0x6E, + 0x76, 0x96, 0x95, 0x96, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x93, 0x93, + 0x92, 0x92, 0x90, 0x70, 0x6C, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6E, + 0x6D, 0x6E, 0x6E, 0x6E, 0x6F, 0x8F, 0x94, 0x92, 0x92, 0x91, 0x91, 0x90, + 0x90, 0x8F, 0x90, 0x8F, 0x8F, 0x8E, 0x8F, 0x6F, 0x67, 0x6B, 0x69, 0x6B, + 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, 0x6E, 0x6F, 0x6F, 0x8F, 0x96, 0x93, + 0x95, 0x93, 0x95, 0x93, 0x94, 0x93, 0x94, 0x92, 0x94, 0x91, 0x94, 0x77, + 0x6A, 0x6E, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x6F, 0x6E, 0x6F, 0x6E, 0x70, + 0x6D, 0x8B, 0x96, 0x92, 0x94, 0x91, 0x92, 0x91, 0x91, 0x90, 0x90, 0x8F, + 0x90, 0x8D, 0x90, 0x71, 0x67, 0x6B, 0x69, 0x6B, 0x6A, 0x6B, 0x6B, 0x6C, + 0x6C, 0x6D, 0x6C, 0x6E, 0x6D, 0x8C, 0x95, 0x92, 0x94, 0x93, 0x93, 0x92, + 0x93, 0x92, 0x93, 0x92, 0x93, 0x91, 0x92, 0x73, 0x6B, 0x6E, 0x6D, 0x6E, + 0x6E, 0x6F, 0x6E, 0x6F, 0x6F, 0x70, 0x6F, 0x70, 0x70, 0x90, 0x96, 0x93, + 0x94, 0x93, 0x93, 0x92, 0x92, 0x91, 0x91, 0x90, 0x90, 0x8F, 0x8E, 0x6E, + 0x68, 0x6A, 0x6A, 0x6B, 0x6A, 0x6B, 0x6B, 0x6C, 0x6C, 0x6C, 0x6C, 0x6D, + 0x6E, 0x8F, 0x94, 0x92, 0x93, 0x92, 0x92, 0x92, 0x92, 0x91, 0x92, 0x91, + 0x92, 0x90, 0x92, 0x74, 0x6A, 0x6E, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, + 0x6F, 0x70, 0x6F, 0x72, 0x6E, 0x88, 0x99, 0x93, 0x96, 0x93, 0x95, 0x92, + 0x94, 0x91, 0x93, 0x90, 0x92, 0x8F, 0x93, 0x83, 0x67, 0x6C, 0x69, 0x6B, + 0x6A, 0x6B, 0x6B, 0x6C, 0x6B, 0x6C, 0x6C, 0x6D, 0x6C, 0x6F, 0x90, 0x93, + 0x92, 0x92, 0x91, 0x92, 0x91, 0x91, 0x91, 0x91, 0x90, 0x91, 0x90, 0x91, + 0x72, 0x69, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, 0x6D, 0x70, 0x6E, 0x71, 0x6E, + 0x72, 0x6D, 0x84, 0x99, 0x94, 0x96, 0x94, 0x95, 0x93, 0x94, 0x92, 0x93, + 0x91, 0x93, 0x90, 0x94, 0x83, 0x68, 0x6D, 0x6A, 0x6C, 0x6B, 0x6C, 0x6B, + 0x6D, 0x6C, 0x6D, 0x6C, 0x6E, 0x6B, 0x73, 0x93, 0x92, 0x92, 0x91, 0x91, + 0x91, 0x91, 0x91, 0x90, 0x90, 0x90, 0x90, 0x8F, 0x90, 0x70, 0x69, 0x6C, + 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, 0x6F, 0x71, 0x6E, 0x8B, + 0x98, 0x94, 0x96, 0x94, 0x95, 0x93, 0x94, 0x92, 0x94, 0x92, 0x93, 0x90, + 0x95, 0x7C, 0x68, 0x6E, 0x6B, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6E, + 0x6C, 0x6F, 0x6A, 0x7E, 0x96, 0x91, 0x93, 0x91, 0x92, 0x90, 0x91, 0x90, + 0x91, 0x8F, 0x91, 0x8E, 0x92, 0x84, 0x68, 0x6C, 0x6A, 0x6C, 0x6B, 0x6D, + 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, 0x6E, 0x76, 0x95, 0x95, 0x95, 0x94, + 0x95, 0x94, 0x94, 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x90, 0x6F, 0x6C, + 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6E, 0x6E, 0x6E, 0x6E, 0x6E, 0x6F, + 0x8E, 0x94, 0x92, 0x93, 0x91, 0x92, 0x91, 0x91, 0x90, 0x90, 0x8F, 0x90, + 0x8F, 0x8F, 0x70, 0x68, 0x6B, 0x6A, 0x6C, 0x6B, 0x6C, 0x6C, 0x6D, 0x6C, + 0x6E, 0x6D, 0x70, 0x6C, 0x89, 0x97, 0x93, 0x95, 0x93, 0x94, 0x93, 0x94, + 0x92, 0x93, 0x92, 0x93, 0x91, 0x94, 0x76, 0x6A, 0x6E, 0x6C, 0x6E, 0x6D, + 0x6F, 0x6D, 0x6F, 0x6D, 0x70, 0x6D, 0x71, 0x6C, 0x85, 0x97, 0x92, 0x94, + 0x92, 0x93, 0x91, 0x92, 0x90, 0x91, 0x8F, 0x91, 0x8E, 0x92, 0x78, 0x67, + 0x6C, 0x69, 0x6C, 0x6A, 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6F, 0x6B, + 0x87, 0x97, 0x92, 0x94, 0x92, 0x94, 0x92, 0x93, 0x92, 0x93, 0x91, 0x93, + 0x90, 0x94, 0x78, 0x6A, 0x6E, 0x6C, 0x6E, 0x6D, 0x6E, 0x6E, 0x6F, 0x6E, + 0x70, 0x6E, 0x71, 0x6E, 0x8C, 0x97, 0x93, 0x94, 0x93, 0x93, 0x93, 0x92, + 0x92, 0x91, 0x92, 0x8F, 0x92, 0x8A, 0x6B, 0x6A, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6C, 0x6C, 0x6C, 0x6D, 0x6C, 0x6F, 0x6A, 0x81, 0x96, 0x91, 0x93, 0x92, + 0x92, 0x92, 0x92, 0x92, 0x91, 0x92, 0x91, 0x91, 0x90, 0x71, 0x6A, 0x6D, + 0x6C, 0x6E, 0x6D, 0x6E, 0x6E, 0x6E, 0x6F, 0x6E, 0x71, 0x6D, 0x7C, 0x97, + 0x94, 0x95, 0x94, 0x94, 0x94, 0x93, 0x93, 0x92, 0x92, 0x91, 0x91, 0x92, + 0x75, 0x68, 0x6D, 0x6A, 0x6C, 0x6B, 0x6C, 0x6C, 0x6C, 0x6D, 0x6C, 0x6F, + 0x6A, 0x78, 0x94, 0x92, 0x92, 0x92, 0x91, 0x92, 0x91, 0x91, 0x90, 0x90, + 0x91, 0x8F, 0x92, 0x78, 0x68, 0x6D, 0x6B, 0x6D, 0x6C, 0x6D, 0x6E, 0x6D, + 0x6F, 0x6D, 0x71, 0x6C, 0x79, 0x96, 0x94, 0x94, 0x94, 0x93, 0x94, 0x93, + 0x93, 0x92, 0x92, 0x92, 0x91, 0x94, 0x7A, 0x69, 0x6E, 0x6B, 0x6D, 0x6C, + 0x6D, 0x6D, 0x6D, 0x6E, 0x6C, 0x6F, 0x6B, 0x77, 0x94, 0x93, 0x92, 0x92, + 0x91, 0x92, 0x91, 0x91, 0x90, 0x90, 0x90, 0x8F, 0x92, 0x79, 0x67, 0x6C, + 0x6A, 0x6C, 0x6B, 0x6C, 0x6D, 0x6C, 0x6E, 0x6C, 0x70, 0x6C, 0x77, 0x94, + 0x94, 0x93, 0x94, 0x93, 0x94, 0x92, 0x93, 0x92, 0x93, 0x92, 0x92, 0x92, + 0x76, 0x69, 0x6E, 0x6B, 0x6E, 0x6D, 0x6E, 0x6E, 0x6E, 0x6F, 0x6D, 0x70, + 0x6B, 0x7C, 0x96, 0x93, 0x93, 0x93, 0x92, 0x93, 0x91, 0x92, 0x90, 0x91, + 0x8F, 0x91, 0x8E, 0x70, 0x68, 0x6C, 0x6A, 0x6C, 0x6B, 0x6C, 0x6C, 0x6C, + 0x6D, 0x6C, 0x6F, 0x6A, 0x80, 0x96, 0x92, 0x94, 0x92, 0x92, 0x93, 0x92, + 0x93, 0x91, 0x93, 0x90, 0x93, 0x8C, 0x6E, 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, + 0x6E, 0x6D, 0x6F, 0x6E, 0x6F, 0x70, 0x6D, 0x86, 0x98, 0x92, 0x95, 0x93, + 0x93, 0x92, 0x92, 0x92, 0x91, 0x92, 0x8F, 0x93, 0x87, 0x6A, 0x6B, 0x6B, + 0x6B, 0x6C, 0x6B, 0x6D, 0x6B, 0x6E, 0x6C, 0x6E, 0x6C, 0x70, 0x8F, 0x94, + 0x91, 0x93, 0x91, 0x93, 0x91, 0x92, 0x91, 0x91, 0x91, 0x90, 0x92, 0x76, + 0x68, 0x6E, 0x6B, 0x6E, 0x6C, 0x6E, 0x6D, 0x6E, 0x6E, 0x6E, 0x70, 0x6D, + 0x88, 0x98, 0x92, 0x95, 0x92, 0x94, 0x92, 0x93, 0x92, 0x92, 0x92, 0x91, + 0x92, 0x75, 0x69, 0x6E, 0x6B, 0x6D, 0x6C, 0x6D, 0x6C, 0x6D, 0x6D, 0x6D, + 0x6E, 0x6C, 0x88, 0x96, 0x91, 0x94, 0x91, 0x93, 0x90, 0x92, 0x90, 0x91, + 0x90, 0x90, 0x90, 0x72, 0x68, 0x6D, 0x6A, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, + 0x6D, 0x6E, 0x6F, 0x6E, 0x8B, 0x97, 0x92, 0x95, 0x92, 0x94, 0x92, 0x94, + 0x92, 0x93, 0x91, 0x92, 0x90, 0x72, 0x6A, 0x6E, 0x6C, 0x6E, 0x6C, 0x6F, + 0x6D, 0x6F, 0x6D, 0x6F, 0x6D, 0x72, 0x91, 0x95, 0x92, 0x94, 0x92, 0x93, + 0x91, 0x93, 0x90, 0x92, 0x8F, 0x93, 0x89, 0x6B, 0x6B, 0x6C, 0x6B, 0x6C, + 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6F, 0x6C, 0x74, 0x92, 0x94, 0x92, 0x93, + 0x92, 0x93, 0x91, 0x93, 0x91, 0x93, 0x90, 0x94, 0x88, 0x6B, 0x6C, 0x6D, + 0x6D, 0x6E, 0x6D, 0x6E, 0x6D, 0x6F, 0x6D, 0x71, 0x6C, 0x7C, 0x97, 0x93, + 0x94, 0x93, 0x93, 0x93, 0x92, 0x93, 0x91, 0x93, 0x8F, 0x94, 0x80, 0x68, + 0x6D, 0x6B, 0x6D, 0x6C, 0x6D, 0x6D, 0x6D, 0x6E, 0x6D, 0x6F, 0x6B, 0x84, + 0x96, 0x91, 0x94, 0x91, 0x93, 0x91, 0x92, 0x91, 0x91, 0x90, 0x91, 0x90, + 0x72, 0x69, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6F, 0x6D, 0x6F, 0x6D, + 0x72, 0x91, 0x96, 0x93, 0x95, 0x92, 0x94, 0x92, 0x94, 0x91, 0x93, 0x90, + 0x94, 0x8B, 0x6D, 0x6C, 0x6D, 0x6C, 0x6D, 0x6C, 0x6E, 0x6C, 0x6F, 0x6D, + 0x70, 0x6B, 0x79, 0x95, 0x92, 0x93, 0x92, 0x92, 0x92, 0x91, 0x92, 0x90, + 0x92, 0x8F, 0x93, 0x7C, 0x68, 0x6D, 0x6A, 0x6C, 0x6C, 0x6D, 0x6D, 0x6D, + 0x6E, 0x6D, 0x6F, 0x6C, 0x86, 0x97, 0x91, 0x95, 0x92, 0x94, 0x92, 0x93, + 0x91, 0x93, 0x91, 0x92, 0x8F, 0x70, 0x6B, 0x6E, 0x6C, 0x6E, 0x6C, 0x6E, + 0x6D, 0x6F, 0x6D, 0x70, 0x6D, 0x74, 0x93, 0x94, 0x93, 0x94, 0x92, 0x93, + 0x91, 0x93, 0x90, 0x93, 0x8F, 0x94, 0x82, 0x68, 0x6D, 0x6B, 0x6C, 0x6C, + 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x6F, 0x6B, 0x87, 0x96, 0x91, 0x94, 0x91, + 0x93, 0x91, 0x92, 0x91, 0x91, 0x91, 0x91, 0x91, 0x74, 0x69, 0x6E, 0x6B, + 0x6E, 0x6C, 0x6E, 0x6D, 0x6F, 0x6D, 0x6F, 0x6E, 0x70, 0x8F, 0x96, 0x92, + 0x95, 0x92, 0x94, 0x92, 0x93, 0x91, 0x92, 0x91, 0x92, 0x90, 0x72, 0x69, + 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6E, 0x6D, 0x6E, 0x6D, 0x70, 0x8E, + 0x95, 0x91, 0x94, 0x91, 0x93, 0x91, 0x92, 0x90, 0x92, 0x90, 0x91, 0x8F, + 0x70, 0x69, 0x6D, 0x6A, 0x6D, 0x6B, 0x6E, 0x6C, 0x6E, 0x6D, 0x6E, 0x6E, + 0x6F, 0x8D, 0x96, 0x92, 0x95, 0x92, 0x94, 0x92, 0x93, 0x91, 0x92, 0x91, + 0x91, 0x92, 0x75, 0x69, 0x6E, 0x6B, 0x6E, 0x6C, 0x6E, 0x6D, 0x6E, 0x6E, + 0x6E, 0x6F, 0x6D, 0x89, 0x97, 0x91, 0x95, 0x91, 0x93, 0x91, 0x93, 0x91, + 0x92, 0x90, 0x91, 0x90, 0x72, 0x69, 0x6D, 0x6A, 0x6D, 0x6B, 0x6D, 0x6C, + 0x6D, 0x6D, 0x6E, 0x6E, 0x6D, 0x8A, 0x96, 0x91, 0x94, 0x91, 0x93, 0x91, + 0x93, 0x91, 0x92, 0x91, 0x91, 0x91, 0x74, 0x69, 0x6E, 0x6B, 0x6E, 0x6C, + 0x6E, 0x6D, 0x6E, 0x6E, 0x6F, 0x6E, 0x6F, 0x8D, 0x96, 0x92, 0x95, 0x92, + 0x94, 0x91, 0x93, 0x91, 0x92, 0x90, 0x92, 0x8E, 0x6F, 0x6A, 0x6D, 0x6B, + 0x6D, 0x6C, 0x6E, 0x6C, 0x6E, 0x6D, 0x6E, 0x6D, 0x6F, 0x8E, 0x95, 0x91, + 0x94, 0x91, 0x93, 0x91, 0x93, 0x90, 0x92, 0x90, 0x92, 0x8D, 0x6E, 0x6A, + 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6F, 0x6D, 0x70, 0x6C, 0x76, 0x94, + 0x94, 0x93, 0x94, 0x92, 0x93, 0x92, 0x93, 0x91, 0x93, 0x90, 0x94, 0x86, + 0x6A, 0x6D, 0x6C, 0x6C, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, 0x6D, 0x70, 0x6B, + 0x7B, 0x96, 0x92, 0x93, 0x93, 0x92, 0x92, 0x91, 0x92, 0x90, 0x92, 0x8F, + 0x94, 0x81, 0x68, 0x6D, 0x6B, 0x6C, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, 0x6D, + 0x6F, 0x6B, 0x83, 0x97, 0x92, 0x94, 0x92, 0x93, 0x92, 0x92, 0x92, 0x92, + 0x92, 0x90, 0x92, 0x76, 0x69, 0x6E, 0x6B, 0x6E, 0x6C, 0x6E, 0x6D, 0x6E, + 0x6D, 0x6F, 0x6E, 0x6F, 0x8D, 0x96, 0x92, 0x95, 0x92, 0x94, 0x91, 0x93, + 0x91, 0x92, 0x90, 0x92, 0x8E, 0x6F, 0x6A, 0x6D, 0x6B, 0x6D, 0x6B, 0x6E, + 0x6C, 0x6E, 0x6C, 0x6F, 0x6C, 0x74, 0x93, 0x94, 0x93, 0x93, 0x92, 0x93, + 0x91, 0x92, 0x90, 0x92, 0x8F, 0x94, 0x81, 0x68, 0x6D, 0x6B, 0x6D, 0x6C, + 0x6D, 0x6D, 0x6D, 0x6E, 0x6D, 0x70, 0x6B, 0x82, 0x97, 0x92, 0x95, 0x92, + 0x93, 0x92, 0x92, 0x92, 0x91, 0x92, 0x90, 0x93, 0x79, 0x68, 0x6E, 0x6B, + 0x6E, 0x6C, 0x6E, 0x6C, 0x6E, 0x6D, 0x6E, 0x6D, 0x70, 0x8F, 0x95, 0x92, + 0x94, 0x92, 0x93, 0x91, 0x92, 0x90, 0x92, 0x8F, 0x92, 0x8B, 0x6C, 0x6B, + 0x6C, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6E, 0x6C, 0x70, 0x6B, 0x7C, 0x96, + 0x92, 0x94, 0x93, 0x93, 0x93, 0x92, 0x93, 0x91, 0x93, 0x8F, 0x94, 0x85, + 0x69, 0x6D, 0x6C, 0x6C, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, 0x6D, 0x70, 0x6C, + 0x79, 0x95, 0x93, 0x93, 0x93, 0x92, 0x93, 0x91, 0x93, 0x90, 0x92, 0x8F, + 0x94, 0x82, 0x68, 0x6C, 0x6B, 0x6C, 0x6C, 0x6C, 0x6D, 0x6C, 0x6E, 0x6C, + 0x70, 0x6B, 0x80, 0x97, 0x91, 0x94, 0x92, 0x93, 0x91, 0x92, 0x91, 0x92, + 0x91, 0x92, 0x8F, 0x6F, 0x6A, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, + 0x6D, 0x70, 0x6B, 0x80, 0x97, 0x92, 0x95, 0x92, 0x94, 0x92, 0x93, 0x91, + 0x92, 0x90, 0x93, 0x8B, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6D, 0x6D, 0x6D, + 0x6E, 0x6D, 0x6F, 0x6D, 0x8B, 0x96, 0x92, 0x94, 0x91, 0x93, 0x91, 0x93, + 0x90, 0x92, 0x8F, 0x94, 0x80, 0x68, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, + 0x6E, 0x6D, 0x6F, 0x6C, 0x76, 0x94, 0x93, 0x94, 0x93, 0x93, 0x92, 0x92, + 0x92, 0x92, 0x91, 0x91, 0x8F, 0x6F, 0x6B, 0x6D, 0x6C, 0x6D, 0x6C, 0x6E, + 0x6D, 0x6F, 0x6D, 0x70, 0x6B, 0x86, 0x97, 0x92, 0x94, 0x92, 0x93, 0x91, + 0x93, 0x91, 0x92, 0x8F, 0x93, 0x85, 0x69, 0x6D, 0x6B, 0x6D, 0x6C, 0x6D, + 0x6D, 0x6D, 0x6D, 0x6E, 0x6E, 0x70, 0x90, 0x94, 0x92, 0x93, 0x92, 0x93, + 0x92, 0x92, 0x91, 0x92, 0x90, 0x92, 0x74, 0x69, 0x6D, 0x6B, 0x6E, 0x6C, + 0x6E, 0x6C, 0x6F, 0x6D, 0x70, 0x6B, 0x80, 0x97, 0x92, 0x95, 0x92, 0x94, + 0x92, 0x93, 0x91, 0x93, 0x90, 0x94, 0x85, 0x69, 0x6D, 0x6B, 0x6D, 0x6C, + 0x6D, 0x6D, 0x6E, 0x6D, 0x6E, 0x6E, 0x70, 0x90, 0x94, 0x93, 0x93, 0x92, + 0x93, 0x91, 0x92, 0x91, 0x92, 0x8F, 0x93, 0x79, 0x68, 0x6E, 0x6B, 0x6D, + 0x6B, 0x6E, 0x6C, 0x6E, 0x6D, 0x6F, 0x6C, 0x75, 0x94, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x92, 0x92, 0x91, 0x92, 0x90, 0x93, 0x78, 0x69, 0x6E, 0x6B, + 0x6E, 0x6C, 0x6E, 0x6D, 0x6F, 0x6D, 0x6F, 0x6D, 0x74, 0x93, 0x94, 0x93, + 0x93, 0x92, 0x93, 0x92, 0x93, 0x91, 0x92, 0x8F, 0x94, 0x7B, 0x68, 0x6E, + 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6E, 0x6D, 0x6F, 0x6D, 0x73, 0x92, 0x94, + 0x93, 0x93, 0x92, 0x93, 0x92, 0x92, 0x91, 0x92, 0x90, 0x93, 0x77, 0x69, + 0x6E, 0x6B, 0x6E, 0x6C, 0x6E, 0x6C, 0x6F, 0x6D, 0x70, 0x6C, 0x77, 0x95, + 0x93, 0x94, 0x93, 0x93, 0x93, 0x92, 0x92, 0x91, 0x92, 0x90, 0x93, 0x78, + 0x68, 0x6E, 0x6B, 0x6E, 0x6C, 0x6E, 0x6C, 0x6E, 0x6D, 0x6F, 0x6C, 0x76, + 0x94, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x91, 0x92, 0x90, 0x92, + 0x74, 0x69, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6F, 0x6C, 0x70, 0x6B, + 0x7B, 0x96, 0x92, 0x94, 0x92, 0x93, 0x92, 0x92, 0x92, 0x91, 0x92, 0x90, + 0x92, 0x74, 0x69, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6F, 0x6D, 0x70, + 0x6B, 0x80, 0x97, 0x92, 0x94, 0x92, 0x93, 0x92, 0x92, 0x91, 0x92, 0x91, + 0x91, 0x8F, 0x6F, 0x6A, 0x6C, 0x6B, 0x6D, 0x6C, 0x6D, 0x6C, 0x6E, 0x6C, + 0x70, 0x6B, 0x85, 0x97, 0x91, 0x94, 0x91, 0x93, 0x91, 0x93, 0x90, 0x92, + 0x8F, 0x93, 0x86, 0x69, 0x6D, 0x6B, 0x6D, 0x6C, 0x6D, 0x6D, 0x6D, 0x6E, + 0x6E, 0x6F, 0x6D, 0x8B, 0x96, 0x92, 0x94, 0x92, 0x93, 0x91, 0x93, 0x90, + 0x93, 0x8F, 0x94, 0x81, 0x68, 0x6D, 0x6B, 0x6D, 0x6C, 0x6D, 0x6C, 0x6E, + 0x6D, 0x6F, 0x6D, 0x73, 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, + 0x91, 0x92, 0x90, 0x92, 0x75, 0x69, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, + 0x6F, 0x6C, 0x70, 0x6B, 0x7E, 0x97, 0x92, 0x94, 0x92, 0x93, 0x92, 0x93, + 0x91, 0x92, 0x90, 0x92, 0x8C, 0x6C, 0x6B, 0x6C, 0x6C, 0x6D, 0x6C, 0x6D, + 0x6D, 0x6E, 0x6D, 0x6F, 0x6C, 0x8A, 0x96, 0x92, 0x94, 0x92, 0x93, 0x91, + 0x93, 0x90, 0x93, 0x8F, 0x94, 0x81, 0x68, 0x6D, 0x6B, 0x6D, 0x6C, 0x6D, + 0x6C, 0x6E, 0x6D, 0x6F, 0x6D, 0x73, 0x93, 0x93, 0x93, 0x93, 0x93, 0x92, + 0x92, 0x92, 0x91, 0x91, 0x91, 0x90, 0x70, 0x6A, 0x6D, 0x6B, 0x6D, 0x6C, + 0x6E, 0x6C, 0x6F, 0x6D, 0x70, 0x6B, 0x84, 0x97, 0x91, 0x95, 0x92, 0x94, + 0x91, 0x93, 0x91, 0x93, 0x8F, 0x93, 0x87, 0x6A, 0x6D, 0x6B, 0x6D, 0x6C, + 0x6D, 0x6D, 0x6E, 0x6D, 0x6F, 0x6D, 0x73, 0x93, 0x93, 0x93, 0x93, 0x92, + 0x92, 0x92, 0x92, 0x91, 0x92, 0x90, 0x92, 0x75, 0x69, 0x6D, 0x6B, 0x6D, + 0x6C, 0x6E, 0x6C, 0x6E, 0x6D, 0x70, 0x6B, 0x85, 0x97, 0x91, 0x94, 0x91, + 0x93, 0x91, 0x93, 0x90, 0x93, 0x8F, 0x93, 0x86, 0x69, 0x6D, 0x6B, 0x6D, + 0x6C, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, 0x6D, 0x74, 0x94, 0x93, 0x93, 0x93, + 0x93, 0x92, 0x92, 0x92, 0x91, 0x91, 0x91, 0x8F, 0x6F, 0x6A, 0x6D, 0x6B, + 0x6D, 0x6C, 0x6E, 0x6C, 0x6E, 0x6D, 0x70, 0x6B, 0x86, 0x97, 0x91, 0x94, + 0x92, 0x93, 0x91, 0x93, 0x90, 0x92, 0x8F, 0x94, 0x7F, 0x68, 0x6D, 0x6A, + 0x6D, 0x6B, 0x6E, 0x6C, 0x6E, 0x6C, 0x70, 0x6B, 0x7A, 0x96, 0x92, 0x94, + 0x92, 0x93, 0x92, 0x93, 0x91, 0x92, 0x90, 0x93, 0x8A, 0x6B, 0x6C, 0x6B, + 0x6D, 0x6C, 0x6D, 0x6D, 0x6E, 0x6D, 0x6E, 0x6E, 0x71, 0x91, 0x94, 0x93, + 0x93, 0x92, 0x93, 0x92, 0x92, 0x91, 0x92, 0x90, 0x91, 0x72, 0x6A, 0x6D, + 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6E, 0x6D, 0x6F, 0x6C, 0x88, 0x96, 0x91, + 0x94, 0x92, 0x93, 0x91, 0x93, 0x90, 0x92, 0x8F, 0x94, 0x7C, 0x68, 0x6E, + 0x6A, 0x6D, 0x6B, 0x6E, 0x6C, 0x6F, 0x6C, 0x70, 0x6B, 0x7D, 0x97, 0x92, + 0x94, 0x92, 0x94, 0x91, 0x93, 0x91, 0x93, 0x90, 0x93, 0x86, 0x69, 0x6D, + 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, 0x6E, 0x6D, 0x6F, 0x6C, 0x78, 0x96, 0x92, + 0x94, 0x92, 0x93, 0x92, 0x92, 0x91, 0x92, 0x90, 0x92, 0x8B, 0x6B, 0x6C, + 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, 0x6D, 0x6D, 0x6E, 0x6D, 0x72, 0x92, 0x94, + 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x91, 0x91, 0x91, 0x8F, 0x6E, 0x6B, + 0x6C, 0x6C, 0x6D, 0x6D, 0x6D, 0x6D, 0x6E, 0x6E, 0x6F, 0x6E, 0x8D, 0x96, + 0x92, 0x94, 0x92, 0x93, 0x91, 0x93, 0x91, 0x93, 0x8F, 0x94, 0x7E, 0x68, + 0x6E, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6E, 0x6D, 0x6F, 0x6C, 0x75, 0x94, + 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x91, 0x91, 0x90, 0x91, 0x73, + 0x69, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6E, 0x6C, 0x70, 0x6B, 0x80, + 0x97, 0x92, 0x94, 0x92, 0x94, 0x91, 0x93, 0x91, 0x92, 0x90, 0x93, 0x8A, + 0x6B, 0x6C, 0x6C, 0x6C, 0x6D, 0x6D, 0x6D, 0x6D, 0x6E, 0x6E, 0x6F, 0x6E, + 0x8C, 0x96, 0x92, 0x94, 0x92, 0x93, 0x91, 0x93, 0x90, 0x92, 0x8F, 0x94, + 0x7F, 0x68, 0x6D, 0x6A, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6F, 0x6C, + 0x75, 0x94, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x91, 0x92, 0x90, + 0x92, 0x73, 0x69, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6F, 0x6D, 0x70, + 0x6B, 0x82, 0x97, 0x92, 0x95, 0x92, 0x94, 0x92, 0x93, 0x91, 0x93, 0x90, + 0x94, 0x85, 0x69, 0x6D, 0x6B, 0x6D, 0x6C, 0x6D, 0x6D, 0x6E, 0x6D, 0x6E, + 0x6E, 0x70, 0x91, 0x94, 0x92, 0x93, 0x92, 0x92, 0x91, 0x92, 0x91, 0x91, + 0x90, 0x91, 0x73, 0x69, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6F, 0x6C, + 0x70, 0x6B, 0x81, 0x97, 0x92, 0x95, 0x92, 0x94, 0x92, 0x93, 0x91, 0x93, + 0x90, 0x94, 0x85, 0x69, 0x6E, 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, 0x6E, 0x6E, + 0x6F, 0x6E, 0x71, 0x92, 0x94, 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x91, + 0x91, 0x90, 0x91, 0x72, 0x69, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, 0x6E, + 0x6C, 0x70, 0x6B, 0x83, 0x97, 0x91, 0x94, 0x92, 0x93, 0x91, 0x93, 0x90, + 0x93, 0x8F, 0x94, 0x83, 0x69, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6D, 0x6F, + 0x6D, 0x70, 0x6D, 0x77, 0x96, 0x93, 0x94, 0x93, 0x93, 0x92, 0x93, 0x92, + 0x92, 0x91, 0x92, 0x8D, 0x6D, 0x6C, 0x6C, 0x6C, 0x6D, 0x6D, 0x6D, 0x6D, + 0x6E, 0x6E, 0x6E, 0x6E, 0x8E, 0x95, 0x92, 0x93, 0x92, 0x93, 0x91, 0x92, + 0x90, 0x92, 0x8F, 0x92, 0x75, 0x68, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, 0x6C, + 0x6E, 0x6C, 0x70, 0x6B, 0x84, 0x97, 0x92, 0x95, 0x92, 0x94, 0x91, 0x93, + 0x91, 0x93, 0x8F, 0x94, 0x81, 0x68, 0x6E, 0x6B, 0x6E, 0x6C, 0x6E, 0x6D, + 0x6F, 0x6D, 0x70, 0x6C, 0x79, 0x96, 0x92, 0x94, 0x92, 0x93, 0x92, 0x92, + 0x91, 0x92, 0x90, 0x92, 0x8B, 0x6B, 0x6C, 0x6B, 0x6C, 0x6C, 0x6C, 0x6C, + 0x6D, 0x6D, 0x6E, 0x6D, 0x70, 0x90, 0x94, 0x92, 0x93, 0x92, 0x92, 0x92, + 0x91, 0x91, 0x91, 0x91, 0x8E, 0x6E, 0x6B, 0x6C, 0x6C, 0x6D, 0x6D, 0x6E, + 0x6D, 0x6E, 0x6E, 0x6F, 0x6E, 0x8E, 0x96, 0x93, 0x94, 0x93, 0x93, 0x92, + 0x93, 0x91, 0x92, 0x90, 0x92, 0x74, 0x6A, 0x6D, 0x6B, 0x6D, 0x6C, 0x6E, + 0x6D, 0x6E, 0x6D, 0x6F, 0x6C, 0x89, 0x96, 0x91, 0x94, 0x91, 0x93, 0x91, + 0x92, 0x90, 0x92, 0x8F, 0x93, 0x79, 0x68, 0x6D, 0x6A, 0x6D, 0x6B, 0x6D, + 0x6C, 0x6E, 0x6C, 0x70, 0x6B, 0x84, 0x97, 0x92, 0x94, 0x92, 0x94, 0x92, + 0x93, 0x91, 0x93, 0x90, 0x94, 0x7A, 0x69, 0x6E, 0x6B, 0x6E, 0x6C, 0x6F, + 0x6D, 0x6F, 0x6D, 0x71, 0x6B, 0x80, 0x97, 0x92, 0x95, 0x92, 0x94, 0x91, + 0x93, 0x90, 0x93, 0x8F, 0x94, 0x7E, 0x68, 0x6D, 0x6A, 0x6D, 0x6B, 0x6D, + 0x6C, 0x6E, 0x6C, 0x6F, 0x6A, 0x81, 0x97, 0x91, 0x94, 0x91, 0x93, 0x91, + 0x93, 0x90, 0x92, 0x8F, 0x94, 0x7C, 0x68, 0x6E, 0x6B, 0x6E, 0x6C, 0x6E, + 0x6C, 0x6F, 0x6D, 0x70, 0x6C, 0x84, 0x98, 0x92, 0x95, 0x92, 0x94, 0x92, + 0x93, 0x91, 0x93, 0x90, 0x94, 0x7C, 0x68, 0x6E, 0x6B, 0x6E, 0x6C, 0x6E, + 0x6C, 0x6F, 0x6C, 0x70, 0x6B, 0x84, 0x97, 0x91, 0x94, 0x91, 0x93, 0x91, + 0x92, 0x90, 0x92, 0x8E, 0x93, 0x78, 0x68, 0x6D, 0x6A, 0x6D, 0x6B, 0x6D, + 0x6C, 0x6E, 0x6C, 0x6F, 0x6B, 0x88, 0x95, 0x93 +}; + + +unsigned char PROGMEM sndMove[1379] = { + 0x52, 0x49, 0x46, 0x46, 0x5B, 0x05, 0x00, 0x00, 0x57, 0x41, 0x56, 0x45, + 0x66, 0x6D, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x40, 0x1F, 0x00, 0x00, 0x40, 0x1F, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, + 0x64, 0x61, 0x74, 0x61, 0x37, 0x05, 0x00, 0x00, 0x68, 0x6E, 0x6C, 0x6E, + 0x6D, 0x6F, 0x6E, 0x70, 0x6F, 0x70, 0x70, 0x71, 0x71, 0x72, 0x72, 0x73, + 0x73, 0x74, 0x74, 0x75, 0x75, 0x76, 0x76, 0x76, 0x77, 0x77, 0x77, 0x78, + 0x78, 0x79, 0x79, 0x7A, 0x7A, 0x7B, 0x7B, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, + 0x7D, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x81, 0x81, 0x82, 0x82, + 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, 0x85, 0x85, 0x86, 0x86, 0x86, 0x87, + 0x87, 0x87, 0x88, 0x88, 0x89, 0x89, 0x89, 0x8A, 0x8A, 0x8A, 0x8B, 0x8B, + 0x8C, 0x8C, 0x8D, 0x8D, 0x8D, 0x8D, 0x8E, 0x8E, 0x8F, 0x8F, 0x90, 0x8F, + 0x90, 0x90, 0x91, 0x91, 0x92, 0x91, 0x93, 0x91, 0x96, 0x85, 0x6A, 0x6F, + 0x6D, 0x70, 0x6D, 0x6E, 0x6E, 0x6F, 0x6F, 0x70, 0x70, 0x71, 0x71, 0x72, + 0x72, 0x73, 0x73, 0x73, 0x74, 0x74, 0x74, 0x75, 0x75, 0x76, 0x76, 0x77, + 0x77, 0x78, 0x78, 0x79, 0x79, 0x7A, 0x7A, 0x7A, 0x7B, 0x7B, 0x7B, 0x7C, + 0x7C, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x81, + 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x85, 0x85, 0x86, + 0x86, 0x86, 0x87, 0x87, 0x88, 0x88, 0x88, 0x89, 0x89, 0x89, 0x8A, 0x8A, + 0x8B, 0x8B, 0x8B, 0x8C, 0x8C, 0x8C, 0x8D, 0x8D, 0x8E, 0x8E, 0x8E, 0x8E, + 0x8F, 0x8F, 0x90, 0x90, 0x91, 0x90, 0x92, 0x91, 0x93, 0x91, 0x95, 0x8A, + 0x6B, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, 0x6F, 0x70, 0x70, 0x70, 0x6F, 0x71, + 0x70, 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x74, 0x74, 0x75, 0x75, 0x76, + 0x76, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x79, 0x79, 0x7A, 0x7A, 0x7B, + 0x7B, 0x7C, 0x7C, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, + 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x85, + 0x85, 0x85, 0x86, 0x86, 0x86, 0x87, 0x87, 0x88, 0x88, 0x88, 0x89, 0x89, + 0x89, 0x8A, 0x8A, 0x8B, 0x8B, 0x8B, 0x8C, 0x8C, 0x8C, 0x8D, 0x8D, 0x8E, + 0x8E, 0x8E, 0x8F, 0x8F, 0x8F, 0x90, 0x90, 0x90, 0x91, 0x91, 0x91, 0x92, + 0x92, 0x90, 0x6F, 0x6C, 0x6E, 0x6E, 0x6E, 0x6F, 0x6F, 0x70, 0x70, 0x71, + 0x71, 0x72, 0x72, 0x72, 0x71, 0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x74, + 0x75, 0x75, 0x76, 0x76, 0x77, 0x77, 0x77, 0x78, 0x78, 0x79, 0x79, 0x7A, + 0x7A, 0x7A, 0x7B, 0x7B, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, + 0x7F, 0x7F, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x83, 0x83, + 0x84, 0x84, 0x84, 0x85, 0x85, 0x86, 0x86, 0x86, 0x87, 0x87, 0x88, 0x88, + 0x88, 0x89, 0x89, 0x89, 0x8A, 0x8A, 0x8B, 0x8B, 0x8B, 0x8B, 0x8C, 0x8C, + 0x8D, 0x8D, 0x8E, 0x8D, 0x8E, 0x8E, 0x8F, 0x8F, 0x90, 0x8F, 0x91, 0x90, + 0x92, 0x90, 0x93, 0x90, 0x96, 0x7D, 0x69, 0x6F, 0x6C, 0x6F, 0x6E, 0x70, + 0x6F, 0x70, 0x70, 0x71, 0x71, 0x72, 0x72, 0x73, 0x73, 0x74, 0x73, 0x73, + 0x73, 0x74, 0x74, 0x74, 0x75, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77, 0x78, + 0x78, 0x79, 0x79, 0x79, 0x7A, 0x7A, 0x7B, 0x7B, 0x7B, 0x7C, 0x7C, 0x7D, + 0x7D, 0x7D, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, + 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x85, 0x85, 0x86, 0x86, + 0x87, 0x87, 0x87, 0x87, 0x88, 0x88, 0x89, 0x89, 0x8A, 0x8A, 0x8A, 0x8A, + 0x8B, 0x8B, 0x8C, 0x8C, 0x8C, 0x8D, 0x8D, 0x8D, 0x8E, 0x8E, 0x8E, 0x8F, + 0x8F, 0x90, 0x90, 0x90, 0x90, 0x91, 0x90, 0x92, 0x90, 0x95, 0x7A, 0x69, + 0x6F, 0x6C, 0x6F, 0x6E, 0x6F, 0x6F, 0x70, 0x70, 0x71, 0x71, 0x72, 0x72, + 0x72, 0x73, 0x73, 0x73, 0x74, 0x74, 0x73, 0x73, 0x74, 0x74, 0x75, 0x75, + 0x76, 0x76, 0x77, 0x77, 0x78, 0x78, 0x78, 0x79, 0x79, 0x79, 0x7A, 0x7A, + 0x7B, 0x7B, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, + 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, + 0x84, 0x85, 0x85, 0x85, 0x86, 0x86, 0x86, 0x87, 0x87, 0x88, 0x88, 0x88, + 0x89, 0x89, 0x89, 0x8A, 0x8A, 0x8A, 0x8B, 0x8B, 0x8C, 0x8C, 0x8C, 0x8D, + 0x8D, 0x8D, 0x8E, 0x8E, 0x8E, 0x8F, 0x8F, 0x90, 0x90, 0x90, 0x90, 0x91, + 0x91, 0x92, 0x91, 0x93, 0x74, 0x6B, 0x6E, 0x6D, 0x6E, 0x6E, 0x6F, 0x6F, + 0x70, 0x70, 0x71, 0x71, 0x72, 0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x74, + 0x74, 0x73, 0x74, 0x74, 0x75, 0x75, 0x76, 0x76, 0x77, 0x77, 0x78, 0x78, + 0x78, 0x79, 0x79, 0x79, 0x7A, 0x7A, 0x7B, 0x7B, 0x7C, 0x7C, 0x7D, 0x7D, + 0x7D, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, + 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, 0x84, 0x85, 0x85, 0x85, 0x86, 0x86, + 0x87, 0x87, 0x87, 0x88, 0x88, 0x88, 0x89, 0x89, 0x8A, 0x8A, 0x8A, 0x8A, + 0x8B, 0x8B, 0x8C, 0x8C, 0x8D, 0x8C, 0x8D, 0x8D, 0x8E, 0x8E, 0x8F, 0x8E, + 0x90, 0x8F, 0x90, 0x90, 0x91, 0x90, 0x92, 0x90, 0x95, 0x85, 0x69, 0x6E, + 0x6C, 0x6E, 0x6D, 0x6F, 0x6E, 0x70, 0x6F, 0x71, 0x70, 0x71, 0x71, 0x72, + 0x72, 0x73, 0x73, 0x74, 0x74, 0x75, 0x75, 0x75, 0x74, 0x75, 0x75, 0x76, + 0x76, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x79, 0x79, 0x7A, 0x7A, 0x7B, + 0x7B, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7F, 0x7F, 0x80, + 0x80, 0x80, 0x81, 0x81, 0x81, 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, 0x84, + 0x84, 0x85, 0x85, 0x86, 0x86, 0x86, 0x87, 0x87, 0x87, 0x88, 0x88, 0x89, + 0x89, 0x89, 0x89, 0x8A, 0x8A, 0x8B, 0x8B, 0x8B, 0x8B, 0x8C, 0x8C, 0x8C, + 0x8C, 0x8D, 0x8D, 0x8E, 0x8D, 0x8E, 0x8E, 0x8F, 0x8E, 0x8F, 0x8F, 0x90, + 0x8F, 0x92, 0x88, 0x6D, 0x70, 0x6E, 0x70, 0x70, 0x71, 0x71, 0x72, 0x72, + 0x72, 0x72, 0x73, 0x73, 0x74, 0x74, 0x75, 0x75, 0x76, 0x76, 0x76, 0x77, + 0x77, 0x78, 0x77, 0x77, 0x78, 0x78, 0x78, 0x78, 0x79, 0x79, 0x7A, 0x7A, + 0x7A, 0x7B, 0x7B, 0x7B, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, + 0x82, 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, + 0x85, 0x85, 0x85, 0x85, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x87, 0x87, + 0x87, 0x87, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x89, 0x88, 0x89, 0x89, + 0x89, 0x89, 0x8A, 0x89, 0x8A, 0x89, 0x8C, 0x80, 0x73, 0x76, 0x75, 0x76, + 0x76, 0x77, 0x76, 0x77, 0x77, 0x78, 0x78, 0x78, 0x78, 0x79, 0x79, 0x79, + 0x79, 0x7A, 0x7A, 0x7A, 0x7A, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, 0x7B, + 0x7B, 0x7C, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x83, + 0x7C, 0x7B, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7D, 0x7D, 0x7D, + 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x7E, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, + 0x7E, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x81, 0x80, 0x81, 0x80, 0x81, 0x80, 0x7E, 0x7E, 0x7E, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F +}; + + + diff --git a/Spawner.h b/Spawner.h new file mode 100644 index 0000000..797e81e --- /dev/null +++ b/Spawner.h @@ -0,0 +1,35 @@ +#include "Arduino.h" + +class Spawner +{ + public: + void Spawn(int pos, int rate, int sp, int dir, long activate); + void Kill(); + int Alive(); + int _pos; + int _rate; + int _sp; + int _dir; + long _lastSpawned; + long _activate; + private: + int _alive; +}; + +void Spawner::Spawn(int pos, int rate, int sp, int dir, long activate){ + _pos = pos; + _rate = rate; + _sp = sp; + _dir = dir; + _activate = millis()+activate; + _alive = 1; +} + +void Spawner::Kill(){ + _alive = 0; + _lastSpawned = 0; +} + +int Spawner::Alive(){ + return _alive; +} diff --git a/TWANG32.ino b/TWANG32.ino new file mode 100644 index 0000000..668412a --- /dev/null +++ b/TWANG32.ino @@ -0,0 +1,1176 @@ +/* + TWANG32 - An ESP32 port of TWANG + (c) B. Dring 3/2018 + License: Creative Commons 4.0 Attribution - Share Alike + + TWANG was originally created by Critters + https://github.com/Critters/TWANG + + It was inspired by Robin Baumgartens Line Wobbler Game_Audio + +*/ + + +#include +#include +#include "RunningMedian.h" + +// twang files +#include "twang_mpu.h" +#include "Enemy.h" +#include "Particle.h" +#include "Spawner.h" +#include "Lava.h" +#include "Boss.h" +#include "Conveyor.h" +#include "iSin.h" +#include "sound.h" +#include "settings.h" +//#include "SoundData.h"; +//#include "Game_Audio.h" + + +#define DATA_PIN 16 +#define CLOCK_PIN 17 +#define LED_TYPE APA102 +#define LED_COLOR_ORDER BGR +#define NUM_LEDS 288 + +#define BRIGHTNESS 150 +#define DIRECTION 1 +#define MIN_REDRAW_INTERVAL 16 // Min redraw interval (ms) 33 = 30fps / 16 = 63fps +#define USE_GRAVITY 0 // 0/1 use gravity (LED strip going up wall) +#define BEND_POINT 550 // 0/1000 point at which the LED strip goes up the wall + +// GAME +long previousMillis = 0; // Time of the last redraw +int levelNumber = 0; +long lastInputTime = 0; +#define TIMEOUT 30000 // time until screen saver + + + +int joystickTilt = 0; // Stores the angle of the joystick +int joystickWobble = 0; // Stores the max amount of acceleration (wobble) + +// WOBBLE ATTACK +#define DEFAULT_ATTACK_WIDTH 70 // Width of the wobble attack, world is 1000 wide +int attack_width = DEFAULT_ATTACK_WIDTH; +#define ATTACK_DURATION 500 // Duration of a wobble attack (ms) +long attackMillis = 0; // Time the attack started +bool attacking = 0; // Is the attack in progress? +#define BOSS_WIDTH 40 + +// TODO all animation durations should be defined rather than literals +// because they are used in main loop and some sounds too. +#define STARTUP_WIPEUP_DUR 200 +#define STARTUP_SPARKLE_DUR 1300 +#define STARTUP_FADE_DUR 1500 + +#define GAMEOVER_SPREAD_DURATION 1000 +#define GAMEOVER_FADE_DURATION 1500 + +#define WIN_FILL_DURATION 500 // sound has a freq effect that might need to be adjusted +#define WIN_CLEAR_DURATION 1000 +#define WIN_OFF_DURATION 1200 + +Twang_MPU accelgyro = Twang_MPU(); +CRGB leds[NUM_LEDS]; +RunningMedian MPUAngleSamples = RunningMedian(5); +RunningMedian MPUWobbleSamples = RunningMedian(5); +iSin isin = iSin(); + +//#define DEBUG // comment out to stop serial debugging + +// POOLS +#define LIFE_LEDS 3 +int lifeLEDs[LIFE_LEDS] = {7, 6, 5}; // these numbers are Arduino GPIO numbers...this is not used in the B. Dring enclosure design + +#define ENEMY_COUNT 10 +Enemy enemyPool[ENEMY_COUNT] = { + Enemy(), Enemy(), Enemy(), Enemy(), Enemy(), Enemy(), Enemy(), Enemy(), Enemy(), Enemy() +}; + + +#define PARTICLE_COUNT 40 +Particle particlePool[PARTICLE_COUNT] = { + Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle(), Particle() +}; + +#define SPAWN_COUNT 5 +Spawner spawnPool[SPAWN_COUNT] = { + Spawner(), Spawner() +}; + +#define LAVA_COUNT 5 +Lava lavaPool[LAVA_COUNT] = { + Lava(), Lava(), Lava(), Lava() +}; + +#define CONVEYOR_COUNT 2 +Conveyor conveyorPool[CONVEYOR_COUNT] = { + Conveyor(), Conveyor() +}; + +Boss boss = Boss(); + +enum stages { + STARTUP, + PLAY, + WIN, + DEAD, + SCREENSAVER, + BOSS_KILLED, + GAMEOVER +} stage; + +long stageStartTime; // Stores the time the stage changed for stages that are time based +int playerPosition; // Stores the player position +int playerPositionModifier; // +/- adjustment to player position +bool playerAlive; +long killTime; +int lives = LIVES_PER_LEVEL; +bool lastLevel = false; + +int score = 0; + + +void setup() { + #ifdef DEBUG + Serial.begin(115200); + #endif + + Wire.begin(); + accelgyro.initialize(); + + FastLED.addLeds(leds, NUM_LEDS); + FastLED.setBrightness(BRIGHTNESS); + FastLED.setDither(1); + + sound_init(DAC_AUDIO_PIN); + + stage = STARTUP; + stageStartTime = millis(); +} + +void loop() { + long mm = millis(); + int brightness = 0; + + if(stage == PLAY){ + if(attacking){ + SFXattacking(); + }else{ + SFXtilt(joystickTilt); + + + } + }else if(stage == DEAD){ + SFXdead(); + } + + if (mm - previousMillis >= MIN_REDRAW_INTERVAL) { + getInput(); + + long frameTimer = mm; + previousMillis = mm; + + if(abs(joystickTilt) > JOYSTICK_DEADZONE){ + lastInputTime = mm; + if(stage == SCREENSAVER){ + levelNumber = -1; + stageStartTime = mm; + stage = WIN; + } + }else{ + if(lastInputTime+TIMEOUT < mm){ + + stage = SCREENSAVER; + } + } + if(stage == SCREENSAVER){ + screenSaverTick(); + }else if(stage == STARTUP){ + if (stageStartTime+STARTUP_FADE_DUR > mm) { + tickStartup(mm); + } + else + { + SFXcomplete(); + levelNumber = 0; + loadLevel(); + } + }else if(stage == PLAY){ + // PLAYING + if(attacking && attackMillis+ATTACK_DURATION < mm) attacking = 0; + + // If not attacking, check if they should be + if(!attacking && joystickWobble > ATTACK_THRESHOLD){ + attackMillis = mm; + attacking = 1; + } + + // If still not attacking, move! + playerPosition += playerPositionModifier; + if(!attacking){ + SFXtilt(joystickTilt); + int moveAmount = (joystickTilt/6.0); + if(DIRECTION) moveAmount = -moveAmount; + moveAmount = constrain(moveAmount, -MAX_PLAYER_SPEED, MAX_PLAYER_SPEED); + + playerPosition -= moveAmount; + if(playerPosition < 0) + playerPosition = 0; + + // stop player from leaving if boss is alive + if (boss.Alive() && playerPosition >= 1000) // move player back + playerPosition = 999; //(NUM_LEDS - 1) * (1000.0/NUM_LEDS); + + if(playerPosition >= 1000 && !boss.Alive()) { + // Reached exit! + levelComplete(); + return; + } + } + + if(inLava(playerPosition)){ + die(); + } + + // Ticks and draw calls + FastLED.clear(); + tickConveyors(); + tickSpawners(); + tickBoss(); + tickLava(); + tickEnemies(); + drawPlayer(); + drawAttack(); + drawExit(); + }else if(stage == DEAD){ + // DEAD + FastLED.clear(); + if(!tickParticles()){ + loadLevel(); + } + }else if(stage == WIN){ + // LEVEL COMPLETE + tickWin(mm); + }else if(stage == BOSS_KILLED){ + tickBossKilled(mm); + //tickComplete(mm); + } else if (stage == GAMEOVER) { + if (stageStartTime+GAMEOVER_FADE_DURATION > mm) + { + tickGameover(mm); + } + else + { + FastLED.clear(); + score = 0; // reset the score + levelNumber = 0; + lives = LIVES_PER_LEVEL; + loadLevel(); + } + } + + FastLED.show(); + + } + + +} + +// --------------------------------- +// ------------ LEVELS ------------- +// --------------------------------- +void loadLevel(){ + // leave these alone + updateLives(); + cleanupLevel(); + playerAlive = 1; + lastLevel = false; // this gets changed on the boss level + + /// Defaults...OK to change the following items in the levels below + attack_width = DEFAULT_ATTACK_WIDTH; + playerPosition = 0; + + /* ==== Level Editing Guide =============== + Level creation is done by adding to or editing the switch statement below + + You can add as many levels as you want but you must have a "case" + for each level. The case numbers must start at 0 and go up without skipping any numbers. + + Don't edit case 0 or the last (boss) level. They are special cases and editing them could + break the code. + + TWANG uses a virtual 1000 LED grid. It will then scale that number to your strip, so if you + want something in the middle of your strip use the number 500. Consider the size of your strip + when adding features. All time values are specified in milliseconds (1/1000 of a second) + + You can add any of the following features. + + Enemies: You add up to 10 enemies with the spawnEnemy(...) functions. + spawnEnemy(position, direction, speed, wobble); + position: Where the enemy starts + direction: If it moves, what direction does it go 0=down, 1=away + speed: How fast does it move. Typically 1 to 4. + wobble: 0=regular movement, 1=bouncing back and forth use the speed value + to set the length of the wobble. + + Spawn Pools: This generates and endless source of new enemies. 2 pools max + spawnPool[index].Spawn(position, rate, speed, direction, activate); + index: You can have up to 2 pools, use an index of 0 for the first and 1 for the second. + position: The location the enemies with be generated from. + rate: The time in milliseconds between each new enemy + speed: How fast they move. Typically 1 to 4. + direction: Directions they go 0=down, 1=away + activate: The delay in milliseconds before the first enemy + + Lava: You can create 4 pools of lava. + spawnLava(left, right, ontime, offtime, offset, state); + left: the lower end of the lava pool + right: the upper end of the lava pool + ontime: How long the lave stays on. + offset: the delay before the first switch + state: does it start on or off + + Conveyor: You can create 2 conveyors. + spawnConveyor(startPoint, endPoint, direction) + startPoint: The close end of the conveyor + endPoint: The far end of the conveyor + direction(speed): positive = away, negative = towards you (must be less than +/- player speed) + + ===== Other things you can adjust per level ================ + + Player Start position: + playerPosition = xxx; + + + The size of the TWANG attack + attack_width = xxx; + + + */ + switch(levelNumber){ + case 0: // basic introduction + playerPosition = 200; + spawnEnemy(1, 0, 0, 0); + break; + case 1: + // Slow moving enemy + spawnEnemy(900, 0, 1, 0); + break; + case 2: + // Spawning enemies at exit every 2 seconds + spawnPool[0].Spawn(1000, 3000, 2, 0, 0); + break; + case 3: + // Lava intro + spawnLava(400, 490, 2000, 2000, 0, Lava::OFF); + spawnEnemy(350, 0, 1, 0); + spawnPool[0].Spawn(1000, 5500, 3, 0, 0); + + break; + case 4: + // Sin enemy + spawnEnemy(700, 1, 7, 275); + spawnEnemy(500, 1, 5, 250); + break; + case 5: + // Sin enemy swarm + spawnEnemy(700, 1, 7, 275); + spawnEnemy(500, 1, 5, 250); + + spawnEnemy(600, 1, 7, 200); + spawnEnemy(800, 1, 5, 350); + + spawnEnemy(400, 1, 7, 150); + spawnEnemy(450, 1, 5, 400); + + break; + case 6: + // Conveyor + spawnConveyor(100, 600, -6); + spawnEnemy(800, 0, 0, 0); + break; + case 7: + // Conveyor of enemies + spawnConveyor(50, 1000, 6); + spawnEnemy(300, 0, 0, 0); + spawnEnemy(400, 0, 0, 0); + spawnEnemy(500, 0, 0, 0); + spawnEnemy(600, 0, 0, 0); + spawnEnemy(700, 0, 0, 0); + spawnEnemy(800, 0, 0, 0); + spawnEnemy(900, 0, 0, 0); + break; + case 8: // spawn train; + spawnPool[0].Spawn(900, 1000, 3, 0, 0); + break; + case 9: // spawn train skinny width; + attack_width = 32; + spawnPool[0].Spawn(900, 1800, 2, 0, 0); + break; + case 10: // evil fast split spawner + spawnPool[0].Spawn(550, 1100, 3, 0, 0); + spawnPool[1].Spawn(550, 1100, 3, 1, 0); + break; + case 11: // split spawner with exit blocking lava + spawnPool[0].Spawn(500, 1100, 3, 0, 0); + spawnPool[1].Spawn(500, 1100, 3, 1, 0); + spawnLava(900, 950, 2200, 800, 2000, Lava::OFF); + break; + case 12: + // Lava run + spawnLava(195, 300, 2000, 2000, 0, Lava::OFF); + spawnLava(400, 500, 2000, 2000, 0, Lava::OFF); + spawnLava(600, 700, 2000, 2000, 0, Lava::OFF); + spawnPool[0].Spawn(1000, 3800, 4, 0, 0); + break; + case 13: + // Sin enemy #2 practice (slow conveyor) + spawnEnemy(700, 1, 7, 275); + spawnEnemy(500, 1, 5, 250); + spawnPool[0].Spawn(1000, 5500, 4, 0, 3000); + spawnPool[1].Spawn(0, 5500, 5, 1, 10000); + spawnConveyor(100, 900, -4); + break; + case 14: + // Sin enemy #2 (fast conveyor) + spawnEnemy(700, 1, 7, 275); + spawnEnemy(500, 1, 5, 250); + spawnPool[0].Spawn(1000, 5500, 4, 0, 3000); + spawnPool[1].Spawn(0, 5500, 5, 1, 10000); + spawnConveyor(100, 900, -6); + break; + case 15: // (don't edit last level) + // Boss this should always be the last level + spawnBoss(); + break; + } + stageStartTime = millis(); + stage = PLAY; +} + +void spawnBoss(){ + lastLevel = true; + boss.Spawn(); + moveBoss(); +} + +void moveBoss(){ + int spawnSpeed = 2500; + if(boss._lives == 2) spawnSpeed = 2000; + if(boss._lives == 1) spawnSpeed = 1500; + spawnPool[0].Spawn(boss._pos, spawnSpeed, 3, 0, 0); + spawnPool[1].Spawn(boss._pos, spawnSpeed, 3, 1, 0); +} + +/* ======================== spawn Functions ===================================== + + The following spawn functions add items to pools by looking for an unactive + item in the pool. You can only add as many as the ..._COUNT. Additonal attemps + to add will be ignored. + + ============================================================================== +*/ +void spawnEnemy(int pos, int dir, int speed, int wobble){ + for(int e = 0; e playerPosition?1:-1; + return; + } + } +} + +void spawnLava(int left, int right, int ontime, int offtime, int offset, int state){ + for(int i = 0; i LEVEL_COUNT) + if(lastLevel) + levelNumber = 0; + lives = LIVES_PER_LEVEL; + loadLevel(); +} + +void gameOver(){ + + levelNumber = 0; + loadLevel(); +} + +void die(){ + playerAlive = 0; + if(levelNumber > 0) + lives --; + //updateLives(); + if(lives == 0){ + stage = GAMEOVER; + stageStartTime = millis(); + } + else + { + for(int p = 0; p < PARTICLE_COUNT; p++){ + particlePool[p].Spawn(playerPosition); + } + stageStartTime = millis(); + stage = DEAD; + } + killTime = millis(); +} + +// ---------------------------------- +// -------- TICKS & RENDERS --------- +// ---------------------------------- +void tickStartup(long mm) +{ + FastLED.clear(); + if(stageStartTime+STARTUP_WIPEUP_DUR > mm) // fill to the top with green + { + int n = min(map(((mm-stageStartTime)), 0, STARTUP_WIPEUP_DUR, 0, NUM_LEDS), NUM_LEDS); // fill from top to bottom + for(int i = 0; i<= n; i++){ + leds[i] = CRGB(0, 255, 0); + } + } + else if(stageStartTime+STARTUP_SPARKLE_DUR > mm) // sparkle the full green bar + { + for(int i = 0; i< NUM_LEDS; i++){ + if(random8(30) < 28) + leds[i] = CRGB(0, 255, 0); // most are green + else { + int flicker = random8(250); + leds[i] = CRGB(flicker, 150, flicker); // some flicker brighter + } + } + + } + else if (stageStartTime+STARTUP_FADE_DUR > mm) // fade it out to bottom + { + int n = max(map(((mm-stageStartTime)), STARTUP_SPARKLE_DUR, STARTUP_FADE_DUR, 0, NUM_LEDS), 0); // fill from top to bottom + int brightness = max(map(((mm-stageStartTime)), STARTUP_SPARKLE_DUR, STARTUP_FADE_DUR, 255, 0), 0); + // for(int i = 0; i<= n; i++){ + + // leds[i] = CRGB(0, brightness, 0); + // } + for(int i = n; i< NUM_LEDS; i++){ + + leds[i] = CRGB(0, brightness, 0); + } + } + SFXFreqSweepWarble(STARTUP_FADE_DUR, millis()-stageStartTime, 40, 400, 20); + +} + + + +void tickEnemies(){ + for(int i = 0; i playerPosition-(attack_width/2) && enemyPool[i]._pos < playerPosition+(attack_width/2)){ + enemyPool[i].Kill(); + SFXkill(); + } + } + if(inLava(enemyPool[i]._pos)){ + enemyPool[i].Kill(); + SFXkill(); + } + // Draw (if still alive) + if(enemyPool[i].Alive()) { + leds[getLED(enemyPool[i]._pos)] = CRGB(255, 0, 0); + } + // Hit player? + if( + (enemyPool[i].playerSide == 1 && enemyPool[i]._pos <= playerPosition) || + (enemyPool[i].playerSide == -1 && enemyPool[i]._pos >= playerPosition) + ){ + die(); + return; + } + } + } +} + +void tickBoss(){ + // DRAW + if(boss.Alive()){ + boss._ticks ++; + for(int i = getLED(boss._pos-BOSS_WIDTH/2); i<=getLED(boss._pos+BOSS_WIDTH/2); i++){ + leds[i] = CRGB::DarkRed; + leds[i] %= 100; + } + // CHECK COLLISION + if(getLED(playerPosition) > getLED(boss._pos - BOSS_WIDTH/2) && getLED(playerPosition) < getLED(boss._pos + BOSS_WIDTH)){ + die(); + return; + } + // CHECK FOR ATTACK + if(attacking){ + if( + (getLED(playerPosition+(attack_width/2)) >= getLED(boss._pos - BOSS_WIDTH/2) && getLED(playerPosition+(attack_width/2)) <= getLED(boss._pos + BOSS_WIDTH/2)) || + (getLED(playerPosition-(attack_width/2)) <= getLED(boss._pos + BOSS_WIDTH/2) && getLED(playerPosition-(attack_width/2)) >= getLED(boss._pos - BOSS_WIDTH/2)) + ){ + boss.Hit(); + if(boss.Alive()){ + moveBoss(); + }else{ + spawnPool[0].Kill(); + spawnPool[1].Kill(); + } + } + } + } +} + +void drawPlayer(){ + leds[getLED(playerPosition)] = CRGB(0, 255, 0); +} + +void drawExit(){ + if(!boss.Alive()){ + leds[NUM_LEDS-1] = CRGB(0, 0, 255); + } +} + +void tickSpawners(){ + long mm = millis(); + for(int s = 0; s 3) + //sound(380 + random8(200), MAX_VOLUME / 2); // scary lava noise + } + } + lavaPool[i] = LP; + } +} + +bool tickParticles(){ + bool stillActive = false; + uint8_t brightness; + for(int p = 0; p < PARTICLE_COUNT; p++){ + if(particlePool[p].Alive()){ + particlePool[p].Tick(USE_GRAVITY); + + if (particlePool[p]._power < 5) + { + brightness = (5 - particlePool[p]._power) * 10; + leds[getLED(particlePool[p]._pos)] += CRGB(brightness, brightness/2, brightness/2);\ + } + else + leds[getLED(particlePool[p]._pos)] += CRGB(particlePool[p]._power, 0, 0);\ + + stillActive = true; + } + } + return stillActive; +} + +void tickConveyors(){ + int b, dir, n, i, ss, ee, led; + long m = 10000+millis(); + playerPositionModifier = 0; + + // TODO should the visual speed be proportional to the conveyor speed? + + for(i = 0; i 0) leds[led] = CRGB(0, 0, b); + } + + if(playerPosition > conveyorPool[i]._startPoint && playerPosition < conveyorPool[i]._endPoint){ + playerPositionModifier = dir; + } + } + } +} + +void tickComplete(long mm) // the boss is dead +{ + int brightness = 0; + FastLED.clear(); + SFXcomplete(); + if(stageStartTime+500 > mm){ + int n = max(map(((mm-stageStartTime)), 0, 500, NUM_LEDS, 0), 0); + for(int i = NUM_LEDS; i>= n; i--){ + brightness = (sin(((i*10)+mm)/500.0)+1)*255; + leds[i].setHSV(brightness, 255, 50); + } + }else if(stageStartTime+5000 > mm){ + for(int i = NUM_LEDS; i>= 0; i--){ + brightness = (sin(((i*10)+mm)/500.0)+1)*255; + leds[i].setHSV(brightness, 255, 50); + } + }else if(stageStartTime+5500 > mm){ + int n = max(map(((mm-stageStartTime)), 5000, 5500, NUM_LEDS, 0), 0); + for(int i = 0; i< n; i++){ + brightness = (sin(((i*10)+mm)/500.0)+1)*255; + leds[i].setHSV(brightness, 255, 50); + } + }else{ + nextLevel(); + } +} + +void tickBossKilled(long mm) // boss funeral +{ + int brightness = 0; + FastLED.clear(); + if(stageStartTime+500 > mm){ + int n = max(map(((mm-stageStartTime)), 0, 500, NUM_LEDS, 0), 0); + for(int i = NUM_LEDS; i>= n; i--){ + brightness = (sin(((i*10)+mm)/500.0)+1)*255; + leds[i].setHSV(brightness, 255, 50); + } + SFXbosskilled(); + }else if(stageStartTime+6500 > mm){ + for(int i = NUM_LEDS; i>= 0; i--){ + brightness = (sin(((i*10)+mm)/500.0)+1)*255; + leds[i].setHSV(brightness, 255, 50); + } + SFXbosskilled(); + }else if(stageStartTime+7000 > mm){ + int n = max(map(((mm-stageStartTime)), 5000, 5500, NUM_LEDS, 0), 0); + for(int i = 0; i< n; i++){ + brightness = (sin(((i*10)+mm)/500.0)+1)*255; + leds[i].setHSV(brightness, 255, 50); + } + SFXcomplete(); + }else{ + nextLevel(); + } +} + +void tickGameover(long mm) { + + int brightness = 0; + + if(stageStartTime+GAMEOVER_SPREAD_DURATION > mm) // Spread red from player position to top and bottom + { + // fill to top + int n = max(map(((mm-stageStartTime)), 0, GAMEOVER_SPREAD_DURATION, getLED(playerPosition), NUM_LEDS), 0); + for(int i = getLED(playerPosition); i<= n; i++){ + leds[i] = CRGB(255, 0, 0); + } + // fill to bottom + n = max(map(((mm-stageStartTime)), 0, GAMEOVER_SPREAD_DURATION, getLED(playerPosition), 0), 0); + for(int i = getLED(playerPosition); i>= n; i--){ + leds[i] = CRGB(255, 0, 0); + } + SFXgameover(); + } + else if(stageStartTime+GAMEOVER_FADE_DURATION > mm) // fade down to bottom and fade brightness + { + int n = max(map(((mm-stageStartTime)), GAMEOVER_FADE_DURATION, GAMEOVER_SPREAD_DURATION, NUM_LEDS, 0), 0); + brightness = map(((mm-stageStartTime)), GAMEOVER_SPREAD_DURATION, GAMEOVER_FADE_DURATION, 200, 0); + + for(int i = 0; i<= n; i++){ + leds[i] = CRGB(brightness, 0, 0); + } + SFXcomplete(); + } + +} + + + +void tickWin(long mm) { + int brightness = 0; + FastLED.clear(); + if(stageStartTime+WIN_FILL_DURATION > mm){ + int n = max(map(((mm-stageStartTime)), 0, WIN_FILL_DURATION, NUM_LEDS, 0), 0); // fill from top to bottom + for(int i = NUM_LEDS; i>= n; i--){ + brightness = BRIGHTNESS; + leds[i] = CRGB(0, brightness, 0); + } + SFXwin(); + }else if(stageStartTime+WIN_CLEAR_DURATION > mm){ + int n = max(map(((mm-stageStartTime)), WIN_FILL_DURATION, WIN_CLEAR_DURATION, NUM_LEDS, 0), 0); // clear from top to bottom + for(int i = 0; i< n; i++){ + brightness = BRIGHTNESS; + leds[i] = CRGB(0, brightness, 0); + } + SFXwin(); + }else if(stageStartTime+WIN_OFF_DURATION > mm){ // wait a while with leds off + leds[0] = CRGB(0, BRIGHTNESS, 0); + }else{ + nextLevel(); + } +} + + +void drawLives() +{ + // show how many lives are left by drawing a short line of green leds for each life + SFXcomplete(); // stop any sounds + FastLED.clear(); + + int pos = 0; + for (int i = 0; i < lives; i++) + { + for (int j=0; j<4; j++) + { + leds[pos++] = CRGB(0, 255, 0); + FastLED.show(); + } + leds[pos++] = CRGB(0, 0, 0); + delay(20); + } + FastLED.show(); + delay(400); + FastLED.clear(); +} + + + +void drawAttack(){ + if(!attacking) return; + int n = map(millis() - attackMillis, 0, ATTACK_DURATION, 100, 5); + for(int i = getLED(playerPosition-(attack_width/2))+1; i<=getLED(playerPosition+(attack_width/2))-1; i++){ + leds[i] = CRGB(0, 0, n); + } + if(n > 90) { + n = 255; + leds[getLED(playerPosition)] = CRGB(255, 255, 255); + }else{ + n = 0; + leds[getLED(playerPosition)] = CRGB(0, 255, 0); + } + leds[getLED(playerPosition-(attack_width/2))] = CRGB(n, n, 255); + leds[getLED(playerPosition+(attack_width/2))] = CRGB(n, n, 255); +} + +int getLED(int pos){ + // The world is 1000 pixels wide, this converts world units into an LED number + return constrain((int)map(pos, 0, 1000, 0, NUM_LEDS-1), 0, NUM_LEDS-1); +} + +bool inLava(int pos){ + // Returns if the player is in active lava + int i; + Lava LP; + for(i = 0; i pos) return true; + } + } + return false; +} + +void updateLives(){ + // Updates the life LEDs to show how many lives the player has left + //for(int i = 0; ii?HIGH:LOW); + //} + + drawLives(); +} + +// --------------------------------- +// --------- SCREENSAVER ----------- +// --------------------------------- +void screenSaverTick(){ + int n, b, c, i; + long mm = millis(); + int mode = (mm/30000)%5; + + SFXcomplete(); // make sure there is not sound...play testing showed this to be a problem + + for(i = 0; i orange + n = (mm/250)%10; + b = 10+((sin(mm/500.00)+1)*20.00); + c = 20+((sin(mm/5000.00)+1)*33); + for(i = 0; i= 1){ + // Random flashes + randomSeed(mm); + for(i = 0; i+90 value to joystickTilt + // and any value to joystickWobble that is greater than ATTACK_THRESHOLD (defined at start) + // For example you could use 3 momentary buttons: + // if(digitalRead(leftButtonPinNumber) == HIGH) joystickTilt = -90; + // if(digitalRead(rightButtonPinNumber) == HIGH) joystickTilt = 90; + // if(digitalRead(attackButtonPinNumber) == HIGH) joystickWobble = ATTACK_THRESHOLD; + + int16_t ax, ay, az, gx, gy, gz, accel, gyro; + + accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); + + + // what orientation is used? + if (JOYSTICK_ORIENTATION == 0) { + accel = ax; + gyro = gx; + } + else if (JOYSTICK_ORIENTATION == 1) { + accel = ay; + gyro = gy; + } + else { + accel = ay; + gyro = gy; + } + + accel = accel / 166; // adjust it to degrees. + + // apply the deadzone + if(abs(accel) < JOYSTICK_DEADZONE) accel = 0; + if(accel > 0) accel -= JOYSTICK_DEADZONE; + if(accel < 0) accel += JOYSTICK_DEADZONE; + + MPUAngleSamples.add(accel); + MPUWobbleSamples.add(gyro); + + joystickTilt = MPUAngleSamples.getMedian(); + joystickWobble = abs(MPUWobbleSamples.getHighest()); + + if(JOYSTICK_DIRECTION == 1) { // what direction is MPU facing + joystickTilt = 0-joystickTilt; + } + + + + #ifdef DEBUG // show input Data + Serial.print("Tilt: "); Serial.println(joystickTilt); + //Serial.print("Wobble: "); Serial.println(joystickWobble); + #endif + +} + +// --------------------------------- +// -------------- SFX -------------- +// --------------------------------- + +/* +/* + This is used sweep across (up or down) a frequency range for a specified duration. + A sin based warble is added to the frequency. This function is meant to be called + on each frame to adjust the frequency in sync with an animation + + duration = over what time period is this mapped + elapsedTime = how far into the duration are we in + freqStart = the beginning frequency + freqEnd = the ending frequency + warble = the amount of warble added (0 disables) + + +*/ +void SFXFreqSweepWarble(int duration, int elapsedTime, int freqStart, int freqEnd, int warble) +{ + int freq = map_constrain(elapsedTime, 0, duration, freqStart, freqEnd); + if (warble) + warble = map(sin(millis()/20.0)*1000.0, -1000, 1000, 0, warble); + + sound(freq + warble, MAX_VOLUME); +} + +/* + + This is used sweep across (up or down) a frequency range for a specified duration. + Random noise is optionally added to the frequency. This function is meant to be called + on each frame to adjust the frequency in sync with an animation + + duration = over what time period is this mapped + elapsedTime = how far into the duration are we in + freqStart = the beginning frequency + freqEnd = the ending frequency + noiseFactor = the amount of noise to added/subtracted (0 disables) + + +*/ +void SFXFreqSweepNoise(int duration, int elapsedTime, int freqStart, int freqEnd, uint8_t noiseFactor) +{ + int freq; + + if (elapsedTime > duration) + freq = freqEnd; + else + freq = map(elapsedTime, 0, duration, freqStart, freqEnd); + + if (noiseFactor) + noiseFactor = noiseFactor - random8(noiseFactor / 2); + + sound(freq + noiseFactor, MAX_VOLUME); +} + + +void SFXtilt(int amount){ + if (amount == 0){ + SFXcomplete(); + return; + } + + int f = map(abs(amount), 0, 90, 80, 900)+random8(100); + if(playerPositionModifier < 0) f -= 500; + if(playerPositionModifier > 0) f += 200; + int vol = map(abs(amount), 0, 90, MAX_VOLUME / 2, MAX_VOLUME * 3/4); + sound(f,vol); +} +void SFXattacking(){ + int freq = map(sin(millis()/2.0)*1000.0, -1000, 1000, 500, 600); + if(random8(5)== 0){ + freq *= 3; + } + sound(freq, MAX_VOLUME); +} +void SFXdead(){ + SFXFreqSweepNoise(1000, millis()-killTime, 1000, 10, 200); +} + +void SFXgameover(){ + SFXFreqSweepWarble(GAMEOVER_SPREAD_DURATION, millis()-killTime, 440, 20, 60); +} + +void SFXkill(){ + sound(2000, MAX_VOLUME); +} +void SFXwin(){ + SFXFreqSweepWarble(WIN_OFF_DURATION, millis()-stageStartTime, 40, 400, 20); +} + +void SFXbosskilled() +{ + SFXFreqSweepWarble(7000, millis()-stageStartTime, 75, 1100, 60); +} + +void SFXcomplete(){ + soundOff(); +} + + +/* + This works just like the map function except x is constrained to the range of in_min and in_max +*/ +long map_constrain(long x, long in_min, long in_max, long out_min, long out_max) +{ + // constain the x value to be between in_min and in_max + if (in_max > in_min){ // map allows min to be larger than max, but constrain does not + x = constrain(x, in_min, in_max); + } + else { + x = constrain(x, in_max, in_min); + } + return map(x, in_min, in_max, out_min, out_max); +} + diff --git a/iSin.h b/iSin.h new file mode 100644 index 0000000..29b3d15 --- /dev/null +++ b/iSin.h @@ -0,0 +1,38 @@ +#include "Arduino.h" + +class iSin +{ + public: + int convert(long x); + private: + uint8_t isinTable8[91] = { + 0, 4, 9, 13, 18, 22, 27, 31, 35, 40, 44, + 49, 53, 57, 62, 66, 70, 75, 79, 83, 87, + 91, 96, 100, 104, 108, 112, 116, 120, 124, 128, + 131, 135, 139, 143, 146, 150, 153, 157, 160, 164, + 167, 171, 174, 177, 180, 183, 186, 190, 192, 195, + 198, 201, 204, 206, 209, 211, 214, 216, 219, 221, + 223, 225, 227, 229, 231, 233, 235, 236, 238, 240, + 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 253, 254, 254, 254, 255, 255, 255, 255 + }; +}; + +int iSin::convert(long x) +{ + boolean pos = true; // positive - keeps an eye on the sign. + if (x < 0) + { + x = -x; + pos = !pos; + } + if (x >= 360) x %= 360; + if (x > 180) + { + x -= 180; + pos = !pos; + } + if (x > 90) x = 180 - x; + if (pos) return isinTable8[x]/2 ; + return -isinTable8[x]/2 ; +} diff --git a/settings.h b/settings.h new file mode 100644 index 0000000..dcb89a7 --- /dev/null +++ b/settings.h @@ -0,0 +1,15 @@ +// PLAYER +#define MAX_PLAYER_SPEED 10 // Max move speed of the player +#define LIVES_PER_LEVEL 3 // default lives per level + +// JOYSTICK +#define JOYSTICK_ORIENTATION 1 // 0, 1 or 2 to set the axis of the joystick +#define JOYSTICK_DIRECTION 1 // 0/1 to flip joystick direction +#define ATTACK_THRESHOLD 30000 // The threshold that triggers an attack +#define JOYSTICK_DEADZONE 8 // Angle to ignore + +// AUDIO +#define MAX_VOLUME 20 // 0 to 255 +#define DAC_AUDIO_PIN 25 // should be 25 or 26 only + +//TODO ... move all the settings to this file. \ No newline at end of file diff --git a/sound.h b/sound.h new file mode 100644 index 0000000..9af92f1 --- /dev/null +++ b/sound.h @@ -0,0 +1,86 @@ +/* + * This creates sound tones by outputting a square wave on a DAC pin. The + * volume of the tone is the level of the DAC pin. + * + * The square wave is created by a timer. The timer runs at 2x the freq, because + * it needs to transition high and then low. + * + * + */ + + +#include "esp32-hal-timer.h"; + +#define ESP32_F_CPU 80000000 // the speed of the processor +#define AUDIO_INTERRUPT_PRESCALER 80 +#define SOUND_TIMER_NO 0 +//#define AUDIO_PIN 25 +#define MIN_FREQ 20 +#define MAX_FREQ 16000 + +hw_timer_t * sndTimer = NULL; + +bool sound_on = true; +bool sound_wave_high = true; // this toggles to create the high/low transitions of the wave +uint8_t sound_volume = 0; + +void sound_init(int pin); +bool sound(uint16_t freq, uint8_t volume); +void soundOff(); + +int dac_pin; + + + +void IRAM_ATTR onSoundTimer() +{ + if (sound_on) { + dacWrite(dac_pin, (sound_wave_high?sound_volume:0)); + sound_wave_high = ! sound_wave_high; + + } + else + dacWrite(dac_pin, 0); +} + +void sound_init(int pin){ // pin must be a DAC pin number !! (typically 25 or 26) + dac_pin = pin; + sound_on = false; + pinMode(dac_pin, OUTPUT); + sound_volume = 0; + + sndTimer = timerBegin(SOUND_TIMER_NO, AUDIO_INTERRUPT_PRESCALER, true); + timerAttachInterrupt(sndTimer, &onSoundTimer, true); + timerAlarmWrite(sndTimer, ESP32_F_CPU/AUDIO_INTERRUPT_PRESCALER/MIN_FREQ, true); // lower timer freq + timerAlarmEnable(sndTimer); +} + +bool sound(uint16_t freq, uint8_t volume){ + if (volume == 0) { + soundOff(); + return false; + } + if (freq < MIN_FREQ || freq > MAX_FREQ) { + return false; + } + sound_on = true; + sound_volume = volume; + timerAlarmWrite(sndTimer, ESP32_F_CPU/AUDIO_INTERRUPT_PRESCALER/(freq * 2), true); + return true; +} + +void soundOff(){ + sound_on = false; + sound_volume = 0; + timerAlarmWrite(sndTimer, ESP32_F_CPU/AUDIO_INTERRUPT_PRESCALER/(MIN_FREQ), true); // lower timer freq +} + + + + + + + + + + diff --git a/twang_mpu.h b/twang_mpu.h new file mode 100644 index 0000000..74659fd --- /dev/null +++ b/twang_mpu.h @@ -0,0 +1,44 @@ +// A very simple implementation of the MPU-6050 limited to the +// TWANG requirements +// I reused the function names to make it compatible +// B. Dring 2/2018 + +class Twang_MPU +{ + + public: + void initialize(); + void getMotion6(int16_t* xAccel, int16_t* yAccel, int16_t* zAccel, int16_t* xGyro, int16_t* yGyro, int16_t* zGyro); + + private: + static const uint8_t MPU_ADDR = 0x68; + static const uint8_t PWR_MGMT_1 = 0x6B; + static const uint8_t MPU_DATA_REG_START = 0x3B; + static const uint8_t MPU_DATA_LEN = 14; +}; + +void Twang_MPU::initialize() +{ + Wire.beginTransmission(MPU_ADDR); + Wire.write(PWR_MGMT_1); // PWR_MGMT_1 register + Wire.write(0); // set to zero (wakes up the MPU-6050) + Wire.endTransmission(true); +} + + +void Twang_MPU::getMotion6(int16_t* xAccel, int16_t* yAccel, int16_t* zAccel, int16_t* xGyro, int16_t* yGyro, int16_t* zGyro) +{ + + Wire.beginTransmission(MPU_ADDR); + Wire.write(MPU_DATA_REG_START); // starting with register 0x3B (ACCEL_XOUT_H) + Wire.endTransmission(false); + Wire.requestFrom(MPU_ADDR,MPU_DATA_LEN,true); // read the whole MPU data section + *xAccel=Wire.read()<<8|Wire.read(); // x Accel + *yAccel=Wire.read()<<8|Wire.read(); // y Accel + *zAccel=Wire.read()<<8|Wire.read(); // z Accel + Wire.read(); Wire.read(); // Temperature..not used, but need to read it + *xGyro=Wire.read()<<8|Wire.read(); // x Gyro + *yGyro=Wire.read()<<8|Wire.read(); // y Gyro + *zGyro=Wire.read()<<8|Wire.read(); // z Gyro +} +