├── .gitignore ├── TODO.txt ├── Makefile ├── renderer.h ├── LICENSE ├── renderer.c ├── main.c ├── microui.h ├── fenster.h ├── microui.c └── atlas.inl /.gitignore: -------------------------------------------------------------------------------- 1 | *.d 2 | main 3 | tags 4 | *.o 5 | *.exe 6 | -------------------------------------------------------------------------------- /TODO.txt: -------------------------------------------------------------------------------- 1 | * Upstream different mouse handling for macOS in fenster 2 | * Should set `mouse=` like the other platforms 3 | * Wayland support 4 | * Linux FB support 5 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | CFLAGS ?= -DNDEBUG -O3 -Wall -Wextra -pedantic -std=c99 2 | LDLIBS = -lm 3 | SOURCES := main.c renderer.c microui.c 4 | OBJECTS := $(SOURCES:%.c=%.o) 5 | DEPS := $(SOURCES:%.c=%.d) 6 | CFLAGS += -MMD 7 | TARGET = native 8 | MAIN = main 9 | 10 | $(MAIN): $(OBJECTS) 11 | $(CC) -o $(MAIN) $(OBJECTS) $(LDLIBS) 12 | 13 | -include $(DEPS) 14 | 15 | ifeq ($(OS),Windows_NT) 16 | MAIN = main.exe 17 | LDLIBS += -lgdi32 18 | else ifeq ($(TARGET), mingw) 19 | MAIN = main.exe 20 | export CC = x86_64-w64-mingw32-gcc 21 | LDLIBS += -lgdi32 22 | else 23 | UNAME_S := $(shell uname -s) 24 | ifeq ($(UNAME_S),Darwin) 25 | LDLIBS += -framework Cocoa 26 | else 27 | LDLIBS += -lX11 28 | endif 29 | endif 30 | 31 | clean: 32 | rm -f main $(OBJECTS) $(DEPS) 33 | 34 | .PHONY: clean 35 | -------------------------------------------------------------------------------- /renderer.h: -------------------------------------------------------------------------------- 1 | #ifndef RENDERER_H 2 | #define RENDERER_H 3 | 4 | #include "microui.h" 5 | #include 6 | 7 | void r_init(void); 8 | void r_draw_rect(mu_Rect rect, mu_Color color); 9 | void r_draw_text(const char *text, mu_Vec2 pos, mu_Color color); 10 | void r_draw_icon(int id, mu_Rect rect, mu_Color color); 11 | int r_get_text_width(const char *text, int len); 12 | int r_get_text_height(void); 13 | void r_set_clip_rect(mu_Rect rect); 14 | void r_clear(mu_Color color); 15 | void r_present(void); 16 | // Can only be checked once per frame; side-effecting. 17 | int r_mouse_down(void); 18 | // Can only be checked once per frame; side-effecting. 19 | int r_mouse_up(void); 20 | // Can only be checked once per frame; side-effecting. 21 | int r_mouse_moved(int *x, int *y); 22 | // Can only be checked once per key per frame; side-effecting. 23 | int r_key_down(int key); 24 | int r_key_up(int key); 25 | int r_ctrl_pressed(void); 26 | int r_shift_pressed(void); 27 | int r_alt_pressed(void); 28 | int64_t r_get_time(void); 29 | void r_sleep(int64_t ms); 30 | 31 | #endif 32 | 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Maxwell Bernstein and Kartik Agaram 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /renderer.c: -------------------------------------------------------------------------------- 1 | #include "fenster.h" 2 | #include 3 | #include 4 | #include "renderer.h" 5 | #include "atlas.inl" 6 | 7 | #define BUFFER_SIZE 16384 8 | 9 | typedef uint8_t byte; 10 | 11 | static mu_Rect tex_buf[BUFFER_SIZE]; 12 | static mu_Rect src_buf[BUFFER_SIZE]; 13 | static mu_Color color_buf[BUFFER_SIZE]; 14 | 15 | static int buf_idx; 16 | 17 | static struct fenster window = {.title="A window", .width=800, .height=600}; 18 | 19 | static mu_Rect clip_rect; 20 | 21 | void r_init(void) { 22 | /* init SDL window */ 23 | window.buf = malloc(window.width * window.height * sizeof(*window.buf)); 24 | r_clear(mu_color(0, 0, 0, 255)); 25 | fenster_open(&window); 26 | 27 | /* init texture */ 28 | clip_rect = mu_rect(0, 0, window.width, window.height); 29 | } 30 | 31 | static inline bool within(int c, int lo, int hi) { 32 | return c >= lo && c < hi; 33 | } 34 | 35 | static inline bool within_rect(mu_Rect rect, int x, int y) { 36 | return within(x, rect.x, rect.x+rect.w) 37 | && within(y, rect.y, rect.y+rect.h); 38 | } 39 | 40 | static inline bool same_size(const mu_Rect* a, const mu_Rect* b) { 41 | return a->w == b->w && a->h == b->h; 42 | } 43 | 44 | static inline byte texture_color(const mu_Rect* tex, int x, int y) { 45 | assert(x < tex->w); 46 | x = x + tex->x; 47 | assert(y < tex->h); 48 | y = y + tex->y; 49 | return atlas_texture[y*ATLAS_WIDTH + x]; 50 | } 51 | 52 | static inline uint32_t r_color(mu_Color clr) { 53 | return ((uint32_t)clr.a << 24) | ((uint32_t)clr.r << 16) | ((uint32_t)clr.g << 8) | clr.b; 54 | } 55 | 56 | mu_Color mu_color_argb(uint32_t clr) { 57 | return mu_color((clr >> 16) & 0xff, (clr >> 8) & 0xff, clr & 0xff, (clr >> 24) & 0xff); 58 | } 59 | 60 | static inline int greyscale(byte c) { 61 | return r_color(mu_color(c, c, c, 255)); 62 | } 63 | 64 | 65 | static inline mu_Color blend_pixel(mu_Color dst, mu_Color src) { 66 | int ia = 0xff - src.a; 67 | dst.r = ((src.r * src.a) + (dst.r * ia)) >> 8; 68 | dst.g = ((src.g * src.a) + (dst.g * ia)) >> 8; 69 | dst.b = ((src.b * src.a) + (dst.b * ia)) >> 8; 70 | return dst; 71 | } 72 | 73 | static void flush(void) { 74 | // draw things based on texture, vertex, color 75 | for (int i = 0; i < buf_idx; i++) { 76 | mu_Rect* src = &src_buf[i]; 77 | mu_Rect* tex = &tex_buf[i]; 78 | // draw 79 | int ystart = mu_max(src->y, clip_rect.y); 80 | int yend = mu_min(src->y+src->h, clip_rect.y+clip_rect.h); 81 | int xstart = mu_max(src->x, clip_rect.x); 82 | int xend = mu_min(src->x+src->w, clip_rect.x+clip_rect.w); 83 | // hacky but sufficient for us 84 | if (same_size(src, tex)) { 85 | for (int y = ystart; y < yend; y++) { 86 | for (int x = xstart; x < xend; x++) { 87 | assert(within_rect(*src, x, y)); 88 | assert(within_rect(clip_rect, x, y)); 89 | // read color from texture 90 | byte tc = texture_color(tex, x-src->x, y-src->y); 91 | fenster_pixel(&window, x, y) |= greyscale(tc); 92 | } 93 | } 94 | } else { 95 | mu_Color new_color = color_buf[i]; 96 | for (int y = ystart; y < yend; y++) { 97 | for (int x = xstart; x < xend; x++) { 98 | assert(within_rect(*src, x, y)); 99 | assert(within_rect(clip_rect, x, y)); 100 | // blend color from operation 101 | mu_Color existing_color = mu_color_argb(fenster_pixel(&window, x, y)); 102 | mu_Color result = blend_pixel(existing_color, new_color); 103 | fenster_pixel(&window, x, y) = r_color(result); 104 | } 105 | } 106 | } 107 | } 108 | 109 | buf_idx = 0; 110 | } 111 | 112 | 113 | static void push_quad(mu_Rect src, mu_Rect tex, mu_Color color) { 114 | if (buf_idx == BUFFER_SIZE) { flush(); } 115 | 116 | tex_buf[buf_idx] = tex; 117 | src_buf[buf_idx] = src; 118 | color_buf[buf_idx] = color; 119 | 120 | buf_idx++; 121 | } 122 | 123 | 124 | void r_draw_rect(mu_Rect rect, mu_Color color) { 125 | push_quad(rect, atlas[ATLAS_WHITE], color); 126 | } 127 | 128 | 129 | void r_draw_text(const char *text, mu_Vec2 pos, mu_Color color) { 130 | mu_Rect dst = { pos.x, pos.y, 0, 0 }; 131 | for (const char *p = text; *p; p++) { 132 | if ((*p & 0xc0) == 0x80) { continue; } 133 | int chr = mu_min((unsigned char) *p, 127); 134 | mu_Rect src = atlas[ATLAS_FONT + chr]; 135 | dst.w = src.w; 136 | dst.h = src.h; 137 | push_quad(dst, src, color); 138 | dst.x += dst.w; 139 | } 140 | } 141 | 142 | 143 | void r_draw_icon(int id, mu_Rect rect, mu_Color color) { 144 | mu_Rect src = atlas[id]; 145 | int x = rect.x + (rect.w - src.w) / 2; 146 | int y = rect.y + (rect.h - src.h) / 2; 147 | push_quad(mu_rect(x, y, src.w, src.h), src, color); 148 | } 149 | 150 | 151 | int r_get_text_width(const char *text, int len) { 152 | int res = 0; 153 | for (const char *p = text; *p && len--; p++) { 154 | if ((*p & 0xc0) == 0x80) { continue; } 155 | int chr = mu_min((unsigned char) *p, 127); 156 | res += atlas[ATLAS_FONT + chr].w; 157 | } 158 | return res; 159 | } 160 | 161 | 162 | int r_get_text_height(void) { 163 | return 18; 164 | } 165 | 166 | 167 | void r_set_clip_rect(mu_Rect rect) { 168 | flush(); 169 | int ystart = mu_max(0, rect.y); 170 | int yend = mu_min(window.height, rect.y+rect.h); 171 | int xstart = mu_max(0, rect.x); 172 | int xend = mu_min(window.width, rect.x+rect.w); 173 | clip_rect = mu_rect(xstart, ystart, xend-xstart, yend-ystart); 174 | } 175 | 176 | void r_clear(mu_Color clr) { 177 | flush(); 178 | for (int i = 0; i < window.width * window.height; i++) { 179 | window.buf[i] = r_color(clr); 180 | } 181 | } 182 | 183 | 184 | void r_present(void) { 185 | flush(); 186 | fenster_loop(&window); 187 | } 188 | 189 | int mouse_down = 0; 190 | 191 | int r_mouse_down(void) { 192 | if (window.mouse && !mouse_down) { 193 | mouse_down = 1; 194 | return 1; 195 | } 196 | return 0; 197 | } 198 | 199 | int r_mouse_up(void) { 200 | if (!window.mouse && mouse_down) { 201 | mouse_down = 0; 202 | return 1; 203 | } 204 | return 0; 205 | } 206 | 207 | int r_mouse_moved(int *mousex, int *mousey) { 208 | if (window.x != *mousex || window.y != *mousey) { 209 | *mousex = window.x; 210 | *mousey = window.y; 211 | return 1; 212 | } 213 | return 0; 214 | } 215 | 216 | int r_ctrl_pressed(void) { return window.mod & 1; } 217 | 218 | int r_shift_pressed(void) { return window.mod & 2; } 219 | 220 | int r_alt_pressed(void) { return window.mod & 4; } 221 | 222 | int r_key_down(int key) { 223 | if (window.keys[key] == 1) { 224 | window.keys[key]++; 225 | return 1; 226 | } 227 | return 0; 228 | } 229 | 230 | int r_key_up(int key) { 231 | if (window.keys[key] < 1) { 232 | return 1; 233 | } 234 | return 0; 235 | } 236 | 237 | int64_t r_get_time(void) { 238 | return fenster_time(); 239 | } 240 | 241 | void r_sleep(int64_t ms) { 242 | fenster_sleep(ms); 243 | } 244 | -------------------------------------------------------------------------------- /main.c: -------------------------------------------------------------------------------- 1 | #include "renderer.h" 2 | #include "microui.h" 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | 10 | static char logbuf[64000]; 11 | static int logbuf_updated = 0; 12 | static float bg[3] = { 90, 95, 100 }; 13 | 14 | 15 | static void write_log(const char *text) { 16 | if (logbuf[0]) { strcat(logbuf, "\n"); } 17 | strcat(logbuf, text); 18 | logbuf_updated = 1; 19 | } 20 | 21 | 22 | static void test_window(mu_Context *ctx) { 23 | /* do window */ 24 | if (mu_begin_window(ctx, "Demo Window", mu_rect(40, 40, 300, 450))) { 25 | mu_Container *win = mu_get_current_container(ctx); 26 | win->rect.w = mu_max(win->rect.w, 240); 27 | win->rect.h = mu_max(win->rect.h, 300); 28 | 29 | /* window info */ 30 | if (mu_header(ctx, "Window Info")) { 31 | mu_Container *win = mu_get_current_container(ctx); 32 | char buf[64]; 33 | mu_layout_row(ctx, 2, (int[]) { 54, -1 }, 0); 34 | mu_label(ctx,"Position:"); 35 | sprintf(buf, "%d, %d", win->rect.x, win->rect.y); mu_label(ctx, buf); 36 | mu_label(ctx, "Size:"); 37 | sprintf(buf, "%d, %d", win->rect.w, win->rect.h); mu_label(ctx, buf); 38 | } 39 | 40 | /* labels + buttons */ 41 | if (mu_header_ex(ctx, "Test Buttons", MU_OPT_EXPANDED)) { 42 | mu_layout_row(ctx, 3, (int[]) { 86, -110, -1 }, 0); 43 | mu_label(ctx, "Test buttons 1:"); 44 | if (mu_button(ctx, "Button 1")) { write_log("Pressed button 1"); } 45 | if (mu_button(ctx, "Button 2")) { write_log("Pressed button 2"); } 46 | mu_label(ctx, "Test buttons 2:"); 47 | if (mu_button(ctx, "Button 3")) { write_log("Pressed button 3"); } 48 | if (mu_button(ctx, "Popup")) { mu_open_popup(ctx, "Test Popup"); } 49 | if (mu_begin_popup(ctx, "Test Popup")) { 50 | mu_button(ctx, "Hello"); 51 | mu_button(ctx, "World"); 52 | mu_end_popup(ctx); 53 | } 54 | } 55 | 56 | /* tree */ 57 | if (mu_header_ex(ctx, "Tree and Text", MU_OPT_EXPANDED)) { 58 | mu_layout_row(ctx, 2, (int[]) { 140, -1 }, 0); 59 | mu_layout_begin_column(ctx); 60 | if (mu_begin_treenode(ctx, "Test 1")) { 61 | if (mu_begin_treenode(ctx, "Test 1a")) { 62 | mu_label(ctx, "Hello"); 63 | mu_label(ctx, "world"); 64 | mu_end_treenode(ctx); 65 | } 66 | if (mu_begin_treenode(ctx, "Test 1b")) { 67 | if (mu_button(ctx, "Button 1")) { write_log("Pressed button 1"); } 68 | if (mu_button(ctx, "Button 2")) { write_log("Pressed button 2"); } 69 | mu_end_treenode(ctx); 70 | } 71 | mu_end_treenode(ctx); 72 | } 73 | if (mu_begin_treenode(ctx, "Test 2")) { 74 | mu_layout_row(ctx, 2, (int[]) { 54, 54 }, 0); 75 | if (mu_button(ctx, "Button 3")) { write_log("Pressed button 3"); } 76 | if (mu_button(ctx, "Button 4")) { write_log("Pressed button 4"); } 77 | if (mu_button(ctx, "Button 5")) { write_log("Pressed button 5"); } 78 | if (mu_button(ctx, "Button 6")) { write_log("Pressed button 6"); } 79 | mu_end_treenode(ctx); 80 | } 81 | if (mu_begin_treenode(ctx, "Test 3")) { 82 | static int checks[3] = { 1, 0, 1 }; 83 | mu_checkbox(ctx, "Checkbox 1", &checks[0]); 84 | mu_checkbox(ctx, "Checkbox 2", &checks[1]); 85 | mu_checkbox(ctx, "Checkbox 3", &checks[2]); 86 | mu_end_treenode(ctx); 87 | } 88 | mu_layout_end_column(ctx); 89 | 90 | mu_layout_begin_column(ctx); 91 | mu_layout_row(ctx, 1, (int[]) { -1 }, 0); 92 | mu_text(ctx, "Lorem ipsum dolor sit amet, consectetur adipiscing " 93 | "elit. Maecenas lacinia, sem eu lacinia molestie, mi risus faucibus " 94 | "ipsum, eu varius magna felis a nulla."); 95 | mu_layout_end_column(ctx); 96 | } 97 | 98 | /* background color sliders */ 99 | if (mu_header_ex(ctx, "Background Color", MU_OPT_EXPANDED)) { 100 | mu_layout_row(ctx, 2, (int[]) { -78, -1 }, 74); 101 | /* sliders */ 102 | mu_layout_begin_column(ctx); 103 | mu_layout_row(ctx, 2, (int[]) { 46, -1 }, 0); 104 | mu_label(ctx, "Red:"); mu_slider(ctx, &bg[0], 0, 255); 105 | mu_label(ctx, "Green:"); mu_slider(ctx, &bg[1], 0, 255); 106 | mu_label(ctx, "Blue:"); mu_slider(ctx, &bg[2], 0, 255); 107 | mu_layout_end_column(ctx); 108 | /* color preview */ 109 | mu_Rect r = mu_layout_next(ctx); 110 | mu_draw_rect(ctx, r, mu_color(bg[0], bg[1], bg[2], 255)); 111 | char buf[32]; 112 | sprintf(buf, "#%02X%02X%02X", (int) bg[0], (int) bg[1], (int) bg[2]); 113 | mu_draw_control_text(ctx, buf, r, MU_COLOR_TEXT, MU_OPT_ALIGNCENTER); 114 | } 115 | 116 | mu_end_window(ctx); 117 | } 118 | } 119 | 120 | 121 | static void log_window(mu_Context *ctx) { 122 | if (mu_begin_window(ctx, "Log Window", mu_rect(350, 40, 300, 200))) { 123 | /* output text panel */ 124 | mu_layout_row(ctx, 1, (int[]) { -1 }, -25); 125 | mu_begin_panel(ctx, "Log Output"); 126 | mu_Container *panel = mu_get_current_container(ctx); 127 | mu_layout_row(ctx, 1, (int[]) { -1 }, -1); 128 | mu_text(ctx, logbuf); 129 | mu_end_panel(ctx); 130 | if (logbuf_updated) { 131 | panel->scroll.y = panel->content_size.y; 132 | logbuf_updated = 0; 133 | } 134 | 135 | /* input textbox + submit button */ 136 | static char buf[128]; 137 | int submitted = 0; 138 | mu_layout_row(ctx, 2, (int[]) { -70, -1 }, 0); 139 | if (mu_textbox(ctx, buf, sizeof(buf)) & MU_RES_SUBMIT) { 140 | mu_set_focus(ctx, ctx->last_id); 141 | submitted = 1; 142 | } 143 | if (mu_button(ctx, "Submit")) { submitted = 1; } 144 | if (submitted) { 145 | write_log(buf); 146 | buf[0] = '\0'; 147 | } 148 | 149 | mu_end_window(ctx); 150 | } 151 | } 152 | 153 | 154 | static int uint8_slider(mu_Context *ctx, unsigned char *value, int low, int high) { 155 | static float tmp; 156 | mu_push_id(ctx, &value, sizeof(value)); 157 | tmp = *value; 158 | int res = mu_slider_ex(ctx, &tmp, low, high, 0, "%.0f", MU_OPT_ALIGNCENTER); 159 | *value = tmp; 160 | mu_pop_id(ctx); 161 | return res; 162 | } 163 | 164 | 165 | static void style_window(mu_Context *ctx) { 166 | static struct { const char *label; int idx; } colors[] = { 167 | { "text:", MU_COLOR_TEXT }, 168 | { "border:", MU_COLOR_BORDER }, 169 | { "windowbg:", MU_COLOR_WINDOWBG }, 170 | { "titlebg:", MU_COLOR_TITLEBG }, 171 | { "titletext:", MU_COLOR_TITLETEXT }, 172 | { "panelbg:", MU_COLOR_PANELBG }, 173 | { "button:", MU_COLOR_BUTTON }, 174 | { "buttonhover:", MU_COLOR_BUTTONHOVER }, 175 | { "buttonfocus:", MU_COLOR_BUTTONFOCUS }, 176 | { "base:", MU_COLOR_BASE }, 177 | { "basehover:", MU_COLOR_BASEHOVER }, 178 | { "basefocus:", MU_COLOR_BASEFOCUS }, 179 | { "scrollbase:", MU_COLOR_SCROLLBASE }, 180 | { "scrollthumb:", MU_COLOR_SCROLLTHUMB }, 181 | { NULL } 182 | }; 183 | 184 | if (mu_begin_window(ctx, "Style Editor", mu_rect(350, 250, 300, 240))) { 185 | int sw = mu_get_current_container(ctx)->body.w * 0.14; 186 | mu_layout_row(ctx, 6, (int[]) { 80, sw, sw, sw, sw, -1 }, 0); 187 | for (int i = 0; colors[i].label; i++) { 188 | mu_label(ctx, colors[i].label); 189 | uint8_slider(ctx, &ctx->style->colors[i].r, 0, 255); 190 | uint8_slider(ctx, &ctx->style->colors[i].g, 0, 255); 191 | uint8_slider(ctx, &ctx->style->colors[i].b, 0, 255); 192 | uint8_slider(ctx, &ctx->style->colors[i].a, 0, 255); 193 | mu_draw_rect(ctx, mu_layout_next(ctx), ctx->style->colors[i]); 194 | } 195 | mu_end_window(ctx); 196 | } 197 | } 198 | 199 | 200 | static void process_frame(mu_Context *ctx) { 201 | mu_begin(ctx); 202 | style_window(ctx); 203 | log_window(ctx); 204 | test_window(ctx); 205 | mu_end(ctx); 206 | } 207 | 208 | 209 | static int text_width(mu_Font font, const char *text, int len) { 210 | if (len == -1) { len = strlen(text); } 211 | return r_get_text_width(text, len); 212 | } 213 | 214 | static int text_height(mu_Font font) { 215 | return r_get_text_height(); 216 | } 217 | 218 | int main(int argc, char **argv) { 219 | r_init(); 220 | 221 | /* init microui */ 222 | mu_Context *ctx = malloc(sizeof(mu_Context)); 223 | mu_init(ctx); 224 | ctx->text_width = text_width; 225 | ctx->text_height = text_height; 226 | 227 | int fps = 60; 228 | int mousex = 0, mousey = 0; 229 | 230 | /* main loop */ 231 | for (;;) { 232 | int64_t before = r_get_time(); 233 | if (r_mouse_moved(&mousex, &mousey)) { 234 | mu_input_mousemove(ctx, mousex, mousey); 235 | } 236 | if (r_mouse_down()) { 237 | mu_input_mousedown(ctx, mousex, mousey, MU_MOUSE_LEFT); 238 | } else if (r_mouse_up()) { 239 | mu_input_mouseup(ctx, mousex, mousey, MU_MOUSE_LEFT); 240 | } 241 | // TODO(max): scroll 242 | if (r_key_down(0x1b)) { break; } // esc 243 | if (r_key_down('\n')) { mu_input_keydown(ctx, MU_KEY_RETURN); } 244 | else if (r_key_up('\n')) { mu_input_keyup(ctx, MU_KEY_RETURN); } 245 | if (r_key_down('\b')) { mu_input_keydown(ctx, MU_KEY_BACKSPACE); } 246 | else if (r_key_up('\b')) { mu_input_keyup(ctx, MU_KEY_BACKSPACE); } 247 | for (int i = 0; i < 256; i++) { 248 | if (r_key_down(i)) { 249 | if (' ' <= i && i <= '~') { 250 | char text[2] = {i, 0}; 251 | if (isalpha(i)) { 252 | if (!r_shift_pressed()) { 253 | text[0] = tolower(i); 254 | } 255 | } 256 | else { 257 | // TODO(kartik): depends on keyboard layout 258 | } 259 | mu_input_text(ctx, text); 260 | } 261 | continue; 262 | } 263 | // TODO(max): mod 264 | } 265 | 266 | /* process frame */ 267 | process_frame(ctx); 268 | 269 | /* render */ 270 | r_clear(mu_color(bg[0], bg[1], bg[2], 255)); 271 | mu_Command *cmd = NULL; 272 | while (mu_next_command(ctx, &cmd)) { 273 | switch (cmd->type) { 274 | case MU_COMMAND_TEXT: r_draw_text(cmd->text.str, cmd->text.pos, cmd->text.color); break; 275 | case MU_COMMAND_RECT: r_draw_rect(cmd->rect.rect, cmd->rect.color); break; 276 | case MU_COMMAND_ICON: r_draw_icon(cmd->icon.id, cmd->icon.rect, cmd->icon.color); break; 277 | case MU_COMMAND_CLIP: r_set_clip_rect(cmd->clip.rect); break; 278 | } 279 | } 280 | r_present(); 281 | int64_t after = r_get_time(); 282 | int64_t paint_time_ms = after - before; 283 | int64_t frame_budget_ms = 1000 / fps; 284 | int64_t sleep_time_ms = frame_budget_ms - paint_time_ms; 285 | if (sleep_time_ms > 0) { 286 | r_sleep(sleep_time_ms); 287 | } 288 | } 289 | 290 | return 0; 291 | } 292 | -------------------------------------------------------------------------------- /microui.h: -------------------------------------------------------------------------------- 1 | /* 2 | ** Copyright (c) 2024 rxi 3 | ** 4 | ** This library is free software; you can redistribute it and/or modify it 5 | ** under the terms of the MIT license. See `microui.c` for details. 6 | */ 7 | 8 | #ifndef MICROUI_H 9 | #define MICROUI_H 10 | 11 | #define MU_VERSION "2.02" 12 | 13 | #define MU_COMMANDLIST_SIZE (256 * 1024) 14 | #define MU_ROOTLIST_SIZE 32 15 | #define MU_CONTAINERSTACK_SIZE 32 16 | #define MU_CLIPSTACK_SIZE 32 17 | #define MU_IDSTACK_SIZE 32 18 | #define MU_LAYOUTSTACK_SIZE 16 19 | #define MU_CONTAINERPOOL_SIZE 48 20 | #define MU_TREENODEPOOL_SIZE 48 21 | #define MU_MAX_WIDTHS 16 22 | #define MU_REAL float 23 | #define MU_REAL_FMT "%.3g" 24 | #define MU_SLIDER_FMT "%.2f" 25 | #define MU_MAX_FMT 127 26 | 27 | #define mu_stack(T, n) struct { int idx; T items[n]; } 28 | #define mu_min(a, b) ((a) < (b) ? (a) : (b)) 29 | #define mu_max(a, b) ((a) > (b) ? (a) : (b)) 30 | #define mu_clamp(x, a, b) mu_min(b, mu_max(a, x)) 31 | 32 | enum { 33 | MU_CLIP_PART = 1, 34 | MU_CLIP_ALL 35 | }; 36 | 37 | enum { 38 | MU_COMMAND_JUMP = 1, 39 | MU_COMMAND_CLIP, 40 | MU_COMMAND_RECT, 41 | MU_COMMAND_TEXT, 42 | MU_COMMAND_ICON, 43 | MU_COMMAND_MAX 44 | }; 45 | 46 | enum { 47 | MU_COLOR_TEXT, 48 | MU_COLOR_BORDER, 49 | MU_COLOR_WINDOWBG, 50 | MU_COLOR_TITLEBG, 51 | MU_COLOR_TITLETEXT, 52 | MU_COLOR_PANELBG, 53 | MU_COLOR_BUTTON, 54 | MU_COLOR_BUTTONHOVER, 55 | MU_COLOR_BUTTONFOCUS, 56 | MU_COLOR_BASE, 57 | MU_COLOR_BASEHOVER, 58 | MU_COLOR_BASEFOCUS, 59 | MU_COLOR_SCROLLBASE, 60 | MU_COLOR_SCROLLTHUMB, 61 | MU_COLOR_MAX 62 | }; 63 | 64 | enum { 65 | MU_ICON_CLOSE = 1, 66 | MU_ICON_CHECK, 67 | MU_ICON_COLLAPSED, 68 | MU_ICON_EXPANDED, 69 | MU_ICON_MAX 70 | }; 71 | 72 | enum { 73 | MU_RES_ACTIVE = (1 << 0), 74 | MU_RES_SUBMIT = (1 << 1), 75 | MU_RES_CHANGE = (1 << 2) 76 | }; 77 | 78 | enum { 79 | MU_OPT_ALIGNCENTER = (1 << 0), 80 | MU_OPT_ALIGNRIGHT = (1 << 1), 81 | MU_OPT_NOINTERACT = (1 << 2), 82 | MU_OPT_NOFRAME = (1 << 3), 83 | MU_OPT_NORESIZE = (1 << 4), 84 | MU_OPT_NOSCROLL = (1 << 5), 85 | MU_OPT_NOCLOSE = (1 << 6), 86 | MU_OPT_NOTITLE = (1 << 7), 87 | MU_OPT_HOLDFOCUS = (1 << 8), 88 | MU_OPT_AUTOSIZE = (1 << 9), 89 | MU_OPT_POPUP = (1 << 10), 90 | MU_OPT_CLOSED = (1 << 11), 91 | MU_OPT_EXPANDED = (1 << 12) 92 | }; 93 | 94 | enum { 95 | MU_MOUSE_LEFT = (1 << 0), 96 | MU_MOUSE_RIGHT = (1 << 1), 97 | MU_MOUSE_MIDDLE = (1 << 2) 98 | }; 99 | 100 | enum { 101 | MU_KEY_SHIFT = (1 << 0), 102 | MU_KEY_CTRL = (1 << 1), 103 | MU_KEY_ALT = (1 << 2), 104 | MU_KEY_BACKSPACE = (1 << 3), 105 | MU_KEY_RETURN = (1 << 4) 106 | }; 107 | 108 | 109 | typedef struct mu_Context mu_Context; 110 | typedef unsigned mu_Id; 111 | typedef MU_REAL mu_Real; 112 | typedef void* mu_Font; 113 | 114 | typedef struct { int x, y; } mu_Vec2; 115 | typedef struct { int x, y, w, h; } mu_Rect; 116 | typedef struct { unsigned char r, g, b, a; } mu_Color; 117 | typedef struct { mu_Id id; int last_update; } mu_PoolItem; 118 | 119 | typedef struct { int type, size; } mu_BaseCommand; 120 | typedef struct { mu_BaseCommand base; void *dst; } mu_JumpCommand; 121 | typedef struct { mu_BaseCommand base; mu_Rect rect; } mu_ClipCommand; 122 | typedef struct { mu_BaseCommand base; mu_Rect rect; mu_Color color; } mu_RectCommand; 123 | typedef struct { mu_BaseCommand base; mu_Font font; mu_Vec2 pos; mu_Color color; char str[1]; } mu_TextCommand; 124 | typedef struct { mu_BaseCommand base; mu_Rect rect; int id; mu_Color color; } mu_IconCommand; 125 | 126 | typedef union { 127 | int type; 128 | mu_BaseCommand base; 129 | mu_JumpCommand jump; 130 | mu_ClipCommand clip; 131 | mu_RectCommand rect; 132 | mu_TextCommand text; 133 | mu_IconCommand icon; 134 | } mu_Command; 135 | 136 | typedef struct { 137 | mu_Rect body; 138 | mu_Rect next; 139 | mu_Vec2 position; 140 | mu_Vec2 size; 141 | mu_Vec2 max; 142 | int widths[MU_MAX_WIDTHS]; 143 | int items; 144 | int item_index; 145 | int next_row; 146 | int next_type; 147 | int indent; 148 | } mu_Layout; 149 | 150 | typedef struct { 151 | mu_Command *head, *tail; 152 | mu_Rect rect; 153 | mu_Rect body; 154 | mu_Vec2 content_size; 155 | mu_Vec2 scroll; 156 | int zindex; 157 | int open; 158 | } mu_Container; 159 | 160 | typedef struct { 161 | mu_Font font; 162 | mu_Vec2 size; 163 | int padding; 164 | int spacing; 165 | int indent; 166 | int title_height; 167 | int scrollbar_size; 168 | int thumb_size; 169 | mu_Color colors[MU_COLOR_MAX]; 170 | } mu_Style; 171 | 172 | struct mu_Context { 173 | /* callbacks */ 174 | int (*text_width)(mu_Font font, const char *str, int len); 175 | int (*text_height)(mu_Font font); 176 | void (*draw_frame)(mu_Context *ctx, mu_Rect rect, int colorid); 177 | /* core state */ 178 | mu_Style _style; 179 | mu_Style *style; 180 | mu_Id hover; 181 | mu_Id focus; 182 | mu_Id last_id; 183 | mu_Rect last_rect; 184 | int last_zindex; 185 | int updated_focus; 186 | int frame; 187 | mu_Container *hover_root; 188 | mu_Container *next_hover_root; 189 | mu_Container *scroll_target; 190 | char number_edit_buf[MU_MAX_FMT]; 191 | mu_Id number_edit; 192 | /* stacks */ 193 | mu_stack(char, MU_COMMANDLIST_SIZE) command_list; 194 | mu_stack(mu_Container*, MU_ROOTLIST_SIZE) root_list; 195 | mu_stack(mu_Container*, MU_CONTAINERSTACK_SIZE) container_stack; 196 | mu_stack(mu_Rect, MU_CLIPSTACK_SIZE) clip_stack; 197 | mu_stack(mu_Id, MU_IDSTACK_SIZE) id_stack; 198 | mu_stack(mu_Layout, MU_LAYOUTSTACK_SIZE) layout_stack; 199 | /* retained state pools */ 200 | mu_PoolItem container_pool[MU_CONTAINERPOOL_SIZE]; 201 | mu_Container containers[MU_CONTAINERPOOL_SIZE]; 202 | mu_PoolItem treenode_pool[MU_TREENODEPOOL_SIZE]; 203 | /* input state */ 204 | mu_Vec2 mouse_pos; 205 | mu_Vec2 last_mouse_pos; 206 | mu_Vec2 mouse_delta; 207 | mu_Vec2 scroll_delta; 208 | int mouse_down; 209 | int mouse_pressed; 210 | int key_down; 211 | int key_pressed; 212 | char input_text[32]; 213 | }; 214 | 215 | 216 | mu_Vec2 mu_vec2(int x, int y); 217 | mu_Rect mu_rect(int x, int y, int w, int h); 218 | mu_Color mu_color(int r, int g, int b, int a); 219 | 220 | void mu_init(mu_Context *ctx); 221 | void mu_begin(mu_Context *ctx); 222 | void mu_end(mu_Context *ctx); 223 | void mu_set_focus(mu_Context *ctx, mu_Id id); 224 | mu_Id mu_get_id(mu_Context *ctx, const void *data, int size); 225 | void mu_push_id(mu_Context *ctx, const void *data, int size); 226 | void mu_pop_id(mu_Context *ctx); 227 | void mu_push_clip_rect(mu_Context *ctx, mu_Rect rect); 228 | void mu_pop_clip_rect(mu_Context *ctx); 229 | mu_Rect mu_get_clip_rect(mu_Context *ctx); 230 | int mu_check_clip(mu_Context *ctx, mu_Rect r); 231 | mu_Container* mu_get_current_container(mu_Context *ctx); 232 | mu_Container* mu_get_container(mu_Context *ctx, const char *name); 233 | void mu_bring_to_front(mu_Context *ctx, mu_Container *cnt); 234 | 235 | int mu_pool_init(mu_Context *ctx, mu_PoolItem *items, int len, mu_Id id); 236 | int mu_pool_get(mu_Context *ctx, mu_PoolItem *items, int len, mu_Id id); 237 | void mu_pool_update(mu_Context *ctx, mu_PoolItem *items, int idx); 238 | 239 | void mu_input_mousemove(mu_Context *ctx, int x, int y); 240 | void mu_input_mousedown(mu_Context *ctx, int x, int y, int btn); 241 | void mu_input_mouseup(mu_Context *ctx, int x, int y, int btn); 242 | void mu_input_scroll(mu_Context *ctx, int x, int y); 243 | void mu_input_keydown(mu_Context *ctx, int key); 244 | void mu_input_keyup(mu_Context *ctx, int key); 245 | void mu_input_text(mu_Context *ctx, const char *text); 246 | 247 | mu_Command* mu_push_command(mu_Context *ctx, int type, int size); 248 | int mu_next_command(mu_Context *ctx, mu_Command **cmd); 249 | void mu_set_clip(mu_Context *ctx, mu_Rect rect); 250 | void mu_draw_rect(mu_Context *ctx, mu_Rect rect, mu_Color color); 251 | void mu_draw_box(mu_Context *ctx, mu_Rect rect, mu_Color color); 252 | void mu_draw_text(mu_Context *ctx, mu_Font font, const char *str, int len, mu_Vec2 pos, mu_Color color); 253 | void mu_draw_icon(mu_Context *ctx, int id, mu_Rect rect, mu_Color color); 254 | 255 | void mu_layout_row(mu_Context *ctx, int items, const int *widths, int height); 256 | void mu_layout_width(mu_Context *ctx, int width); 257 | void mu_layout_height(mu_Context *ctx, int height); 258 | void mu_layout_begin_column(mu_Context *ctx); 259 | void mu_layout_end_column(mu_Context *ctx); 260 | void mu_layout_set_next(mu_Context *ctx, mu_Rect r, int relative); 261 | mu_Rect mu_layout_next(mu_Context *ctx); 262 | 263 | void mu_draw_control_frame(mu_Context *ctx, mu_Id id, mu_Rect rect, int colorid, int opt); 264 | void mu_draw_control_text(mu_Context *ctx, const char *str, mu_Rect rect, int colorid, int opt); 265 | int mu_mouse_over(mu_Context *ctx, mu_Rect rect); 266 | void mu_update_control(mu_Context *ctx, mu_Id id, mu_Rect rect, int opt); 267 | 268 | #define mu_button(ctx, label) mu_button_ex(ctx, label, 0, MU_OPT_ALIGNCENTER) 269 | #define mu_textbox(ctx, buf, bufsz) mu_textbox_ex(ctx, buf, bufsz, 0) 270 | #define mu_slider(ctx, value, lo, hi) mu_slider_ex(ctx, value, lo, hi, 0, MU_SLIDER_FMT, MU_OPT_ALIGNCENTER) 271 | #define mu_number(ctx, value, step) mu_number_ex(ctx, value, step, MU_SLIDER_FMT, MU_OPT_ALIGNCENTER) 272 | #define mu_header(ctx, label) mu_header_ex(ctx, label, 0) 273 | #define mu_begin_treenode(ctx, label) mu_begin_treenode_ex(ctx, label, 0) 274 | #define mu_begin_window(ctx, title, rect) mu_begin_window_ex(ctx, title, rect, 0) 275 | #define mu_begin_panel(ctx, name) mu_begin_panel_ex(ctx, name, 0) 276 | 277 | void mu_text(mu_Context *ctx, const char *text); 278 | void mu_label(mu_Context *ctx, const char *text); 279 | int mu_button_ex(mu_Context *ctx, const char *label, int icon, int opt); 280 | int mu_checkbox(mu_Context *ctx, const char *label, int *state); 281 | int mu_textbox_raw(mu_Context *ctx, char *buf, int bufsz, mu_Id id, mu_Rect r, int opt); 282 | int mu_textbox_ex(mu_Context *ctx, char *buf, int bufsz, int opt); 283 | int mu_slider_ex(mu_Context *ctx, mu_Real *value, mu_Real low, mu_Real high, mu_Real step, const char *fmt, int opt); 284 | int mu_number_ex(mu_Context *ctx, mu_Real *value, mu_Real step, const char *fmt, int opt); 285 | int mu_header_ex(mu_Context *ctx, const char *label, int opt); 286 | int mu_begin_treenode_ex(mu_Context *ctx, const char *label, int opt); 287 | void mu_end_treenode(mu_Context *ctx); 288 | int mu_begin_window_ex(mu_Context *ctx, const char *title, mu_Rect rect, int opt); 289 | void mu_end_window(mu_Context *ctx); 290 | void mu_open_popup(mu_Context *ctx, const char *name); 291 | int mu_begin_popup(mu_Context *ctx, const char *name); 292 | void mu_end_popup(mu_Context *ctx); 293 | void mu_begin_panel_ex(mu_Context *ctx, const char *name, int opt); 294 | void mu_end_panel(mu_Context *ctx); 295 | 296 | #endif 297 | -------------------------------------------------------------------------------- /fenster.h: -------------------------------------------------------------------------------- 1 | /* 2 | ** Copyright (c) 2024 Serge Zaitsev 3 | ** 4 | ** Permission is hereby granted, free of charge, to any person obtaining a copy 5 | ** of this software and associated documentation files (the "Software"), to 6 | ** deal in the Software without restriction, including without limitation the 7 | ** rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 8 | ** sell copies of the Software, and to permit persons to whom the Software is 9 | ** furnished to do so, subject to the following conditions: 10 | ** 11 | ** The above copyright notice and this permission notice shall be included in 12 | ** all copies or substantial portions of the Software. 13 | ** 14 | ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19 | ** FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 20 | ** IN THE SOFTWARE. 21 | */ 22 | 23 | #ifndef FENSTER_H 24 | #define FENSTER_H 25 | 26 | #if defined(__APPLE__) 27 | #include 28 | #include 29 | #include 30 | #elif defined(_WIN32) 31 | #include 32 | #else 33 | #define _DEFAULT_SOURCE 1 34 | #include 35 | #include 36 | #include 37 | #include 38 | #endif 39 | 40 | #include 41 | #include 42 | #include 43 | 44 | struct fenster { 45 | const char *title; 46 | const int width; 47 | const int height; 48 | uint32_t *buf; 49 | int keys[256]; /* keys are mostly ASCII, but arrows are 17..20 */ 50 | int mod; /* mod is 4 bits mask, ctrl=1, shift=2, alt=4, meta=8 */ 51 | int x; 52 | int y; 53 | int mouse; 54 | #if defined(__APPLE__) 55 | id wnd; 56 | #elif defined(_WIN32) 57 | HWND hwnd; 58 | #else 59 | Display *dpy; 60 | Window w; 61 | GC gc; 62 | XImage *img; 63 | #endif 64 | }; 65 | 66 | #ifndef FENSTER_API 67 | #define FENSTER_API extern 68 | #endif 69 | FENSTER_API int fenster_open(struct fenster *f); 70 | FENSTER_API int fenster_loop(struct fenster *f); 71 | FENSTER_API void fenster_close(struct fenster *f); 72 | FENSTER_API void fenster_sleep(int64_t ms); 73 | FENSTER_API int64_t fenster_time(void); 74 | #define fenster_pixel(f, x, y) ((f)->buf[((y) * (f)->width) + (x)]) 75 | 76 | #ifndef FENSTER_HEADER 77 | #if defined(__APPLE__) 78 | #define msg(r, o, s) ((r(*)(id, SEL))objc_msgSend)(o, sel_getUid(s)) 79 | #define msg1(r, o, s, A, a) \ 80 | ((r(*)(id, SEL, A))objc_msgSend)(o, sel_getUid(s), a) 81 | #define msg2(r, o, s, A, a, B, b) \ 82 | ((r(*)(id, SEL, A, B))objc_msgSend)(o, sel_getUid(s), a, b) 83 | #define msg3(r, o, s, A, a, B, b, C, c) \ 84 | ((r(*)(id, SEL, A, B, C))objc_msgSend)(o, sel_getUid(s), a, b, c) 85 | #define msg4(r, o, s, A, a, B, b, C, c, D, d) \ 86 | ((r(*)(id, SEL, A, B, C, D))objc_msgSend)(o, sel_getUid(s), a, b, c, d) 87 | 88 | #define cls(x) ((id)objc_getClass(x)) 89 | 90 | extern id const NSDefaultRunLoopMode; 91 | extern id const NSApp; 92 | 93 | static void fenster_draw_rect(id v, SEL s, CGRect r) { 94 | (void)r, (void)s; 95 | struct fenster *f = (struct fenster *)objc_getAssociatedObject(v, "fenster"); 96 | CGContextRef context = 97 | msg(CGContextRef, msg(id, cls("NSGraphicsContext"), "currentContext"), 98 | "graphicsPort"); 99 | CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); 100 | CGDataProviderRef provider = CGDataProviderCreateWithData( 101 | NULL, f->buf, f->width * f->height * 4, NULL); 102 | CGImageRef img = 103 | CGImageCreate(f->width, f->height, 8, 32, f->width * 4, space, 104 | kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little, 105 | provider, NULL, false, kCGRenderingIntentDefault); 106 | CGColorSpaceRelease(space); 107 | CGDataProviderRelease(provider); 108 | CGContextDrawImage(context, CGRectMake(0, 0, f->width, f->height), img); 109 | CGImageRelease(img); 110 | } 111 | 112 | static BOOL fenster_should_close(id v, SEL s, id w) { 113 | (void)v, (void)s, (void)w; 114 | msg1(void, NSApp, "terminate:", id, NSApp); 115 | return YES; 116 | } 117 | 118 | FENSTER_API int fenster_open(struct fenster *f) { 119 | msg(id, cls("NSApplication"), "sharedApplication"); 120 | msg1(void, NSApp, "setActivationPolicy:", NSInteger, 0); 121 | f->wnd = msg4(id, msg(id, cls("NSWindow"), "alloc"), 122 | "initWithContentRect:styleMask:backing:defer:", CGRect, 123 | CGRectMake(0, 0, f->width, f->height), NSUInteger, 3, 124 | NSUInteger, 2, BOOL, NO); 125 | Class windelegate = 126 | objc_allocateClassPair((Class)cls("NSObject"), "FensterDelegate", 0); 127 | class_addMethod(windelegate, sel_getUid("windowShouldClose:"), 128 | (IMP)fenster_should_close, "c@:@"); 129 | objc_registerClassPair(windelegate); 130 | msg1(void, f->wnd, "setDelegate:", id, 131 | msg(id, msg(id, (id)windelegate, "alloc"), "init")); 132 | Class c = objc_allocateClassPair((Class)cls("NSView"), "FensterView", 0); 133 | class_addMethod(c, sel_getUid("drawRect:"), (IMP)fenster_draw_rect, "i@:@@"); 134 | objc_registerClassPair(c); 135 | 136 | id v = msg(id, msg(id, (id)c, "alloc"), "init"); 137 | msg1(void, f->wnd, "setContentView:", id, v); 138 | objc_setAssociatedObject(v, "fenster", (id)f, OBJC_ASSOCIATION_ASSIGN); 139 | 140 | id title = msg1(id, cls("NSString"), "stringWithUTF8String:", const char *, 141 | f->title); 142 | msg1(void, f->wnd, "setTitle:", id, title); 143 | msg1(void, f->wnd, "makeKeyAndOrderFront:", id, nil); 144 | msg(void, f->wnd, "center"); 145 | msg1(void, NSApp, "activateIgnoringOtherApps:", BOOL, YES); 146 | return 0; 147 | } 148 | 149 | FENSTER_API void fenster_close(struct fenster *f) { 150 | msg(void, f->wnd, "close"); 151 | } 152 | 153 | // clang-format off 154 | static const uint8_t FENSTER_KEYCODES[128] = {65,83,68,70,72,71,90,88,67,86,0,66,81,87,69,82,89,84,49,50,51,52,54,53,61,57,55,45,56,48,93,79,85,91,73,80,10,76,74,39,75,59,92,44,47,78,77,46,9,32,96,8,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,2,3,127,0,5,0,4,0,20,19,18,17,0}; 155 | // clang-format on 156 | FENSTER_API int fenster_loop(struct fenster *f) { 157 | msg1(void, msg(id, f->wnd, "contentView"), "setNeedsDisplay:", BOOL, YES); 158 | id ev = msg4(id, NSApp, 159 | "nextEventMatchingMask:untilDate:inMode:dequeue:", NSUInteger, 160 | NSUIntegerMax, id, NULL, id, NSDefaultRunLoopMode, BOOL, YES); 161 | if (!ev) 162 | return 0; 163 | NSUInteger evtype = msg(NSUInteger, ev, "type"); 164 | switch (evtype) { 165 | case 1: /* NSEventTypeMouseDown */ 166 | f->mouse |= 1; 167 | break; 168 | case 2: /* NSEventTypeMouseUp*/ 169 | f->mouse &= ~1; 170 | break; 171 | case 5: 172 | case 6: { /* NSEventTypeMouseMoved */ 173 | CGPoint xy = msg(CGPoint, ev, "locationInWindow"); 174 | f->x = (int)xy.x; 175 | f->y = (int)(f->height - xy.y); 176 | return 0; 177 | } 178 | case 10: /*NSEventTypeKeyDown*/ 179 | case 11: /*NSEventTypeKeyUp:*/ { 180 | NSUInteger k = msg(NSUInteger, ev, "keyCode"); 181 | f->keys[k < 127 ? FENSTER_KEYCODES[k] : 0] = evtype == 10; 182 | NSUInteger mod = msg(NSUInteger, ev, "modifierFlags") >> 17; 183 | f->mod = (mod & 0xc) | ((mod & 1) << 1) | ((mod >> 1) & 1); 184 | return 0; 185 | } 186 | } 187 | msg1(void, NSApp, "sendEvent:", id, ev); 188 | return 0; 189 | } 190 | #elif defined(_WIN32) 191 | // clang-format off 192 | static const uint8_t FENSTER_KEYCODES[] = {0,27,49,50,51,52,53,54,55,56,57,48,45,61,8,9,81,87,69,82,84,89,85,73,79,80,91,93,10,0,65,83,68,70,71,72,74,75,76,59,39,96,0,92,90,88,67,86,66,78,77,44,46,47,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,17,3,0,20,0,19,0,5,18,4,26,127}; 193 | // clang-format on 194 | typedef struct BINFO{ 195 | BITMAPINFOHEADER bmiHeader; 196 | RGBQUAD bmiColors[3]; 197 | }BINFO; 198 | static LRESULT CALLBACK fenster_wndproc(HWND hwnd, UINT msg, WPARAM wParam, 199 | LPARAM lParam) { 200 | struct fenster *f = (struct fenster *)GetWindowLongPtr(hwnd, GWLP_USERDATA); 201 | switch (msg) { 202 | case WM_PAINT: { 203 | PAINTSTRUCT ps; 204 | HDC hdc = BeginPaint(hwnd, &ps); 205 | HDC memdc = CreateCompatibleDC(hdc); 206 | HBITMAP hbmp = CreateCompatibleBitmap(hdc, f->width, f->height); 207 | HBITMAP oldbmp = SelectObject(memdc, hbmp); 208 | BINFO bi = {{sizeof(bi), f->width, -f->height, 1, 32, BI_BITFIELDS}}; 209 | bi.bmiColors[0].rgbRed = 0xff; 210 | bi.bmiColors[1].rgbGreen = 0xff; 211 | bi.bmiColors[2].rgbBlue = 0xff; 212 | SetDIBitsToDevice(memdc, 0, 0, f->width, f->height, 0, 0, 0, f->height, 213 | f->buf, (BITMAPINFO *)&bi, DIB_RGB_COLORS); 214 | BitBlt(hdc, 0, 0, f->width, f->height, memdc, 0, 0, SRCCOPY); 215 | SelectObject(memdc, oldbmp); 216 | DeleteObject(hbmp); 217 | DeleteDC(memdc); 218 | EndPaint(hwnd, &ps); 219 | } break; 220 | case WM_CLOSE: 221 | DestroyWindow(hwnd); 222 | break; 223 | case WM_LBUTTONDOWN: 224 | case WM_LBUTTONUP: 225 | f->mouse = (msg == WM_LBUTTONDOWN); 226 | break; 227 | case WM_MOUSEMOVE: 228 | f->y = HIWORD(lParam), f->x = LOWORD(lParam); 229 | break; 230 | case WM_KEYDOWN: 231 | case WM_KEYUP: { 232 | f->mod = ((GetKeyState(VK_CONTROL) & 0x8000) >> 15) | 233 | ((GetKeyState(VK_SHIFT) & 0x8000) >> 14) | 234 | ((GetKeyState(VK_MENU) & 0x8000) >> 13) | 235 | (((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & 0x8000) >> 12); 236 | f->keys[FENSTER_KEYCODES[HIWORD(lParam) & 0x1ff]] = !((lParam >> 31) & 1); 237 | } break; 238 | case WM_DESTROY: 239 | PostQuitMessage(0); 240 | break; 241 | default: 242 | return DefWindowProc(hwnd, msg, wParam, lParam); 243 | } 244 | return 0; 245 | } 246 | 247 | FENSTER_API int fenster_open(struct fenster *f) { 248 | HINSTANCE hInstance = GetModuleHandle(NULL); 249 | WNDCLASSEX wc = {0}; 250 | wc.cbSize = sizeof(WNDCLASSEX); 251 | wc.style = CS_VREDRAW | CS_HREDRAW; 252 | wc.lpfnWndProc = fenster_wndproc; 253 | wc.hInstance = hInstance; 254 | wc.lpszClassName = f->title; 255 | RegisterClassEx(&wc); 256 | f->hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, f->title, f->title, 257 | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 258 | f->width, f->height, NULL, NULL, hInstance, NULL); 259 | 260 | if (f->hwnd == NULL) 261 | return -1; 262 | SetWindowLongPtr(f->hwnd, GWLP_USERDATA, (LONG_PTR)f); 263 | ShowWindow(f->hwnd, SW_NORMAL); 264 | UpdateWindow(f->hwnd); 265 | return 0; 266 | } 267 | 268 | FENSTER_API void fenster_close(struct fenster *f) { (void)f; } 269 | 270 | FENSTER_API int fenster_loop(struct fenster *f) { 271 | MSG msg; 272 | while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { 273 | if (msg.message == WM_QUIT) 274 | return -1; 275 | TranslateMessage(&msg); 276 | DispatchMessage(&msg); 277 | } 278 | InvalidateRect(f->hwnd, NULL, TRUE); 279 | return 0; 280 | } 281 | #else 282 | // clang-format off 283 | static int FENSTER_KEYCODES[124] = {XK_BackSpace,8,XK_Delete,127,XK_Down,18,XK_End,5,XK_Escape,27,XK_Home,2,XK_Insert,26,XK_Left,20,XK_Page_Down,4,XK_Page_Up,3,XK_Return,10,XK_Right,19,XK_Tab,9,XK_Up,17,XK_apostrophe,39,XK_backslash,92,XK_bracketleft,91,XK_bracketright,93,XK_comma,44,XK_equal,61,XK_grave,96,XK_minus,45,XK_period,46,XK_semicolon,59,XK_slash,47,XK_space,32,XK_a,65,XK_b,66,XK_c,67,XK_d,68,XK_e,69,XK_f,70,XK_g,71,XK_h,72,XK_i,73,XK_j,74,XK_k,75,XK_l,76,XK_m,77,XK_n,78,XK_o,79,XK_p,80,XK_q,81,XK_r,82,XK_s,83,XK_t,84,XK_u,85,XK_v,86,XK_w,87,XK_x,88,XK_y,89,XK_z,90,XK_0,48,XK_1,49,XK_2,50,XK_3,51,XK_4,52,XK_5,53,XK_6,54,XK_7,55,XK_8,56,XK_9,57}; 284 | // clang-format on 285 | FENSTER_API int fenster_open(struct fenster *f) { 286 | f->dpy = XOpenDisplay(NULL); 287 | int screen = DefaultScreen(f->dpy); 288 | f->w = XCreateSimpleWindow(f->dpy, RootWindow(f->dpy, screen), 0, 0, f->width, 289 | f->height, 0, BlackPixel(f->dpy, screen), 290 | WhitePixel(f->dpy, screen)); 291 | f->gc = XCreateGC(f->dpy, f->w, 0, 0); 292 | XSelectInput(f->dpy, f->w, 293 | ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | 294 | ButtonReleaseMask | PointerMotionMask); 295 | XStoreName(f->dpy, f->w, f->title); 296 | XMapWindow(f->dpy, f->w); 297 | XSync(f->dpy, f->w); 298 | f->img = XCreateImage(f->dpy, DefaultVisual(f->dpy, 0), 24, ZPixmap, 0, 299 | (char *)f->buf, f->width, f->height, 32, 0); 300 | return 0; 301 | } 302 | FENSTER_API void fenster_close(struct fenster *f) { XCloseDisplay(f->dpy); } 303 | FENSTER_API int fenster_loop(struct fenster *f) { 304 | XEvent ev; 305 | XPutImage(f->dpy, f->w, f->gc, f->img, 0, 0, 0, 0, f->width, f->height); 306 | XFlush(f->dpy); 307 | while (XPending(f->dpy)) { 308 | XNextEvent(f->dpy, &ev); 309 | switch (ev.type) { 310 | case ButtonPress: 311 | case ButtonRelease: 312 | f->mouse = (ev.type == ButtonPress); 313 | break; 314 | case MotionNotify: 315 | f->x = ev.xmotion.x, f->y = ev.xmotion.y; 316 | break; 317 | case KeyPress: 318 | case KeyRelease: { 319 | int m = ev.xkey.state; 320 | int k = XkbKeycodeToKeysym(f->dpy, ev.xkey.keycode, 0, 0); 321 | for (unsigned int i = 0; i < 124; i += 2) { 322 | if (FENSTER_KEYCODES[i] == k) { 323 | f->keys[FENSTER_KEYCODES[i + 1]] = (ev.type == KeyPress); 324 | break; 325 | } 326 | } 327 | f->mod = (!!(m & ControlMask)) | (!!(m & ShiftMask) << 1) | 328 | (!!(m & Mod1Mask) << 2) | (!!(m & Mod4Mask) << 3); 329 | } break; 330 | } 331 | } 332 | return 0; 333 | } 334 | #endif 335 | 336 | #ifdef _WIN32 337 | FENSTER_API void fenster_sleep(int64_t ms) { Sleep(ms); } 338 | FENSTER_API int64_t fenster_time() { 339 | LARGE_INTEGER freq, count; 340 | QueryPerformanceFrequency(&freq); 341 | QueryPerformanceCounter(&count); 342 | return (int64_t)(count.QuadPart * 1000.0 / freq.QuadPart); 343 | } 344 | #else 345 | FENSTER_API void fenster_sleep(int64_t ms) { 346 | struct timespec ts; 347 | ts.tv_sec = ms / 1000; 348 | ts.tv_nsec = (ms % 1000) * 1000000; 349 | nanosleep(&ts, NULL); 350 | } 351 | FENSTER_API int64_t fenster_time(void) { 352 | struct timespec time; 353 | clock_gettime(CLOCK_REALTIME, &time); 354 | return time.tv_sec * 1000 + (time.tv_nsec / 1000000); 355 | } 356 | #endif 357 | 358 | #ifdef __cplusplus 359 | class Fenster { 360 | struct fenster f; 361 | int64_t now; 362 | 363 | public: 364 | Fenster(const int w, const int h, const char *title) 365 | : f{.title = title, .width = w, .height = h} { 366 | this->f.buf = new uint32_t[w * h]; 367 | clear(); 368 | this->now = fenster_time(); 369 | fenster_open(&this->f); 370 | } 371 | ~Fenster() { 372 | fenster_close(&this->f); 373 | delete[] this->f.buf; 374 | } 375 | void clear() { memset(this->f.buf, 0, this->f.width * this->f.height * 4); } 376 | bool loop(const int fps) { 377 | int64_t t = fenster_time(); 378 | int64_t paint_time = t - this->now; 379 | int64_t frame_budget = 1000 / fps; 380 | int64_t sleep_time = frame_budget - paint_time; 381 | if (sleep_time > 0) { 382 | fenster_sleep(sleep_time); 383 | } 384 | this->now = t; 385 | return fenster_loop(&this->f) == 0; 386 | } 387 | void paint() { fenster_loop(&this->f); } 388 | inline uint32_t &px(const int x, const int y) { 389 | return fenster_pixel(&this->f, x, y); 390 | } 391 | bool key(int c) { return c >= 0 && c < 128 ? this->f.keys[c] : false; } 392 | int x() { return this->f.x; } 393 | int y() { return this->f.y; } 394 | int mouse() { return this->f.mouse; } 395 | int mod() { return this->f.mod; } 396 | long width() { return this->f.width; } 397 | long height() { return this->f.height; } 398 | }; 399 | #endif /* __cplusplus */ 400 | 401 | #endif /* !FENSTER_HEADER */ 402 | #endif /* FENSTER_H */ 403 | -------------------------------------------------------------------------------- /microui.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** Copyright (c) 2024 rxi 3 | ** 4 | ** Permission is hereby granted, free of charge, to any person obtaining a copy 5 | ** of this software and associated documentation files (the "Software"), to 6 | ** deal in the Software without restriction, including without limitation the 7 | ** rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 8 | ** sell copies of the Software, and to permit persons to whom the Software is 9 | ** furnished to do so, subject to the following conditions: 10 | ** 11 | ** The above copyright notice and this permission notice shall be included in 12 | ** all copies or substantial portions of the Software. 13 | ** 14 | ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19 | ** FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 20 | ** IN THE SOFTWARE. 21 | */ 22 | 23 | #include 24 | #include 25 | #include 26 | #include "microui.h" 27 | 28 | #define unused(x) ((void) (x)) 29 | 30 | #define expect(x) do { \ 31 | if (!(x)) { \ 32 | fprintf(stderr, "Fatal error: %s:%d: assertion '%s' failed\n", \ 33 | __FILE__, __LINE__, #x); \ 34 | abort(); \ 35 | } \ 36 | } while (0) 37 | 38 | #define push(stk, val) do { \ 39 | expect((stk).idx < (int) (sizeof((stk).items) / sizeof(*(stk).items))); \ 40 | (stk).items[(stk).idx] = (val); \ 41 | (stk).idx++; /* incremented after incase `val` uses this value */ \ 42 | } while (0) 43 | 44 | #define pop(stk) do { \ 45 | expect((stk).idx > 0); \ 46 | (stk).idx--; \ 47 | } while (0) 48 | 49 | 50 | static mu_Rect unclipped_rect = { 0, 0, 0x1000000, 0x1000000 }; 51 | 52 | static mu_Style default_style = { 53 | /* font | size | padding | spacing | indent */ 54 | NULL, { 68, 10 }, 5, 4, 24, 55 | /* title_height | scrollbar_size | thumb_size */ 56 | 24, 12, 8, 57 | { 58 | { 230, 230, 230, 255 }, /* MU_COLOR_TEXT */ 59 | { 25, 25, 25, 255 }, /* MU_COLOR_BORDER */ 60 | { 50, 50, 50, 255 }, /* MU_COLOR_WINDOWBG */ 61 | { 25, 25, 25, 255 }, /* MU_COLOR_TITLEBG */ 62 | { 240, 240, 240, 255 }, /* MU_COLOR_TITLETEXT */ 63 | { 0, 0, 0, 0 }, /* MU_COLOR_PANELBG */ 64 | { 75, 75, 75, 255 }, /* MU_COLOR_BUTTON */ 65 | { 95, 95, 95, 255 }, /* MU_COLOR_BUTTONHOVER */ 66 | { 115, 115, 115, 255 }, /* MU_COLOR_BUTTONFOCUS */ 67 | { 30, 30, 30, 255 }, /* MU_COLOR_BASE */ 68 | { 35, 35, 35, 255 }, /* MU_COLOR_BASEHOVER */ 69 | { 40, 40, 40, 255 }, /* MU_COLOR_BASEFOCUS */ 70 | { 43, 43, 43, 255 }, /* MU_COLOR_SCROLLBASE */ 71 | { 30, 30, 30, 255 } /* MU_COLOR_SCROLLTHUMB */ 72 | } 73 | }; 74 | 75 | 76 | mu_Vec2 mu_vec2(int x, int y) { 77 | mu_Vec2 res; 78 | res.x = x; res.y = y; 79 | return res; 80 | } 81 | 82 | 83 | mu_Rect mu_rect(int x, int y, int w, int h) { 84 | mu_Rect res; 85 | res.x = x; res.y = y; res.w = w; res.h = h; 86 | return res; 87 | } 88 | 89 | 90 | mu_Color mu_color(int r, int g, int b, int a) { 91 | mu_Color res; 92 | res.r = r; res.g = g; res.b = b; res.a = a; 93 | return res; 94 | } 95 | 96 | 97 | static mu_Rect expand_rect(mu_Rect rect, int n) { 98 | return mu_rect(rect.x - n, rect.y - n, rect.w + n * 2, rect.h + n * 2); 99 | } 100 | 101 | 102 | static mu_Rect intersect_rects(mu_Rect r1, mu_Rect r2) { 103 | int x1 = mu_max(r1.x, r2.x); 104 | int y1 = mu_max(r1.y, r2.y); 105 | int x2 = mu_min(r1.x + r1.w, r2.x + r2.w); 106 | int y2 = mu_min(r1.y + r1.h, r2.y + r2.h); 107 | if (x2 < x1) { x2 = x1; } 108 | if (y2 < y1) { y2 = y1; } 109 | return mu_rect(x1, y1, x2 - x1, y2 - y1); 110 | } 111 | 112 | 113 | static int rect_overlaps_vec2(mu_Rect r, mu_Vec2 p) { 114 | return p.x >= r.x && p.x < r.x + r.w && p.y >= r.y && p.y < r.y + r.h; 115 | } 116 | 117 | 118 | static void draw_frame(mu_Context *ctx, mu_Rect rect, int colorid) { 119 | mu_draw_rect(ctx, rect, ctx->style->colors[colorid]); 120 | if (colorid == MU_COLOR_SCROLLBASE || 121 | colorid == MU_COLOR_SCROLLTHUMB || 122 | colorid == MU_COLOR_TITLEBG) { return; } 123 | /* draw border */ 124 | if (ctx->style->colors[MU_COLOR_BORDER].a) { 125 | mu_draw_box(ctx, expand_rect(rect, 1), ctx->style->colors[MU_COLOR_BORDER]); 126 | } 127 | } 128 | 129 | 130 | void mu_init(mu_Context *ctx) { 131 | memset(ctx, 0, sizeof(*ctx)); 132 | ctx->draw_frame = draw_frame; 133 | ctx->_style = default_style; 134 | ctx->style = &ctx->_style; 135 | } 136 | 137 | 138 | void mu_begin(mu_Context *ctx) { 139 | expect(ctx->text_width && ctx->text_height); 140 | ctx->command_list.idx = 0; 141 | ctx->root_list.idx = 0; 142 | ctx->scroll_target = NULL; 143 | ctx->hover_root = ctx->next_hover_root; 144 | ctx->next_hover_root = NULL; 145 | ctx->mouse_delta.x = ctx->mouse_pos.x - ctx->last_mouse_pos.x; 146 | ctx->mouse_delta.y = ctx->mouse_pos.y - ctx->last_mouse_pos.y; 147 | ctx->frame++; 148 | } 149 | 150 | 151 | static int compare_zindex(const void *a, const void *b) { 152 | return (*(mu_Container**) a)->zindex - (*(mu_Container**) b)->zindex; 153 | } 154 | 155 | 156 | void mu_end(mu_Context *ctx) { 157 | int i, n; 158 | /* check stacks */ 159 | expect(ctx->container_stack.idx == 0); 160 | expect(ctx->clip_stack.idx == 0); 161 | expect(ctx->id_stack.idx == 0); 162 | expect(ctx->layout_stack.idx == 0); 163 | 164 | /* handle scroll input */ 165 | if (ctx->scroll_target) { 166 | ctx->scroll_target->scroll.x += ctx->scroll_delta.x; 167 | ctx->scroll_target->scroll.y += ctx->scroll_delta.y; 168 | } 169 | 170 | /* unset focus if focus id was not touched this frame */ 171 | if (!ctx->updated_focus) { ctx->focus = 0; } 172 | ctx->updated_focus = 0; 173 | 174 | /* bring hover root to front if mouse was pressed */ 175 | if (ctx->mouse_pressed && ctx->next_hover_root && 176 | ctx->next_hover_root->zindex < ctx->last_zindex && 177 | ctx->next_hover_root->zindex >= 0 178 | ) { 179 | mu_bring_to_front(ctx, ctx->next_hover_root); 180 | } 181 | 182 | /* reset input state */ 183 | ctx->key_pressed = 0; 184 | ctx->input_text[0] = '\0'; 185 | ctx->mouse_pressed = 0; 186 | ctx->scroll_delta = mu_vec2(0, 0); 187 | ctx->last_mouse_pos = ctx->mouse_pos; 188 | 189 | /* sort root containers by zindex */ 190 | n = ctx->root_list.idx; 191 | qsort(ctx->root_list.items, n, sizeof(mu_Container*), compare_zindex); 192 | 193 | /* set root container jump commands */ 194 | for (i = 0; i < n; i++) { 195 | mu_Container *cnt = ctx->root_list.items[i]; 196 | /* if this is the first container then make the first command jump to it. 197 | ** otherwise set the previous container's tail to jump to this one */ 198 | if (i == 0) { 199 | mu_Command *cmd = (mu_Command*) ctx->command_list.items; 200 | cmd->jump.dst = (char*) cnt->head + sizeof(mu_JumpCommand); 201 | } else { 202 | mu_Container *prev = ctx->root_list.items[i - 1]; 203 | prev->tail->jump.dst = (char*) cnt->head + sizeof(mu_JumpCommand); 204 | } 205 | /* make the last container's tail jump to the end of command list */ 206 | if (i == n - 1) { 207 | cnt->tail->jump.dst = ctx->command_list.items + ctx->command_list.idx; 208 | } 209 | } 210 | } 211 | 212 | 213 | void mu_set_focus(mu_Context *ctx, mu_Id id) { 214 | ctx->focus = id; 215 | ctx->updated_focus = 1; 216 | } 217 | 218 | 219 | /* 32bit fnv-1a hash */ 220 | #define HASH_INITIAL 2166136261 221 | 222 | static void hash(mu_Id *hash, const void *data, int size) { 223 | const unsigned char *p = data; 224 | while (size--) { 225 | *hash = (*hash ^ *p++) * 16777619; 226 | } 227 | } 228 | 229 | 230 | mu_Id mu_get_id(mu_Context *ctx, const void *data, int size) { 231 | int idx = ctx->id_stack.idx; 232 | mu_Id res = (idx > 0) ? ctx->id_stack.items[idx - 1] : HASH_INITIAL; 233 | hash(&res, data, size); 234 | ctx->last_id = res; 235 | return res; 236 | } 237 | 238 | 239 | void mu_push_id(mu_Context *ctx, const void *data, int size) { 240 | push(ctx->id_stack, mu_get_id(ctx, data, size)); 241 | } 242 | 243 | 244 | void mu_pop_id(mu_Context *ctx) { 245 | pop(ctx->id_stack); 246 | } 247 | 248 | 249 | void mu_push_clip_rect(mu_Context *ctx, mu_Rect rect) { 250 | mu_Rect last = mu_get_clip_rect(ctx); 251 | push(ctx->clip_stack, intersect_rects(rect, last)); 252 | } 253 | 254 | 255 | void mu_pop_clip_rect(mu_Context *ctx) { 256 | pop(ctx->clip_stack); 257 | } 258 | 259 | 260 | mu_Rect mu_get_clip_rect(mu_Context *ctx) { 261 | expect(ctx->clip_stack.idx > 0); 262 | return ctx->clip_stack.items[ctx->clip_stack.idx - 1]; 263 | } 264 | 265 | 266 | int mu_check_clip(mu_Context *ctx, mu_Rect r) { 267 | mu_Rect cr = mu_get_clip_rect(ctx); 268 | if (r.x > cr.x + cr.w || r.x + r.w < cr.x || 269 | r.y > cr.y + cr.h || r.y + r.h < cr.y ) { return MU_CLIP_ALL; } 270 | if (r.x >= cr.x && r.x + r.w <= cr.x + cr.w && 271 | r.y >= cr.y && r.y + r.h <= cr.y + cr.h ) { return 0; } 272 | return MU_CLIP_PART; 273 | } 274 | 275 | 276 | static void push_layout(mu_Context *ctx, mu_Rect body, mu_Vec2 scroll) { 277 | mu_Layout layout; 278 | int width = 0; 279 | memset(&layout, 0, sizeof(layout)); 280 | layout.body = mu_rect(body.x - scroll.x, body.y - scroll.y, body.w, body.h); 281 | layout.max = mu_vec2(-0x1000000, -0x1000000); 282 | push(ctx->layout_stack, layout); 283 | mu_layout_row(ctx, 1, &width, 0); 284 | } 285 | 286 | 287 | static mu_Layout* get_layout(mu_Context *ctx) { 288 | return &ctx->layout_stack.items[ctx->layout_stack.idx - 1]; 289 | } 290 | 291 | 292 | static void pop_container(mu_Context *ctx) { 293 | mu_Container *cnt = mu_get_current_container(ctx); 294 | mu_Layout *layout = get_layout(ctx); 295 | cnt->content_size.x = layout->max.x - layout->body.x; 296 | cnt->content_size.y = layout->max.y - layout->body.y; 297 | /* pop container, layout and id */ 298 | pop(ctx->container_stack); 299 | pop(ctx->layout_stack); 300 | mu_pop_id(ctx); 301 | } 302 | 303 | 304 | mu_Container* mu_get_current_container(mu_Context *ctx) { 305 | expect(ctx->container_stack.idx > 0); 306 | return ctx->container_stack.items[ ctx->container_stack.idx - 1 ]; 307 | } 308 | 309 | 310 | static mu_Container* get_container(mu_Context *ctx, mu_Id id, int opt) { 311 | mu_Container *cnt; 312 | /* try to get existing container from pool */ 313 | int idx = mu_pool_get(ctx, ctx->container_pool, MU_CONTAINERPOOL_SIZE, id); 314 | if (idx >= 0) { 315 | if (ctx->containers[idx].open || ~opt & MU_OPT_CLOSED) { 316 | mu_pool_update(ctx, ctx->container_pool, idx); 317 | } 318 | return &ctx->containers[idx]; 319 | } 320 | if (opt & MU_OPT_CLOSED) { return NULL; } 321 | /* container not found in pool: init new container */ 322 | idx = mu_pool_init(ctx, ctx->container_pool, MU_CONTAINERPOOL_SIZE, id); 323 | cnt = &ctx->containers[idx]; 324 | memset(cnt, 0, sizeof(*cnt)); 325 | cnt->open = 1; 326 | mu_bring_to_front(ctx, cnt); 327 | return cnt; 328 | } 329 | 330 | 331 | mu_Container* mu_get_container(mu_Context *ctx, const char *name) { 332 | mu_Id id = mu_get_id(ctx, name, strlen(name)); 333 | return get_container(ctx, id, 0); 334 | } 335 | 336 | 337 | void mu_bring_to_front(mu_Context *ctx, mu_Container *cnt) { 338 | cnt->zindex = ++ctx->last_zindex; 339 | } 340 | 341 | 342 | /*============================================================================ 343 | ** pool 344 | **============================================================================*/ 345 | 346 | int mu_pool_init(mu_Context *ctx, mu_PoolItem *items, int len, mu_Id id) { 347 | int i, n = -1, f = ctx->frame; 348 | for (i = 0; i < len; i++) { 349 | if (items[i].last_update < f) { 350 | f = items[i].last_update; 351 | n = i; 352 | } 353 | } 354 | expect(n > -1); 355 | items[n].id = id; 356 | mu_pool_update(ctx, items, n); 357 | return n; 358 | } 359 | 360 | 361 | int mu_pool_get(mu_Context *ctx, mu_PoolItem *items, int len, mu_Id id) { 362 | int i; 363 | unused(ctx); 364 | for (i = 0; i < len; i++) { 365 | if (items[i].id == id) { return i; } 366 | } 367 | return -1; 368 | } 369 | 370 | 371 | void mu_pool_update(mu_Context *ctx, mu_PoolItem *items, int idx) { 372 | items[idx].last_update = ctx->frame; 373 | } 374 | 375 | 376 | /*============================================================================ 377 | ** input handlers 378 | **============================================================================*/ 379 | 380 | void mu_input_mousemove(mu_Context *ctx, int x, int y) { 381 | ctx->mouse_pos = mu_vec2(x, y); 382 | } 383 | 384 | 385 | void mu_input_mousedown(mu_Context *ctx, int x, int y, int btn) { 386 | mu_input_mousemove(ctx, x, y); 387 | ctx->mouse_down |= btn; 388 | ctx->mouse_pressed |= btn; 389 | } 390 | 391 | 392 | void mu_input_mouseup(mu_Context *ctx, int x, int y, int btn) { 393 | mu_input_mousemove(ctx, x, y); 394 | ctx->mouse_down &= ~btn; 395 | } 396 | 397 | 398 | void mu_input_scroll(mu_Context *ctx, int x, int y) { 399 | ctx->scroll_delta.x += x; 400 | ctx->scroll_delta.y += y; 401 | } 402 | 403 | 404 | void mu_input_keydown(mu_Context *ctx, int key) { 405 | ctx->key_pressed |= key; 406 | ctx->key_down |= key; 407 | } 408 | 409 | 410 | void mu_input_keyup(mu_Context *ctx, int key) { 411 | ctx->key_down &= ~key; 412 | } 413 | 414 | 415 | void mu_input_text(mu_Context *ctx, const char *text) { 416 | int len = strlen(ctx->input_text); 417 | int size = strlen(text) + 1; 418 | expect(len + size <= (int) sizeof(ctx->input_text)); 419 | memcpy(ctx->input_text + len, text, size); 420 | } 421 | 422 | 423 | /*============================================================================ 424 | ** commandlist 425 | **============================================================================*/ 426 | 427 | mu_Command* mu_push_command(mu_Context *ctx, int type, int size) { 428 | mu_Command *cmd = (mu_Command*) (ctx->command_list.items + ctx->command_list.idx); 429 | expect(ctx->command_list.idx + size < MU_COMMANDLIST_SIZE); 430 | cmd->base.type = type; 431 | cmd->base.size = size; 432 | ctx->command_list.idx += size; 433 | return cmd; 434 | } 435 | 436 | 437 | int mu_next_command(mu_Context *ctx, mu_Command **cmd) { 438 | if (*cmd) { 439 | *cmd = (mu_Command*) (((char*) *cmd) + (*cmd)->base.size); 440 | } else { 441 | *cmd = (mu_Command*) ctx->command_list.items; 442 | } 443 | while ((char*) *cmd != ctx->command_list.items + ctx->command_list.idx) { 444 | if ((*cmd)->type != MU_COMMAND_JUMP) { return 1; } 445 | *cmd = (*cmd)->jump.dst; 446 | } 447 | return 0; 448 | } 449 | 450 | 451 | static mu_Command* push_jump(mu_Context *ctx, mu_Command *dst) { 452 | mu_Command *cmd; 453 | cmd = mu_push_command(ctx, MU_COMMAND_JUMP, sizeof(mu_JumpCommand)); 454 | cmd->jump.dst = dst; 455 | return cmd; 456 | } 457 | 458 | 459 | void mu_set_clip(mu_Context *ctx, mu_Rect rect) { 460 | mu_Command *cmd; 461 | cmd = mu_push_command(ctx, MU_COMMAND_CLIP, sizeof(mu_ClipCommand)); 462 | cmd->clip.rect = rect; 463 | } 464 | 465 | 466 | void mu_draw_rect(mu_Context *ctx, mu_Rect rect, mu_Color color) { 467 | mu_Command *cmd; 468 | rect = intersect_rects(rect, mu_get_clip_rect(ctx)); 469 | if (rect.w > 0 && rect.h > 0) { 470 | cmd = mu_push_command(ctx, MU_COMMAND_RECT, sizeof(mu_RectCommand)); 471 | cmd->rect.rect = rect; 472 | cmd->rect.color = color; 473 | } 474 | } 475 | 476 | 477 | void mu_draw_box(mu_Context *ctx, mu_Rect rect, mu_Color color) { 478 | mu_draw_rect(ctx, mu_rect(rect.x + 1, rect.y, rect.w - 2, 1), color); 479 | mu_draw_rect(ctx, mu_rect(rect.x + 1, rect.y + rect.h - 1, rect.w - 2, 1), color); 480 | mu_draw_rect(ctx, mu_rect(rect.x, rect.y, 1, rect.h), color); 481 | mu_draw_rect(ctx, mu_rect(rect.x + rect.w - 1, rect.y, 1, rect.h), color); 482 | } 483 | 484 | 485 | void mu_draw_text(mu_Context *ctx, mu_Font font, const char *str, int len, 486 | mu_Vec2 pos, mu_Color color) 487 | { 488 | mu_Command *cmd; 489 | mu_Rect rect = mu_rect( 490 | pos.x, pos.y, ctx->text_width(font, str, len), ctx->text_height(font)); 491 | int clipped = mu_check_clip(ctx, rect); 492 | if (clipped == MU_CLIP_ALL ) { return; } 493 | if (clipped == MU_CLIP_PART) { mu_set_clip(ctx, mu_get_clip_rect(ctx)); } 494 | /* add command */ 495 | if (len < 0) { len = strlen(str); } 496 | cmd = mu_push_command(ctx, MU_COMMAND_TEXT, sizeof(mu_TextCommand) + len); 497 | memcpy(cmd->text.str, str, len); 498 | cmd->text.str[len] = '\0'; 499 | cmd->text.pos = pos; 500 | cmd->text.color = color; 501 | cmd->text.font = font; 502 | /* reset clipping if it was set */ 503 | if (clipped) { mu_set_clip(ctx, unclipped_rect); } 504 | } 505 | 506 | 507 | void mu_draw_icon(mu_Context *ctx, int id, mu_Rect rect, mu_Color color) { 508 | mu_Command *cmd; 509 | /* do clip command if the rect isn't fully contained within the cliprect */ 510 | int clipped = mu_check_clip(ctx, rect); 511 | if (clipped == MU_CLIP_ALL ) { return; } 512 | if (clipped == MU_CLIP_PART) { mu_set_clip(ctx, mu_get_clip_rect(ctx)); } 513 | /* do icon command */ 514 | cmd = mu_push_command(ctx, MU_COMMAND_ICON, sizeof(mu_IconCommand)); 515 | cmd->icon.id = id; 516 | cmd->icon.rect = rect; 517 | cmd->icon.color = color; 518 | /* reset clipping if it was set */ 519 | if (clipped) { mu_set_clip(ctx, unclipped_rect); } 520 | } 521 | 522 | 523 | /*============================================================================ 524 | ** layout 525 | **============================================================================*/ 526 | 527 | enum { RELATIVE = 1, ABSOLUTE = 2 }; 528 | 529 | 530 | void mu_layout_begin_column(mu_Context *ctx) { 531 | push_layout(ctx, mu_layout_next(ctx), mu_vec2(0, 0)); 532 | } 533 | 534 | 535 | void mu_layout_end_column(mu_Context *ctx) { 536 | mu_Layout *a, *b; 537 | b = get_layout(ctx); 538 | pop(ctx->layout_stack); 539 | /* inherit position/next_row/max from child layout if they are greater */ 540 | a = get_layout(ctx); 541 | a->position.x = mu_max(a->position.x, b->position.x + b->body.x - a->body.x); 542 | a->next_row = mu_max(a->next_row, b->next_row + b->body.y - a->body.y); 543 | a->max.x = mu_max(a->max.x, b->max.x); 544 | a->max.y = mu_max(a->max.y, b->max.y); 545 | } 546 | 547 | 548 | void mu_layout_row(mu_Context *ctx, int items, const int *widths, int height) { 549 | mu_Layout *layout = get_layout(ctx); 550 | if (widths) { 551 | expect(items <= MU_MAX_WIDTHS); 552 | memcpy(layout->widths, widths, items * sizeof(widths[0])); 553 | } 554 | layout->items = items; 555 | layout->position = mu_vec2(layout->indent, layout->next_row); 556 | layout->size.y = height; 557 | layout->item_index = 0; 558 | } 559 | 560 | 561 | void mu_layout_width(mu_Context *ctx, int width) { 562 | get_layout(ctx)->size.x = width; 563 | } 564 | 565 | 566 | void mu_layout_height(mu_Context *ctx, int height) { 567 | get_layout(ctx)->size.y = height; 568 | } 569 | 570 | 571 | void mu_layout_set_next(mu_Context *ctx, mu_Rect r, int relative) { 572 | mu_Layout *layout = get_layout(ctx); 573 | layout->next = r; 574 | layout->next_type = relative ? RELATIVE : ABSOLUTE; 575 | } 576 | 577 | 578 | mu_Rect mu_layout_next(mu_Context *ctx) { 579 | mu_Layout *layout = get_layout(ctx); 580 | mu_Style *style = ctx->style; 581 | mu_Rect res; 582 | 583 | if (layout->next_type) { 584 | /* handle rect set by `mu_layout_set_next` */ 585 | int type = layout->next_type; 586 | layout->next_type = 0; 587 | res = layout->next; 588 | if (type == ABSOLUTE) { return (ctx->last_rect = res); } 589 | 590 | } else { 591 | /* handle next row */ 592 | if (layout->item_index == layout->items) { 593 | mu_layout_row(ctx, layout->items, NULL, layout->size.y); 594 | } 595 | 596 | /* position */ 597 | res.x = layout->position.x; 598 | res.y = layout->position.y; 599 | 600 | /* size */ 601 | res.w = layout->items > 0 ? layout->widths[layout->item_index] : layout->size.x; 602 | res.h = layout->size.y; 603 | if (res.w == 0) { res.w = style->size.x + style->padding * 2; } 604 | if (res.h == 0) { res.h = style->size.y + style->padding * 2; } 605 | if (res.w < 0) { res.w += layout->body.w - res.x + 1; } 606 | if (res.h < 0) { res.h += layout->body.h - res.y + 1; } 607 | 608 | layout->item_index++; 609 | } 610 | 611 | /* update position */ 612 | layout->position.x += res.w + style->spacing; 613 | layout->next_row = mu_max(layout->next_row, res.y + res.h + style->spacing); 614 | 615 | /* apply body offset */ 616 | res.x += layout->body.x; 617 | res.y += layout->body.y; 618 | 619 | /* update max position */ 620 | layout->max.x = mu_max(layout->max.x, res.x + res.w); 621 | layout->max.y = mu_max(layout->max.y, res.y + res.h); 622 | 623 | return (ctx->last_rect = res); 624 | } 625 | 626 | 627 | /*============================================================================ 628 | ** controls 629 | **============================================================================*/ 630 | 631 | static int in_hover_root(mu_Context *ctx) { 632 | int i = ctx->container_stack.idx; 633 | while (i--) { 634 | if (ctx->container_stack.items[i] == ctx->hover_root) { return 1; } 635 | /* only root containers have their `head` field set; stop searching if we've 636 | ** reached the current root container */ 637 | if (ctx->container_stack.items[i]->head) { break; } 638 | } 639 | return 0; 640 | } 641 | 642 | 643 | void mu_draw_control_frame(mu_Context *ctx, mu_Id id, mu_Rect rect, 644 | int colorid, int opt) 645 | { 646 | if (opt & MU_OPT_NOFRAME) { return; } 647 | colorid += (ctx->focus == id) ? 2 : (ctx->hover == id) ? 1 : 0; 648 | ctx->draw_frame(ctx, rect, colorid); 649 | } 650 | 651 | 652 | void mu_draw_control_text(mu_Context *ctx, const char *str, mu_Rect rect, 653 | int colorid, int opt) 654 | { 655 | mu_Vec2 pos; 656 | mu_Font font = ctx->style->font; 657 | int tw = ctx->text_width(font, str, -1); 658 | mu_push_clip_rect(ctx, rect); 659 | pos.y = rect.y + (rect.h - ctx->text_height(font)) / 2; 660 | if (opt & MU_OPT_ALIGNCENTER) { 661 | pos.x = rect.x + (rect.w - tw) / 2; 662 | } else if (opt & MU_OPT_ALIGNRIGHT) { 663 | pos.x = rect.x + rect.w - tw - ctx->style->padding; 664 | } else { 665 | pos.x = rect.x + ctx->style->padding; 666 | } 667 | mu_draw_text(ctx, font, str, -1, pos, ctx->style->colors[colorid]); 668 | mu_pop_clip_rect(ctx); 669 | } 670 | 671 | 672 | int mu_mouse_over(mu_Context *ctx, mu_Rect rect) { 673 | return rect_overlaps_vec2(rect, ctx->mouse_pos) && 674 | rect_overlaps_vec2(mu_get_clip_rect(ctx), ctx->mouse_pos) && 675 | in_hover_root(ctx); 676 | } 677 | 678 | 679 | void mu_update_control(mu_Context *ctx, mu_Id id, mu_Rect rect, int opt) { 680 | int mouseover = mu_mouse_over(ctx, rect); 681 | 682 | if (ctx->focus == id) { ctx->updated_focus = 1; } 683 | if (opt & MU_OPT_NOINTERACT) { return; } 684 | if (mouseover && !ctx->mouse_down) { ctx->hover = id; } 685 | 686 | if (ctx->focus == id) { 687 | if (ctx->mouse_pressed && !mouseover) { mu_set_focus(ctx, 0); } 688 | if (!ctx->mouse_down && ~opt & MU_OPT_HOLDFOCUS) { mu_set_focus(ctx, 0); } 689 | } 690 | 691 | if (ctx->hover == id) { 692 | if (ctx->mouse_pressed) { 693 | mu_set_focus(ctx, id); 694 | } else if (!mouseover) { 695 | ctx->hover = 0; 696 | } 697 | } 698 | } 699 | 700 | 701 | void mu_text(mu_Context *ctx, const char *text) { 702 | const char *start, *end, *p = text; 703 | int width = -1; 704 | mu_Font font = ctx->style->font; 705 | mu_Color color = ctx->style->colors[MU_COLOR_TEXT]; 706 | mu_layout_begin_column(ctx); 707 | mu_layout_row(ctx, 1, &width, ctx->text_height(font)); 708 | do { 709 | mu_Rect r = mu_layout_next(ctx); 710 | int w = 0; 711 | start = end = p; 712 | do { 713 | const char* word = p; 714 | while (*p && *p != ' ' && *p != '\n') { p++; } 715 | w += ctx->text_width(font, word, p - word); 716 | if (w > r.w && end != start) { break; } 717 | w += ctx->text_width(font, p, 1); 718 | end = p++; 719 | } while (*end && *end != '\n'); 720 | mu_draw_text(ctx, font, start, end - start, mu_vec2(r.x, r.y), color); 721 | p = end + 1; 722 | } while (*end); 723 | mu_layout_end_column(ctx); 724 | } 725 | 726 | 727 | void mu_label(mu_Context *ctx, const char *text) { 728 | mu_draw_control_text(ctx, text, mu_layout_next(ctx), MU_COLOR_TEXT, 0); 729 | } 730 | 731 | 732 | int mu_button_ex(mu_Context *ctx, const char *label, int icon, int opt) { 733 | int res = 0; 734 | mu_Id id = label ? mu_get_id(ctx, label, strlen(label)) 735 | : mu_get_id(ctx, &icon, sizeof(icon)); 736 | mu_Rect r = mu_layout_next(ctx); 737 | mu_update_control(ctx, id, r, opt); 738 | /* handle click */ 739 | if (ctx->mouse_pressed == MU_MOUSE_LEFT && ctx->focus == id) { 740 | res |= MU_RES_SUBMIT; 741 | } 742 | /* draw */ 743 | mu_draw_control_frame(ctx, id, r, MU_COLOR_BUTTON, opt); 744 | if (label) { mu_draw_control_text(ctx, label, r, MU_COLOR_TEXT, opt); } 745 | if (icon) { mu_draw_icon(ctx, icon, r, ctx->style->colors[MU_COLOR_TEXT]); } 746 | return res; 747 | } 748 | 749 | 750 | int mu_checkbox(mu_Context *ctx, const char *label, int *state) { 751 | int res = 0; 752 | mu_Id id = mu_get_id(ctx, &state, sizeof(state)); 753 | mu_Rect r = mu_layout_next(ctx); 754 | mu_Rect box = mu_rect(r.x, r.y, r.h, r.h); 755 | mu_update_control(ctx, id, r, 0); 756 | /* handle click */ 757 | if (ctx->mouse_pressed == MU_MOUSE_LEFT && ctx->focus == id) { 758 | res |= MU_RES_CHANGE; 759 | *state = !*state; 760 | } 761 | /* draw */ 762 | mu_draw_control_frame(ctx, id, box, MU_COLOR_BASE, 0); 763 | if (*state) { 764 | mu_draw_icon(ctx, MU_ICON_CHECK, box, ctx->style->colors[MU_COLOR_TEXT]); 765 | } 766 | r = mu_rect(r.x + box.w, r.y, r.w - box.w, r.h); 767 | mu_draw_control_text(ctx, label, r, MU_COLOR_TEXT, 0); 768 | return res; 769 | } 770 | 771 | 772 | int mu_textbox_raw(mu_Context *ctx, char *buf, int bufsz, mu_Id id, mu_Rect r, 773 | int opt) 774 | { 775 | int res = 0; 776 | mu_update_control(ctx, id, r, opt | MU_OPT_HOLDFOCUS); 777 | 778 | if (ctx->focus == id) { 779 | /* handle text input */ 780 | int len = strlen(buf); 781 | int n = mu_min(bufsz - len - 1, (int) strlen(ctx->input_text)); 782 | if (n > 0) { 783 | memcpy(buf + len, ctx->input_text, n); 784 | len += n; 785 | buf[len] = '\0'; 786 | res |= MU_RES_CHANGE; 787 | } 788 | /* handle backspace */ 789 | if (ctx->key_pressed & MU_KEY_BACKSPACE && len > 0) { 790 | /* skip utf-8 continuation bytes */ 791 | while ((buf[--len] & 0xc0) == 0x80 && len > 0); 792 | buf[len] = '\0'; 793 | res |= MU_RES_CHANGE; 794 | } 795 | /* handle return */ 796 | if (ctx->key_pressed & MU_KEY_RETURN) { 797 | mu_set_focus(ctx, 0); 798 | res |= MU_RES_SUBMIT; 799 | } 800 | } 801 | 802 | /* draw */ 803 | mu_draw_control_frame(ctx, id, r, MU_COLOR_BASE, opt); 804 | if (ctx->focus == id) { 805 | mu_Color color = ctx->style->colors[MU_COLOR_TEXT]; 806 | mu_Font font = ctx->style->font; 807 | int textw = ctx->text_width(font, buf, -1); 808 | int texth = ctx->text_height(font); 809 | int ofx = r.w - ctx->style->padding - textw - 1; 810 | int textx = r.x + mu_min(ofx, ctx->style->padding); 811 | int texty = r.y + (r.h - texth) / 2; 812 | mu_push_clip_rect(ctx, r); 813 | mu_draw_text(ctx, font, buf, -1, mu_vec2(textx, texty), color); 814 | mu_draw_rect(ctx, mu_rect(textx + textw, texty, 1, texth), color); 815 | mu_pop_clip_rect(ctx); 816 | } else { 817 | mu_draw_control_text(ctx, buf, r, MU_COLOR_TEXT, opt); 818 | } 819 | 820 | return res; 821 | } 822 | 823 | 824 | static int number_textbox(mu_Context *ctx, mu_Real *value, mu_Rect r, mu_Id id) { 825 | if (ctx->mouse_pressed == MU_MOUSE_LEFT && ctx->key_down & MU_KEY_SHIFT && 826 | ctx->hover == id 827 | ) { 828 | ctx->number_edit = id; 829 | sprintf(ctx->number_edit_buf, MU_REAL_FMT, *value); 830 | } 831 | if (ctx->number_edit == id) { 832 | int res = mu_textbox_raw( 833 | ctx, ctx->number_edit_buf, sizeof(ctx->number_edit_buf), id, r, 0); 834 | if (res & MU_RES_SUBMIT || ctx->focus != id) { 835 | *value = strtod(ctx->number_edit_buf, NULL); 836 | ctx->number_edit = 0; 837 | } else { 838 | return 1; 839 | } 840 | } 841 | return 0; 842 | } 843 | 844 | 845 | int mu_textbox_ex(mu_Context *ctx, char *buf, int bufsz, int opt) { 846 | mu_Id id = mu_get_id(ctx, &buf, sizeof(buf)); 847 | mu_Rect r = mu_layout_next(ctx); 848 | return mu_textbox_raw(ctx, buf, bufsz, id, r, opt); 849 | } 850 | 851 | 852 | int mu_slider_ex(mu_Context *ctx, mu_Real *value, mu_Real low, mu_Real high, 853 | mu_Real step, const char *fmt, int opt) 854 | { 855 | char buf[MU_MAX_FMT + 1]; 856 | mu_Rect thumb; 857 | int x, w, res = 0; 858 | mu_Real last = *value, v = last; 859 | mu_Id id = mu_get_id(ctx, &value, sizeof(value)); 860 | mu_Rect base = mu_layout_next(ctx); 861 | 862 | /* handle text input mode */ 863 | if (number_textbox(ctx, &v, base, id)) { return res; } 864 | 865 | /* handle normal mode */ 866 | mu_update_control(ctx, id, base, opt); 867 | 868 | /* handle input */ 869 | if (ctx->focus == id && 870 | (ctx->mouse_down | ctx->mouse_pressed) == MU_MOUSE_LEFT) 871 | { 872 | v = low + (ctx->mouse_pos.x - base.x) * (high - low) / base.w; 873 | if (step) { v = ((long long)((v + step / 2) / step)) * step; } 874 | } 875 | /* clamp and store value, update res */ 876 | *value = v = mu_clamp(v, low, high); 877 | if (last != v) { res |= MU_RES_CHANGE; } 878 | 879 | /* draw base */ 880 | mu_draw_control_frame(ctx, id, base, MU_COLOR_BASE, opt); 881 | /* draw thumb */ 882 | w = ctx->style->thumb_size; 883 | x = (v - low) * (base.w - w) / (high - low); 884 | thumb = mu_rect(base.x + x, base.y, w, base.h); 885 | mu_draw_control_frame(ctx, id, thumb, MU_COLOR_BUTTON, opt); 886 | /* draw text */ 887 | sprintf(buf, fmt, v); 888 | mu_draw_control_text(ctx, buf, base, MU_COLOR_TEXT, opt); 889 | 890 | return res; 891 | } 892 | 893 | 894 | int mu_number_ex(mu_Context *ctx, mu_Real *value, mu_Real step, 895 | const char *fmt, int opt) 896 | { 897 | char buf[MU_MAX_FMT + 1]; 898 | int res = 0; 899 | mu_Id id = mu_get_id(ctx, &value, sizeof(value)); 900 | mu_Rect base = mu_layout_next(ctx); 901 | mu_Real last = *value; 902 | 903 | /* handle text input mode */ 904 | if (number_textbox(ctx, value, base, id)) { return res; } 905 | 906 | /* handle normal mode */ 907 | mu_update_control(ctx, id, base, opt); 908 | 909 | /* handle input */ 910 | if (ctx->focus == id && ctx->mouse_down == MU_MOUSE_LEFT) { 911 | *value += ctx->mouse_delta.x * step; 912 | } 913 | /* set flag if value changed */ 914 | if (*value != last) { res |= MU_RES_CHANGE; } 915 | 916 | /* draw base */ 917 | mu_draw_control_frame(ctx, id, base, MU_COLOR_BASE, opt); 918 | /* draw text */ 919 | sprintf(buf, fmt, *value); 920 | mu_draw_control_text(ctx, buf, base, MU_COLOR_TEXT, opt); 921 | 922 | return res; 923 | } 924 | 925 | 926 | static int header(mu_Context *ctx, const char *label, int istreenode, int opt) { 927 | mu_Rect r; 928 | int active, expanded; 929 | mu_Id id = mu_get_id(ctx, label, strlen(label)); 930 | int idx = mu_pool_get(ctx, ctx->treenode_pool, MU_TREENODEPOOL_SIZE, id); 931 | int width = -1; 932 | mu_layout_row(ctx, 1, &width, 0); 933 | 934 | active = (idx >= 0); 935 | expanded = (opt & MU_OPT_EXPANDED) ? !active : active; 936 | r = mu_layout_next(ctx); 937 | mu_update_control(ctx, id, r, 0); 938 | 939 | /* handle click */ 940 | active ^= (ctx->mouse_pressed == MU_MOUSE_LEFT && ctx->focus == id); 941 | 942 | /* update pool ref */ 943 | if (idx >= 0) { 944 | if (active) { mu_pool_update(ctx, ctx->treenode_pool, idx); } 945 | else { memset(&ctx->treenode_pool[idx], 0, sizeof(mu_PoolItem)); } 946 | } else if (active) { 947 | mu_pool_init(ctx, ctx->treenode_pool, MU_TREENODEPOOL_SIZE, id); 948 | } 949 | 950 | /* draw */ 951 | if (istreenode) { 952 | if (ctx->hover == id) { ctx->draw_frame(ctx, r, MU_COLOR_BUTTONHOVER); } 953 | } else { 954 | mu_draw_control_frame(ctx, id, r, MU_COLOR_BUTTON, 0); 955 | } 956 | mu_draw_icon( 957 | ctx, expanded ? MU_ICON_EXPANDED : MU_ICON_COLLAPSED, 958 | mu_rect(r.x, r.y, r.h, r.h), ctx->style->colors[MU_COLOR_TEXT]); 959 | r.x += r.h - ctx->style->padding; 960 | r.w -= r.h - ctx->style->padding; 961 | mu_draw_control_text(ctx, label, r, MU_COLOR_TEXT, 0); 962 | 963 | return expanded ? MU_RES_ACTIVE : 0; 964 | } 965 | 966 | 967 | int mu_header_ex(mu_Context *ctx, const char *label, int opt) { 968 | return header(ctx, label, 0, opt); 969 | } 970 | 971 | 972 | int mu_begin_treenode_ex(mu_Context *ctx, const char *label, int opt) { 973 | int res = header(ctx, label, 1, opt); 974 | if (res & MU_RES_ACTIVE) { 975 | get_layout(ctx)->indent += ctx->style->indent; 976 | push(ctx->id_stack, ctx->last_id); 977 | } 978 | return res; 979 | } 980 | 981 | 982 | void mu_end_treenode(mu_Context *ctx) { 983 | get_layout(ctx)->indent -= ctx->style->indent; 984 | mu_pop_id(ctx); 985 | } 986 | 987 | 988 | #define scrollbar(ctx, cnt, b, cs, x, y, w, h) \ 989 | do { \ 990 | /* only add scrollbar if content size is larger than body */ \ 991 | int maxscroll = cs.y - b->h; \ 992 | \ 993 | if (maxscroll > 0 && b->h > 0) { \ 994 | mu_Rect base, thumb; \ 995 | mu_Id id = mu_get_id(ctx, "!scrollbar" #y, 11); \ 996 | \ 997 | /* get sizing / positioning */ \ 998 | base = *b; \ 999 | base.x = b->x + b->w; \ 1000 | base.w = ctx->style->scrollbar_size; \ 1001 | \ 1002 | /* handle input */ \ 1003 | mu_update_control(ctx, id, base, 0); \ 1004 | if (ctx->focus == id && ctx->mouse_down == MU_MOUSE_LEFT) { \ 1005 | cnt->scroll.y += ctx->mouse_delta.y * cs.y / base.h; \ 1006 | } \ 1007 | /* clamp scroll to limits */ \ 1008 | cnt->scroll.y = mu_clamp(cnt->scroll.y, 0, maxscroll); \ 1009 | \ 1010 | /* draw base and thumb */ \ 1011 | ctx->draw_frame(ctx, base, MU_COLOR_SCROLLBASE); \ 1012 | thumb = base; \ 1013 | thumb.h = mu_max(ctx->style->thumb_size, base.h * b->h / cs.y); \ 1014 | thumb.y += cnt->scroll.y * (base.h - thumb.h) / maxscroll; \ 1015 | ctx->draw_frame(ctx, thumb, MU_COLOR_SCROLLTHUMB); \ 1016 | \ 1017 | /* set this as the scroll_target (will get scrolled on mousewheel) */ \ 1018 | /* if the mouse is over it */ \ 1019 | if (mu_mouse_over(ctx, *b)) { ctx->scroll_target = cnt; } \ 1020 | } else { \ 1021 | cnt->scroll.y = 0; \ 1022 | } \ 1023 | } while (0) 1024 | 1025 | 1026 | static void scrollbars(mu_Context *ctx, mu_Container *cnt, mu_Rect *body) { 1027 | int sz = ctx->style->scrollbar_size; 1028 | mu_Vec2 cs = cnt->content_size; 1029 | cs.x += ctx->style->padding * 2; 1030 | cs.y += ctx->style->padding * 2; 1031 | mu_push_clip_rect(ctx, *body); 1032 | /* resize body to make room for scrollbars */ 1033 | if (cs.y > cnt->body.h) { body->w -= sz; } 1034 | if (cs.x > cnt->body.w) { body->h -= sz; } 1035 | /* to create a horizontal or vertical scrollbar almost-identical code is 1036 | ** used; only the references to `x|y` `w|h` need to be switched */ 1037 | scrollbar(ctx, cnt, body, cs, x, y, w, h); 1038 | scrollbar(ctx, cnt, body, cs, y, x, h, w); 1039 | mu_pop_clip_rect(ctx); 1040 | } 1041 | 1042 | 1043 | static void push_container_body( 1044 | mu_Context *ctx, mu_Container *cnt, mu_Rect body, int opt 1045 | ) { 1046 | if (~opt & MU_OPT_NOSCROLL) { scrollbars(ctx, cnt, &body); } 1047 | push_layout(ctx, expand_rect(body, -ctx->style->padding), cnt->scroll); 1048 | cnt->body = body; 1049 | } 1050 | 1051 | 1052 | static void begin_root_container(mu_Context *ctx, mu_Container *cnt) { 1053 | push(ctx->container_stack, cnt); 1054 | /* push container to roots list and push head command */ 1055 | push(ctx->root_list, cnt); 1056 | cnt->head = push_jump(ctx, NULL); 1057 | /* set as hover root if the mouse is overlapping this container and it has a 1058 | ** higher zindex than the current hover root */ 1059 | if (rect_overlaps_vec2(cnt->rect, ctx->mouse_pos) && 1060 | (!ctx->next_hover_root || cnt->zindex > ctx->next_hover_root->zindex) 1061 | ) { 1062 | ctx->next_hover_root = cnt; 1063 | } 1064 | /* clipping is reset here in case a root-container is made within 1065 | ** another root-containers's begin/end block; this prevents the inner 1066 | ** root-container being clipped to the outer */ 1067 | push(ctx->clip_stack, unclipped_rect); 1068 | } 1069 | 1070 | 1071 | static void end_root_container(mu_Context *ctx) { 1072 | /* push tail 'goto' jump command and set head 'skip' command. the final steps 1073 | ** on initing these are done in mu_end() */ 1074 | mu_Container *cnt = mu_get_current_container(ctx); 1075 | cnt->tail = push_jump(ctx, NULL); 1076 | cnt->head->jump.dst = ctx->command_list.items + ctx->command_list.idx; 1077 | /* pop base clip rect and container */ 1078 | mu_pop_clip_rect(ctx); 1079 | pop_container(ctx); 1080 | } 1081 | 1082 | 1083 | int mu_begin_window_ex(mu_Context *ctx, const char *title, mu_Rect rect, int opt) { 1084 | mu_Rect body; 1085 | mu_Id id = mu_get_id(ctx, title, strlen(title)); 1086 | mu_Container *cnt = get_container(ctx, id, opt); 1087 | if (!cnt || !cnt->open) { return 0; } 1088 | push(ctx->id_stack, id); 1089 | 1090 | if (cnt->rect.w == 0) { cnt->rect = rect; } 1091 | begin_root_container(ctx, cnt); 1092 | rect = body = cnt->rect; 1093 | 1094 | /* draw frame */ 1095 | if (~opt & MU_OPT_NOFRAME) { 1096 | ctx->draw_frame(ctx, rect, MU_COLOR_WINDOWBG); 1097 | } 1098 | 1099 | /* do title bar */ 1100 | if (~opt & MU_OPT_NOTITLE) { 1101 | mu_Rect tr = rect; 1102 | tr.h = ctx->style->title_height; 1103 | ctx->draw_frame(ctx, tr, MU_COLOR_TITLEBG); 1104 | 1105 | /* do title text */ 1106 | if (~opt & MU_OPT_NOTITLE) { 1107 | mu_Id id = mu_get_id(ctx, "!title", 6); 1108 | mu_update_control(ctx, id, tr, opt); 1109 | mu_draw_control_text(ctx, title, tr, MU_COLOR_TITLETEXT, opt); 1110 | if (id == ctx->focus && ctx->mouse_down == MU_MOUSE_LEFT) { 1111 | cnt->rect.x += ctx->mouse_delta.x; 1112 | cnt->rect.y += ctx->mouse_delta.y; 1113 | } 1114 | body.y += tr.h; 1115 | body.h -= tr.h; 1116 | } 1117 | 1118 | /* do `close` button */ 1119 | if (~opt & MU_OPT_NOCLOSE) { 1120 | mu_Id id = mu_get_id(ctx, "!close", 6); 1121 | mu_Rect r = mu_rect(tr.x + tr.w - tr.h, tr.y, tr.h, tr.h); 1122 | tr.w -= r.w; 1123 | mu_draw_icon(ctx, MU_ICON_CLOSE, r, ctx->style->colors[MU_COLOR_TITLETEXT]); 1124 | mu_update_control(ctx, id, r, opt); 1125 | if (ctx->mouse_pressed == MU_MOUSE_LEFT && id == ctx->focus) { 1126 | cnt->open = 0; 1127 | } 1128 | } 1129 | } 1130 | 1131 | push_container_body(ctx, cnt, body, opt); 1132 | 1133 | /* do `resize` handle */ 1134 | if (~opt & MU_OPT_NORESIZE) { 1135 | int sz = ctx->style->title_height; 1136 | mu_Id id = mu_get_id(ctx, "!resize", 7); 1137 | mu_Rect r = mu_rect(rect.x + rect.w - sz, rect.y + rect.h - sz, sz, sz); 1138 | mu_update_control(ctx, id, r, opt); 1139 | if (id == ctx->focus && ctx->mouse_down == MU_MOUSE_LEFT) { 1140 | cnt->rect.w = mu_max(96, cnt->rect.w + ctx->mouse_delta.x); 1141 | cnt->rect.h = mu_max(64, cnt->rect.h + ctx->mouse_delta.y); 1142 | } 1143 | } 1144 | 1145 | /* resize to content size */ 1146 | if (opt & MU_OPT_AUTOSIZE) { 1147 | mu_Rect r = get_layout(ctx)->body; 1148 | cnt->rect.w = cnt->content_size.x + (cnt->rect.w - r.w); 1149 | cnt->rect.h = cnt->content_size.y + (cnt->rect.h - r.h); 1150 | } 1151 | 1152 | /* close if this is a popup window and elsewhere was clicked */ 1153 | if (opt & MU_OPT_POPUP && ctx->mouse_pressed && ctx->hover_root != cnt) { 1154 | cnt->open = 0; 1155 | } 1156 | 1157 | mu_push_clip_rect(ctx, cnt->body); 1158 | return MU_RES_ACTIVE; 1159 | } 1160 | 1161 | 1162 | void mu_end_window(mu_Context *ctx) { 1163 | mu_pop_clip_rect(ctx); 1164 | end_root_container(ctx); 1165 | } 1166 | 1167 | 1168 | void mu_open_popup(mu_Context *ctx, const char *name) { 1169 | mu_Container *cnt = mu_get_container(ctx, name); 1170 | /* set as hover root so popup isn't closed in begin_window_ex() */ 1171 | ctx->hover_root = ctx->next_hover_root = cnt; 1172 | /* position at mouse cursor, open and bring-to-front */ 1173 | cnt->rect = mu_rect(ctx->mouse_pos.x, ctx->mouse_pos.y, 1, 1); 1174 | cnt->open = 1; 1175 | mu_bring_to_front(ctx, cnt); 1176 | } 1177 | 1178 | 1179 | int mu_begin_popup(mu_Context *ctx, const char *name) { 1180 | int opt = MU_OPT_POPUP | MU_OPT_AUTOSIZE | MU_OPT_NORESIZE | 1181 | MU_OPT_NOSCROLL | MU_OPT_NOTITLE | MU_OPT_CLOSED; 1182 | return mu_begin_window_ex(ctx, name, mu_rect(0, 0, 0, 0), opt); 1183 | } 1184 | 1185 | 1186 | void mu_end_popup(mu_Context *ctx) { 1187 | mu_end_window(ctx); 1188 | } 1189 | 1190 | 1191 | void mu_begin_panel_ex(mu_Context *ctx, const char *name, int opt) { 1192 | mu_Container *cnt; 1193 | mu_push_id(ctx, name, strlen(name)); 1194 | cnt = get_container(ctx, ctx->last_id, opt); 1195 | cnt->rect = mu_layout_next(ctx); 1196 | if (~opt & MU_OPT_NOFRAME) { 1197 | ctx->draw_frame(ctx, cnt->rect, MU_COLOR_PANELBG); 1198 | } 1199 | push(ctx->container_stack, cnt); 1200 | push_container_body(ctx, cnt, cnt->rect, opt); 1201 | mu_push_clip_rect(ctx, cnt->body); 1202 | } 1203 | 1204 | 1205 | void mu_end_panel(mu_Context *ctx) { 1206 | mu_pop_clip_rect(ctx); 1207 | pop_container(ctx); 1208 | } 1209 | -------------------------------------------------------------------------------- /atlas.inl: -------------------------------------------------------------------------------- 1 | 2 | enum { ATLAS_WHITE = MU_ICON_MAX, ATLAS_FONT }; 3 | enum { ATLAS_WIDTH = 128, ATLAS_HEIGHT = 128 }; 4 | 5 | 6 | static unsigned char atlas_texture[ATLAS_WIDTH * ATLAS_HEIGHT] = { 7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 18 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 22 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 25 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 26 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 27 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 28 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 29 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 30 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 31 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 32 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 33 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 34 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 35 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 36 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 37 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 38 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 39 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 40 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 41 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 42 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 43 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 44 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 46 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 50 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x20, 51 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x32, 0x0b, 0x00, 0x00, 0x00, 52 | 0x00, 0x31, 0x35, 0x01, 0x00, 0x00, 0x00, 0x15, 0x35, 0x1d, 0x30, 0x19, 53 | 0x00, 0x00, 0x0f, 0x35, 0x06, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 54 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x2d, 0x00, 0x00, 0x00, 55 | 0x14, 0x26, 0x00, 0x00, 0x31, 0x2a, 0x00, 0x00, 0x00, 0x10, 0x31, 0x00, 56 | 0x00, 0x00, 0x00, 0x06, 0x3e, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 57 | 0x06, 0x3e, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 58 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x00, 59 | 0x31, 0x35, 0x2f, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x41, 60 | 0x37, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 61 | 0x00, 0x00, 0x00, 0x00, 0x21, 0xe0, 0xea, 0x2c, 0x00, 0x00, 0x00, 0x00, 62 | 0x36, 0xc4, 0xdb, 0xb2, 0xd9, 0xc1, 0x1a, 0x00, 0x00, 0xea, 0xff, 0x39, 63 | 0x00, 0x00, 0x00, 0x9e, 0xff, 0x88, 0xbe, 0x9c, 0x00, 0x00, 0x72, 0xff, 64 | 0x48, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 65 | 0x00, 0x00, 0x1c, 0xe4, 0xce, 0x8d, 0x00, 0x00, 0xb5, 0x60, 0x00, 0x00, 66 | 0xea, 0xfa, 0x2c, 0x00, 0x00, 0x4e, 0xeb, 0x00, 0x00, 0x1c, 0x8f, 0xea, 67 | 0xea, 0xee, 0x92, 0x1f, 0x00, 0x00, 0x1c, 0x8f, 0xea, 0xea, 0xee, 0x92, 68 | 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 69 | 0x42, 0xf3, 0xcd, 0xf5, 0x3a, 0x00, 0x00, 0x00, 0xea, 0xf2, 0xef, 0xe5, 70 | 0x8f, 0x2f, 0x00, 0x00, 0x0f, 0xa0, 0xfe, 0xf2, 0xf1, 0xfa, 0x33, 0x00, 71 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 72 | 0xe0, 0xea, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x35, 0xdc, 0x33, 0x00, 0x06, 73 | 0x00, 0x5a, 0xd7, 0x13, 0x00, 0xea, 0xd8, 0x92, 0x00, 0x00, 0x09, 0xf0, 74 | 0xd9, 0x88, 0x7b, 0xda, 0x00, 0x00, 0xb9, 0xe9, 0x91, 0x00, 0x05, 0xf4, 75 | 0x03, 0x35, 0x02, 0x32, 0x1f, 0x00, 0x04, 0x37, 0x24, 0x00, 0x5b, 0xa9, 76 | 0x1b, 0xe7, 0x01, 0x44, 0xd0, 0x02, 0x00, 0x00, 0xea, 0xe4, 0xc3, 0x01, 77 | 0x00, 0x4e, 0xeb, 0x00, 0x00, 0x8f, 0xd8, 0x42, 0x01, 0x3a, 0xd0, 0x9b, 78 | 0x00, 0x00, 0x8f, 0xd8, 0x42, 0x01, 0x3a, 0xd0, 0x9b, 0x00, 0x2e, 0x1a, 79 | 0x00, 0x03, 0x36, 0x19, 0x00, 0x04, 0x36, 0x00, 0xa3, 0xa0, 0x00, 0xb5, 80 | 0x8d, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x01, 0x3d, 0xac, 0xe5, 0x03, 0x00, 81 | 0xa1, 0xeb, 0x63, 0x0c, 0x03, 0x2e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 82 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xe1, 0xeb, 0x2d, 0x00, 0x00, 83 | 0x00, 0x00, 0x00, 0xd6, 0x38, 0x37, 0xb4, 0xd6, 0xe9, 0x35, 0x9e, 0x5c, 84 | 0x00, 0xea, 0x87, 0xe8, 0x03, 0x00, 0x56, 0xcc, 0xba, 0x88, 0x38, 0xff, 85 | 0x1a, 0x09, 0xf7, 0x84, 0xd9, 0x00, 0x39, 0xfe, 0x0e, 0xff, 0xb7, 0xe1, 86 | 0xf3, 0x94, 0xbc, 0xde, 0xfb, 0x97, 0x73, 0x9b, 0x0b, 0xfb, 0x0b, 0xcf, 87 | 0x44, 0x01, 0x00, 0x00, 0xea, 0x65, 0xf7, 0x63, 0x00, 0x4e, 0xeb, 0x00, 88 | 0x01, 0xe0, 0x79, 0x00, 0x00, 0x00, 0x6b, 0xea, 0x03, 0x01, 0xe0, 0x79, 89 | 0x00, 0x00, 0x00, 0x6b, 0xea, 0x03, 0xb0, 0xa4, 0x00, 0x39, 0xfe, 0xa0, 90 | 0x00, 0x3d, 0xfd, 0x00, 0x6e, 0xe0, 0x5b, 0xef, 0x41, 0x00, 0x00, 0x00, 91 | 0xea, 0x6d, 0x00, 0x00, 0x17, 0xfd, 0x47, 0x18, 0xff, 0x8f, 0x00, 0x00, 92 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 93 | 0x00, 0x21, 0xe1, 0xeb, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xe3, 94 | 0x00, 0xc5, 0x51, 0x00, 0xd4, 0x37, 0x61, 0x99, 0x00, 0xea, 0x4d, 0xe9, 95 | 0x45, 0x00, 0xb2, 0x70, 0xbf, 0x88, 0x04, 0xf0, 0x59, 0x48, 0xe9, 0x18, 96 | 0xfd, 0x23, 0x77, 0xd4, 0x0e, 0xff, 0x9f, 0x02, 0x54, 0xff, 0x86, 0x00, 97 | 0x69, 0xf0, 0x39, 0xd1, 0x61, 0xca, 0x60, 0xb6, 0x6f, 0xe3, 0x98, 0x00, 98 | 0xea, 0x4a, 0x7f, 0xec, 0x15, 0x4e, 0xeb, 0x00, 0x32, 0xff, 0x36, 0x00, 99 | 0x00, 0x00, 0x29, 0xff, 0x3e, 0x32, 0xff, 0x36, 0x00, 0x00, 0x00, 0x29, 100 | 0xff, 0x3f, 0x68, 0xe6, 0x00, 0x83, 0xaf, 0xe7, 0x01, 0x80, 0xc9, 0x00, 101 | 0x18, 0xf4, 0xff, 0x53, 0x00, 0x15, 0x3b, 0x00, 0xea, 0x6d, 0x00, 0x00, 102 | 0x00, 0xc5, 0xa2, 0x41, 0xff, 0x39, 0x00, 0x40, 0x73, 0x73, 0x35, 0x00, 103 | 0x00, 0x00, 0x3d, 0xed, 0x45, 0x00, 0x00, 0x00, 0x22, 0xe1, 0xeb, 0x2d, 104 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xb3, 0x12, 0xf9, 0x04, 0x03, 105 | 0xef, 0x2c, 0x6a, 0x94, 0x00, 0xea, 0x4d, 0x95, 0x9e, 0x14, 0xf6, 0x18, 106 | 0xc1, 0x88, 0x00, 0xb2, 0x96, 0x8e, 0xa4, 0x00, 0xcb, 0x6a, 0xb5, 0x92, 107 | 0x0e, 0xff, 0x59, 0x00, 0x27, 0xff, 0x3d, 0x00, 0x3a, 0xff, 0x04, 0x71, 108 | 0xae, 0x40, 0xe0, 0x2e, 0xee, 0x1e, 0xd5, 0x00, 0xea, 0x4d, 0x08, 0xd9, 109 | 0xa0, 0x4b, 0xeb, 0x00, 0x20, 0xfe, 0x45, 0x00, 0x00, 0x00, 0x37, 0xff, 110 | 0x2c, 0x20, 0xfe, 0x45, 0x00, 0x00, 0x00, 0x37, 0xff, 0x3b, 0x21, 0xff, 111 | 0x29, 0xcc, 0x4a, 0xe9, 0x30, 0xc3, 0x81, 0x14, 0xdf, 0xab, 0xbd, 0xcd, 112 | 0x14, 0x9c, 0xb5, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0xdc, 0xa6, 0x20, 113 | 0xfe, 0x42, 0x00, 0x63, 0xb2, 0xf4, 0x76, 0x00, 0x00, 0x00, 0x13, 0xd0, 114 | 0xf6, 0x45, 0x00, 0x22, 0xe1, 0xeb, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 115 | 0x00, 0x00, 0x3f, 0xe7, 0x03, 0xd7, 0x5e, 0x75, 0xf7, 0x8d, 0xc7, 0x4a, 116 | 0x00, 0xea, 0x4d, 0x3c, 0xf0, 0x71, 0xb7, 0x00, 0xc1, 0x88, 0x00, 0x70, 117 | 0xc9, 0xcb, 0x5d, 0x00, 0x83, 0xa2, 0xe9, 0x4f, 0x0e, 0xff, 0x43, 0x00, 118 | 0x26, 0xff, 0x2d, 0x00, 0x39, 0xff, 0x00, 0x00, 0x00, 0x7c, 0x9a, 0x1f, 119 | 0xf1, 0x00, 0xaf, 0x00, 0xea, 0x4d, 0x00, 0x44, 0xfe, 0x83, 0xeb, 0x00, 120 | 0x00, 0xcd, 0x89, 0x00, 0x00, 0x00, 0x7b, 0xd9, 0x00, 0x00, 0xcd, 0x89, 121 | 0x00, 0x00, 0x00, 0x7b, 0xf8, 0x08, 0x00, 0xd8, 0x75, 0xf8, 0x0d, 0xa7, 122 | 0x79, 0xf7, 0x39, 0x5b, 0xfc, 0x0a, 0x09, 0xba, 0xd4, 0xf6, 0x39, 0x00, 123 | 0xea, 0x6d, 0x00, 0x00, 0x31, 0xff, 0x75, 0x00, 0xcc, 0x8f, 0x00, 0x00, 124 | 0x00, 0xdb, 0x76, 0x00, 0x00, 0x00, 0x00, 0x13, 0xd0, 0xf6, 0x63, 0xe1, 125 | 0xeb, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xf3, 126 | 0x44, 0x2c, 0x96, 0x87, 0x29, 0xa3, 0x64, 0x00, 0x00, 0xea, 0x4d, 0x01, 127 | 0xe1, 0xf3, 0x5b, 0x00, 0xc1, 0x88, 0x00, 0x2e, 0xf7, 0xf5, 0x17, 0x00, 128 | 0x3a, 0xec, 0xfc, 0x10, 0x0e, 0xff, 0x43, 0x00, 0x26, 0xff, 0x2d, 0x00, 129 | 0x39, 0xff, 0x00, 0x00, 0x17, 0xe6, 0x19, 0x02, 0xee, 0x13, 0xd0, 0x00, 130 | 0xea, 0x4d, 0x00, 0x00, 0xa5, 0xf6, 0xeb, 0x00, 0x00, 0x7d, 0xec, 0x7a, 131 | 0x24, 0x73, 0xe7, 0x87, 0x00, 0x00, 0x7d, 0xec, 0x7a, 0x24, 0x73, 0xe7, 132 | 0x9c, 0x00, 0x00, 0x91, 0xda, 0xbd, 0x00, 0x61, 0xd9, 0xed, 0x03, 0x2b, 133 | 0xfe, 0x67, 0x1d, 0x70, 0xfc, 0xf0, 0x1a, 0x00, 0xea, 0x7f, 0x31, 0x81, 134 | 0xdc, 0xdc, 0x0a, 0x00, 0x79, 0xef, 0x83, 0x23, 0x1c, 0xe1, 0x76, 0x00, 135 | 0x00, 0x00, 0x00, 0x00, 0x13, 0xd0, 0xff, 0xec, 0x2e, 0x00, 0x00, 0x00, 136 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0xdc, 0x78, 0x20, 0x0d, 137 | 0x3c, 0x3b, 0x00, 0x00, 0x00, 0xea, 0x4d, 0x00, 0x8a, 0xf3, 0x0b, 0x00, 138 | 0xc1, 0x88, 0x00, 0x01, 0xea, 0xce, 0x00, 0x00, 0x03, 0xed, 0xc9, 0x00, 139 | 0x0e, 0xff, 0x43, 0x00, 0x26, 0xff, 0x2d, 0x00, 0x39, 0xff, 0x00, 0x00, 140 | 0x98, 0x7e, 0x00, 0x00, 0x78, 0xe7, 0xb0, 0x00, 0xea, 0x4d, 0x00, 0x00, 141 | 0x18, 0xef, 0xeb, 0x00, 0x00, 0x06, 0x54, 0xb6, 0xfb, 0xbb, 0x57, 0x07, 142 | 0x00, 0x00, 0x06, 0x54, 0xb6, 0xfc, 0xff, 0x8d, 0x01, 0x00, 0x00, 0x49, 143 | 0xff, 0x74, 0x00, 0x1b, 0xfe, 0xa8, 0x00, 0x00, 0x7f, 0xde, 0xff, 0xe7, 144 | 0x72, 0xb1, 0xdb, 0x00, 0xea, 0xff, 0xf8, 0xd6, 0x92, 0x13, 0x00, 0x00, 145 | 0x06, 0x52, 0xb4, 0xfb, 0xff, 0xe5, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 146 | 0x00, 0x13, 0xbc, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 147 | 0x00, 0x00, 0x00, 0x00, 0x44, 0xb7, 0xde, 0xdb, 0xad, 0x50, 0x00, 0x00, 148 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 149 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 150 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 151 | 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 152 | 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 153 | 0x00, 0x1b, 0xda, 0xbb, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 154 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 155 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 156 | 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 157 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 158 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 159 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 160 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 161 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 162 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 163 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0xe6, 164 | 0xa0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 165 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 166 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 167 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 168 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 169 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 170 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 171 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 172 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 173 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 174 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 175 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 176 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 177 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 178 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 179 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 181 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 182 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 183 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 184 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 185 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 186 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 188 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 189 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 191 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 192 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 193 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 194 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 195 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 196 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 197 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 198 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 199 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 200 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 201 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 202 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 203 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 204 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 205 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 206 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 207 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 208 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 209 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 210 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 211 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 212 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 213 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 214 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 215 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 216 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 217 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 219 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 220 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 221 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 222 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 223 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 224 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 225 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 226 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 227 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 228 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 229 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 230 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 231 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 232 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x17, 0x00, 0x00, 0x00, 233 | 0x2a, 0x1e, 0x00, 0x35, 0x13, 0x00, 0x00, 0x00, 0x2c, 0x1c, 0x00, 0x00, 234 | 0x0c, 0x27, 0x00, 0x29, 0x09, 0x00, 0x00, 0x00, 0x3c, 0x24, 0x00, 0x00, 235 | 0x00, 0x31, 0x35, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 236 | 0x1f, 0x00, 0x00, 0x31, 0x17, 0x00, 0x00, 0x13, 0x35, 0x00, 0x31, 0x35, 237 | 0x2b, 0x02, 0x00, 0x00, 0x00, 0x31, 0x35, 0x2a, 0x02, 0x00, 0x00, 0x33, 238 | 0x16, 0x00, 0x00, 0x00, 0x0f, 0x35, 0x27, 0x28, 0x00, 0x00, 0x00, 0x1f, 239 | 0x2e, 0x0b, 0xbc, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 240 | 0x13, 0xbc, 0x2a, 0x0b, 0xbc, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 241 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 242 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 243 | 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0xc9, 0x8e, 0x00, 0xfc, 244 | 0x5b, 0x00, 0x00, 0x00, 0xd2, 0x84, 0x00, 0x00, 0x59, 0xa9, 0x00, 0xea, 245 | 0x0f, 0x00, 0x00, 0x34, 0xfe, 0xce, 0x00, 0x00, 0x00, 0xea, 0xf2, 0xed, 246 | 0xfa, 0xce, 0x1a, 0x00, 0x09, 0xb5, 0xfd, 0xe7, 0xf5, 0xaf, 0x00, 0xea, 247 | 0x6d, 0x00, 0x0c, 0xcf, 0xa7, 0x00, 0xea, 0xf2, 0xf3, 0xea, 0x94, 0x00, 248 | 0x00, 0xea, 0xf4, 0xf6, 0xec, 0x9d, 0x00, 0xc0, 0x9e, 0x00, 0x00, 0x00, 249 | 0x7a, 0xe5, 0x58, 0xf8, 0x26, 0x00, 0x0d, 0xe4, 0x7a, 0x0e, 0xff, 0x43, 250 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0x39, 0x0e, 251 | 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 252 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 253 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 254 | 0x6d, 0x00, 0x00, 0x00, 0xc9, 0x8e, 0x00, 0xfc, 0x5b, 0x00, 0x00, 0x00, 255 | 0xd2, 0x84, 0x00, 0x00, 0x89, 0x79, 0x1c, 0xdd, 0x00, 0x00, 0x00, 0x93, 256 | 0xad, 0xf9, 0x2e, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x19, 0xe3, 0x8c, 0x00, 257 | 0xab, 0xe1, 0x4f, 0x02, 0x07, 0x1f, 0x00, 0xea, 0x6d, 0x03, 0xb2, 0xc6, 258 | 0x08, 0x00, 0xea, 0x6d, 0x03, 0x4d, 0xff, 0x33, 0x00, 0xea, 0x6d, 0x03, 259 | 0x49, 0xff, 0x3a, 0x67, 0xee, 0x06, 0x00, 0x00, 0xd0, 0x8e, 0x00, 0xb3, 260 | 0xbb, 0x00, 0x8e, 0xcf, 0x05, 0x0e, 0xff, 0x41, 0x12, 0x25, 0x00, 0x00, 261 | 0x00, 0x00, 0x18, 0x20, 0x18, 0xff, 0x39, 0x0e, 0xff, 0x41, 0x2e, 0x33, 262 | 0x01, 0x00, 0x03, 0x35, 0x01, 0x2e, 0x34, 0x01, 0x00, 0x00, 0x00, 0x00, 263 | 0x00, 0x00, 0x04, 0x39, 0x05, 0x00, 0x00, 0x03, 0x36, 0x02, 0x11, 0x25, 264 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 265 | 0xc9, 0x8e, 0x00, 0xfc, 0x5b, 0x00, 0x00, 0x00, 0xd2, 0x84, 0x41, 0xd3, 266 | 0xf0, 0xe3, 0xdd, 0xf4, 0xd3, 0x00, 0x06, 0xec, 0x52, 0xb4, 0x8d, 0x00, 267 | 0x00, 0xea, 0x6d, 0x00, 0x06, 0xdd, 0x86, 0x0b, 0xfc, 0x81, 0x00, 0x00, 268 | 0x00, 0x00, 0x00, 0xea, 0x6d, 0x8d, 0xdd, 0x15, 0x00, 0x00, 0xea, 0x6d, 269 | 0x00, 0x07, 0xf3, 0x64, 0x00, 0xea, 0x6d, 0x00, 0x0a, 0xf4, 0x69, 0x13, 270 | 0xfa, 0x4a, 0x00, 0x27, 0xff, 0x34, 0x00, 0x1c, 0xf1, 0x86, 0xf7, 0x33, 271 | 0x00, 0x0e, 0xff, 0xaa, 0xd3, 0xf8, 0xab, 0x01, 0x00, 0x87, 0xf6, 0xda, 272 | 0xa5, 0xff, 0x39, 0x0e, 0xff, 0xc0, 0xe5, 0xf2, 0xd5, 0x03, 0x0e, 0xff, 273 | 0xb4, 0xe5, 0xf2, 0xd6, 0x04, 0x00, 0x00, 0x00, 0x00, 0x6d, 0xe7, 0xdd, 274 | 0xe7, 0x6d, 0x00, 0x0e, 0xff, 0x98, 0xd2, 0xf8, 0xab, 0x01, 0x00, 0x00, 275 | 0x00, 0x00, 0x00, 0xea, 0xe9, 0xd9, 0xd9, 0xd9, 0xf7, 0x8e, 0x00, 0xfc, 276 | 0x5b, 0x00, 0x00, 0x00, 0xd2, 0x84, 0x09, 0x1d, 0xec, 0x2e, 0x93, 0x87, 277 | 0x1d, 0x00, 0x52, 0xf1, 0x09, 0x5d, 0xe8, 0x04, 0x00, 0xea, 0xe4, 0xd3, 278 | 0xf6, 0xb1, 0x0d, 0x3c, 0xff, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 279 | 0xc9, 0xff, 0x60, 0x00, 0x00, 0x00, 0xea, 0x8a, 0x49, 0x9e, 0xf1, 0x0d, 280 | 0x00, 0xea, 0xa6, 0x71, 0xbb, 0xe1, 0x1a, 0x00, 0xb4, 0xa0, 0x00, 0x7d, 281 | 0xda, 0x00, 0x00, 0x00, 0x74, 0xff, 0x93, 0x00, 0x00, 0x0e, 0xff, 0x9c, 282 | 0x02, 0x2a, 0xff, 0x32, 0x0e, 0xfa, 0x5a, 0x00, 0x6f, 0xff, 0x39, 0x0e, 283 | 0xff, 0xa6, 0x04, 0x1e, 0xff, 0x42, 0x0e, 0xff, 0xa5, 0x04, 0x1e, 0xff, 284 | 0x42, 0x00, 0x00, 0x00, 0x07, 0xf1, 0x59, 0x00, 0x55, 0xf2, 0x09, 0x0e, 285 | 0xff, 0x99, 0x01, 0x2d, 0xff, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 286 | 0x98, 0x4c, 0x4c, 0x4c, 0xd9, 0x8e, 0x00, 0xfc, 0x5b, 0x00, 0x00, 0x00, 287 | 0xd2, 0x84, 0x37, 0x58, 0xef, 0x4a, 0xc6, 0x83, 0x38, 0x00, 0xb1, 0xd5, 288 | 0x6f, 0x7d, 0xff, 0x4c, 0x00, 0xea, 0x94, 0x47, 0x70, 0xe7, 0x83, 0x22, 289 | 0xff, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0xd2, 0xaf, 0xe2, 0x10, 290 | 0x00, 0x00, 0xea, 0xf5, 0xda, 0x94, 0x3e, 0x00, 0x00, 0xea, 0xd6, 0xc4, 291 | 0xfd, 0x27, 0x00, 0x00, 0x5b, 0xef, 0x06, 0xd3, 0x81, 0x00, 0x00, 0x01, 292 | 0xbc, 0xeb, 0xd2, 0x06, 0x00, 0x0e, 0xff, 0x56, 0x00, 0x00, 0xdd, 0x77, 293 | 0x50, 0xfb, 0x0c, 0x00, 0x23, 0xff, 0x39, 0x0e, 0xff, 0x5c, 0x00, 0x00, 294 | 0xeb, 0x68, 0x0e, 0xff, 0x5c, 0x00, 0x00, 0xeb, 0x68, 0x00, 0x00, 0x00, 295 | 0x4c, 0xfb, 0x0b, 0x00, 0x08, 0xf8, 0x51, 0x0e, 0xff, 0x52, 0x00, 0x00, 296 | 0xde, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 297 | 0xc9, 0x8e, 0x00, 0xd3, 0x85, 0x00, 0x00, 0x09, 0xf4, 0x6b, 0x7b, 0xc7, 298 | 0xdf, 0xa7, 0xfd, 0xa9, 0x7f, 0x16, 0xfa, 0xc4, 0xb8, 0xb8, 0xe2, 0xab, 299 | 0x00, 0xea, 0x6d, 0x00, 0x00, 0x8e, 0xdf, 0x00, 0xd2, 0x89, 0x00, 0x00, 300 | 0x00, 0x00, 0x00, 0xea, 0x6d, 0x0f, 0xe0, 0xa1, 0x00, 0x00, 0xea, 0x6d, 301 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x01, 0xc6, 0xa5, 0x00, 0x00, 302 | 0x0c, 0xf5, 0x69, 0xff, 0x28, 0x00, 0x00, 0x60, 0xec, 0x21, 0xe4, 0x80, 303 | 0x00, 0x0e, 0xff, 0x65, 0x00, 0x01, 0xea, 0x67, 0x43, 0xfe, 0x12, 0x00, 304 | 0x25, 0xff, 0x39, 0x0e, 0xff, 0x43, 0x00, 0x00, 0xea, 0x68, 0x0e, 0xff, 305 | 0x43, 0x00, 0x00, 0xea, 0x68, 0x00, 0x00, 0x00, 0x4c, 0xfe, 0x16, 0x00, 306 | 0x11, 0xfd, 0x40, 0x0e, 0xff, 0x65, 0x00, 0x01, 0xeb, 0x67, 0x00, 0x00, 307 | 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0xc9, 0x8e, 0x00, 0x72, 308 | 0xdf, 0x4b, 0x23, 0x8c, 0xfa, 0x28, 0x00, 0x7c, 0x81, 0x1a, 0xe5, 0x00, 309 | 0x00, 0x70, 0xeb, 0x05, 0x00, 0x00, 0x5c, 0xf8, 0x00, 0xea, 0x7f, 0x22, 310 | 0x4a, 0xdd, 0x95, 0x00, 0x84, 0xed, 0x7c, 0x1d, 0x24, 0x32, 0x00, 0xea, 311 | 0x6d, 0x00, 0x40, 0xfd, 0x52, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 312 | 0x00, 0xea, 0x6d, 0x00, 0x31, 0xfc, 0x49, 0x00, 0x00, 0xa8, 0xe3, 0xcd, 313 | 0x00, 0x00, 0x17, 0xed, 0x62, 0x00, 0x54, 0xf9, 0x2d, 0x0e, 0xff, 0xbc, 314 | 0x1d, 0x5f, 0xff, 0x21, 0x07, 0xf5, 0x7e, 0x11, 0x8d, 0xff, 0x39, 0x0e, 315 | 0xff, 0x43, 0x00, 0x00, 0xea, 0x68, 0x0e, 0xff, 0x43, 0x00, 0x00, 0xea, 316 | 0x68, 0x00, 0x00, 0x00, 0x14, 0xf2, 0x88, 0x15, 0x82, 0xe8, 0x03, 0x0e, 317 | 0xff, 0xbc, 0x1e, 0x61, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 318 | 0x6d, 0x00, 0x00, 0x00, 0xc9, 0x8e, 0x00, 0x10, 0x85, 0xdc, 0xfe, 0xd9, 319 | 0x4c, 0x00, 0x00, 0xaa, 0x50, 0x4b, 0xb4, 0x00, 0x00, 0xcf, 0x97, 0x00, 320 | 0x00, 0x00, 0x0c, 0xf4, 0x00, 0xea, 0xff, 0xff, 0xdd, 0x93, 0x1c, 0x00, 321 | 0x08, 0x5c, 0xc0, 0xfe, 0xed, 0x7b, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x8d, 322 | 0xea, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 323 | 0x00, 0x95, 0xe0, 0x00, 0x00, 0x4f, 0xff, 0x74, 0x00, 0x00, 0xa8, 0xc3, 324 | 0x01, 0x00, 0x00, 0xb7, 0xca, 0x0e, 0xfd, 0x6f, 0xd4, 0xe5, 0x72, 0x00, 325 | 0x00, 0x5c, 0xd9, 0xdb, 0x63, 0xef, 0x39, 0x0e, 0xff, 0x43, 0x00, 0x00, 326 | 0xea, 0x68, 0x0e, 0xff, 0x43, 0x00, 0x00, 0xea, 0x68, 0x00, 0x00, 0x00, 327 | 0x00, 0x43, 0xdb, 0xfc, 0xb7, 0x46, 0x00, 0x0e, 0xff, 0x8c, 0xd4, 0xe4, 328 | 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 329 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 330 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 331 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 332 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 333 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 334 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 335 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 336 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 337 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 338 | 0x00, 0x00, 0x00, 0x0e, 0xff, 0x43, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 339 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 342 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 343 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 344 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 345 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 346 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 347 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 348 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 349 | 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 350 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 351 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 352 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 353 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 354 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 355 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 356 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 357 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 358 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 359 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xc2, 0x33, 0x00, 0x00, 360 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 361 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 362 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 363 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 364 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 365 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 366 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 367 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 368 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 369 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 370 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 371 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 372 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 373 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 374 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 375 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 376 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 377 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 378 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 379 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 380 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 381 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 382 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 383 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 384 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 385 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 386 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 387 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 388 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 389 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 390 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 391 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 392 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 393 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 394 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 395 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 396 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 397 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 398 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 399 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 400 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 401 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 402 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 403 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 404 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 405 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 406 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 407 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 408 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 409 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 410 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 411 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 412 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 413 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 414 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x79, 415 | 0x00, 0x00, 0x00, 0x00, 0x58, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 416 | 0x00, 0x00, 0x00, 0x00, 0x0a, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 417 | 0x14, 0x00, 0x00, 0x04, 0x32, 0x3b, 0x03, 0x00, 0x00, 0x00, 0x21, 0x38, 418 | 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0x3b, 0x0f, 0x00, 0x2e, 0x35, 0x35, 419 | 0x35, 0x16, 0x00, 0x00, 0x03, 0x26, 0x49, 0x1f, 0x1e, 0x33, 0x33, 0x33, 420 | 0x33, 0x33, 0x00, 0x00, 0x18, 0x3a, 0x05, 0x00, 0x00, 0x00, 0x14, 0x37, 421 | 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 422 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 423 | 0x00, 0x31, 0x35, 0x35, 0x35, 0x27, 0x00, 0x31, 0x35, 0x35, 0x35, 0x26, 424 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 425 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xa6, 0xea, 0x9e, 0x53, 0x0f, 0x03, 426 | 0x5f, 0xa3, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 427 | 0xe9, 0xea, 0xb4, 0x23, 0x00, 0x07, 0x98, 0xff, 0x61, 0x00, 0x27, 0xd4, 428 | 0xee, 0xe8, 0xe8, 0x2f, 0x32, 0xcf, 0xdd, 0xe5, 0xef, 0x33, 0x00, 0x00, 429 | 0x00, 0x89, 0xff, 0x41, 0x00, 0xea, 0xf9, 0xf6, 0xf6, 0x64, 0x00, 0x25, 430 | 0xcf, 0xfe, 0xd1, 0x6c, 0x90, 0xf6, 0xf6, 0xf6, 0xf9, 0xff, 0x00, 0xa0, 431 | 0xea, 0xca, 0xee, 0x3e, 0x00, 0x9e, 0xf3, 0xe2, 0xe3, 0x1c, 0x00, 0x00, 432 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 433 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0xea, 0xf4, 0xec, 434 | 0xec, 0xac, 0x00, 0xea, 0xf4, 0xec, 0xec, 0xa9, 0x00, 0x00, 0x00, 0x00, 435 | 0x17, 0x3a, 0x05, 0x30, 0x0c, 0x06, 0x36, 0x0c, 0x00, 0x00, 0x34, 0x13, 436 | 0x16, 0xf6, 0x91, 0xc3, 0x79, 0x5b, 0x80, 0xed, 0xc9, 0xd9, 0xdb, 0xcb, 437 | 0x00, 0x00, 0x31, 0xa9, 0x00, 0x00, 0x06, 0xf7, 0x57, 0x0c, 0xbd, 0x88, 438 | 0x05, 0xc6, 0xb6, 0xed, 0x61, 0x00, 0x08, 0x64, 0x05, 0x02, 0xbf, 0x9d, 439 | 0x04, 0x3a, 0x00, 0x01, 0xbe, 0xa2, 0x00, 0x00, 0x3d, 0xd1, 0xfc, 0x41, 440 | 0x02, 0xfc, 0x41, 0x00, 0x00, 0x00, 0x00, 0xc9, 0xa9, 0x1f, 0x00, 0x00, 441 | 0x00, 0x00, 0x00, 0x00, 0x90, 0xbf, 0x23, 0xfe, 0x27, 0x00, 0x9b, 0xaf, 442 | 0x2b, 0xfc, 0x21, 0x00, 0xa9, 0xb1, 0x00, 0x00, 0x00, 0x01, 0x50, 0xce, 443 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x98, 0x1e, 0x00, 0x00, 0x00, 444 | 0x00, 0x00, 0x7c, 0xc1, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0xea, 445 | 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0xf6, 0xdf, 0xbf, 0xf9, 446 | 0x39, 0x1d, 0xff, 0x38, 0x00, 0x00, 0xf6, 0x5c, 0x30, 0xff, 0x55, 0xa7, 447 | 0x00, 0x00, 0x06, 0x21, 0xdd, 0xeb, 0x45, 0x0c, 0x00, 0x00, 0x3a, 0xc8, 448 | 0x00, 0x00, 0x35, 0xfd, 0x09, 0x00, 0x77, 0xc1, 0x00, 0x44, 0x03, 0xee, 449 | 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xa9, 0x00, 0x00, 0x00, 0x09, 450 | 0xdb, 0x79, 0x00, 0x0d, 0xdc, 0x43, 0xff, 0x41, 0x13, 0xff, 0x38, 0x0f, 451 | 0x00, 0x00, 0x36, 0xff, 0x34, 0x26, 0x05, 0x00, 0x00, 0x00, 0x00, 0x12, 452 | 0xf3, 0x4e, 0x0a, 0xf1, 0x6b, 0x16, 0xce, 0x80, 0x6e, 0xda, 0x00, 0x00, 453 | 0x58, 0xe9, 0x00, 0x01, 0x50, 0xce, 0xbc, 0x44, 0x49, 0xab, 0xab, 0xab, 454 | 0xab, 0xa8, 0x0f, 0x78, 0xe1, 0x98, 0x1f, 0x00, 0x00, 0x01, 0xdb, 0x62, 455 | 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6a, 0x00, 0x00, 0x00, 456 | 0x00, 0x00, 0x0e, 0xfa, 0x58, 0x00, 0x6f, 0xff, 0x39, 0x1d, 0xff, 0x38, 457 | 0x00, 0x00, 0xf6, 0x5c, 0x00, 0x90, 0xfc, 0xdd, 0x46, 0x00, 0x00, 0x8b, 458 | 0xbb, 0x75, 0xce, 0x06, 0x41, 0x8d, 0xa7, 0xe7, 0x8d, 0x8d, 0x6b, 0xe3, 459 | 0x00, 0x00, 0x52, 0xf5, 0x00, 0x00, 0x00, 0xf0, 0x61, 0x00, 0x00, 0x00, 460 | 0x00, 0x31, 0xf8, 0x3f, 0x00, 0x33, 0xcb, 0xf8, 0x85, 0x05, 0x00, 0x9c, 461 | 0x8e, 0x08, 0xff, 0x41, 0x1f, 0xfd, 0xfe, 0xfa, 0xb8, 0x2d, 0x5b, 0xf2, 462 | 0xc9, 0xe6, 0xe7, 0x5a, 0x00, 0x00, 0x00, 0x7c, 0xd9, 0x02, 0x00, 0x37, 463 | 0xfb, 0xf8, 0xa4, 0x02, 0x2e, 0xfd, 0x49, 0x26, 0xbd, 0xfe, 0x35, 0xce, 464 | 0xac, 0x34, 0x00, 0x00, 0x24, 0x55, 0x55, 0x55, 0x55, 0x53, 0x00, 0x00, 465 | 0x08, 0x68, 0xd8, 0x98, 0x00, 0x3b, 0xf4, 0x0d, 0x00, 0xea, 0xe8, 0xd6, 466 | 0xd6, 0x6f, 0x00, 0xea, 0xb6, 0x82, 0x82, 0x42, 0x00, 0x00, 0x4f, 0xfb, 467 | 0x0c, 0x00, 0x23, 0xff, 0x39, 0x1d, 0xff, 0x38, 0x00, 0x00, 0xf6, 0x5c, 468 | 0x00, 0x00, 0x3a, 0xe4, 0xf4, 0x89, 0x00, 0x24, 0x30, 0x0c, 0x48, 0x00, 469 | 0x34, 0x72, 0x92, 0xe1, 0x72, 0x72, 0x5e, 0xea, 0x00, 0x00, 0x59, 0xee, 470 | 0x00, 0x00, 0x00, 0xf0, 0x61, 0x00, 0x00, 0x00, 0x22, 0xe6, 0x76, 0x00, 471 | 0x00, 0x15, 0x57, 0x82, 0xe7, 0x79, 0x4d, 0xd5, 0x09, 0x08, 0xff, 0x41, 472 | 0x00, 0x13, 0x03, 0x2c, 0xcd, 0xa5, 0x6f, 0xfc, 0x30, 0x01, 0x81, 0xd3, 473 | 0x00, 0x00, 0x09, 0xe9, 0x6a, 0x00, 0x0f, 0xc5, 0xb2, 0x78, 0xed, 0x63, 474 | 0x00, 0x7f, 0xe4, 0xe4, 0xa5, 0xeb, 0x34, 0xc4, 0xcd, 0x64, 0x0a, 0x00, 475 | 0x2e, 0x6c, 0x6c, 0x6c, 0x6c, 0x6a, 0x00, 0x00, 0x29, 0x92, 0xe4, 0x93, 476 | 0x00, 0x9a, 0xa3, 0x00, 0x00, 0xea, 0x96, 0x48, 0x48, 0x25, 0x00, 0xea, 477 | 0xc8, 0xa1, 0xa1, 0x52, 0x00, 0x00, 0x43, 0xfe, 0x12, 0x00, 0x23, 0xff, 478 | 0x39, 0x1c, 0xff, 0x3d, 0x00, 0x1c, 0xff, 0x5c, 0x06, 0x00, 0x17, 0xa7, 479 | 0x8a, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xc8, 480 | 0x00, 0x00, 0x25, 0xff, 0x0f, 0x00, 0x7f, 0xb8, 0x00, 0x00, 0x00, 0xf0, 481 | 0x61, 0x00, 0x00, 0x20, 0xe0, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 482 | 0x84, 0xe4, 0xc4, 0xf0, 0xe2, 0xe3, 0xff, 0xe9, 0x00, 0x00, 0x00, 0x00, 483 | 0x7b, 0xdd, 0x4b, 0xf3, 0x07, 0x00, 0x47, 0xf8, 0x00, 0x00, 0x68, 0xed, 484 | 0x0b, 0x00, 0x5f, 0xe3, 0x02, 0x00, 0x5d, 0xeb, 0x00, 0x00, 0x01, 0x00, 485 | 0xaa, 0xbd, 0x00, 0x00, 0x35, 0xa5, 0xea, 0x90, 0x3f, 0x92, 0x92, 0x92, 486 | 0x92, 0x90, 0x34, 0xbe, 0xe0, 0x74, 0x10, 0x00, 0x09, 0xf0, 0x44, 0x00, 487 | 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6a, 0x00, 0x00, 0x00, 488 | 0x00, 0x00, 0x07, 0xf5, 0x7b, 0x10, 0x8b, 0xff, 0x39, 0x02, 0xe4, 0x8c, 489 | 0x10, 0x86, 0xff, 0x5c, 0x60, 0xd2, 0xa9, 0xea, 0xfd, 0x77, 0x00, 0x00, 490 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x91, 0x00, 0x00, 0x01, 0xea, 491 | 0x87, 0x2f, 0xd5, 0x81, 0x00, 0x00, 0x00, 0xf0, 0x61, 0x00, 0x1f, 0xdf, 492 | 0x9f, 0x29, 0x29, 0x29, 0x36, 0x28, 0x04, 0x29, 0xcd, 0x9c, 0x2a, 0x35, 493 | 0x35, 0x3b, 0xff, 0x69, 0x28, 0x37, 0x09, 0x32, 0xd3, 0x81, 0x16, 0xef, 494 | 0x7f, 0x18, 0xa7, 0xaf, 0x00, 0x03, 0xdb, 0x87, 0x00, 0x00, 0x3e, 0xf5, 495 | 0x26, 0x05, 0x88, 0xc7, 0x00, 0x06, 0x1b, 0x75, 0xf4, 0x48, 0x00, 0x00, 496 | 0x00, 0x00, 0x1b, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x56, 497 | 0x04, 0x00, 0x00, 0x00, 0x5a, 0xe2, 0x02, 0x00, 0x00, 0xea, 0x81, 0x24, 498 | 0x24, 0x1a, 0x00, 0xea, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 499 | 0xda, 0xda, 0x71, 0xff, 0x39, 0x00, 0x68, 0xe4, 0xfa, 0xa6, 0xd0, 0x5c, 500 | 0x09, 0x38, 0x74, 0xc9, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 501 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xb5, 0xef, 0x82, 0x10, 502 | 0x00, 0x00, 0x00, 0xf0, 0x61, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 503 | 0x5f, 0xdc, 0xfc, 0xe9, 0xa6, 0x22, 0x00, 0x00, 0x00, 0x08, 0xff, 0x41, 504 | 0x3e, 0xd7, 0xfd, 0xe4, 0x95, 0x17, 0x00, 0x47, 0xdc, 0xfb, 0xb2, 0x30, 505 | 0x00, 0x55, 0xfa, 0x1b, 0x00, 0x00, 0x00, 0x90, 0xe3, 0xf2, 0xbf, 0x3c, 506 | 0x00, 0xec, 0xfc, 0xde, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 507 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 508 | 0xb9, 0x85, 0x00, 0x00, 0x00, 0xea, 0xff, 0xff, 0xff, 0xba, 0x00, 0xea, 509 | 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x1a, 0xff, 510 | 0x39, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x70, 511 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 512 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 513 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x01, 514 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x01, 515 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 516 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0f, 0x0d, 0x00, 517 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 518 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 519 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 520 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0x39, 0x00, 0x00, 0x00, 521 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 522 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 523 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 524 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 525 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 526 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 527 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 528 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 529 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 530 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 531 | 0x00, 0x00, 0x14, 0xc2, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 532 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 533 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 534 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 535 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 536 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 537 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 538 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 539 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 540 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 541 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 542 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 543 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 544 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 545 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 546 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 547 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 548 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 549 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 550 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 551 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 552 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 553 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 554 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 555 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 556 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 557 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 558 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 559 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 560 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 561 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 562 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 563 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 564 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 565 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 566 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 567 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 568 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 569 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 570 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 571 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 572 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 573 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 574 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 575 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 576 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 577 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 578 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 579 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 580 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 581 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 582 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 583 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 584 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 585 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 586 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 587 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 588 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 589 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 590 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 591 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 592 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 593 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 594 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x17, 0x00, 595 | 0x00, 0x00, 0x00, 0x00, 0x15, 0x43, 0x14, 0x00, 0x2d, 0x35, 0x35, 0x35, 596 | 0x35, 0x35, 0x32, 0x1b, 0x00, 0x00, 0x00, 0x26, 0x1c, 0x35, 0x35, 0x35, 597 | 0x35, 0x35, 0x00, 0x00, 0x1d, 0x17, 0x00, 0x00, 0x00, 0x00, 0x8c, 0xa9, 598 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 599 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xbc, 0x2f, 0x00, 600 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 601 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x7a, 602 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x35, 0x35, 603 | 0x35, 0x2b, 0x0d, 0x35, 0x04, 0x35, 0x0e, 0x00, 0x12, 0x41, 0x0e, 0x00, 604 | 0x2f, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 605 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0xa1, 606 | 0xf9, 0xe4, 0xfe, 0x7c, 0xc9, 0xf0, 0xf6, 0xfe, 0xf0, 0xf0, 0x9e, 0xd1, 607 | 0x02, 0x00, 0x14, 0xf1, 0x7c, 0xf0, 0xf0, 0xf0, 0xf8, 0xff, 0x00, 0x00, 608 | 0xbd, 0xae, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xb2, 0x74, 0x00, 0x00, 0x00, 609 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 610 | 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 611 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 612 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x00, 0x00, 613 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x60, 0x60, 0x60, 0xaa, 0x33, 0xfc, 614 | 0x02, 0xf9, 0x36, 0x9f, 0xeb, 0xd6, 0xf7, 0x5d, 0xa5, 0x99, 0x00, 0x00, 615 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 616 | 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x2b, 0xfe, 0x2d, 0x00, 0x1a, 0x15, 617 | 0x00, 0x00, 0x6c, 0xea, 0x00, 0x00, 0x1d, 0xf7, 0x58, 0x00, 0x8a, 0xda, 618 | 0x00, 0x00, 0x00, 0x08, 0xd5, 0x9c, 0x00, 0x35, 0xc9, 0xd2, 0x34, 0x00, 619 | 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x03, 0x35, 0x42, 0x09, 0x00, 620 | 0x00, 0x00, 0x07, 0x38, 0x03, 0x00, 0x00, 0x00, 0x28, 0x48, 0x36, 0x36, 621 | 0x0e, 0xff, 0x40, 0x00, 0x0e, 0x36, 0x34, 0x17, 0x00, 0x00, 0x0f, 0x36, 622 | 0x25, 0x2c, 0x00, 0x00, 0x1a, 0x35, 0x33, 0x1a, 0x00, 0x00, 0x10, 0x36, 623 | 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 624 | 0x00, 0x95, 0x00, 0x00, 0x00, 0x95, 0x1f, 0xea, 0x00, 0xe6, 0x22, 0x1c, 625 | 0x04, 0x00, 0x7a, 0xcf, 0x46, 0xef, 0x09, 0x00, 0x00, 0x00, 0x04, 0x3e, 626 | 0x21, 0x00, 0x04, 0x36, 0x34, 0x06, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 627 | 0x00, 0x00, 0x24, 0xff, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xea, 628 | 0x00, 0x00, 0x00, 0x8b, 0xd9, 0x1d, 0xf5, 0x54, 0x00, 0x00, 0x00, 0x8b, 629 | 0xe0, 0x0e, 0x00, 0xac, 0x58, 0x54, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 630 | 0x00, 0x00, 0x00, 0xa7, 0xd5, 0xc6, 0xf3, 0x42, 0x00, 0x6d, 0xe1, 0xc7, 631 | 0xe1, 0x49, 0x02, 0xca, 0xbd, 0xb6, 0xff, 0xb2, 0x0e, 0xff, 0x40, 0x0c, 632 | 0xc7, 0xae, 0xba, 0xa4, 0x00, 0x00, 0x7f, 0xdf, 0x46, 0xfb, 0x38, 0x08, 633 | 0xd8, 0x97, 0xb6, 0xb1, 0x00, 0x00, 0x81, 0xe2, 0x00, 0x00, 0x58, 0xaa, 634 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 635 | 0x00, 0x95, 0x0a, 0xa3, 0x00, 0xa1, 0x0d, 0x00, 0x00, 0x02, 0xa9, 0xb9, 636 | 0x03, 0xe3, 0x58, 0x00, 0x00, 0x70, 0xe7, 0xdd, 0xf7, 0x11, 0xe9, 0xe3, 637 | 0xd8, 0xcf, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x84, 638 | 0xfb, 0xb6, 0x33, 0x00, 0x00, 0x00, 0x6c, 0xea, 0x00, 0x00, 0x00, 0x12, 639 | 0xef, 0xd9, 0xc8, 0x01, 0x00, 0x00, 0x3b, 0xfb, 0x42, 0x00, 0x26, 0xdf, 640 | 0x04, 0x02, 0xd1, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 641 | 0x00, 0x00, 0xa7, 0xa5, 0x07, 0xf1, 0x3f, 0x00, 0x77, 0xba, 0x45, 0xf4, 642 | 0x06, 0x01, 0xe9, 0x66, 0x0e, 0xff, 0x45, 0xbc, 0xbb, 0x07, 0x59, 0xf3, 643 | 0x0a, 0x00, 0xd8, 0x80, 0x00, 0x95, 0xd5, 0x8f, 0xdb, 0x0b, 0x50, 0xf9, 644 | 0x13, 0x00, 0xd8, 0x85, 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x2c, 0xb1, 645 | 0xcf, 0x88, 0x4c, 0x89, 0x00, 0x95, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 646 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x9a, 0xd6, 0x1d, 0x00, 0x86, 0xb7, 0x00, 647 | 0x07, 0xf1, 0x62, 0x00, 0x06, 0x58, 0xf8, 0x20, 0x00, 0x08, 0x00, 0x00, 648 | 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xbe, 0xfe, 0x5a, 649 | 0x00, 0x00, 0x6c, 0xea, 0x00, 0x00, 0x00, 0x00, 0x79, 0xff, 0x40, 0x00, 650 | 0x00, 0x0a, 0xda, 0x92, 0x00, 0x00, 0x9a, 0x75, 0x00, 0x00, 0x53, 0xc0, 651 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x8b, 0xbf, 0xe6, 0xc5, 652 | 0x49, 0xfe, 0xc3, 0xc2, 0xd2, 0xfc, 0x36, 0xfe, 0x39, 0x2b, 0xf8, 0x29, 653 | 0x0e, 0xff, 0xc7, 0xf9, 0x18, 0x00, 0x09, 0xef, 0x57, 0x32, 0xfd, 0x20, 654 | 0x00, 0x0b, 0xe0, 0xff, 0x3d, 0x00, 0x04, 0xe5, 0x69, 0x31, 0xfe, 0x25, 655 | 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x49, 0x3a, 0x47, 0x91, 0xbd, 0x67, 656 | 0x00, 0x95, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 657 | 0x43, 0xe6, 0x15, 0x00, 0x00, 0x28, 0xfb, 0x1a, 0x4a, 0xfb, 0x0d, 0x00, 658 | 0x00, 0x11, 0xc2, 0xf4, 0x90, 0x19, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 659 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xbe, 0x00, 0x00, 0x6c, 0xea, 660 | 0x00, 0x00, 0x00, 0x00, 0x47, 0xff, 0x12, 0x00, 0x00, 0x91, 0xda, 0x0a, 661 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 662 | 0x00, 0x00, 0x27, 0xfc, 0x6a, 0x1e, 0x9a, 0xc5, 0x3b, 0xfd, 0x42, 0x31, 663 | 0x31, 0x31, 0x00, 0x9f, 0xe5, 0xb3, 0x5d, 0x00, 0x0e, 0xff, 0xac, 0xd2, 664 | 0xa4, 0x00, 0x00, 0x97, 0xac, 0x88, 0xbc, 0x00, 0x00, 0x2b, 0xf7, 0xee, 665 | 0x75, 0x00, 0x00, 0x82, 0xbf, 0x86, 0xc3, 0x00, 0x00, 0x00, 0x58, 0xaa, 666 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 667 | 0x00, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x5b, 0x00, 0x00, 668 | 0x00, 0x00, 0xc7, 0x76, 0x40, 0xfe, 0x15, 0x00, 0x00, 0x00, 0x01, 0x4f, 669 | 0xd1, 0xdf, 0x00, 0x00, 0x00, 0xea, 0x83, 0x27, 0x27, 0x23, 0x39, 0x44, 670 | 0x14, 0x2b, 0xd1, 0x7b, 0x00, 0x00, 0x6c, 0xea, 0x00, 0x00, 0x00, 0x00, 671 | 0x47, 0xff, 0x12, 0x00, 0x40, 0xfd, 0x60, 0x27, 0x27, 0x27, 0x00, 0x00, 672 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xf6, 673 | 0x0f, 0x1f, 0xe4, 0xc5, 0x01, 0xe0, 0x89, 0x0e, 0x07, 0x31, 0x08, 0xfa, 674 | 0x4e, 0x24, 0x0a, 0x00, 0x0e, 0xff, 0x40, 0x2b, 0xf5, 0x65, 0x00, 0x36, 675 | 0xef, 0xd1, 0x5b, 0x00, 0x05, 0xcd, 0x9e, 0x4b, 0xf8, 0x2d, 0x00, 0x1e, 676 | 0xf6, 0xda, 0x63, 0x00, 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x00, 0x00, 677 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 678 | 0x00, 0x00, 0x00, 0x00, 0x10, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x68, 0xd4, 679 | 0x04, 0xec, 0x8a, 0x14, 0x3f, 0x27, 0x2c, 0x01, 0x54, 0xee, 0x00, 0x00, 680 | 0x00, 0xea, 0xff, 0xff, 0xff, 0xe6, 0x51, 0xdb, 0xfd, 0xea, 0xa3, 0x11, 681 | 0x00, 0x00, 0x6c, 0xea, 0x00, 0x00, 0x00, 0x00, 0x47, 0xff, 0x12, 0x00, 682 | 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 683 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc8, 0xf7, 0xdf, 0x83, 0xc5, 684 | 0x00, 0x3f, 0xae, 0xf4, 0xfc, 0x9f, 0x0a, 0xd2, 0xfc, 0xfb, 0xf7, 0x90, 685 | 0x0e, 0xff, 0x40, 0x00, 0x65, 0xf6, 0x00, 0x00, 0xd4, 0xf0, 0x09, 0x00, 686 | 0x83, 0xe5, 0x10, 0x00, 0xa2, 0xd0, 0x00, 0x00, 0xb4, 0xf4, 0x0d, 0x00, 687 | 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 688 | 0x00, 0xc6, 0x95, 0x95, 0x95, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 689 | 0x82, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x11, 0xf7, 0x00, 0x4f, 0xbf, 0xfe, 690 | 0xf1, 0x57, 0xe9, 0xf3, 0xde, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 691 | 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 692 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 693 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 694 | 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 695 | 0x0a, 0x00, 0xaa, 0x94, 0x08, 0x02, 0x4e, 0xf8, 0x00, 0x00, 0x00, 0x00, 696 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 697 | 0x00, 0x00, 0x00, 0x06, 0xbf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xaa, 698 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 699 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x00, 0x00, 700 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x0f, 701 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 702 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 703 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 704 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 705 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xae, 706 | 0x37, 0x49, 0xae, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 707 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xc3, 708 | 0xf1, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x00, 0x00, 709 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 710 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 711 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 712 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 713 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 714 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 715 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 716 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x79, 0xb0, 0x96, 0x5c, 0x10, 717 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 718 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x9f, 0x3a, 0x00, 0x00, 0x00, 719 | 0x00, 0x00, 0x3d, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 720 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 721 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 722 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 723 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 724 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 725 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 726 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 727 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 728 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 729 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 730 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 731 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 732 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 733 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 734 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 735 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 736 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 737 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 738 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 739 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 740 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 741 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xff, 0x5a, 0xff, 0x8f, 0x00, 742 | 0x00, 0x00, 0xff, 0x8f, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 743 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 744 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 745 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 746 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 747 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 748 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 749 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 750 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 751 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 752 | 0x00, 0x00, 0x3c, 0xaa, 0x3c, 0x8f, 0xff, 0x8f, 0x00, 0x00, 0x8f, 0xff, 753 | 0x8f, 0x00, 0x8f, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 754 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 755 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 756 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 757 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 758 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 759 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 760 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 761 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 762 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 763 | 0x00, 0x00, 0x8f, 0xff, 0x8f, 0x00, 0x00, 0x8f, 0xff, 0x8f, 0xff, 0x8f, 764 | 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 765 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 766 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 767 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 768 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 769 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 770 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 771 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 772 | 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x14, 0x00, 0x00, 0x00, 773 | 0x00, 0x00, 0x00, 0x6e, 0xaa, 0x00, 0x3c, 0xaa, 0x3c, 0x00, 0x00, 0x8f, 774 | 0xff, 0x8f, 0x00, 0x00, 0x8f, 0xff, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 775 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 776 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x86, 0xbd, 0x00, 777 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x17, 778 | 0x00, 0x00, 0x00, 0x0a, 0x35, 0x13, 0x00, 0x00, 0x30, 0x20, 0x1d, 0x00, 779 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 780 | 0x00, 0x00, 0x00, 0x00, 0x31, 0x17, 0x00, 0x33, 0x15, 0x07, 0x35, 0x35, 781 | 0x26, 0x35, 0x31, 0x03, 0x7f, 0x18, 0x03, 0x7f, 0x18, 0x0b, 0xbc, 0x31, 782 | 0x00, 0x00, 0x0d, 0x35, 0x00, 0x00, 0x00, 0x5e, 0xff, 0x70, 0x00, 0x00, 783 | 0x00, 0x00, 0x70, 0xff, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 784 | 0xff, 0x00, 0x5a, 0xff, 0x5a, 0x00, 0x8f, 0xff, 0x8f, 0x00, 0x00, 0x00, 785 | 0x00, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 786 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 787 | 0x00, 0x00, 0x00, 0x00, 0x81, 0xd8, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 788 | 0x4f, 0x3b, 0x00, 0x00, 0x00, 0xb5, 0xf5, 0xb0, 0xe7, 0x28, 0x00, 0x26, 789 | 0xff, 0x55, 0x00, 0x3e, 0xe7, 0x4c, 0xdc, 0x06, 0x00, 0x00, 0x00, 0x00, 790 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 791 | 0xea, 0x6d, 0x00, 0xf4, 0x64, 0x22, 0xff, 0xcb, 0x8e, 0xd6, 0xeb, 0x0b, 792 | 0xc5, 0x2f, 0x0b, 0xc5, 0x2f, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x33, 0xfc, 793 | 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0x70, 0x00, 0x00, 0x70, 0xff, 0x70, 794 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 795 | 0x00, 0x8f, 0xff, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 796 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 797 | 0x00, 0x00, 0x17, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x07, 798 | 0xcd, 0xa8, 0x36, 0x03, 0x35, 0x00, 0x24, 0x0b, 0xcf, 0x85, 0x36, 0x00, 799 | 0x32, 0xfd, 0x1b, 0x01, 0xbb, 0x85, 0x00, 0x19, 0xff, 0x48, 0x01, 0xca, 800 | 0x70, 0x01, 0xca, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 801 | 0x00, 0x00, 0x2c, 0x09, 0x00, 0x2c, 0x08, 0x00, 0xea, 0x6d, 0x00, 0xf4, 802 | 0x64, 0x22, 0xff, 0x12, 0x00, 0x46, 0xeb, 0x03, 0x36, 0x0e, 0x03, 0x36, 803 | 0x0e, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x1f, 0xea, 0x00, 0x00, 0x00, 0x00, 804 | 0x00, 0x70, 0xff, 0x70, 0x70, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 805 | 0x55, 0x37, 0x00, 0x37, 0x55, 0x00, 0x1e, 0x55, 0x1e, 0xff, 0x8f, 0x00, 806 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 807 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0xcc, 808 | 0xcc, 0xe8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x98, 0xf3, 0xe6, 0xc9, 0x0e, 809 | 0xff, 0x85, 0xfc, 0x93, 0xfb, 0xde, 0xc9, 0x00, 0x41, 0xf6, 0x00, 0x00, 810 | 0x9e, 0x99, 0x00, 0x0c, 0xff, 0x3c, 0x2c, 0xff, 0x0f, 0x00, 0x69, 0xd0, 811 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xf8, 0x54, 812 | 0x20, 0xf8, 0x51, 0x00, 0xea, 0x6d, 0x00, 0xf4, 0x64, 0x22, 0xff, 0x12, 813 | 0x00, 0x46, 0xeb, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43, 814 | 0x00, 0x00, 0x0a, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 815 | 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa5, 0x00, 0xa5, 816 | 0xff, 0x00, 0x5a, 0xff, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 817 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 818 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xe6, 0x6f, 0x00, 819 | 0x00, 0x00, 0x00, 0x00, 0xc7, 0x8b, 0x00, 0x0e, 0xff, 0xc7, 0x1f, 0x00, 820 | 0xee, 0x64, 0x00, 0x00, 0x64, 0xe7, 0x00, 0x00, 0x8f, 0xba, 0x00, 0x01, 821 | 0xfd, 0x2f, 0x54, 0xe5, 0x00, 0x00, 0x41, 0xf6, 0x00, 0x00, 0x00, 0x00, 822 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x45, 0x09, 0x03, 0x46, 0x09, 0x00, 823 | 0xea, 0x6d, 0x00, 0xf4, 0x64, 0x22, 0xff, 0x12, 0x00, 0x46, 0xeb, 0x0e, 824 | 0xff, 0x43, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 825 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0xff, 0x70, 0x00, 0x00, 826 | 0x00, 0x00, 0x00, 0x00, 0x55, 0x37, 0x00, 0x37, 0x55, 0x00, 0x1e, 0x55, 827 | 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 828 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 829 | 0x00, 0x00, 0x00, 0x01, 0xb1, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 830 | 0xc7, 0x8b, 0x00, 0x0e, 0xff, 0x5d, 0x00, 0x00, 0xee, 0x64, 0x00, 0x9b, 831 | 0xe8, 0x53, 0x00, 0x00, 0x23, 0xc4, 0xd7, 0x00, 0xf1, 0x22, 0x7b, 0xbe, 832 | 0x00, 0x00, 0x1a, 0xff, 0x00, 0x00, 0x00, 0x62, 0xa4, 0xa4, 0x00, 0x00, 833 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0xf4, 834 | 0x64, 0x22, 0xff, 0x12, 0x00, 0x46, 0xeb, 0x0e, 0xff, 0x43, 0x0e, 0xff, 835 | 0x43, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 836 | 0x00, 0x70, 0xff, 0x70, 0x70, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 837 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 838 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 839 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 840 | 0xe8, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x8b, 0x00, 0x0e, 841 | 0xff, 0x43, 0x00, 0x00, 0xee, 0x64, 0x00, 0x52, 0xcc, 0xa7, 0x00, 0x00, 842 | 0x4e, 0xea, 0x76, 0x00, 0x75, 0x0c, 0x6f, 0xca, 0x00, 0x00, 0x26, 0xff, 843 | 0x00, 0x00, 0x00, 0x49, 0x7a, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 844 | 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0xf4, 0x64, 0x22, 0xff, 0x12, 845 | 0x00, 0x46, 0xeb, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43, 846 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0x70, 0x00, 847 | 0x00, 0x70, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 848 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 849 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 850 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xf5, 0x4c, 0x03, 0x03, 0x00, 851 | 0x00, 0x00, 0x00, 0x00, 0xc7, 0x8b, 0x00, 0x0e, 0xff, 0x43, 0x00, 0x00, 852 | 0xd0, 0x8f, 0x05, 0x00, 0x4a, 0xf5, 0x00, 0x00, 0x99, 0xa2, 0x00, 0x08, 853 | 0x75, 0x17, 0x47, 0xf2, 0x01, 0x00, 0x4e, 0xeb, 0x09, 0x56, 0x17, 0x00, 854 | 0x00, 0x00, 0x08, 0x75, 0x17, 0x08, 0x75, 0x17, 0x09, 0x56, 0x17, 0x00, 855 | 0xea, 0x6d, 0x00, 0xf4, 0x64, 0x22, 0xff, 0x12, 0x00, 0x46, 0xeb, 0x0e, 856 | 0xff, 0x43, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 857 | 0x00, 0x00, 0x00, 0x5e, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 858 | 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 859 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 860 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 861 | 0x00, 0x00, 0x9a, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 862 | 0xc7, 0x8b, 0x00, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x62, 0xee, 0xfc, 0x00, 863 | 0x41, 0xf7, 0x00, 0x00, 0x9f, 0x99, 0x00, 0x27, 0xfe, 0x4f, 0x1a, 0xfc, 864 | 0x27, 0x00, 0x82, 0xba, 0x3d, 0xf9, 0x14, 0x00, 0x00, 0x00, 0x27, 0xfe, 865 | 0x4f, 0x27, 0xfe, 0x4f, 0x3d, 0xf9, 0x14, 0x00, 0xea, 0x6d, 0x00, 0xf6, 866 | 0x60, 0x22, 0xff, 0x12, 0x00, 0x46, 0xeb, 0x0e, 0xff, 0x43, 0x0e, 0xff, 867 | 0x43, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 868 | 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x14, 0x00, 0x00, 0x00, 869 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 870 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 871 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 872 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 873 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0e, 0x00, 0x13, 0xf7, 0x74, 0x3a, 874 | 0xe1, 0x6d, 0x00, 0x00, 0x12, 0x00, 0x00, 0x97, 0x9e, 0x0d, 0xeb, 0x3d, 875 | 0x71, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 876 | 0x71, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x33, 0xff, 0x25, 0x22, 0xff, 0x3c, 877 | 0x20, 0x67, 0xeb, 0x00, 0x00, 0x00, 0x17, 0xff, 0x42, 0x00, 0x00, 0x00, 878 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 879 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 880 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 881 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 882 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 883 | 0xc1, 0xc1, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 884 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xa8, 0x8b, 0x86, 0x0d, 0x00, 0x00, 885 | 0x00, 0x00, 0x00, 0x16, 0xc8, 0x5c, 0x97, 0x00, 0x49, 0x33, 0x00, 0x00, 886 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x33, 0x00, 0x00, 887 | 0x00, 0x00, 0xf9, 0xad, 0x00, 0x1c, 0xd1, 0xd1, 0x95, 0xd1, 0xc0, 0x00, 888 | 0x00, 0x00, 0xba, 0xf7, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 889 | }; 890 | 891 | 892 | static mu_Rect atlas[] = { 893 | [ MU_ICON_CLOSE ] = { 88, 68, 16, 16 }, 894 | [ MU_ICON_CHECK ] = { 0, 0, 18, 18 }, 895 | [ MU_ICON_EXPANDED ] = { 118, 68, 7, 5 }, 896 | [ MU_ICON_COLLAPSED ] = { 113, 68, 5, 7 }, 897 | [ ATLAS_WHITE ] = { 125, 68, 3, 3 }, 898 | [ ATLAS_FONT+32 ] = { 84, 68, 2, 17 }, 899 | [ ATLAS_FONT+33 ] = { 39, 68, 3, 17 }, 900 | [ ATLAS_FONT+34 ] = { 114, 51, 5, 17 }, 901 | [ ATLAS_FONT+35 ] = { 34, 17, 7, 17 }, 902 | [ ATLAS_FONT+36 ] = { 28, 34, 6, 17 }, 903 | [ ATLAS_FONT+37 ] = { 58, 0, 9, 17 }, 904 | [ ATLAS_FONT+38 ] = { 103, 0, 8, 17 }, 905 | [ ATLAS_FONT+39 ] = { 86, 68, 2, 17 }, 906 | [ ATLAS_FONT+40 ] = { 42, 68, 3, 17 }, 907 | [ ATLAS_FONT+41 ] = { 45, 68, 3, 17 }, 908 | [ ATLAS_FONT+42 ] = { 34, 34, 6, 17 }, 909 | [ ATLAS_FONT+43 ] = { 40, 34, 6, 17 }, 910 | [ ATLAS_FONT+44 ] = { 48, 68, 3, 17 }, 911 | [ ATLAS_FONT+45 ] = { 51, 68, 3, 17 }, 912 | [ ATLAS_FONT+46 ] = { 54, 68, 3, 17 }, 913 | [ ATLAS_FONT+47 ] = { 124, 34, 4, 17 }, 914 | [ ATLAS_FONT+48 ] = { 46, 34, 6, 17 }, 915 | [ ATLAS_FONT+49 ] = { 52, 34, 6, 17 }, 916 | [ ATLAS_FONT+50 ] = { 58, 34, 6, 17 }, 917 | [ ATLAS_FONT+51 ] = { 64, 34, 6, 17 }, 918 | [ ATLAS_FONT+52 ] = { 70, 34, 6, 17 }, 919 | [ ATLAS_FONT+53 ] = { 76, 34, 6, 17 }, 920 | [ ATLAS_FONT+54 ] = { 82, 34, 6, 17 }, 921 | [ ATLAS_FONT+55 ] = { 88, 34, 6, 17 }, 922 | [ ATLAS_FONT+56 ] = { 94, 34, 6, 17 }, 923 | [ ATLAS_FONT+57 ] = { 100, 34, 6, 17 }, 924 | [ ATLAS_FONT+58 ] = { 57, 68, 3, 17 }, 925 | [ ATLAS_FONT+59 ] = { 60, 68, 3, 17 }, 926 | [ ATLAS_FONT+60 ] = { 106, 34, 6, 17 }, 927 | [ ATLAS_FONT+61 ] = { 112, 34, 6, 17 }, 928 | [ ATLAS_FONT+62 ] = { 118, 34, 6, 17 }, 929 | [ ATLAS_FONT+63 ] = { 119, 51, 5, 17 }, 930 | [ ATLAS_FONT+64 ] = { 18, 0, 10, 17 }, 931 | [ ATLAS_FONT+65 ] = { 41, 17, 7, 17 }, 932 | [ ATLAS_FONT+66 ] = { 48, 17, 7, 17 }, 933 | [ ATLAS_FONT+67 ] = { 55, 17, 7, 17 }, 934 | [ ATLAS_FONT+68 ] = { 111, 0, 8, 17 }, 935 | [ ATLAS_FONT+69 ] = { 0, 35, 6, 17 }, 936 | [ ATLAS_FONT+70 ] = { 6, 35, 6, 17 }, 937 | [ ATLAS_FONT+71 ] = { 119, 0, 8, 17 }, 938 | [ ATLAS_FONT+72 ] = { 18, 17, 8, 17 }, 939 | [ ATLAS_FONT+73 ] = { 63, 68, 3, 17 }, 940 | [ ATLAS_FONT+74 ] = { 66, 68, 3, 17 }, 941 | [ ATLAS_FONT+75 ] = { 62, 17, 7, 17 }, 942 | [ ATLAS_FONT+76 ] = { 12, 51, 6, 17 }, 943 | [ ATLAS_FONT+77 ] = { 28, 0, 10, 17 }, 944 | [ ATLAS_FONT+78 ] = { 67, 0, 9, 17 }, 945 | [ ATLAS_FONT+79 ] = { 76, 0, 9, 17 }, 946 | [ ATLAS_FONT+80 ] = { 69, 17, 7, 17 }, 947 | [ ATLAS_FONT+81 ] = { 85, 0, 9, 17 }, 948 | [ ATLAS_FONT+82 ] = { 76, 17, 7, 17 }, 949 | [ ATLAS_FONT+83 ] = { 18, 51, 6, 17 }, 950 | [ ATLAS_FONT+84 ] = { 24, 51, 6, 17 }, 951 | [ ATLAS_FONT+85 ] = { 26, 17, 8, 17 }, 952 | [ ATLAS_FONT+86 ] = { 83, 17, 7, 17 }, 953 | [ ATLAS_FONT+87 ] = { 38, 0, 10, 17 }, 954 | [ ATLAS_FONT+88 ] = { 90, 17, 7, 17 }, 955 | [ ATLAS_FONT+89 ] = { 30, 51, 6, 17 }, 956 | [ ATLAS_FONT+90 ] = { 36, 51, 6, 17 }, 957 | [ ATLAS_FONT+91 ] = { 69, 68, 3, 17 }, 958 | [ ATLAS_FONT+92 ] = { 124, 51, 4, 17 }, 959 | [ ATLAS_FONT+93 ] = { 72, 68, 3, 17 }, 960 | [ ATLAS_FONT+94 ] = { 42, 51, 6, 17 }, 961 | [ ATLAS_FONT+95 ] = { 15, 68, 4, 17 }, 962 | [ ATLAS_FONT+96 ] = { 48, 51, 6, 17 }, 963 | [ ATLAS_FONT+97 ] = { 54, 51, 6, 17 }, 964 | [ ATLAS_FONT+98 ] = { 97, 17, 7, 17 }, 965 | [ ATLAS_FONT+99 ] = { 0, 52, 5, 17 }, 966 | [ ATLAS_FONT+100 ] = { 104, 17, 7, 17 }, 967 | [ ATLAS_FONT+101 ] = { 60, 51, 6, 17 }, 968 | [ ATLAS_FONT+102 ] = { 19, 68, 4, 17 }, 969 | [ ATLAS_FONT+103 ] = { 66, 51, 6, 17 }, 970 | [ ATLAS_FONT+104 ] = { 111, 17, 7, 17 }, 971 | [ ATLAS_FONT+105 ] = { 75, 68, 3, 17 }, 972 | [ ATLAS_FONT+106 ] = { 78, 68, 3, 17 }, 973 | [ ATLAS_FONT+107 ] = { 72, 51, 6, 17 }, 974 | [ ATLAS_FONT+108 ] = { 81, 68, 3, 17 }, 975 | [ ATLAS_FONT+109 ] = { 48, 0, 10, 17 }, 976 | [ ATLAS_FONT+110 ] = { 118, 17, 7, 17 }, 977 | [ ATLAS_FONT+111 ] = { 0, 18, 7, 17 }, 978 | [ ATLAS_FONT+112 ] = { 7, 18, 7, 17 }, 979 | [ ATLAS_FONT+113 ] = { 14, 34, 7, 17 }, 980 | [ ATLAS_FONT+114 ] = { 23, 68, 4, 17 }, 981 | [ ATLAS_FONT+115 ] = { 5, 52, 5, 17 }, 982 | [ ATLAS_FONT+116 ] = { 27, 68, 4, 17 }, 983 | [ ATLAS_FONT+117 ] = { 21, 34, 7, 17 }, 984 | [ ATLAS_FONT+118 ] = { 78, 51, 6, 17 }, 985 | [ ATLAS_FONT+119 ] = { 94, 0, 9, 17 }, 986 | [ ATLAS_FONT+120 ] = { 84, 51, 6, 17 }, 987 | [ ATLAS_FONT+121 ] = { 90, 51, 6, 17 }, 988 | [ ATLAS_FONT+122 ] = { 10, 68, 5, 17 }, 989 | [ ATLAS_FONT+123 ] = { 31, 68, 4, 17 }, 990 | [ ATLAS_FONT+124 ] = { 96, 51, 6, 17 }, 991 | [ ATLAS_FONT+125 ] = { 35, 68, 4, 17 }, 992 | [ ATLAS_FONT+126 ] = { 102, 51, 6, 17 }, 993 | [ ATLAS_FONT+127 ] = { 108, 51, 6, 17 }, 994 | }; 995 | 996 | --------------------------------------------------------------------------------