Merge branch 'dev' into audioreactive-prototype

This commit is contained in:
Blaz Kristan 2022-09-01 22:20:39 +02:00
commit 36e10539e0
17 changed files with 3292 additions and 3279 deletions

View File

@ -264,6 +264,7 @@ board_build.ldscript = ${common.ldscript_4m1m}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266
lib_deps = ${esp8266.lib_deps}
monitor_filters = esp8266_exception_decoder
[env:esp8266_2m]
board = esp_wroom_02

View File

@ -3470,9 +3470,9 @@ static const char _data_FX_MODE_DRIP[] PROGMEM = "Drip@Gravity,# of drips;!,!;!;
typedef struct Tetris {
float pos;
float speed;
uint32_t col;
uint16_t aux0; // 2D-fication of SEGENV.aux0 (brick size)
uint16_t aux1; // 2D-fication of SEGENV.aux1 (stack size)
uint8_t col; // color index
uint16_t brick; // brick size in pixels
uint16_t stack; // stack size in pixels
uint32_t step; // 2D-fication of SEGENV.step (state)
} tetris;
@ -3491,7 +3491,7 @@ uint16_t mode_tetrix(void) {
static void runStrip(size_t stripNr, Tetris *drop) {
// initialize dropping on first call or segment full
if (SEGENV.call == 0) {
drop->aux1 = 0; // reset brick stack size
drop->stack = 0; // reset brick stack size
drop->step = 0;
//for (int i=0; i<SEGLEN; i++) SEGMENT.setPixelColor(i | int((stripNr+1)<<16), SEGCOLOR(1)); // will fill virtual strip only
}
@ -3504,9 +3504,9 @@ uint16_t mode_tetrix(void) {
speed = map(speed, 1, 255, 5000, 250); // time taken for full (SEGLEN) drop
drop->speed = float(SEGLEN * FRAMETIME) / float(speed); // set speed
drop->pos = SEGLEN; // start at end of segment (no need to subtract 1)
drop->col = SEGMENT.color_from_palette(random8(0,15)<<4,false,false,0); // limit color choices so there is enough HUE gap
drop->col = random8(0,15)<<4; // limit color choices so there is enough HUE gap
drop->step = 1; // drop state (0 init, 1 forming, 2 falling)
drop->aux0 = (SEGMENT.intensity ? (SEGMENT.intensity>>5)+1 : random8(1,5)) * (1+(SEGLEN>>6)); // size of brick
drop->brick = (SEGMENT.intensity ? (SEGMENT.intensity>>5)+1 : random8(1,5)) * (1+(SEGLEN>>6)); // size of brick
}
if (drop->step == 1) { // forming
@ -3516,24 +3516,27 @@ uint16_t mode_tetrix(void) {
}
if (drop->step == 2) { // falling
if (drop->pos > drop->aux1) { // fall until top of stack
if (drop->pos > drop->stack) { // fall until top of stack
drop->pos -= drop->speed; // may add gravity as: speed += gravity
if (uint16_t(drop->pos) < drop->aux1) drop->pos = drop->aux1;
for (int i=int(drop->pos); i<SEGLEN; i++) SEGMENT.setPixelColor(i | int((stripNr+1)<<16), i<int(drop->pos)+drop->aux0 ? drop->col : SEGCOLOR(1));
if (uint16_t(drop->pos) < drop->stack) drop->pos = drop->stack;
for (int i=int(drop->pos); i<SEGLEN; i++) {
uint32_t col = i<int(drop->pos)+drop->brick ? SEGMENT.color_from_palette(drop->col, false, false, 0) : SEGCOLOR(1);
SEGMENT.setPixelColor(i | int((stripNr+1)<<16), col);
}
} else { // we hit bottom
drop->step = 0; // proceed with next brick, go back to init
drop->aux1 += drop->aux0; // increase the stack size
if (drop->aux1 >= SEGLEN) drop->step = millis() + 2000; // fade out stack
drop->stack += drop->brick; // increase the stack size
if (drop->stack >= SEGLEN) drop->step = millis() + 2000; // fade out stack
}
}
if (drop->step > 2) {
drop->aux0 = 0; // reset brick size (no more growing)
if (drop->step > 2) { // fade strip
drop->brick = 0; // reset brick size (no more growing)
if (drop->step > millis()) {
// allow fading of virtual strip
for (int i=0; i<SEGLEN; i++) SEGMENT.blendPixelColor(i | int((stripNr+1)<<16), SEGCOLOR(1), 25); // 10% blend
for (int i=0; i<SEGLEN; i++) SEGMENT.blendPixelColor(i | int((stripNr+1)<<16), SEGCOLOR(1), 25); // 10% blend with Bg color
} else {
drop->aux1 = 0; // reset brick stack size
drop->stack = 0; // reset brick stack size
drop->step = 0; // proceed with next brick
}
}

View File

@ -357,26 +357,21 @@ typedef struct Segment {
union {
uint16_t options; //bit pattern: msb first: [transposed mirrorY reverseY] transitional (tbd) paused needspixelstate mirrored on reverse selected
struct {
bool selected : 1; // 0 : selected
bool reverse : 1; // 1 : reversed
bool on : 1; // 2 : is On
bool mirror : 1; // 3 : mirrored
bool pxs : 1; // 4 : indicates that the effect does not use FRAMETIME or needs getPixelColor (?)
bool freeze : 1; // 5 : paused/frozen
bool reset : 1; // 6 : indicates that Segment runtime requires reset
bool transitional: 1; // 7 : transitional (there is transition occuring)
bool reverse_y : 1; // 8 : reversed Y (2D)
bool mirror_y : 1; // 9 : mirrored Y (2D)
bool transpose : 1; // 10 : transposed (2D, swapped X & Y)
uint8_t map1D2D : 3; // 11-13 : mapping for 1D effect on 2D (0-use as strip, 1-expand vertically, 2-circular/arc, 3-rectangular/corner, ...)
uint8_t soundSim : 2; // 14-15 : 0-3 sound simulation types
bool selected : 1; // 0 : selected
bool reverse : 1; // 1 : reversed
bool on : 1; // 2 : is On
bool mirror : 1; // 3 : mirrored
bool freeze : 1; // 4 : paused/frozen
bool reset : 1; // 5 : indicates that Segment runtime requires reset
bool transitional: 1; // 6 : transitional (there is transition occuring)
bool reverse_y : 1; // 7 : reversed Y (2D)
bool mirror_y : 1; // 8 : mirrored Y (2D)
bool transpose : 1; // 9 : transposed (2D, swapped X & Y)
uint8_t map1D2D : 3; // 10-12 : mapping for 1D effect on 2D (0-use as strip, 1-expand vertically, 2-circular/arc, 3-rectangular/corner, ...)
uint8_t soundSim : 3; // 13-15 : 0-7 sound simulation types
};
};
uint8_t grouping, spacing;
//struct {
// uint8_t grouping : 4; // maximum 15 pixels in a group
// uint8_t spacing : 4; // maximum 15 pixels per gap
//};
uint8_t opacity;
uint32_t colors[NUM_COLORS];
uint8_t cct; //0==1900K, 255==10091K
@ -418,17 +413,20 @@ typedef struct Segment {
// transition data, valid only if transitional==true, holds values during transition
struct Transition {
uint32_t _colorT[NUM_COLORS];
uint8_t _briT; // temporary brightness
uint8_t _cctT; // temporary CCT
CRGBPalette16 _palT; // temporary palette
uint8_t _modeP; // previous mode/effect
uint8_t _briT; // temporary brightness
uint8_t _cctT; // temporary CCT
CRGBPalette16 _palT; // temporary palette
uint8_t _modeP; // previous mode/effect
//uint16_t _aux0, _aux1; // previous mode/effect runtime data
//uint32_t _step, _call; // previous mode/effect runtime data
//byte *_data; // previous mode/effect runtime data
uint32_t _start;
uint16_t _dur;
Transition(uint16_t dur=750) : _briT(255), _cctT(127), _palT(CRGBPalette16(CRGB::Black)), _modeP(FX_MODE_STATIC), _start(millis()), _dur(dur) {}
Transition(uint16_t d, uint8_t b, uint8_t c, const uint32_t *o) : _briT(b), _cctT(c), _palT(CRGBPalette16(CRGB::Black)), _modeP(FX_MODE_STATIC), _start(millis()), _dur(d) {
for (size_t i=0; i<NUM_COLORS; i++) _colorT[i] = o[i];
}
} *_t; // this struct will bootloop ESP
} *_t;
public:
@ -530,8 +528,7 @@ typedef struct Segment {
* Safe to call from interrupts and network requests.
*/
inline void markForReset(void) { reset = true; } // setOption(SEG_OPTION_RESET, true)
//inline void setUpLeds() { if (!leds) leds = (CRGB*)malloc(sizeof(CRGB)*length()); }
void setUpLeds(void);
void setUpLeds(void); // set up leds[] array for loseless getPixelColor()
// transition functions
void startTransition(uint16_t dur); // transition has to start before actual segment values change

View File

@ -297,8 +297,8 @@ void Segment::startTransition(uint16_t dur) {
if (!_t) _t = new Transition(dur); // no previous transition running
if (!_t) return; // failed to allocate data
_t->_briT = _briT;
_t->_cctT = _cctT;
_t->_briT = _briT;
_t->_cctT = _cctT;
_t->_palT = _palT;
_t->_modeP = _modeP;
for (size_t i=0; i<NUM_COLORS; i++) _t->_colorT[i] = _colorT[i];
@ -625,7 +625,7 @@ uint8_t Segment::differs(Segment& b) const {
if (stopY != b.stopY) d |= SEG_DIFFERS_BOUNDS;
//bit pattern: msb first: [transposed mirrorY reverseY] transitional (tbd) paused needspixelstate mirrored on reverse selected
if ((options & 0b1111111100101110) != (b.options & 0b1111111100101110)) d |= SEG_DIFFERS_OPT;
if ((options & 0b1111111110011110) != (b.options & 0b1111111110011110)) d |= SEG_DIFFERS_OPT;
if ((options & 0x01) != (b.options & 0x01)) d |= SEG_DIFFERS_SEL;
for (uint8_t i = 0; i < NUM_COLORS; i++) if (colors[i] != b.colors[i]) d |= SEG_DIFFERS_COL;
@ -1545,7 +1545,7 @@ const char JSON_mode_names[] PROGMEM = R"=====(["Mode names have moved"])=====";
const char JSON_palette_names[] PROGMEM = R"=====([
"Default","* Random Cycle","* Color 1","* Colors 1&2","* Color Gradient","* Colors Only","Party","Cloud","Lava","Ocean",
"Forest","Rainbow","Rainbow Bands","Sunset","Rivendell","Breeze","Red & Blue","Yellowout","Analogous","Splash",
"Pastel","Sunset 2","Beech","Vintage","Departure","Landscape","Beach","Sherbet","Hult","Hult 64",
"Pastel","Sunset 2","Beach","Vintage","Departure","Landscape","Beech","Sherbet","Hult","Hult 64",
"Drywet","Jul","Grintage","Rewhi","Tertiary","Fire","Icefire","Cyane","Light Pink","Autumn",
"Magenta","Magred","Yelmag","Yelblu","Orange & Teal","Tiamat","April Night","Orangery","C9","Sakura",
"Aurora","Atlantica","C9 2","C9 New","Temperature","Aurora 2","Retro Clown","Candy","Toxy Reaf","Fairy Reaf",

View File

@ -226,13 +226,12 @@
#define SEG_OPTION_REVERSED 1
#define SEG_OPTION_ON 2
#define SEG_OPTION_MIRROR 3 //Indicates that the effect will be mirrored within the segment
#define SEG_OPTION_NONUNITY 4 //Indicates that the effect does not use FRAMETIME or needs getPixelColor
#define SEG_OPTION_FREEZE 5 //Segment contents will not be refreshed
#define SEG_OPTION_RESET 6 //Segment runtime requires reset
#define SEG_OPTION_TRANSITIONAL 7
#define SEG_OPTION_REVERSED_Y 8
#define SEG_OPTION_MIRROR_Y 9
#define SEG_OPTION_TRANSPOSED 10
#define SEG_OPTION_FREEZE 4 //Segment contents will not be refreshed
#define SEG_OPTION_RESET 5 //Segment runtime requires reset
#define SEG_OPTION_TRANSITIONAL 6
#define SEG_OPTION_REVERSED_Y 7
#define SEG_OPTION_MIRROR_Y 8
#define SEG_OPTION_TRANSPOSED 9
//Segment differs return byte
#define SEG_DIFFERS_BRI 0x01

View File

@ -653,8 +653,8 @@ function populateInfo(i)
}
}
var vcn = "Kuuhaku";
if (i.ver.startsWith("0.13.")) vcn = "Toki";
if (i.ver.includes("-bl")) vcn = "Ryujin";
if (i.ver.startsWith("0.14.")) vcn = "Hoshi";
if (i.ver.includes("-bl")) vcn = "Supāku";
if (i.cn) vcn = i.cn;
cn += `v${i.ver} "${vcn}"<br><br><table>
@ -714,7 +714,7 @@ function populateSegments(s)
}
let map2D = `<div id="seg${i}map2D" data-map="map2D" class="lbl-s hide">Expand 1D FX<br>
<div class="sel-p"><select class="sel-p" id="seg${i}mp12" onchange="setMp12(${i})">
<option value="0" ${inst.mp12==0?' selected':''}>Pxels</option>
<option value="0" ${inst.mp12==0?' selected':''}>Pixels</option>
<option value="1" ${inst.mp12==1?' selected':''}>Bar</option>
<option value="2" ${inst.mp12==2?' selected':''}>Arc</option>
<option value="3" ${inst.mp12==3?' selected':''}>Corner</option>

View File

@ -230,6 +230,7 @@
Global SPI GPIOs (HW)<br>
<i style="color: orange;">(only changable on ESP32, change requires reboot!)</i><br>
MOSI:<input type="number" min="-1" max="33" name="MOSI" onchange="check(this,'if')" class="s" placeholder="MOSI">
MISO:<input type="number" min="-1" max="33" name="MISO" onchange="check(this,'if')" class="s" placeholder="MISO">
SCLK:<input type="number" min="-1" max="33" name="SCLK" onchange="check(this,'if')" class="s" placeholder="SCLK">
<div id="um">Loading settings...</div>
<hr><button type="button" onclick="B()">Back</button><button type="submit">Save</button>

View File

@ -505,8 +505,8 @@ function populateInfo(i)
}
}
var vcn = "Kuuhaku";
if (i.ver.startsWith("0.13.")) vcn = "Toki";
if (i.ver.includes("-bl")) vcn = "Ryujin";
if (i.ver.startsWith("0.14.")) vcn = "Hoshi";
if (i.ver.includes("-bl")) vcn = "Supāku";
if (i.cn) vcn = i.cn;
cn += `v${i.ver} "${vcn}"<br><br><table>

View File

@ -1583,166 +1583,166 @@ const uint8_t PAGE_settings_sec[] PROGMEM = {
// Autogenerated from wled00/data/settings_um.htm, do not edit!!
const uint16_t PAGE_settings_um_length = 2514;
const uint16_t PAGE_settings_um_length = 2526;
const uint8_t PAGE_settings_um[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x58, 0xdb, 0x72, 0xdb, 0x38,
0x12, 0x7d, 0xd7, 0x57, 0xd0, 0x88, 0xcb, 0x26, 0x4b, 0x34, 0x25, 0xc7, 0x3b, 0xb3, 0x89, 0x24,
0xc8, 0x93, 0x38, 0xc9, 0x44, 0x9b, 0x8b, 0x5d, 0xa5, 0xb9, 0xd4, 0x96, 0xd7, 0x35, 0xa6, 0x44,
0x48, 0x42, 0x4c, 0x81, 0x5c, 0x00, 0xf4, 0x65, 0x65, 0xfd, 0xfb, 0x9e, 0x06, 0x49, 0x5d, 0x1c,
0x3b, 0xb3, 0x33, 0x5b, 0xfb, 0xb2, 0x2f, 0x12, 0x09, 0x36, 0x9a, 0x8d, 0xd3, 0xdd, 0xa7, 0xbb,
0xd9, 0xdb, 0x79, 0x73, 0x7a, 0xf2, 0xd3, 0xdf, 0xcf, 0xde, 0x7a, 0x33, 0x3b, 0x4f, 0xfb, 0xbd,
0xea, 0x57, 0xc4, 0x89, 0x97, 0xc6, 0x6a, 0xca, 0x99, 0x50, 0xac, 0xdf, 0x9b, 0x0b, 0x1b, 0x7b,
0xe3, 0x59, 0xac, 0x8d, 0xb0, 0x9c, 0x15, 0x76, 0x72, 0xf0, 0xa2, 0x5e, 0x6d, 0xa8, 0x78, 0x2e,
0x38, 0xbb, 0x96, 0xe2, 0x26, 0xcf, 0xb4, 0x65, 0xde, 0x38, 0x53, 0x56, 0x28, 0x88, 0xdd, 0xc8,
0xc4, 0xce, 0xf8, 0x77, 0xed, 0xf6, 0x4a, 0xf4, 0xc1, 0xa3, 0x44, 0x5c, 0xcb, 0xb1, 0x38, 0x70,
0x37, 0xa1, 0x54, 0xd2, 0xca, 0x38, 0x3d, 0x30, 0xe3, 0x38, 0x15, 0xfc, 0x30, 0x9c, 0xc7, 0xb7,
0x72, 0x5e, 0xcc, 0x57, 0xf7, 0x85, 0x11, 0xda, 0xdd, 0xc4, 0x23, 0xdc, 0xab, 0x8c, 0x7d, 0xf5,
0xe6, 0x7e, 0xcf, 0x4a, 0x9b, 0x8a, 0xfe, 0xcf, 0x90, 0x9c, 0x67, 0x89, 0x37, 0x14, 0xd6, 0x4a,
0x35, 0x35, 0xbd, 0x56, 0xb9, 0xde, 0x33, 0x63, 0x2d, 0x73, 0xdb, 0x6f, 0x5c, 0xc7, 0xda, 0xcb,
0x6e, 0x94, 0xd0, 0x61, 0x9a, 0x8d, 0x65, 0x1e, 0x16, 0x3a, 0xbb, 0x31, 0x61, 0xc2, 0x93, 0x6c,
0x5c, 0xcc, 0x61, 0x5f, 0x58, 0xcc, 0x4f, 0x26, 0x53, 0xbe, 0x58, 0x86, 0xb9, 0x54, 0x86, 0x9f,
0x7f, 0x1f, 0xfe, 0x35, 0x7c, 0x11, 0xbe, 0x0c, 0x0f, 0xdb, 0xe1, 0xe1, 0xe1, 0x05, 0x2d, 0x9e,
0xf2, 0x73, 0xa6, 0xcd, 0x75, 0xc2, 0xc2, 0xdf, 0xff, 0xbb, 0xa0, 0xb7, 0xf0, 0x9d, 0xc3, 0x50,
0x15, 0xf3, 0x4f, 0xbc, 0xdd, 0x9d, 0x14, 0x6a, 0x6c, 0x65, 0xa6, 0xbc, 0xe9, 0x20, 0xf1, 0x45,
0xb0, 0xd0, 0xc2, 0x16, 0x5a, 0x79, 0x49, 0x34, 0x15, 0xf6, 0x6d, 0x2a, 0xc8, 0x80, 0xd7, 0x77,
0xee, 0xd1, 0x72, 0x25, 0x2a, 0xcd, 0xe9, 0x86, 0xa8, 0xd8, 0xdb, 0x63, 0xd9, 0xe8, 0x8b, 0x18,
0x5b, 0xc6, 0xb9, 0xbd, 0xcb, 0x45, 0x36, 0xa1, 0xb5, 0x9d, 0x57, 0x5a, 0xc7, 0x77, 0x91, 0x34,
0xee, 0x7f, 0x6b, 0xff, 0x7b, 0x3f, 0x58, 0xdc, 0x48, 0x95, 0x64, 0x37, 0x51, 0x96, 0x0b, 0xe5,
0xb3, 0x99, 0xb5, 0xb9, 0xe9, 0xb4, 0x5a, 0x53, 0x69, 0x67, 0xc5, 0x28, 0x1a, 0x67, 0xf3, 0xd6,
0x2b, 0xa9, 0xc7, 0x59, 0x96, 0x5d, 0x49, 0xd1, 0xfa, 0xf5, 0xe3, 0xdb, 0x37, 0xad, 0x1b, 0x79,
0x25, 0x5b, 0x35, 0x86, 0xcf, 0x8a, 0x12, 0xd4, 0x03, 0x53, 0x2d, 0xb0, 0x0d, 0xed, 0xaf, 0x1f,
0x6a, 0x6f, 0xad, 0xa4, 0x42, 0xf6, 0x9b, 0x11, 0xe9, 0x64, 0x53, 0x3a, 0xcd, 0xe2, 0xe4, 0x6f,
0x43, 0x5f, 0x84, 0x96, 0xef, 0xb4, 0x83, 0x45, 0x2a, 0xac, 0xa7, 0x78, 0x12, 0x8d, 0xb5, 0x88,
0xad, 0xa8, 0x00, 0xf0, 0x59, 0xe9, 0x2b, 0x16, 0x74, 0x55, 0x04, 0x65, 0xaf, 0xac, 0xd5, 0x72,
0x54, 0x58, 0x81, 0x07, 0x7a, 0xcc, 0x42, 0x11, 0x84, 0x0f, 0xd7, 0x09, 0x07, 0xbc, 0xce, 0x8a,
0x5b, 0xdb, 0xfa, 0x12, 0x5f, 0xc7, 0xb5, 0x82, 0xaf, 0x04, 0x63, 0x73, 0xa7, 0xa0, 0xc2, 0x06,
0x61, 0x12, 0x8d, 0xb2, 0xe4, 0x2e, 0x8a, 0x73, 0x18, 0x9d, 0x9c, 0xcc, 0x64, 0x9a, 0xf8, 0x8a,
0xe4, 0xe3, 0x24, 0x79, 0x7b, 0x0d, 0x2b, 0x3e, 0x4a, 0x83, 0x70, 0x15, 0xda, 0x67, 0x64, 0x33,
0x0b, 0xfd, 0x80, 0xf7, 0x17, 0x3f, 0x0a, 0xfb, 0x8b, 0x1f, 0x2c, 0x1f, 0x97, 0x13, 0x5a, 0x67,
0x1a, 0xe6, 0x41, 0x0e, 0xb1, 0x6e, 0xb2, 0x54, 0x44, 0x69, 0x36, 0xf5, 0xd9, 0x5b, 0x5a, 0xf7,
0xaa, 0xc3, 0x03, 0x18, 0x6f, 0x22, 0x53, 0xe1, 0x8e, 0x81, 0xe0, 0xd6, 0x38, 0xee, 0xc7, 0x6a,
0x1d, 0x9e, 0xc4, 0xc6, 0x89, 0x9c, 0x16, 0x3a, 0x76, 0x68, 0x95, 0xc7, 0xf0, 0x26, 0x31, 0x36,
0x24, 0xd1, 0x3f, 0xd4, 0x40, 0xc1, 0x57, 0x39, 0x40, 0x13, 0x5e, 0x1e, 0x4f, 0x85, 0x97, 0xc4,
0x36, 0xde, 0x01, 0xbc, 0x1b, 0x00, 0x0f, 0xe1, 0x0e, 0x46, 0x2f, 0xe8, 0x20, 0x3c, 0x2a, 0xbf,
0x20, 0x04, 0x9d, 0xbe, 0x28, 0xd7, 0x99, 0xcd, 0xc6, 0x59, 0xba, 0xb7, 0xe7, 0xbb, 0xb0, 0x6c,
0x87, 0xbe, 0x4b, 0x02, 0x4e, 0x12, 0xe9, 0xd0, 0x66, 0x1a, 0x5a, 0x29, 0x14, 0x07, 0x56, 0xcc,
0xe9, 0xe0, 0xe3, 0x41, 0xce, 0x82, 0xe0, 0xfe, 0xbe, 0x12, 0xc3, 0xfe, 0x79, 0x0e, 0x83, 0xdf,
0x41, 0xbf, 0xf7, 0x29, 0x4b, 0x44, 0xe4, 0x9d, 0xa5, 0x22, 0x36, 0xc2, 0x03, 0x10, 0x42, 0x7b,
0x14, 0x3a, 0xde, 0xe0, 0x0c, 0x26, 0x85, 0x5b, 0x1a, 0xcd, 0xb6, 0xc6, 0x32, 0xf3, 0x82, 0x00,
0x52, 0x09, 0xec, 0x75, 0xb9, 0x81, 0x77, 0x50, 0x4a, 0xb0, 0x62, 0xce, 0x82, 0x48, 0x2a, 0x00,
0xfa, 0xfe, 0xa7, 0x4f, 0x1f, 0x39, 0xfb, 0x9c, 0x79, 0x55, 0x4a, 0x1b, 0x0f, 0xf9, 0x68, 0xe3,
0x94, 0xa0, 0x60, 0x5b, 0xe9, 0xf1, 0x6e, 0x33, 0x3d, 0x38, 0xe7, 0x4d, 0xe4, 0x83, 0xd8, 0xe1,
0xdc, 0x6f, 0xdf, 0x6f, 0xe7, 0xd1, 0xe0, 0x31, 0x41, 0xfe, 0x95, 0xe0, 0x78, 0x26, 0xc6, 0x57,
0x14, 0xa3, 0xc1, 0x82, 0xd8, 0x42, 0x71, 0x11, 0x11, 0xdb, 0x44, 0x5a, 0xe4, 0x69, 0x3c, 0x46,
0x14, 0x9d, 0x5f, 0x20, 0xd8, 0x60, 0xa7, 0x29, 0x46, 0xc6, 0x6a, 0xff, 0xe0, 0x28, 0xe8, 0xca,
0x89, 0xcf, 0x70, 0x8e, 0x91, 0xd0, 0xc0, 0x5d, 0x44, 0x14, 0x90, 0x48, 0x54, 0xb0, 0x05, 0x6e,
0x55, 0x2d, 0xd8, 0x0e, 0x8f, 0x82, 0x60, 0x31, 0xc9, 0xb4, 0x4f, 0x7a, 0x25, 0xf8, 0x40, 0xf6,
0x88, 0x65, 0xa2, 0x54, 0xa8, 0xa9, 0x9d, 0x75, 0x65, 0xb3, 0x19, 0x40, 0x91, 0xdd, 0xe1, 0x44,
0x33, 0xe7, 0xf2, 0x22, 0x58, 0xe0, 0x56, 0x44, 0xd7, 0x71, 0x5a, 0xc0, 0x4e, 0x12, 0xc5, 0x22,
0xf4, 0xca, 0x09, 0xd4, 0xae, 0x85, 0x80, 0xb0, 0xbd, 0x43, 0xb8, 0xc1, 0xb5, 0x99, 0xe6, 0x2c,
0x95, 0x73, 0xc1, 0xba, 0x23, 0xe4, 0xd4, 0xd5, 0xf2, 0x91, 0xfd, 0xf7, 0xf7, 0xd5, 0x4a, 0xef,
0xe0, 0x70, 0x75, 0xdd, 0x3f, 0x7a, 0xf9, 0x95, 0x1e, 0x2d, 0x92, 0x5a, 0xcd, 0xf6, 0x93, 0xd5,
0x9e, 0xa3, 0x63, 0x06, 0x0f, 0xab, 0xa9, 0x60, 0x1d, 0xf6, 0x6c, 0x32, 0x99, 0xb0, 0xe5, 0x52,
0xa4, 0x46, 0x2c, 0xcc, 0x8d, 0xb4, 0xe3, 0x99, 0x5f, 0xe2, 0x16, 0x2c, 0xc6, 0x08, 0x11, 0x36,
0x7c, 0xf3, 0x8a, 0x75, 0xca, 0xab, 0x93, 0x8f, 0xd5, 0xd5, 0xa7, 0xd3, 0xe1, 0x60, 0xbd, 0xf8,
0xa1, 0xba, 0x3c, 0x19, 0xb2, 0x8e, 0x7b, 0x6d, 0x37, 0x11, 0x93, 0xb8, 0x48, 0x6d, 0xa7, 0xf4,
0xd9, 0x92, 0x90, 0xfb, 0xff, 0x44, 0x6d, 0x1d, 0x7c, 0xc8, 0xbe, 0x33, 0xbc, 0x91, 0x22, 0x15,
0x56, 0x94, 0xdc, 0x1f, 0xd0, 0xc1, 0x89, 0x53, 0xec, 0xb9, 0x0a, 0xe5, 0x05, 0x78, 0xe2, 0xd4,
0x55, 0x80, 0x08, 0x69, 0xa7, 0xa5, 0x20, 0xe1, 0xa0, 0x12, 0x96, 0x41, 0xe0, 0xaa, 0x1b, 0x57,
0x61, 0xad, 0x49, 0x06, 0x5d, 0x72, 0x8a, 0x47, 0x21, 0x5a, 0x07, 0xe4, 0x37, 0x42, 0x99, 0x34,
0x6d, 0x17, 0x13, 0x59, 0x1a, 0x40, 0x31, 0x6b, 0x81, 0xbe, 0xed, 0xc9, 0x1a, 0x7a, 0x4b, 0xd0,
0x9f, 0xdb, 0x8b, 0x3e, 0x6f, 0x83, 0x53, 0x9c, 0x53, 0xf2, 0xc2, 0xcc, 0x7c, 0x5a, 0x0b, 0x5c,
0xad, 0x2c, 0xef, 0x9d, 0x49, 0x41, 0x6d, 0xc7, 0x57, 0xd2, 0x4f, 0x8b, 0x3e, 0x61, 0xca, 0x23,
0x66, 0xac, 0x4e, 0x4b, 0xaf, 0x5e, 0xc3, 0x09, 0x9a, 0x7e, 0x27, 0x05, 0xc8, 0x1d, 0xe9, 0x1c,
0x02, 0x3c, 0xd4, 0xe2, 0x15, 0xb0, 0x0a, 0xc9, 0xe8, 0xca, 0x7f, 0x93, 0xef, 0xf7, 0x66, 0xda,
0x73, 0xce, 0xaa, 0xfa, 0x93, 0xce, 0xf3, 0xef, 0xdb, 0xf9, 0x2d, 0xeb, 0xef, 0x77, 0xd7, 0xd8,
0xcb, 0x50, 0x3f, 0x82, 0x3d, 0xb4, 0xb0, 0x42, 0x5d, 0x29, 0x18, 0x4e, 0xe1, 0x65, 0x29, 0x38,
0xa4, 0x1a, 0xa7, 0x45, 0x82, 0x87, 0xf0, 0x70, 0x70, 0xbc, 0x61, 0x03, 0x54, 0x04, 0x9d, 0xf5,
0x7d, 0x13, 0xcf, 0x9b, 0xd6, 0xad, 0x2e, 0x1f, 0x3f, 0xb0, 0x5a, 0x63, 0xaf, 0x71, 0x68, 0xdd,
0x53, 0xf5, 0xa1, 0x35, 0x0e, 0xbd, 0x7d, 0xba, 0x73, 0x7d, 0x11, 0xa2, 0xaa, 0x3a, 0xe8, 0x1c,
0x73, 0x99, 0x30, 0xad, 0x5b, 0x04, 0xd5, 0xad, 0x72, 0x32, 0xad, 0xd2, 0x71, 0x94, 0xa1, 0x40,
0xc5, 0x8a, 0x75, 0x52, 0xce, 0x1c, 0xe1, 0x8d, 0xb2, 0x5b, 0x16, 0x1a, 0xbe, 0x5f, 0x86, 0x3d,
0xb3, 0xba, 0x10, 0x6c, 0xbf, 0xe9, 0xab, 0x63, 0x56, 0x12, 0x22, 0xc2, 0xba, 0x83, 0x48, 0x29,
0x43, 0xbb, 0xeb, 0x74, 0x54, 0x84, 0xd7, 0x31, 0xfc, 0xb2, 0xda, 0xb5, 0xbb, 0x50, 0x4b, 0x76,
0x19, 0x56, 0x71, 0xc6, 0xed, 0x46, 0x5c, 0x1d, 0xfb, 0x84, 0xb3, 0x87, 0xd6, 0x8e, 0xb3, 0xa3,
0x97, 0xcc, 0x9b, 0x4b, 0xc5, 0xd9, 0xc1, 0x21, 0xb4, 0xa7, 0xb1, 0x31, 0x9c, 0x19, 0xb6, 0x0f,
0x73, 0x99, 0x54, 0xa8, 0xdb, 0x1d, 0x27, 0x8a, 0xc2, 0x9a, 0x73, 0x16, 0xab, 0xbb, 0x95, 0xcc,
0xed, 0x6d, 0xca, 0xf6, 0xbb, 0xdb, 0xdc, 0x80, 0x3d, 0x54, 0xf7, 0xc9, 0xf6, 0x2d, 0x2b, 0x1e,
0xb8, 0xf3, 0x3b, 0xb8, 0xb3, 0xcb, 0x2e, 0x97, 0x0f, 0x9c, 0x83, 0x40, 0xac, 0x42, 0x40, 0xd4,
0xb6, 0x92, 0x44, 0x22, 0x6e, 0x4f, 0x27, 0x4e, 0xa0, 0x79, 0x88, 0x3a, 0x55, 0x89, 0x5c, 0x7a,
0xbb, 0x0b, 0xbb, 0xec, 0x78, 0x38, 0xe0, 0x0a, 0x32, 0xce, 0xd3, 0xe3, 0xfa, 0x71, 0x4f, 0xaa,
0xbc, 0xb0, 0x1e, 0x41, 0xce, 0xd9, 0x4c, 0x26, 0x09, 0xfa, 0x67, 0xaf, 0x6c, 0x54, 0x77, 0x17,
0x62, 0xd9, 0xa1, 0xdd, 0xbb, 0x0b, 0x79, 0x4c, 0x59, 0x07, 0x2c, 0x61, 0x63, 0x65, 0xf0, 0x24,
0x86, 0xcb, 0x58, 0xff, 0xb2, 0x23, 0x51, 0x07, 0xff, 0x6b, 0x6d, 0xbb, 0x8b, 0x74, 0x09, 0x65,
0x6b, 0xb3, 0xb7, 0x34, 0xed, 0x2e, 0x1c, 0xc6, 0x9c, 0x0c, 0x5f, 0x79, 0x10, 0x1b, 0xbe, 0xad,
0x7a, 0x77, 0x61, 0x96, 0xe8, 0x61, 0x9c, 0xa2, 0x2a, 0x60, 0x7c, 0x3b, 0x93, 0x26, 0xdc, 0xdf,
0x5d, 0x3c, 0x8d, 0xdc, 0x72, 0x3f, 0x40, 0x67, 0x3e, 0xd2, 0xfd, 0xcb, 0xe5, 0x56, 0x4a, 0xbe,
0xd1, 0x59, 0x8e, 0xce, 0x44, 0x95, 0x45, 0xf6, 0xa9, 0x2e, 0x50, 0xa4, 0xd4, 0xe5, 0x06, 0x48,
0xda, 0xcd, 0xfe, 0xd8, 0xbc, 0xbe, 0xfb, 0x0c, 0x4b, 0xeb, 0xe4, 0x09, 0xce, 0x0f, 0x2f, 0xa8,
0xfa, 0x4a, 0x10, 0xfc, 0xe0, 0xf3, 0xd9, 0xcf, 0x3f, 0xd1, 0xc9, 0x64, 0x64, 0xe3, 0x29, 0x49,
0xc1, 0xbd, 0x65, 0x74, 0x94, 0x8b, 0x00, 0xe0, 0xfe, 0x7e, 0x5d, 0xa7, 0xab, 0xa5, 0xa0, 0x34,
0x41, 0xe0, 0xd6, 0x21, 0xd8, 0x95, 0xae, 0x6e, 0x75, 0xb7, 0x13, 0x4f, 0x46, 0x71, 0xdd, 0x47,
0xae, 0x4a, 0x4f, 0xb3, 0xa9, 0xcb, 0x1e, 0xc1, 0xf0, 0xcd, 0xc7, 0x48, 0xc4, 0x6e, 0xd9, 0x93,
0xee, 0x70, 0xe3, 0x74, 0xc1, 0x38, 0xa7, 0x7a, 0x73, 0xc1, 0xc5, 0xf4, 0xe6, 0x82, 0x0b, 0xd8,
0x8d, 0x85, 0x07, 0xcd, 0x6b, 0xb9, 0x1c, 0x9a, 0xd2, 0xc8, 0x60, 0x59, 0x35, 0x32, 0x0f, 0x5b,
0x5c, 0x6a, 0x0a, 0x0f, 0x20, 0xe2, 0x3a, 0x4c, 0x19, 0xe5, 0xb1, 0x06, 0x68, 0x15, 0x76, 0x35,
0xef, 0x57, 0xfd, 0x6e, 0x08, 0xe6, 0x55, 0x2b, 0x3d, 0x45, 0x9a, 0x6e, 0x39, 0xe9, 0x34, 0xa7,
0xab, 0x92, 0x5a, 0x1c, 0x67, 0x92, 0x04, 0x40, 0x13, 0x41, 0xb9, 0xa3, 0x4b, 0xa0, 0xc9, 0xaf,
0xfd, 0x96, 0xb9, 0x7d, 0x60, 0x8a, 0x0a, 0x4e, 0x94, 0x22, 0xe0, 0x0c, 0x27, 0x70, 0x1b, 0x8a,
0xad, 0x86, 0x1b, 0x95, 0x89, 0x30, 0x26, 0x3d, 0x25, 0xa3, 0xa3, 0x54, 0xd2, 0x83, 0xcf, 0x68,
0x2d, 0xcd, 0x26, 0xb9, 0x2f, 0x36, 0x1f, 0x80, 0xe0, 0xeb, 0xda, 0x2c, 0x22, 0x3a, 0x2d, 0xce,
0x4f, 0x0b, 0xf0, 0x35, 0xb5, 0x9a, 0x14, 0x34, 0x22, 0x19, 0x50, 0x20, 0x72, 0x1b, 0x6c, 0xc7,
0xdd, 0x40, 0x4d, 0xb2, 0xfa, 0x40, 0xb5, 0xf5, 0x8f, 0x44, 0x16, 0x99, 0x5e, 0xbe, 0x9d, 0xe2,
0x07, 0x91, 0x8d, 0xee, 0x7c, 0x3d, 0x6d, 0xd9, 0xbd, 0x3d, 0x79, 0xde, 0xbe, 0x38, 0xa6, 0x9f,
0xc8, 0xc1, 0x39, 0xcb, 0xd2, 0x04, 0x25, 0xd7, 0x76, 0xa8, 0xf8, 0xd0, 0x53, 0x58, 0x88, 0x5a,
0x84, 0xe6, 0xfe, 0x55, 0xf2, 0x05, 0xcf, 0x95, 0xa5, 0x66, 0x16, 0xd3, 0xc7, 0x04, 0x5d, 0x32,
0x4e, 0x8f, 0x92, 0xbb, 0xa7, 0x46, 0x26, 0xef, 0xb2, 0x26, 0xf8, 0x7d, 0x63, 0x3a, 0xa2, 0x76,
0x78, 0x31, 0x11, 0xc4, 0xd3, 0xd4, 0x72, 0x1f, 0xbb, 0x51, 0x0d, 0x93, 0x1a, 0x6b, 0xba, 0x96,
0x99, 0xf8, 0xb7, 0xc9, 0x5a, 0xe3, 0xc9, 0x34, 0xfa, 0x62, 0x00, 0x71, 0xb8, 0xc0, 0x68, 0x3d,
0xcb, 0x92, 0x0e, 0xc3, 0x21, 0xd8, 0x32, 0x88, 0xec, 0x0c, 0x13, 0x18, 0x06, 0x10, 0x00, 0x91,
0x5d, 0xd5, 0x2d, 0x35, 0xa8, 0x45, 0x6b, 0x2a, 0xf1, 0xae, 0x17, 0x49, 0xa4, 0x81, 0xcd, 0x77,
0x44, 0xb4, 0xa9, 0x54, 0x02, 0xe9, 0x25, 0x9c, 0x32, 0x1f, 0xfd, 0xf8, 0x6a, 0x3f, 0x79, 0xbb,
0x9c, 0x83, 0x45, 0x54, 0xcc, 0xc3, 0x75, 0x4f, 0x52, 0x52, 0x0a, 0x67, 0x2c, 0xa4, 0x02, 0xea,
0x44, 0x36, 0xbb, 0x13, 0x40, 0xfb, 0x48, 0x85, 0xac, 0xc4, 0x56, 0x6c, 0x34, 0xd3, 0xfd, 0xde,
0xec, 0xa8, 0x4f, 0x4c, 0xd3, 0x6b, 0xe1, 0xe2, 0x32, 0xdc, 0xa8, 0x63, 0xab, 0x5a, 0x0a, 0x66,
0xe8, 0x32, 0x4a, 0x52, 0xb7, 0xaf, 0xe6, 0x69, 0xce, 0x56, 0xe3, 0xc0, 0xf6, 0xac, 0xa4, 0x32,
0x0c, 0x4a, 0x59, 0xa1, 0x92, 0x88, 0xf8, 0xe6, 0x4c, 0x0b, 0x63, 0xbc, 0x9e, 0xec, 0x0f, 0xe3,
0x6b, 0xd1, 0x6b, 0xc9, 0xbe, 0x67, 0x33, 0xaf, 0xfa, 0xca, 0x20, 0xff, 0x85, 0xc9, 0xa9, 0x2c,
0x1e, 0x06, 0x93, 0x44, 0xf8, 0xd8, 0xdc, 0x51, 0x7e, 0x15, 0xa8, 0xa6, 0xd5, 0x6f, 0xb8, 0xa2,
0x9e, 0x75, 0x5b, 0x06, 0x20, 0x1e, 0xe7, 0xfc, 0x05, 0x0b, 0xd1, 0x60, 0xc0, 0x13, 0x98, 0xb8,
0xa8, 0x01, 0x06, 0x94, 0xff, 0x81, 0x0f, 0xc2, 0xcd, 0x79, 0x51, 0x6c, 0xcd, 0x73, 0xe6, 0x7a,
0x48, 0xad, 0xa0, 0xc0, 0xec, 0x26, 0x68, 0xdc, 0x7c, 0x53, 0x1a, 0xee, 0xd3, 0x00, 0x3b, 0x9c,
0x44, 0x8e, 0x88, 0x7f, 0xc1, 0x99, 0x12, 0x69, 0xef, 0x7c, 0x54, 0x33, 0xb7, 0x0a, 0x3a, 0x9e,
0x4b, 0xc8, 0x2c, 0x1b, 0xbd, 0x56, 0xf5, 0xdd, 0xa3, 0xe7, 0xde, 0xdc, 0xff, 0x41, 0xce, 0xe9,
0x73, 0x89, 0x57, 0xe8, 0xd4, 0x67, 0x55, 0x73, 0x0a, 0x12, 0x0a, 0xba, 0x10, 0x74, 0x02, 0x70,
0x88, 0x88, 0x13, 0x70, 0x36, 0x86, 0x63, 0xf0, 0x3d, 0x21, 0xc0, 0x19, 0xa2, 0x12, 0x34, 0x0e,
0x37, 0xcf, 0x1b, 0x9e, 0xc4, 0x3d, 0x5d, 0xfd, 0x66, 0xea, 0x8a, 0x31, 0x9c, 0xa0, 0x98, 0xbb,
0x38, 0xe4, 0x2c, 0xcf, 0x8c, 0x65, 0xd8, 0x57, 0x5a, 0x80, 0xa2, 0x4e, 0xe6, 0x93, 0xdd, 0xa4,
0x20, 0x91, 0xd7, 0x75, 0x21, 0xb7, 0x19, 0x66, 0xc9, 0x1b, 0xd6, 0x6f, 0x6c, 0x2e, 0xce, 0x44,
0x9a, 0xbf, 0xa6, 0x7a, 0x51, 0x58, 0x8b, 0xa3, 0x97, 0xe5, 0xaa, 0xbc, 0x21, 0x9d, 0xe3, 0x54,
0x8e, 0xaf, 0x38, 0x7b, 0x4f, 0xc6, 0x1c, 0xf7, 0x5a, 0xe5, 0x03, 0x18, 0x0c, 0x0d, 0xab, 0x3d,
0x8d, 0x27, 0x36, 0xbd, 0xa6, 0x4d, 0xaf, 0xe3, 0xf1, 0xd5, 0x7a, 0xdf, 0xd6, 0x5b, 0x4a, 0x7b,
0x59, 0x15, 0x2e, 0x2b, 0x11, 0x0d, 0x03, 0x4d, 0x1e, 0x2b, 0x77, 0xea, 0xd4, 0x98, 0x62, 0xbc,
0x6a, 0x2b, 0x5c, 0x4f, 0xdf, 0x99, 0x6a, 0x21, 0x54, 0xb7, 0xf2, 0x67, 0x47, 0x65, 0x70, 0x66,
0x7f, 0xef, 0xd9, 0x61, 0xbb, 0xdd, 0xfe, 0x4b, 0xd7, 0x3b, 0xd9, 0x1e, 0xe6, 0xa1, 0x3a, 0xd9,
0x21, 0x8f, 0x40, 0x61, 0xdf, 0xdb, 0xd4, 0x4b, 0xb1, 0xb1, 0xad, 0x17, 0x43, 0xc4, 0x03, 0xad,
0x8d, 0xbd, 0x67, 0x2f, 0x5f, 0xbc, 0x78, 0x41, 0x5a, 0x8b, 0x34, 0x71, 0xe1, 0x4e, 0xce, 0xd9,
0xce, 0x82, 0xa8, 0xd2, 0xee, 0x52, 0xac, 0x04, 0x66, 0xf6, 0x7c, 0xf3, 0x9b, 0x58, 0x91, 0xc3,
0xc1, 0xcf, 0xfb, 0x8d, 0x1f, 0xd3, 0x6c, 0x14, 0xa7, 0xde, 0xa0, 0x67, 0x8a, 0xbc, 0xff, 0x1c,
0xbb, 0xf0, 0x77, 0xe2, 0xfd, 0x78, 0x36, 0x38, 0x35, 0x9e, 0xff, 0xfe, 0xd7, 0x80, 0x8e, 0xde,
0x93, 0xdb, 0x36, 0x55, 0x33, 0x4b, 0xbf, 0xe1, 0x23, 0x2e, 0xee, 0xe8, 0x8b, 0xa0, 0x9a, 0xd2,
0xf7, 0x38, 0xfa, 0xb4, 0xf1, 0x76, 0x78, 0x76, 0xf4, 0x3c, 0x2c, 0xd7, 0x84, 0xa7, 0xc5, 0x3f,
0x0b, 0x89, 0x0c, 0xc4, 0x05, 0xda, 0x4c, 0xbb, 0x13, 0x50, 0x06, 0x92, 0x4a, 0xcc, 0x80, 0x9d,
0xaa, 0x19, 0xa9, 0x3c, 0x55, 0xd5, 0xe2, 0x75, 0x37, 0x58, 0xf6, 0x87, 0x47, 0xab, 0xe0, 0xc2,
0xd4, 0x48, 0x6e, 0x74, 0x8a, 0xf9, 0xfe, 0x46, 0xe3, 0x41, 0xe3, 0x5c, 0xb0, 0xef, 0x35, 0x56,
0xed, 0xa3, 0xb7, 0xc9, 0xc5, 0x6e, 0x63, 0xdf, 0xc3, 0x54, 0xd9, 0xd9, 0xea, 0x7e, 0x9e, 0x7e,
0x5f, 0xf5, 0x45, 0x91, 0x86, 0xd3, 0x6f, 0xbe, 0xf0, 0xa9, 0xf7, 0x61, 0x1f, 0xe1, 0xee, 0x35,
0x1e, 0x1b, 0x23, 0x2a, 0xbc, 0x87, 0x67, 0x83, 0xff, 0x3d, 0xc8, 0x34, 0x54, 0xff, 0x41, 0x94,
0xdd, 0x1c, 0xfe, 0xa7, 0x60, 0x76, 0x3b, 0x1d, 0xce, 0x1f, 0xfe, 0x38, 0xd0, 0x1f, 0xfe, 0x2c,
0xd2, 0x1f, 0x2a, 0x36, 0x69, 0x50, 0xfe, 0x80, 0xba, 0xfb, 0xf5, 0x27, 0xb4, 0x9a, 0x8f, 0xa3,
0x28, 0xaa, 0xe3, 0x5f, 0xff, 0x1e, 0xa1, 0xac, 0xb8, 0xa1, 0xf1, 0x87, 0xc8, 0xa1, 0x45, 0x2c,
0x88, 0x3f, 0x62, 0x4a, 0xa2, 0x4d, 0xfa, 0x76, 0xfe, 0x6f, 0x7c, 0x47, 0x58, 0x8b, 0x51, 0x17,
0x00, 0x00
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x58, 0x5b, 0x73, 0xdb, 0x36,
0x16, 0x7e, 0xf7, 0xaf, 0xa0, 0x11, 0x8f, 0x4d, 0x8e, 0x68, 0x4a, 0x8e, 0xb7, 0xdd, 0x44, 0x12,
0xe4, 0x4d, 0x9c, 0xb4, 0xd1, 0xe6, 0x62, 0xcf, 0x28, 0x6d, 0x67, 0xc7, 0xeb, 0xa9, 0x69, 0x12,
0x92, 0x10, 0x53, 0x20, 0x17, 0x00, 0x7d, 0x59, 0x59, 0xff, 0x7d, 0xbf, 0x03, 0x92, 0xba, 0x38,
0x76, 0xb6, 0xed, 0x4e, 0x5f, 0xf6, 0x45, 0x22, 0x81, 0x73, 0x0e, 0x0e, 0xbe, 0x73, 0x67, 0x7f,
0xfb, 0xcd, 0xc9, 0xf1, 0xe7, 0x7f, 0x9c, 0xbe, 0xf5, 0xa6, 0x76, 0x96, 0x0d, 0xfa, 0xf5, 0xaf,
0x88, 0x53, 0x2f, 0x8b, 0xd5, 0x84, 0x33, 0xa1, 0xd8, 0xa0, 0x3f, 0x13, 0x36, 0xf6, 0x92, 0x69,
0xac, 0x8d, 0xb0, 0x9c, 0x95, 0x76, 0xbc, 0xff, 0xa2, 0x59, 0xdd, 0x52, 0xf1, 0x4c, 0x70, 0x76,
0x2d, 0xc5, 0x4d, 0x91, 0x6b, 0xcb, 0xbc, 0x24, 0x57, 0x56, 0x28, 0x90, 0xdd, 0xc8, 0xd4, 0x4e,
0xf9, 0x77, 0x9d, 0xce, 0x92, 0xf4, 0xc1, 0x56, 0x2a, 0xae, 0x65, 0x22, 0xf6, 0xdd, 0x4b, 0x28,
0x95, 0xb4, 0x32, 0xce, 0xf6, 0x4d, 0x12, 0x67, 0x82, 0x1f, 0x84, 0xb3, 0xf8, 0x56, 0xce, 0xca,
0xd9, 0xf2, 0xbd, 0x34, 0x42, 0xbb, 0x97, 0xf8, 0x12, 0xef, 0x2a, 0x67, 0x5f, 0x9d, 0x3c, 0xe8,
0x5b, 0x69, 0x33, 0x31, 0xf8, 0x09, 0x94, 0xb3, 0x3c, 0xf5, 0x46, 0xc2, 0x5a, 0xa9, 0x26, 0xa6,
0xdf, 0xae, 0xd6, 0xfb, 0x26, 0xd1, 0xb2, 0xb0, 0x83, 0xad, 0xeb, 0x58, 0x7b, 0xf9, 0x8d, 0x12,
0x3a, 0xcc, 0xf2, 0x44, 0x16, 0x61, 0xa9, 0xf3, 0x1b, 0x13, 0xa6, 0x3c, 0xcd, 0x93, 0x72, 0x06,
0xfd, 0xc2, 0x72, 0x76, 0x3c, 0x9e, 0xf0, 0xf9, 0x22, 0x2c, 0xa4, 0x32, 0xfc, 0xec, 0xfb, 0xf0,
0xaf, 0xe1, 0x8b, 0xf0, 0x65, 0x78, 0xd0, 0x09, 0x0f, 0x0e, 0xce, 0x69, 0xf1, 0x84, 0x9f, 0x31,
0x6d, 0xae, 0x53, 0x16, 0xfe, 0xf7, 0xbf, 0x73, 0x3a, 0x85, 0x6f, 0x1f, 0x84, 0xaa, 0x9c, 0x7d,
0xe4, 0x9d, 0xde, 0xb8, 0x54, 0x89, 0x95, 0xb9, 0xf2, 0x26, 0xc3, 0xd4, 0x17, 0xc1, 0x5c, 0x0b,
0x5b, 0x6a, 0xe5, 0xa5, 0xd1, 0x44, 0xd8, 0xb7, 0x99, 0x20, 0x05, 0x5e, 0xdf, 0xb9, 0xad, 0xc5,
0x92, 0x54, 0x9a, 0x93, 0x35, 0x52, 0xb1, 0xbb, 0xcb, 0xf2, 0xcb, 0x2f, 0x22, 0xb1, 0x8c, 0x73,
0x7b, 0x57, 0x88, 0x7c, 0x4c, 0x6b, 0xdb, 0xaf, 0xb4, 0x8e, 0xef, 0x22, 0x69, 0xdc, 0xff, 0x06,
0xff, 0x3b, 0x3f, 0x98, 0xdf, 0x48, 0x95, 0xe6, 0x37, 0x51, 0x5e, 0x08, 0xe5, 0xb3, 0xa9, 0xb5,
0x85, 0xe9, 0xb6, 0xdb, 0x13, 0x69, 0xa7, 0xe5, 0x65, 0x94, 0xe4, 0xb3, 0xf6, 0x2b, 0xa9, 0x93,
0x3c, 0xcf, 0xaf, 0xa4, 0x68, 0xff, 0xf2, 0xe1, 0xed, 0x9b, 0xf6, 0x8d, 0xbc, 0x92, 0xed, 0x06,
0xc3, 0x67, 0x65, 0x05, 0xea, 0xbe, 0xa9, 0x17, 0xd8, 0x9a, 0xf4, 0xd7, 0x0f, 0xa5, 0xb7, 0x97,
0x54, 0x21, 0xfb, 0xd5, 0x88, 0x6c, 0xbc, 0x4e, 0x9d, 0xe5, 0x71, 0xfa, 0xf7, 0x91, 0x2f, 0x42,
0xcb, 0xb7, 0x3b, 0xc1, 0x3c, 0x13, 0xd6, 0x53, 0x3c, 0x8d, 0x12, 0x2d, 0x62, 0x2b, 0x6a, 0x00,
0x7c, 0x56, 0xd9, 0x8a, 0x05, 0x3d, 0x15, 0x41, 0xd8, 0x2b, 0x6b, 0xb5, 0xbc, 0x2c, 0xad, 0xc0,
0x86, 0x4e, 0x58, 0x28, 0x82, 0xf0, 0xe1, 0x3a, 0xe1, 0x80, 0xe3, 0xac, 0xb8, 0xb5, 0xed, 0x2f,
0xf1, 0x75, 0xdc, 0x08, 0xf8, 0x8a, 0x30, 0x36, 0x77, 0x0a, 0x22, 0x6c, 0x10, 0xa6, 0xd1, 0x65,
0x9e, 0xde, 0x45, 0x71, 0x01, 0xa5, 0xd3, 0xe3, 0xa9, 0xcc, 0x52, 0x5f, 0x11, 0x7d, 0x9c, 0xa6,
0x6f, 0xaf, 0xa1, 0xc5, 0x07, 0x69, 0xe0, 0xae, 0x42, 0xfb, 0x8c, 0x74, 0x66, 0xa1, 0x1f, 0xf0,
0xc1, 0xfc, 0x47, 0x61, 0x7f, 0xf6, 0x83, 0xc5, 0xe3, 0x74, 0x42, 0xeb, 0x5c, 0x43, 0x3d, 0xd0,
0xc1, 0xd7, 0x4d, 0x9e, 0x89, 0x28, 0xcb, 0x27, 0x3e, 0x7b, 0x4b, 0xeb, 0x5e, 0x7d, 0x79, 0x00,
0xe3, 0x8d, 0x65, 0x26, 0xdc, 0x35, 0xe0, 0xdc, 0x1a, 0xd7, 0xfd, 0x50, 0xaf, 0xc3, 0x92, 0x60,
0x1c, 0xcb, 0x49, 0xa9, 0x63, 0x87, 0x56, 0x75, 0x0d, 0x6f, 0x1c, 0x83, 0x21, 0x8d, 0xfe, 0xa9,
0x86, 0x0a, 0xb6, 0x2a, 0x00, 0x9a, 0xf0, 0x8a, 0x78, 0x22, 0xbc, 0x34, 0xb6, 0xf1, 0x36, 0xe0,
0x5d, 0x03, 0x78, 0x04, 0x73, 0x30, 0x3a, 0xa0, 0x0b, 0xf7, 0xa8, 0xed, 0x02, 0x17, 0x74, 0xf2,
0xa2, 0x42, 0xe7, 0x36, 0x4f, 0xf2, 0x6c, 0x77, 0xd7, 0x77, 0x6e, 0xd9, 0x09, 0x7d, 0x17, 0x04,
0x9c, 0x28, 0xb2, 0x91, 0xcd, 0x35, 0xa4, 0x92, 0x2b, 0x0e, 0xad, 0x98, 0xd1, 0xc5, 0x93, 0x61,
0xc1, 0x82, 0xe0, 0xfe, 0xbe, 0x26, 0x03, 0xff, 0xac, 0x80, 0xc2, 0x3f, 0x40, 0xbe, 0xf7, 0x31,
0x4f, 0x45, 0xe4, 0x9d, 0x66, 0x22, 0x36, 0xc2, 0x03, 0x10, 0x42, 0x7b, 0xe4, 0x3a, 0xde, 0xf0,
0x14, 0x2a, 0x85, 0x1b, 0x12, 0xcd, 0xa6, 0xc4, 0x2a, 0xf2, 0x82, 0x00, 0x54, 0x29, 0xf4, 0x75,
0xb1, 0x81, 0x33, 0x28, 0x24, 0x58, 0x39, 0x63, 0x41, 0x24, 0x15, 0x00, 0x7d, 0xf7, 0xf9, 0xe3,
0x07, 0xce, 0x3e, 0xe5, 0x5e, 0x1d, 0xd2, 0xc6, 0x43, 0x3c, 0xda, 0x38, 0x23, 0x28, 0xd8, 0x46,
0x78, 0xfc, 0xb0, 0x1e, 0x1e, 0x9c, 0xf3, 0x16, 0xe2, 0x41, 0x6c, 0x73, 0xee, 0x77, 0xee, 0x37,
0xe3, 0x68, 0xf8, 0x18, 0x21, 0xff, 0x8a, 0x30, 0x99, 0x8a, 0xe4, 0x8a, 0x7c, 0x34, 0x98, 0x53,
0xb6, 0x50, 0x5c, 0x44, 0x94, 0x6d, 0x22, 0x2d, 0x8a, 0x2c, 0x4e, 0xe0, 0x45, 0x67, 0xe7, 0x70,
0x36, 0xe8, 0x69, 0xca, 0x4b, 0x63, 0xb5, 0xbf, 0x7f, 0x18, 0xf4, 0xe4, 0xd8, 0x67, 0xb8, 0xc7,
0xa5, 0xd0, 0xc0, 0x5d, 0x44, 0xe4, 0x90, 0x08, 0x54, 0x64, 0x0b, 0xbc, 0xaa, 0x86, 0xb0, 0x13,
0x1e, 0x06, 0xc1, 0x7c, 0x9c, 0x6b, 0x9f, 0xe4, 0x4a, 0xe4, 0x03, 0xd9, 0xa7, 0x2c, 0x13, 0x65,
0x42, 0x4d, 0xec, 0xb4, 0x27, 0x5b, 0xad, 0x00, 0x82, 0xec, 0x36, 0xa7, 0x34, 0x73, 0x26, 0xcf,
0x83, 0x39, 0x5e, 0x45, 0x74, 0x1d, 0x67, 0x25, 0xf4, 0x24, 0x52, 0x2c, 0x42, 0xae, 0x1c, 0x43,
0xec, 0x8a, 0x08, 0x08, 0xdb, 0x3b, 0xb8, 0x1b, 0x4c, 0x9b, 0x6b, 0xce, 0x32, 0x39, 0x13, 0xac,
0x77, 0x89, 0x98, 0xba, 0x5a, 0x3c, 0xc2, 0x7f, 0x7f, 0x5f, 0xaf, 0xf4, 0xf7, 0x0f, 0x96, 0xcf,
0x83, 0xc3, 0x97, 0x5f, 0xc9, 0xd1, 0x22, 0x6d, 0xc4, 0x6c, 0xee, 0x2c, 0x79, 0x0e, 0x8f, 0x18,
0x2c, 0xac, 0x26, 0x82, 0x75, 0xd9, 0xb3, 0xf1, 0x78, 0xcc, 0x16, 0x0b, 0x91, 0x19, 0x31, 0x37,
0x37, 0xd2, 0x26, 0x53, 0xbf, 0xc2, 0x2d, 0x98, 0x27, 0x70, 0x11, 0x36, 0x7a, 0xf3, 0x8a, 0x75,
0xab, 0xa7, 0xe3, 0x0f, 0xf5, 0xd3, 0xc7, 0x93, 0xd1, 0x70, 0xb5, 0xf8, 0xbe, 0x7e, 0x3c, 0x1e,
0xb1, 0xae, 0x3b, 0xb6, 0x97, 0x8a, 0x71, 0x5c, 0x66, 0xb6, 0x5b, 0xd9, 0x6c, 0x41, 0xc8, 0xfd,
0x7f, 0xa2, 0xb6, 0x72, 0x3e, 0x44, 0xdf, 0x29, 0x4e, 0x24, 0x4f, 0x85, 0x16, 0x55, 0xee, 0x0f,
0xe8, 0xe2, 0x94, 0x53, 0xec, 0x99, 0x0a, 0xe5, 0x39, 0xf2, 0xc4, 0x89, 0xab, 0x00, 0x11, 0xc2,
0x4e, 0x4b, 0x41, 0xc4, 0x41, 0x4d, 0x2c, 0x83, 0xc0, 0x55, 0x37, 0xae, 0xc2, 0x46, 0x92, 0x0c,
0x7a, 0x64, 0x14, 0x8f, 0x5c, 0xb4, 0x71, 0xc8, 0x6f, 0xb8, 0x32, 0x49, 0xda, 0x2c, 0x26, 0xb2,
0x52, 0x80, 0x7c, 0xd6, 0x02, 0x7d, 0xdb, 0x97, 0x0d, 0xf4, 0x96, 0xa0, 0x3f, 0xb3, 0xe7, 0x03,
0xde, 0x41, 0x4e, 0x71, 0x46, 0x29, 0x4a, 0x33, 0xf5, 0x69, 0x2d, 0x70, 0xb5, 0xb2, 0x7a, 0x77,
0x2a, 0x05, 0x8d, 0x1e, 0x5f, 0x51, 0x3f, 0x4d, 0xfa, 0x84, 0x2a, 0x8f, 0xa8, 0xb1, 0xbc, 0x2d,
0x1d, 0xbd, 0x82, 0x13, 0x69, 0xfa, 0x07, 0x29, 0x90, 0xdc, 0x11, 0xce, 0x21, 0xc0, 0x43, 0x2d,
0x5e, 0x02, 0xab, 0x10, 0x8c, 0xae, 0xfc, 0xb7, 0xf8, 0x5e, 0x7f, 0xaa, 0x3d, 0x67, 0xac, 0xba,
0x3f, 0xe9, 0x3e, 0xff, 0xbe, 0x53, 0xdc, 0xb2, 0xc1, 0x5e, 0x6f, 0x85, 0xbd, 0x0c, 0xf5, 0x23,
0xd8, 0x43, 0x0a, 0x2b, 0xd5, 0x95, 0x82, 0xe2, 0xe4, 0x5e, 0x96, 0x9c, 0x43, 0xaa, 0x24, 0x2b,
0x53, 0x6c, 0xc2, 0xc2, 0xc1, 0xd1, 0x9a, 0x0e, 0x10, 0x11, 0x74, 0x57, 0xef, 0x2d, 0xec, 0xb7,
0xac, 0x5b, 0x5d, 0x3c, 0x7e, 0x61, 0xb5, 0xc2, 0x5e, 0xe3, 0xd2, 0xba, 0xaf, 0x9a, 0x4b, 0x6b,
0x5c, 0x7a, 0xf3, 0x76, 0x67, 0xfa, 0x3c, 0x44, 0x55, 0x75, 0xd0, 0xb9, 0xcc, 0x65, 0xc2, 0xac,
0x69, 0x11, 0x54, 0xaf, 0x8e, 0xc9, 0xac, 0x0e, 0xc7, 0xcb, 0x1c, 0x05, 0x2a, 0x56, 0xac, 0x9b,
0x71, 0xe6, 0x12, 0xde, 0x65, 0x7e, 0xcb, 0x42, 0xc3, 0xf7, 0x2a, 0xb7, 0x67, 0x56, 0x97, 0x82,
0xed, 0xb5, 0x7c, 0x75, 0xc4, 0xaa, 0x84, 0x08, 0xb7, 0xee, 0xc2, 0x53, 0x2a, 0xd7, 0xee, 0x39,
0x19, 0x75, 0xc2, 0xeb, 0x1a, 0x7e, 0x51, 0x73, 0xed, 0xcc, 0xd5, 0x82, 0x5d, 0x84, 0xb5, 0x9f,
0x71, 0xbb, 0xe6, 0x57, 0x47, 0x3e, 0xe1, 0xec, 0xa1, 0xb5, 0xe3, 0xec, 0xf0, 0x25, 0xf3, 0x66,
0x52, 0x71, 0xb6, 0x7f, 0x00, 0xe9, 0x59, 0x6c, 0x0c, 0x67, 0x86, 0xed, 0x41, 0x5d, 0x26, 0x15,
0xea, 0x76, 0xd7, 0x91, 0xa2, 0xb0, 0x16, 0x9c, 0xc5, 0xea, 0x6e, 0x49, 0x73, 0x7b, 0x9b, 0xb1,
0xbd, 0xde, 0x66, 0x6e, 0x00, 0x0f, 0xd5, 0x7d, 0xd2, 0x7d, 0x43, 0x8b, 0x07, 0xe6, 0xfc, 0x0e,
0xe6, 0xec, 0xb1, 0x8b, 0xc5, 0x03, 0xe3, 0xc0, 0x11, 0x6b, 0x17, 0x10, 0x8d, 0xae, 0x44, 0x91,
0x8a, 0xdb, 0x93, 0xb1, 0x23, 0x68, 0x1d, 0xa0, 0x4e, 0xd5, 0x24, 0x17, 0xde, 0xce, 0xdc, 0x2e,
0xba, 0x1e, 0x2e, 0xb8, 0x84, 0x8c, 0xf3, 0xec, 0xa8, 0xd9, 0xee, 0x4b, 0x55, 0x94, 0xd6, 0x23,
0xc8, 0x39, 0x9b, 0xca, 0x34, 0x45, 0xff, 0xec, 0x55, 0x8d, 0xea, 0xce, 0x5c, 0x2c, 0xba, 0xc4,
0xbd, 0x33, 0x97, 0x47, 0x14, 0x75, 0xc0, 0x12, 0x3a, 0xd6, 0x0a, 0x8f, 0x63, 0x98, 0x8c, 0x0d,
0x2e, 0xba, 0x12, 0x75, 0xf0, 0x7f, 0x96, 0xb6, 0x33, 0xcf, 0x16, 0x10, 0xb6, 0x52, 0x7b, 0x43,
0xd2, 0xce, 0xdc, 0x61, 0xcc, 0x49, 0xf1, 0xa5, 0x05, 0xc1, 0xf0, 0x6d, 0xd1, 0x3b, 0x73, 0xb3,
0x40, 0x0f, 0xe3, 0x04, 0xd5, 0x0e, 0xe3, 0xdb, 0xa9, 0x34, 0xe1, 0xde, 0xce, 0xfc, 0x69, 0xe4,
0x16, 0x7b, 0x01, 0x3a, 0xf3, 0x4b, 0x3d, 0xb8, 0x58, 0x6c, 0x84, 0xe4, 0x1b, 0x9d, 0x17, 0xe8,
0x4c, 0x54, 0x55, 0x64, 0x9f, 0xea, 0x02, 0x45, 0x46, 0x5d, 0x6e, 0x80, 0xa0, 0x5d, 0xef, 0x8f,
0xcd, 0xeb, 0xbb, 0x4f, 0xd0, 0xb4, 0x09, 0x9e, 0xe0, 0xec, 0xe0, 0x9c, 0xaa, 0xaf, 0x44, 0x82,
0x1f, 0x7e, 0x3a, 0xfd, 0xe9, 0x33, 0xdd, 0x4c, 0x46, 0x36, 0x9e, 0x10, 0x15, 0xcc, 0x5b, 0x79,
0x47, 0xb5, 0x08, 0x00, 0xee, 0xef, 0x57, 0x75, 0xba, 0x5e, 0x0a, 0x2a, 0x15, 0x04, 0x5e, 0x1d,
0x82, 0x3d, 0xe9, 0xea, 0x56, 0x6f, 0x33, 0xf0, 0x64, 0x14, 0x37, 0x7d, 0xe4, 0xb2, 0xf4, 0xb4,
0x5a, 0xba, 0xea, 0x11, 0x0c, 0x5f, 0xdf, 0x46, 0x20, 0xf6, 0xaa, 0x9e, 0x74, 0x9b, 0x1b, 0x27,
0x0b, 0xca, 0x39, 0xd1, 0xeb, 0x0b, 0xce, 0xa7, 0xd7, 0x17, 0x9c, 0xc3, 0xae, 0x2d, 0x3c, 0x68,
0x5e, 0xab, 0xe5, 0xd0, 0x54, 0x4a, 0x06, 0x8b, 0xba, 0x91, 0x79, 0xd8, 0xe2, 0x52, 0x53, 0xb8,
0x0f, 0x12, 0xd7, 0x61, 0xca, 0xa8, 0x88, 0x35, 0x40, 0xab, 0xb1, 0x6b, 0xf2, 0x7e, 0xdd, 0xef,
0x86, 0xc8, 0xbc, 0x6a, 0x29, 0xa7, 0xcc, 0xb2, 0x0d, 0x23, 0x9d, 0x14, 0xf4, 0x54, 0xa5, 0x16,
0x97, 0x33, 0x89, 0x02, 0xa0, 0x89, 0xa0, 0xe2, 0xe8, 0x11, 0x68, 0xf2, 0x6b, 0xbb, 0xe5, 0x8e,
0x0f, 0x99, 0xa2, 0x86, 0x13, 0xa5, 0x08, 0x38, 0xc3, 0x08, 0xdc, 0x86, 0x62, 0xa3, 0xe1, 0x46,
0x65, 0x22, 0x8c, 0x49, 0x4e, 0x95, 0xd1, 0x51, 0x2a, 0x69, 0xe3, 0x13, 0x5a, 0x4b, 0xb3, 0x9e,
0xdc, 0xe7, 0xeb, 0x1b, 0x48, 0xf0, 0x4d, 0x6d, 0x16, 0x11, 0xdd, 0x16, 0xf7, 0xa7, 0x05, 0xd8,
0x9a, 0x5a, 0x4d, 0x72, 0x1a, 0x91, 0x0e, 0xc9, 0x11, 0xb9, 0x0d, 0x36, 0xfd, 0x6e, 0xa8, 0xc6,
0x79, 0x73, 0xa1, 0x46, 0xfb, 0x47, 0x3c, 0x8b, 0x54, 0xaf, 0x4e, 0x27, 0xff, 0x81, 0x67, 0xa3,
0x3b, 0x5f, 0x4d, 0x5b, 0x76, 0x77, 0x57, 0x9e, 0x75, 0xce, 0x8f, 0xe8, 0x27, 0x72, 0x70, 0x4e,
0xf3, 0x2c, 0x45, 0xc9, 0xb5, 0x5d, 0x2a, 0x3e, 0xb4, 0x0b, 0x0d, 0x51, 0x8b, 0xd0, 0xdc, 0xbf,
0x4a, 0xbf, 0x60, 0x5f, 0x59, 0x6a, 0x66, 0x31, 0x7d, 0x8c, 0xd1, 0x25, 0xe3, 0xf6, 0x28, 0xb9,
0xbb, 0xea, 0xd2, 0x14, 0x3d, 0xd6, 0x42, 0x7e, 0x5f, 0x9b, 0x8e, 0xa8, 0x1d, 0x9e, 0x8f, 0x05,
0xe5, 0x69, 0x6a, 0xb9, 0x8f, 0xdc, 0xa8, 0x86, 0x49, 0x8d, 0xb5, 0x5c, 0xcb, 0x4c, 0xf9, 0xb7,
0xc5, 0xda, 0xc9, 0x78, 0x12, 0x7d, 0x31, 0x80, 0x38, 0x9c, 0x63, 0xb4, 0x9e, 0xe6, 0x69, 0x97,
0xe1, 0x12, 0x6c, 0x11, 0x44, 0x76, 0x8a, 0x09, 0x0c, 0x03, 0x08, 0x80, 0xc8, 0xaf, 0x9a, 0x96,
0x1a, 0xa9, 0x45, 0x6b, 0x2a, 0xf1, 0xae, 0x17, 0x49, 0xa5, 0x81, 0xce, 0x77, 0x94, 0x68, 0x33,
0xa9, 0x04, 0xc2, 0x4b, 0x38, 0x61, 0x3e, 0xfa, 0xf1, 0x25, 0x3f, 0x59, 0xbb, 0x9a, 0x83, 0x45,
0x54, 0xce, 0xc2, 0x55, 0x4f, 0x52, 0xa5, 0x14, 0xce, 0x58, 0x48, 0x05, 0xd4, 0x91, 0xac, 0x77,
0x27, 0x80, 0xf6, 0x91, 0x0a, 0x59, 0x93, 0x2d, 0xb3, 0xd1, 0x54, 0x0f, 0xfa, 0xd3, 0xc3, 0x01,
0x65, 0x9a, 0x7e, 0x1b, 0x0f, 0x17, 0xe1, 0x5a, 0x1d, 0x5b, 0xd6, 0x52, 0x64, 0x86, 0x1e, 0xa3,
0x20, 0x75, 0x7c, 0x4d, 0x9e, 0xe6, 0x6c, 0x39, 0x0e, 0x6c, 0xce, 0x4a, 0x2a, 0xc7, 0xa0, 0x94,
0x97, 0x2a, 0x8d, 0x28, 0xdf, 0x9c, 0x6a, 0x61, 0x8c, 0xd7, 0x97, 0x83, 0x51, 0x7c, 0x2d, 0xfa,
0x6d, 0x39, 0xf0, 0x6c, 0xee, 0xd5, 0x5f, 0x19, 0xe4, 0xbf, 0x31, 0x39, 0x55, 0xc5, 0xc3, 0x60,
0x92, 0x08, 0x1f, 0x9b, 0x3b, 0xaa, 0xaf, 0x02, 0xf5, 0xb4, 0xfa, 0x0d, 0x53, 0x34, 0xb3, 0x6e,
0xdb, 0x00, 0xc4, 0xa3, 0x82, 0xbf, 0x60, 0x21, 0x1a, 0x0c, 0x58, 0x02, 0x13, 0x17, 0x35, 0xc0,
0x80, 0xf2, 0x37, 0xd8, 0x20, 0x5c, 0x9f, 0x17, 0xc5, 0xc6, 0x3c, 0x67, 0xae, 0x47, 0xd4, 0x0a,
0x0a, 0xcc, 0x6e, 0x82, 0xc6, 0xcd, 0x37, 0x95, 0xe2, 0x3e, 0x0d, 0xb0, 0xa3, 0x71, 0xe4, 0x12,
0xf1, 0xcf, 0xb8, 0x53, 0x2a, 0xed, 0x9d, 0x8f, 0x6a, 0xe6, 0x56, 0x91, 0x8e, 0x67, 0x12, 0x34,
0x8b, 0xad, 0x7e, 0xbb, 0xfe, 0xee, 0xd1, 0x77, 0x27, 0x0f, 0xfe, 0x26, 0x67, 0xf4, 0xb9, 0xc4,
0x2b, 0x75, 0xe6, 0xb3, 0xba, 0x39, 0x45, 0x12, 0x0a, 0x7a, 0x20, 0x74, 0x04, 0x30, 0x88, 0x88,
0x53, 0xe4, 0x6c, 0x0c, 0xc7, 0xc8, 0xf7, 0x84, 0x00, 0x67, 0xf0, 0x4a, 0xa4, 0x71, 0x98, 0x79,
0xb6, 0xe5, 0x49, 0xbc, 0xd3, 0xd3, 0xaf, 0xa6, 0xa9, 0x18, 0xa3, 0x31, 0x8a, 0xb9, 0xf3, 0x43,
0xce, 0x8a, 0xdc, 0x58, 0x06, 0xbe, 0x4a, 0x03, 0x14, 0x75, 0x52, 0x9f, 0xf4, 0x26, 0x01, 0xa9,
0xbc, 0x6e, 0x0a, 0xb9, 0xcd, 0x31, 0x4b, 0xde, 0xb0, 0xc1, 0xd6, 0xfa, 0xe2, 0x54, 0x64, 0xc5,
0x6b, 0xaa, 0x17, 0xa5, 0xb5, 0xb8, 0x7a, 0x55, 0xae, 0xaa, 0x17, 0x92, 0x99, 0x64, 0x32, 0xb9,
0xe2, 0xec, 0x1d, 0x29, 0x73, 0xd4, 0x6f, 0x57, 0x1b, 0x50, 0x18, 0x12, 0x96, 0x3c, 0x5b, 0x4f,
0x30, 0xbd, 0x26, 0xa6, 0xd7, 0x71, 0x72, 0xb5, 0xe2, 0xdb, 0x38, 0xa5, 0xd2, 0x97, 0xd5, 0xee,
0xb2, 0x24, 0xd1, 0x50, 0xd0, 0x14, 0xb1, 0x72, 0xb7, 0xce, 0x8c, 0x29, 0x93, 0x65, 0x5b, 0xe1,
0x7a, 0xfa, 0xee, 0x44, 0x0b, 0xa1, 0x7a, 0xb5, 0x3d, 0xbb, 0x2a, 0x87, 0x31, 0x07, 0xbb, 0xcf,
0x0e, 0x3a, 0x9d, 0xce, 0x5f, 0x7a, 0xde, 0xf1, 0xe6, 0x30, 0x0f, 0xd1, 0xe9, 0x36, 0x59, 0x04,
0x02, 0x07, 0xde, 0xba, 0x5c, 0xf2, 0x8d, 0x4d, 0xb9, 0x18, 0x22, 0x1e, 0x48, 0xdd, 0xda, 0x7d,
0xf6, 0xf2, 0xc5, 0x8b, 0x17, 0x24, 0xb5, 0xcc, 0x52, 0xe7, 0xee, 0x64, 0x9c, 0xcd, 0x28, 0x88,
0x6a, 0xe9, 0x2e, 0xc4, 0x2a, 0x60, 0xa6, 0xcf, 0xd7, 0xbf, 0x89, 0x95, 0x05, 0x0c, 0xfc, 0x7c,
0xb0, 0xf5, 0x63, 0x96, 0x5f, 0xc6, 0x99, 0x37, 0xec, 0x9b, 0xb2, 0x18, 0x3c, 0x07, 0x17, 0xfe,
0x8e, 0xbd, 0x1f, 0x4f, 0x87, 0x27, 0xc6, 0xf3, 0xdf, 0xfd, 0x12, 0xd0, 0xd5, 0xfb, 0x72, 0x53,
0xa7, 0x7a, 0x66, 0x19, 0x6c, 0xf9, 0xf0, 0x8b, 0x3b, 0xfa, 0x22, 0xa8, 0x26, 0xf4, 0x3d, 0x8e,
0x3e, 0x6d, 0xbc, 0x1d, 0x9d, 0x1e, 0x3e, 0x0f, 0xab, 0x35, 0xe1, 0x69, 0xf1, 0xaf, 0x52, 0x22,
0x02, 0xf1, 0x80, 0x36, 0xd3, 0x6e, 0x07, 0x14, 0x81, 0x24, 0x12, 0x33, 0x60, 0xb7, 0x6e, 0x46,
0x6a, 0x4b, 0xd5, 0xb5, 0x78, 0xd5, 0x0d, 0x56, 0xfd, 0xe1, 0xe1, 0xd2, 0xb9, 0x30, 0x35, 0x92,
0x19, 0x9d, 0x60, 0xbe, 0xb7, 0xd6, 0x78, 0xd0, 0x38, 0x17, 0xec, 0x79, 0x5b, 0xcb, 0xf6, 0xd1,
0x5b, 0xcf, 0xc5, 0x8e, 0x71, 0xe0, 0x61, 0xaa, 0xec, 0x6e, 0x74, 0x3f, 0x4f, 0x9f, 0x57, 0x7f,
0x51, 0xa4, 0xe1, 0xf4, 0x9b, 0x07, 0x3e, 0x75, 0x1e, 0xf8, 0x08, 0x77, 0x6f, 0xeb, 0xb1, 0x31,
0xa2, 0xc6, 0x7b, 0x74, 0x3a, 0xfc, 0xf3, 0x41, 0xa6, 0xa1, 0xfa, 0x77, 0xa2, 0xec, 0xe6, 0xf0,
0x3f, 0x04, 0xb3, 0xe3, 0x1c, 0x78, 0x1f, 0x87, 0xa3, 0x93, 0xdf, 0x09, 0x34, 0xb1, 0xfc, 0x21,
0xa4, 0x1d, 0xa3, 0x33, 0xed, 0xfb, 0xee, 0xd6, 0x6f, 0x3c, 0x73, 0x69, 0xdb, 0xf7, 0x7f, 0xd0,
0x9b, 0x88, 0xb3, 0xca, 0x60, 0x14, 0xb2, 0xa8, 0x16, 0x83, 0xe6, 0xab, 0x5d, 0x53, 0x02, 0xa2,
0x28, 0x6a, 0x42, 0x4e, 0xff, 0x39, 0xf9, 0x08, 0xb9, 0x83, 0x32, 0x2f, 0x22, 0x9b, 0xb2, 0x33,
0xa5, 0x6a, 0xfa, 0x5e, 0xff, 0x1f, 0x35, 0x83, 0x43, 0xb5, 0xc5, 0x17, 0x00, 0x00
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -79,13 +79,13 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
uint16_t grp = elem["grp"] | seg.grouping;
uint16_t spc = elem[F("spc")] | seg.spacing;
uint16_t of = seg.offset;
uint8_t soundSim = elem[F("ssim")] | seg.soundSim;
uint8_t map1D2D = elem[F("mp12")] | seg.map1D2D;
uint8_t soundSim = elem["ssim"] | seg.soundSim;
uint8_t map1D2D = elem["mp12"] | seg.map1D2D;
if ((spc>0 && spc!=seg.spacing) || seg.map1D2D!=map1D2D) seg.fill(BLACK); // clear spacing gaps
seg.map1D2D = map1D2D & 0x07;
seg.soundSim = soundSim & 0x03;
seg.map1D2D = constrain(map1D2D, 0, 7);
seg.soundSim = constrain(soundSim, 0, 7);
uint16_t len = 1;
if (stop > start) len = stop - start;
@ -162,12 +162,12 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
}
#endif
seg.selected = elem["sel"] | seg.selected;
seg.reverse = elem["rev"] | seg.reverse;
seg.mirror = elem[F("mi")] | seg.mirror;
seg.selected = elem["sel"] | seg.selected;
seg.reverse = elem["rev"] | seg.reverse;
seg.mirror = elem["mi"] | seg.mirror;
#ifndef WLED_DISABLE_2D
seg.reverse_y = elem[F("rY")] | seg.reverse_y;
seg.mirror_y = elem[F("mY")] | seg.mirror_y;
seg.reverse_y = elem["rY"] | seg.reverse_y;
seg.mirror_y = elem["mY"] | seg.mirror_y;
seg.transpose = elem[F("tp")] | seg.transpose;
#endif
@ -185,17 +185,17 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
if (elem[F("fxdef")])
{
int16_t sOpt;
sOpt = extractModeDefaults(fx, SET_F("sx")); if (sOpt >= 0) seg.speed = sOpt;
sOpt = extractModeDefaults(fx, SET_F("ix")); if (sOpt >= 0) seg.intensity = sOpt;
sOpt = extractModeDefaults(fx, SET_F("c1")); if (sOpt >= 0) seg.custom1 = sOpt;
sOpt = extractModeDefaults(fx, SET_F("c2")); if (sOpt >= 0) seg.custom2 = sOpt;
sOpt = extractModeDefaults(fx, SET_F("c3")); if (sOpt >= 0) seg.custom3 = sOpt;
sOpt = extractModeDefaults(fx, SET_F("mp12")); if (sOpt >= 0) seg.map1D2D = sOpt & 0x07;
sOpt = extractModeDefaults(fx, SET_F("ssim")); if (sOpt >= 0) seg.soundSim = sOpt & 0x03;
sOpt = extractModeDefaults(fx, "rev"); if (sOpt >= 0) seg.reverse = (bool)sOpt;
sOpt = extractModeDefaults(fx, SET_F("mi")); if (sOpt >= 0) seg.mirror = (bool)sOpt; // NOTE: setting this option is a risky business
sOpt = extractModeDefaults(fx, SET_F("rY")); if (sOpt >= 0) seg.reverse_y = (bool)sOpt;
sOpt = extractModeDefaults(fx, SET_F("mY")); if (sOpt >= 0) seg.mirror_y = (bool)sOpt; // NOTE: setting this option is a risky business
sOpt = extractModeDefaults(fx, "sx"); if (sOpt >= 0) seg.speed = sOpt;
sOpt = extractModeDefaults(fx, "ix"); if (sOpt >= 0) seg.intensity = sOpt;
sOpt = extractModeDefaults(fx, "c1"); if (sOpt >= 0) seg.custom1 = sOpt;
sOpt = extractModeDefaults(fx, "c2"); if (sOpt >= 0) seg.custom2 = sOpt;
sOpt = extractModeDefaults(fx, "c3"); if (sOpt >= 0) seg.custom3 = sOpt;
sOpt = extractModeDefaults(fx, "mp12"); if (sOpt >= 0) seg.map1D2D = constrain(sOpt, 0, 7);
sOpt = extractModeDefaults(fx, "ssim"); if (sOpt >= 0) seg.soundSim = constrain(sOpt, 0, 7);
sOpt = extractModeDefaults(fx, "rev"); if (sOpt >= 0) seg.reverse = (bool)sOpt;
sOpt = extractModeDefaults(fx, "mi"); if (sOpt >= 0) seg.mirror = (bool)sOpt; // NOTE: setting this option is a risky business
sOpt = extractModeDefaults(fx, "rY"); if (sOpt >= 0) seg.reverse_y = (bool)sOpt;
sOpt = extractModeDefaults(fx, "mY"); if (sOpt >= 0) seg.mirror_y = (bool)sOpt; // NOTE: setting this option is a risky business
sOpt = extractModeDefaults(fx, "pal");
if (sOpt >= 0 && sOpt < strip.getPaletteCount() + strip.customPalettes.size()) {
if (sOpt != seg.palette) {
@ -206,8 +206,8 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
}
//getVal also supports inc/decrementing and random
getVal(elem[F("sx")], &seg.speed);
getVal(elem[F("ix")], &seg.intensity);
getVal(elem["sx"], &seg.speed);
getVal(elem["ix"], &seg.intensity);
uint8_t pal = seg.palette;
if (getVal(elem["pal"], &pal, 1, strip.getPaletteCount())) {
if (pal != seg.palette) {
@ -215,15 +215,15 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
seg.palette = pal;
}
}
getVal(elem[F("c1")], &seg.custom1);
getVal(elem[F("c2")], &seg.custom2);
getVal(elem["c1"], &seg.custom1);
getVal(elem["c2"], &seg.custom2);
uint8_t cust3 = seg.custom3;
getVal(elem[F("c3")], &cust3); // we can't pass reference to bifield
seg.custom3 = cust3;
getVal(elem["c3"], &cust3); // we can't pass reference to bifield
seg.custom3 = constrain(cust3, 0, 31);
seg.check1 = elem[F("o1")] | seg.check1;
seg.check2 = elem[F("o2")] | seg.check2;
seg.check3 = elem[F("o3")] | seg.check3;
seg.check1 = elem["o1"] | seg.check1;
seg.check2 = elem["o2"] | seg.check2;
seg.check3 = elem["o3"] | seg.check3;
JsonArray iarr = elem[F("i")]; //set individual LEDs
if (!iarr.isNull()) {
@ -496,26 +496,26 @@ void serializeSegment(JsonObject& root, Segment& seg, byte id, bool forPreset, b
strcat(colstr, "]");
root["col"] = serialized(colstr);
root["fx"] = seg.mode;
root[F("sx")] = seg.speed;
root[F("ix")] = seg.intensity;
root["pal"] = seg.palette;
root[F("c1")] = seg.custom1;
root[F("c2")] = seg.custom2;
root[F("c3")] = seg.custom3;
root[F("sel")] = seg.isSelected();
root["rev"] = seg.reverse;
root[F("mi")] = seg.mirror;
root["fx"] = seg.mode;
root["sx"] = seg.speed;
root["ix"] = seg.intensity;
root["pal"] = seg.palette;
root["c1"] = seg.custom1;
root["c2"] = seg.custom2;
root["c3"] = seg.custom3;
root["sel"] = seg.isSelected();
root["rev"] = seg.reverse;
root["mi"] = seg.mirror;
if (strip.isMatrix) {
root[F("rY")] = seg.reverse_y;
root[F("mY")] = seg.mirror_y;
root["rY"] = seg.reverse_y;
root["mY"] = seg.mirror_y;
root[F("tp")] = seg.transpose;
}
root[F("o1")] = seg.check1;
root[F("o2")] = seg.check2;
root[F("o3")] = seg.check3;
root[F("ssim")] = seg.soundSim;
root[F("mp12")] = seg.map1D2D;
root["o1"] = seg.check1;
root["o2"] = seg.check2;
root["o3"] = seg.check3;
root["ssim"] = seg.soundSim;
root["mp12"] = seg.map1D2D;
}
void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segmentBounds)
@ -628,6 +628,7 @@ void serializeInfo(JsonObject root)
JsonArray spi = root.createNestedArray(F("spi"));
spi.add(spi_mosi);
spi.add(spi_sclk);
spi.add(spi_miso);
#endif
root[F("str")] = syncToggleReceive;
@ -920,12 +921,13 @@ void serializeNodes(JsonObject root)
void serializeModeData(JsonArray fxdata)
{
char lineBuffer[128];
for (size_t i = 0; i < strip.getModeCount(); i++) {
String lineBuffer = FPSTR(strip.getModeData(i));
if (lineBuffer.length() > 0) {
uint8_t endPos = lineBuffer.indexOf('@');
if (endPos>0) fxdata.add(lineBuffer.substring(endPos));
else fxdata.add("");
strncpy_P(lineBuffer, strip.getModeData(i), 127);
if (lineBuffer[0] != 0) {
char* dataPtr = strchr(lineBuffer,'@');
if (dataPtr) fxdata.add(dataPtr);
else fxdata.add("");
}
}
}
@ -933,12 +935,13 @@ void serializeModeData(JsonArray fxdata)
// deserializes mode names string into JsonArray
// also removes WLED-SR extensions (@...) from deserialised names
void serializeModeNames(JsonArray arr) {
char lineBuffer[128];
for (size_t i = 0; i < strip.getModeCount(); i++) {
String lineBuffer = FPSTR(strip.getModeData(i));
if (lineBuffer.length() > 0) {
uint8_t endPos = lineBuffer.indexOf('@');
if (endPos>0) arr.add(lineBuffer.substring(0, endPos));
else arr.add(lineBuffer);
strncpy_P(lineBuffer, strip.getModeData(i), 127);
if (lineBuffer[0] != 0) {
char* dataPtr = strchr(lineBuffer,'@');
if (dataPtr) *dataPtr = 0; // terminate mode data after name
arr.add(lineBuffer);
}
}
}
@ -969,7 +972,6 @@ void serveJson(AsyncWebServerRequest* request)
request->send(response);
releaseJSONBufferLock();
} else {
//request->send_P(200, "application/json", JSON_mode_names);
request->send(503, "application/json", F("{\"error\":3}"));
}
return;
@ -1013,11 +1015,11 @@ void serveJson(AsyncWebServerRequest* request)
serializeInfo(info);
if (subJson != 3)
{
//lDoc[F("effects")] = serialized((const __FlashStringHelper*)JSON_mode_names);
JsonArray effects = lDoc.createNestedArray(F("effects"));
serializeModeNames(effects); // remove WLED-SR extensions from effect names
lDoc[F("palettes")] = serialized((const __FlashStringHelper*)JSON_palette_names);
}
//lDoc["m"] = lDoc.memoryUsage(); // JSON buffer usage, for remote debugging
}
DEBUG_PRINTF("JSON buffer size: %u for request: %d\n", lDoc.memoryUsage(), subJson);

View File

@ -665,6 +665,9 @@ void sendSysInfoUDP()
#define DDP_FLAGS1_STORAGE 0x08
#define DDP_FLAGS1_TIME 0x10
#define DDP_TYPE_RGB24 0x0A
#define DDP_TYPE_RGBW32 0x1A // proposal, this is still not an official part of the DDP spec
#define DDP_ID_DISPLAY 1
#define DDP_ID_CONFIG 250
#define DDP_ID_STATUS 251
@ -724,7 +727,7 @@ uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8
// write the header
/*0*/ddpUdp.write(flags);
/*1*/ddpUdp.write(sequenceNumber++ & 0x0F); // sequence may be unnecessary unless we are sending twice (as requested in Sync settings)
/*2*/ddpUdp.write(0);
/*2*/ddpUdp.write(0); // data type, this is not fully defined by the DDP spec and thus left at "undefined" which is assumed to be 24-bit RGB
/*3*/ddpUdp.write(DDP_ID_DISPLAY);
// data offset in bytes, 32-bit number, MSB first
/*4*/ddpUdp.write(0xFF & (channel >> 24));

View File

@ -355,17 +355,22 @@ uint8_t extractModeSlider(uint8_t mode, uint8_t slider, char *dest, uint8_t maxL
}
// extracts mode parameter defaults from last section of mode data (e.g. "Juggle@!,Trail;!,!,;!;sx=16,ix=240,1d")
int16_t extractModeDefaults(uint8_t mode, const char *segVar)
{
if (mode < strip.getModeCount()) {
String lineBuffer = FPSTR(strip.getModeData(mode));
if (lineBuffer.length() > 0) {
int16_t start = lineBuffer.lastIndexOf(';');
if (start<0) return -1;
char lineBuffer[128] = "";
strncpy_P(lineBuffer, strip.getModeData(mode), 127);
lineBuffer[127] = '\0'; // terminate string
if (lineBuffer[0] != 0) {
char* startPtr = strrchr(lineBuffer, ';'); // last ";" in FX data
if (!startPtr) return -1;
int16_t stop = lineBuffer.indexOf(segVar, start+1);
if (stop<0) return -1;
return atoi(lineBuffer.substring(stop+strlen(segVar)+1).c_str());
char* stopPtr = strstr(startPtr, segVar);
if (!stopPtr) return -1;
stopPtr += strlen(segVar) +1; // skip "="
return atoi(stopPtr);
}
}
return -1;

View File

@ -8,7 +8,7 @@
*/
// version code in format yymmddb (b = daily build)
#define VERSION 2208301
#define VERSION 2208311
//uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG
@ -222,7 +222,7 @@ using PSRAMDynamicJsonDocument = BasicJsonDocument<PSRAM_Allocator>;
// Global Variable definitions
WLED_GLOBAL char versionString[] _INIT(TOSTRING(WLED_VERSION));
#define WLED_CODENAME "Toki"
#define WLED_CODENAME "Hoshi"
// AP and OTA default passwords (for maximum security change them!)
WLED_GLOBAL char apPass[65] _INIT(DEFAULT_AP_PASS);

View File

@ -414,10 +414,10 @@ void deEEP() {
for (byte j = 0; j < numChannels; j++) colX.add(EEPROM.read(memloc + j));
}
segObj["fx"] = EEPROM.read(i+10);
segObj[F("sx")] = EEPROM.read(i+11);
segObj[F("ix")] = EEPROM.read(i+16);
segObj["pal"] = EEPROM.read(i+17);
segObj["fx"] = EEPROM.read(i+10);
segObj["sx"] = EEPROM.read(i+11);
segObj["ix"] = EEPROM.read(i+16);
segObj["pal"] = EEPROM.read(i+17);
} else {
Segment* seg = strip.getSegments();
memcpy(seg, EEPROM.getDataPtr() +i+2, 240);

View File

@ -641,6 +641,7 @@ void getSettingsJS(byte subPage, char* dest)
oappend(SET_F("addInfo('SDA','")); oappendi(HW_PIN_SDA); oappend(SET_F("');"));
oappend(SET_F("addInfo('SCL','")); oappendi(HW_PIN_SCL); oappend(SET_F("');"));
oappend(SET_F("addInfo('MOSI','")); oappendi(HW_PIN_DATASPI); oappend(SET_F("');"));
oappend(SET_F("addInfo('MISO','")); oappendi(HW_PIN_MISOSPI); oappend(SET_F("');"));
oappend(SET_F("addInfo('SCLK','")); oappendi(HW_PIN_CLOCKSPI); oappend(SET_F("');"));
usermods.appendConfigData();
}