diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e47944613..c8490d23d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1,4 @@ -# Who owns all the code by default +# Who owns all the fish by default * @skotopes @DrZlo13 @@ -8,7 +8,7 @@ applications/accessor/** @skotopes @DrZlo13 applications/loader/** @skotopes @DrZlo13 @gornekich applications/bt/** @skotopes @DrZlo13 applications/cli/** @skotopes @DrZlo13 -applications/dolphin/** @skotopes @DrZlo13 @itsyourbedtime +applications/dolphin/** @skotopes @DrZlo13 applications/gpio-tester/** @skotopes @DrZlo13 applications/gui/** @skotopes @DrZlo13 applications/gui-test/** @skotopes @DrZlo13 diff --git a/applications/bad_usb/bad_usb_script.c b/applications/bad_usb/bad_usb_script.c index 1ce87bf00..6cf460df4 100644 --- a/applications/bad_usb/bad_usb_script.c +++ b/applications/bad_usb/bad_usb_script.c @@ -6,6 +6,7 @@ #include #include #include "bad_usb_script.h" +#include #define TAG "BadUSB" #define WORKER_TAG TAG "Worker" @@ -442,6 +443,7 @@ static int32_t bad_usb_worker(void* context) { if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtToggle) { // Start executing script + DOLPHIN_DEED(DolphinDeedBadUsbPlayScript); delay_val = 0; bad_usb->buf_len = 0; bad_usb->st.line_cur = 0; diff --git a/applications/desktop/animations/animation_manager.c b/applications/desktop/animations/animation_manager.c index c123dcaa4..e9d97b04c 100644 --- a/applications/desktop/animations/animation_manager.c +++ b/applications/desktop/animations/animation_manager.c @@ -1,23 +1,30 @@ -#include "animation_manager.h" -#include "furi_hal_delay.h" -#include "portmacro.h" -#include "views/bubble_animation_view.h" -#include "animation_storage.h" - -#include -#include -#include -#include -#include -#include -#include +#include #include +#include +#include +#include +#include +#include #include -#include -#include +#include + +#include "views/bubble_animation_view.h" +#include "views/one_shot_animation_view.h" +#include "animation_storage.h" +#include "animation_manager.h" #define TAG "AnimationManager" +#define HARDCODED_ANIMATION_NAME "L1_Tv_128x47" +#define NO_SD_ANIMATION_NAME "L1_NoSd_128x49" +#define BAD_BATTERY_ANIMATION_NAME "L1_BadBattery_128x47" + +#define NO_DB_ANIMATION_NAME "L0_NoDb_128x51" +#define BAD_SD_ANIMATION_NAME "L0_SdBad_128x51" +#define SD_OK_ANIMATION_NAME "L0_SdOk_128x51" +#define URL_ANIMATION_NAME "L0_Url_128x51" +#define NEW_MAIL_ANIMATION_NAME "L0_NewMail_128x51" + typedef enum { AnimationManagerStateIdle, AnimationManagerStateBlocked, @@ -29,10 +36,13 @@ struct AnimationManager { bool sd_show_url; bool sd_shown_no_db; bool sd_shown_sd_ok; + bool levelup_pending; + bool levelup_active; AnimationManagerState state; FuriPubSubSubscription* pubsub_subscription_storage; FuriPubSubSubscription* pubsub_subscription_dolphin; BubbleAnimationView* animation_view; + OneShotView* one_shot_view; osTimerId_t idle_animation_timer; StorageAnimation* current_animation; AnimationManagerInteractCallback interact_callback; @@ -41,6 +51,7 @@ struct AnimationManager { void* context; string_t freezed_animation_name; int32_t freezed_animation_time_left; + ViewStack* view_stack; }; static StorageAnimation* @@ -50,6 +61,11 @@ static void animation_manager_replace_current_animation( StorageAnimation* storage_animation); static void animation_manager_start_new_idle(AnimationManager* animation_manager); static bool animation_manager_check_blocking(AnimationManager* animation_manager); +static bool animation_manager_is_valid_idle_animation( + const StorageAnimationManifestInfo* info, + const DolphinStats* stats); +static void animation_manager_switch_to_one_shot_view(AnimationManager* animation_manager); +static void animation_manager_switch_to_animation_view(AnimationManager* animation_manager); void animation_manager_set_context(AnimationManager* animation_manager, void* context) { furi_assert(animation_manager); @@ -101,12 +117,26 @@ static void animation_manager_interact_callback(void* context) { } } -/* reaction to animation_manager->interact_callback() */ +/* reaction to animation_manager->check_blocking_callback() */ void animation_manager_check_blocking_process(AnimationManager* animation_manager) { furi_assert(animation_manager); if(animation_manager->state == AnimationManagerStateIdle) { - animation_manager_check_blocking(animation_manager); + bool blocked = animation_manager_check_blocking(animation_manager); + + if(!blocked) { + Dolphin* dolphin = furi_record_open("dolphin"); + DolphinStats stats = dolphin_stats(dolphin); + furi_record_close("dolphin"); + + const StorageAnimationManifestInfo* manifest_info = + animation_storage_get_meta(animation_manager->current_animation); + bool valid = animation_manager_is_valid_idle_animation(manifest_info, &stats); + + if(!valid) { + animation_manager_start_new_idle(animation_manager); + } + } } } @@ -119,13 +149,24 @@ void animation_manager_new_idle_process(AnimationManager* animation_manager) { } } -/* reaction to animation_manager->check_blocking_callback() */ +/* reaction to animation_manager->interact_callback() */ void animation_manager_interact_process(AnimationManager* animation_manager) { furi_assert(animation_manager); - if(animation_manager->state == AnimationManagerStateBlocked) { - /* check if new blocking animation has to be displayed */ + if(animation_manager->levelup_pending) { + animation_manager->levelup_pending = false; + animation_manager->levelup_active = true; + animation_manager_switch_to_one_shot_view(animation_manager); + Dolphin* dolphin = furi_record_open("dolphin"); + dolphin_upgrade_level(dolphin); + furi_record_close("dolphin"); + } else if(animation_manager->levelup_active) { + animation_manager->levelup_active = false; + animation_manager_start_new_idle(animation_manager); + animation_manager_switch_to_animation_view(animation_manager); + } else if(animation_manager->state == AnimationManagerStateBlocked) { bool blocked = animation_manager_check_blocking(animation_manager); + if(!blocked) { animation_manager_start_new_idle(animation_manager); } @@ -152,22 +193,26 @@ static bool animation_manager_check_blocking(AnimationManager* animation_manager if(sd_status == FSE_INTERNAL) { blocking_animation = animation_storage_find_animation(BAD_SD_ANIMATION_NAME); + furi_assert(blocking_animation); } else if(sd_status == FSE_NOT_READY) { animation_manager->sd_shown_sd_ok = false; animation_manager->sd_shown_no_db = false; } else if(sd_status == FSE_OK) { if(!animation_manager->sd_shown_sd_ok) { blocking_animation = animation_storage_find_animation(SD_OK_ANIMATION_NAME); + furi_assert(blocking_animation); animation_manager->sd_shown_sd_ok = true; } else if(!animation_manager->sd_shown_no_db) { bool db_exists = storage_common_stat(storage, "/ext/Manifest", NULL) == FSE_OK; if(!db_exists) { blocking_animation = animation_storage_find_animation(NO_DB_ANIMATION_NAME); + furi_assert(blocking_animation); animation_manager->sd_shown_no_db = true; animation_manager->sd_show_url = true; } } else if(animation_manager->sd_show_url) { blocking_animation = animation_storage_find_animation(URL_ANIMATION_NAME); + furi_assert(blocking_animation); animation_manager->sd_show_url = false; } } @@ -176,13 +221,17 @@ static bool animation_manager_check_blocking(AnimationManager* animation_manager DolphinStats stats = dolphin_stats(dolphin); furi_record_close("dolphin"); if(!blocking_animation && stats.level_up_is_pending) { - blocking_animation = animation_storage_find_animation(LEVELUP_ANIMATION_NAME); + blocking_animation = animation_storage_find_animation(NEW_MAIL_ANIMATION_NAME); + furi_assert(blocking_animation); + if(blocking_animation) { + animation_manager->levelup_pending = true; + } } if(blocking_animation) { osTimerStop(animation_manager->idle_animation_timer); animation_manager_replace_current_animation(animation_manager, blocking_animation); - /* no starting timer because its blocking animation */ + /* no timer starting because this is blocking animation */ animation_manager->state = AnimationManagerStateBlocked; } @@ -199,7 +248,7 @@ static void animation_manager_replace_current_animation( const BubbleAnimation* animation = animation_storage_get_bubble_animation(storage_animation); bubble_animation_view_set_animation(animation_manager->animation_view, animation); - const char* new_name = string_get_cstr(animation_storage_get_meta(storage_animation)->name); + const char* new_name = animation_storage_get_meta(storage_animation)->name; FURI_LOG_I(TAG, "Select \'%s\' animation", new_name); animation_manager->current_animation = storage_animation; @@ -209,9 +258,11 @@ static void animation_manager_replace_current_animation( } AnimationManager* animation_manager_alloc(void) { - animation_storage_initialize_internal_animations(); AnimationManager* animation_manager = furi_alloc(sizeof(AnimationManager)); animation_manager->animation_view = bubble_animation_view_alloc(); + animation_manager->view_stack = view_stack_alloc(); + View* animation_view = bubble_animation_get_view(animation_manager->animation_view); + view_stack_add_view(animation_manager->view_stack, animation_view); string_init(animation_manager->freezed_animation_name); animation_manager->idle_animation_timer = @@ -251,6 +302,8 @@ void animation_manager_free(AnimationManager* animation_manager) { furi_record_close("storage"); string_clear(animation_manager->freezed_animation_name); + View* animation_view = bubble_animation_get_view(animation_manager->animation_view); + view_stack_remove_view(animation_manager->view_stack, animation_view); bubble_animation_view_free(animation_manager->animation_view); osTimerDelete(animation_manager->idle_animation_timer); } @@ -258,7 +311,39 @@ void animation_manager_free(AnimationManager* animation_manager) { View* animation_manager_get_animation_view(AnimationManager* animation_manager) { furi_assert(animation_manager); - return bubble_animation_get_view(animation_manager->animation_view); + return view_stack_get_view(animation_manager->view_stack); +} + +static bool animation_manager_is_valid_idle_animation( + const StorageAnimationManifestInfo* info, + const DolphinStats* stats) { + furi_assert(info); + furi_assert(info->name); + + bool result = true; + + if(!strcmp(info->name, BAD_BATTERY_ANIMATION_NAME)) { + Power* power = furi_record_open("power"); + bool battery_is_well = power_is_battery_healthy(power); + furi_record_close("power"); + + result = !battery_is_well; + } + if(!strcmp(info->name, NO_SD_ANIMATION_NAME)) { + Storage* storage = furi_record_open("storage"); + FS_Error sd_status = storage_sd_status(storage); + furi_record_close("storage"); + + result = (sd_status == FSE_NOT_READY); + } + if((stats->butthurt < info->min_butthurt) || (stats->butthurt > info->max_butthurt)) { + result = false; + } + if((stats->level < info->min_level) || (stats->level > info->max_level)) { + result = false; + } + + return result; } static StorageAnimation* @@ -267,40 +352,25 @@ static StorageAnimation* StorageAnimationList_init(animation_list); animation_storage_fill_animation_list(&animation_list); - Power* power = furi_record_open("power"); - bool battery_is_well = power_is_battery_healthy(power); - furi_record_close("power"); - - Storage* storage = furi_record_open("storage"); - FS_Error sd_status = storage_sd_status(storage); - furi_record_close("storage"); - Dolphin* dolphin = furi_record_open("dolphin"); DolphinStats stats = dolphin_stats(dolphin); + furi_record_close("dolphin"); uint32_t whole_weight = 0; StorageAnimationList_it_t it; for(StorageAnimationList_it(it, animation_list); !StorageAnimationList_end_p(it);) { StorageAnimation* storage_animation = *StorageAnimationList_ref(it); - const StorageAnimationMeta* meta = animation_storage_get_meta(storage_animation); - bool skip_animation = false; - if(battery_is_well && !string_cmp_str(meta->name, BAD_BATTERY_ANIMATION_NAME)) { - skip_animation = true; - } else if((sd_status != FSE_NOT_READY) && !string_cmp_str(meta->name, NO_SD_ANIMATION_NAME)) { - skip_animation = true; - } else if((stats.butthurt < meta->min_butthurt) || (stats.butthurt > meta->max_butthurt)) { - skip_animation = true; - } else if((stats.level < meta->min_level) || (stats.level > meta->max_level)) { - skip_animation = true; - } + const StorageAnimationManifestInfo* manifest_info = + animation_storage_get_meta(storage_animation); + bool valid = animation_manager_is_valid_idle_animation(manifest_info, &stats); - if(skip_animation) { + if(valid) { + whole_weight += manifest_info->weight; + StorageAnimationList_next(it); + } else { animation_storage_free_storage_animation(&storage_animation); /* remove and increase iterator */ StorageAnimationList_remove(animation_list, it); - } else { - whole_weight += meta->weight; - StorageAnimationList_next(it); } } @@ -325,11 +395,10 @@ static StorageAnimation* } StorageAnimationList_clear(animation_list); - furi_record_close("dolphin"); /* cache animation, if failed - choose reliable animation */ if(!animation_storage_get_bubble_animation(selected)) { - const char* name = string_get_cstr(animation_storage_get_meta(selected)->name); + const char* name = animation_storage_get_meta(selected)->name; FURI_LOG_E(TAG, "Can't upload animation described in manifest: \'%s\'", name); animation_storage_free_storage_animation(&selected); selected = animation_storage_find_animation(HARDCODED_ANIMATION_NAME); @@ -362,9 +431,15 @@ void animation_manager_unload_and_stall_animation(AnimationManager* animation_ma furi_assert(0); } - StorageAnimationMeta* meta = animation_storage_get_meta(animation_manager->current_animation); + FURI_LOG_I( + TAG, + "Unload animation \'%s\'", + animation_storage_get_meta(animation_manager->current_animation)->name); + + StorageAnimationManifestInfo* meta = + animation_storage_get_meta(animation_manager->current_animation); /* copy str, not move, because it can be internal animation */ - string_set(animation_manager->freezed_animation_name, meta->name); + string_set_str(animation_manager->freezed_animation_name, meta->name); bubble_animation_freeze(animation_manager->animation_view); animation_storage_free_storage_animation(&animation_manager->current_animation); @@ -394,18 +469,27 @@ void animation_manager_load_and_continue_animation(AnimationManager* animation_m StorageAnimation* restore_animation = animation_storage_find_animation( string_get_cstr(animation_manager->freezed_animation_name)); if(restore_animation) { - animation_manager_replace_current_animation(animation_manager, restore_animation); - animation_manager->state = AnimationManagerStateIdle; + Dolphin* dolphin = furi_record_open("dolphin"); + DolphinStats stats = dolphin_stats(dolphin); + furi_record_close("dolphin"); + const StorageAnimationManifestInfo* manifest_info = + animation_storage_get_meta(restore_animation); + bool valid = animation_manager_is_valid_idle_animation(manifest_info, &stats); + if(valid) { + animation_manager_replace_current_animation( + animation_manager, restore_animation); + animation_manager->state = AnimationManagerStateIdle; - if(animation_manager->freezed_animation_time_left) { - osTimerStart( - animation_manager->idle_animation_timer, - animation_manager->freezed_animation_time_left); - } else { - const BubbleAnimation* animation = animation_storage_get_bubble_animation( - animation_manager->current_animation); - osTimerStart( - animation_manager->idle_animation_timer, animation->duration * 1000); + if(animation_manager->freezed_animation_time_left) { + osTimerStart( + animation_manager->idle_animation_timer, + animation_manager->freezed_animation_time_left); + } else { + const BubbleAnimation* animation = animation_storage_get_bubble_animation( + animation_manager->current_animation); + osTimerStart( + animation_manager->idle_animation_timer, animation->duration * 1000); + } } } else { FURI_LOG_E( @@ -423,12 +507,47 @@ void animation_manager_load_and_continue_animation(AnimationManager* animation_m if(!animation_manager->current_animation) { animation_manager_start_new_idle(animation_manager); } - FURI_LOG_D( + FURI_LOG_I( TAG, - "Load & Continue with \'%s\'", - string_get_cstr(animation_storage_get_meta(animation_manager->current_animation)->name)); + "Load animation \'%s\'", + animation_storage_get_meta(animation_manager->current_animation)->name); bubble_animation_unfreeze(animation_manager->animation_view); string_reset(animation_manager->freezed_animation_name); furi_assert(animation_manager->current_animation); } + +static void animation_manager_switch_to_one_shot_view(AnimationManager* animation_manager) { + furi_assert(animation_manager); + furi_assert(!animation_manager->one_shot_view); + Dolphin* dolphin = furi_record_open("dolphin"); + DolphinStats stats = dolphin_stats(dolphin); + furi_record_close("dolphin"); + + animation_manager->one_shot_view = one_shot_view_alloc(); + one_shot_view_set_interact_callback( + animation_manager->one_shot_view, animation_manager_interact_callback, animation_manager); + View* prev_view = bubble_animation_get_view(animation_manager->animation_view); + View* next_view = one_shot_view_get_view(animation_manager->one_shot_view); + view_stack_remove_view(animation_manager->view_stack, prev_view); + view_stack_add_view(animation_manager->view_stack, next_view); + if(stats.level == 1) { + one_shot_view_start_animation(animation_manager->one_shot_view, &A_Levelup1_128x64); + } else if(stats.level == 2) { + one_shot_view_start_animation(animation_manager->one_shot_view, &A_Levelup2_128x64); + } else { + furi_assert(0); + } +} + +static void animation_manager_switch_to_animation_view(AnimationManager* animation_manager) { + furi_assert(animation_manager); + furi_assert(animation_manager->one_shot_view); + + View* prev_view = one_shot_view_get_view(animation_manager->one_shot_view); + View* next_view = bubble_animation_get_view(animation_manager->animation_view); + view_stack_remove_view(animation_manager->view_stack, prev_view); + view_stack_add_view(animation_manager->view_stack, next_view); + one_shot_view_free(animation_manager->one_shot_view); + animation_manager->one_shot_view = NULL; +} diff --git a/applications/desktop/animations/animation_manager.h b/applications/desktop/animations/animation_manager.h index 1ffaee3a9..d86a162c9 100644 --- a/applications/desktop/animations/animation_manager.h +++ b/applications/desktop/animations/animation_manager.h @@ -1,34 +1,35 @@ #pragma once -#include "dolphin/dolphin.h" #include +#include #include +#include typedef struct AnimationManager AnimationManager; typedef struct { uint8_t x; uint8_t y; - const char* str; - Align horizontal; - Align vertical; + const char* text; + Align align_h; + Align align_v; } Bubble; typedef struct FrameBubble { Bubble bubble; - uint8_t starts_at_frame; - uint8_t ends_at_frame; - struct FrameBubble* next_bubble; + uint8_t start_frame; + uint8_t end_frame; + const struct FrameBubble* next_bubble; } FrameBubble; typedef struct { - FrameBubble** frame_bubbles; - uint8_t frame_bubbles_count; - const Icon** icons; + const FrameBubble* const* frame_bubble_sequences; + uint8_t frame_bubble_sequences_count; + const Icon icon_animation; + uint8_t frame_order[20]; uint8_t passive_frames; uint8_t active_frames; uint8_t active_cycles; - uint8_t frame_rate; uint16_t duration; uint16_t active_cooldown; } BubbleAnimation; diff --git a/applications/desktop/animations/animation_storage.c b/applications/desktop/animations/animation_storage.c index 04ea4249b..94b23be6c 100644 --- a/applications/desktop/animations/animation_storage.c +++ b/applications/desktop/animations/animation_storage.c @@ -1,34 +1,86 @@ -#include "animation_manager.h" -#include "file_worker.h" -#include "flipper_file.h" -#include "furi/common_defines.h" -#include "furi/memmgr.h" -#include "furi/record.h" -#include "animation_storage.h" -#include "gui/canvas.h" -#include "m-string.h" -#include "pb.h" -#include "pb_decode.h" -#include "storage/filesystem_api_defines.h" -#include "storage/storage.h" -#include "animation_storage_i.h" -#include -#include -// Read documentation before using it +#include +#include +#include #include +#include +#include +#include + +#include "animation_manager.h" +#include "animation_storage.h" +#include "animation_storage_i.h" +#include +#include #define ANIMATION_META_FILE "meta.txt" -#define ANIMATION_DIR "/ext/dolphin/animations" +#define ANIMATION_DIR "/ext/dolphin" #define ANIMATION_MANIFEST_FILE ANIMATION_DIR "/manifest.txt" #define TAG "AnimationStorage" -#define DEBUG_PB 0 static void animation_storage_free_bubbles(BubbleAnimation* animation); static void animation_storage_free_frames(BubbleAnimation* animation); static void animation_storage_free_animation(BubbleAnimation** storage_animation); static BubbleAnimation* animation_storage_load_animation(const char* name); +static bool animation_storage_load_single_manifest_info( + StorageAnimationManifestInfo* manifest_info, + const char* name) { + furi_assert(manifest_info); + + bool result = false; + Storage* storage = furi_record_open("storage"); + FlipperFile* file = flipper_file_alloc(storage); + flipper_file_set_strict_mode(file, true); + string_t read_string; + string_init(read_string); + + do { + uint32_t u32value; + if(FSE_OK != storage_sd_status(storage)) break; + if(!flipper_file_open_existing(file, ANIMATION_MANIFEST_FILE)) break; + + if(!flipper_file_read_header(file, read_string, &u32value)) break; + if(string_cmp_str(read_string, "Flipper Animation Manifest")) break; + + manifest_info->name = NULL; + + /* skip other animation names */ + flipper_file_set_strict_mode(file, false); + while(flipper_file_read_string(file, "Name", read_string) && + string_cmp_str(read_string, name)) + ; + if(string_cmp_str(read_string, name)) break; + flipper_file_set_strict_mode(file, true); + + manifest_info->name = furi_alloc(string_size(read_string) + 1); + strcpy((char*)manifest_info->name, string_get_cstr(read_string)); + + if(!flipper_file_read_uint32(file, "Min butthurt", &u32value, 1)) break; + manifest_info->min_butthurt = u32value; + if(!flipper_file_read_uint32(file, "Max butthurt", &u32value, 1)) break; + manifest_info->max_butthurt = u32value; + if(!flipper_file_read_uint32(file, "Min level", &u32value, 1)) break; + manifest_info->min_level = u32value; + if(!flipper_file_read_uint32(file, "Max level", &u32value, 1)) break; + manifest_info->max_level = u32value; + if(!flipper_file_read_uint32(file, "Weight", &u32value, 1)) break; + manifest_info->weight = u32value; + result = true; + } while(0); + + if(!result && manifest_info->name) { + free((void*)manifest_info->name); + } + string_clear(read_string); + flipper_file_close(file); + flipper_file_free(file); + + furi_record_close("storage"); + + return result; +} + void animation_storage_fill_animation_list(StorageAnimationList_t* animation_list) { furi_assert(sizeof(StorageAnimationList_t) == sizeof(void*)); furi_assert(!StorageAnimationList_size(*animation_list)); @@ -37,8 +89,8 @@ void animation_storage_fill_animation_list(StorageAnimationList_t* animation_lis FlipperFile* file = flipper_file_alloc(storage); /* Forbid skipping fields */ flipper_file_set_strict_mode(file, true); - string_t header; - string_init(header); + string_t read_string; + string_init(read_string); do { uint32_t u32value; @@ -46,24 +98,28 @@ void animation_storage_fill_animation_list(StorageAnimationList_t* animation_lis if(FSE_OK != storage_sd_status(storage)) break; if(!flipper_file_open_existing(file, ANIMATION_MANIFEST_FILE)) break; - if(!flipper_file_read_header(file, header, &u32value)) break; - if(string_cmp_str(header, "Flipper Animation Manifest")) break; + if(!flipper_file_read_header(file, read_string, &u32value)) break; + if(string_cmp_str(read_string, "Flipper Animation Manifest")) break; do { storage_animation = furi_alloc(sizeof(StorageAnimation)); storage_animation->external = true; storage_animation->animation = NULL; + storage_animation->manifest_info.name = NULL; + + if(!flipper_file_read_string(file, "Name", read_string)) break; + storage_animation->manifest_info.name = furi_alloc(string_size(read_string) + 1); + strcpy((char*)storage_animation->manifest_info.name, string_get_cstr(read_string)); - if(!flipper_file_read_string(file, "Name", storage_animation->meta.name)) break; if(!flipper_file_read_uint32(file, "Min butthurt", &u32value, 1)) break; - storage_animation->meta.min_butthurt = u32value; + storage_animation->manifest_info.min_butthurt = u32value; if(!flipper_file_read_uint32(file, "Max butthurt", &u32value, 1)) break; - storage_animation->meta.max_butthurt = u32value; + storage_animation->manifest_info.max_butthurt = u32value; if(!flipper_file_read_uint32(file, "Min level", &u32value, 1)) break; - storage_animation->meta.min_level = u32value; + storage_animation->manifest_info.min_level = u32value; if(!flipper_file_read_uint32(file, "Max level", &u32value, 1)) break; - storage_animation->meta.max_level = u32value; + storage_animation->manifest_info.max_level = u32value; if(!flipper_file_read_uint32(file, "Weight", &u32value, 1)) break; - storage_animation->meta.weight = u32value; + storage_animation->manifest_info.weight = u32value; StorageAnimationList_push_back(*animation_list, storage_animation); } while(1); @@ -71,13 +127,13 @@ void animation_storage_fill_animation_list(StorageAnimationList_t* animation_lis animation_storage_free_storage_animation(&storage_animation); } while(0); - string_clear(header); + string_clear(read_string); flipper_file_close(file); flipper_file_free(file); // add hard-coded animations - for(int i = 0; i < COUNT_OF(StorageAnimationInternal); ++i) { - StorageAnimationList_push_back(*animation_list, &StorageAnimationInternal[i]); + for(int i = 0; i < dolphin_internal_size; ++i) { + StorageAnimationList_push_back(*animation_list, (StorageAnimation*)&dolphin_internal[i]); } furi_record_close("storage"); @@ -88,41 +144,45 @@ StorageAnimation* animation_storage_find_animation(const char* name) { furi_assert(strlen(name)); StorageAnimation* storage_animation = NULL; - /* look through internal animations */ - for(int i = 0; i < COUNT_OF(StorageAnimationInternal); ++i) { - if(!string_cmp_str(StorageAnimationInternal[i].meta.name, name)) { - storage_animation = &StorageAnimationInternal[i]; + for(int i = 0; i < dolphin_blocking_size; ++i) { + if(!strcmp(dolphin_blocking[i].manifest_info.name, name)) { + storage_animation = (StorageAnimation*)&dolphin_blocking[i]; break; } } + if(!storage_animation) { + for(int i = 0; i < dolphin_internal_size; ++i) { + if(!strcmp(dolphin_internal[i].manifest_info.name, name)) { + storage_animation = (StorageAnimation*)&dolphin_internal[i]; + break; + } + } + } + /* look through external animations */ if(!storage_animation) { - BubbleAnimation* animation = animation_storage_load_animation(name); + storage_animation = furi_alloc(sizeof(StorageAnimation)); + storage_animation->external = true; - if(animation != NULL) { - storage_animation = furi_alloc(sizeof(StorageAnimation)); - storage_animation->animation = animation; - storage_animation->external = true; - /* meta data takes part in random animation selection, so it - * doesn't need here as we exactly know which animation we need, - * that's why we can ignore reading manifest.txt file - * filling meta data by zeroes */ - storage_animation->meta.min_butthurt = 0; - storage_animation->meta.max_butthurt = 0; - storage_animation->meta.min_level = 0; - storage_animation->meta.max_level = 0; - storage_animation->meta.weight = 0; - string_init_set_str(storage_animation->meta.name, name); + bool result = false; + result = + animation_storage_load_single_manifest_info(&storage_animation->manifest_info, name); + if(result) { + storage_animation->animation = animation_storage_load_animation(name); + result = !!storage_animation->animation; + } + if(!result) { + animation_storage_free_storage_animation(&storage_animation); } } return storage_animation; } -StorageAnimationMeta* animation_storage_get_meta(StorageAnimation* storage_animation) { +StorageAnimationManifestInfo* animation_storage_get_meta(StorageAnimation* storage_animation) { furi_assert(storage_animation); - return &storage_animation->meta; + return &storage_animation->manifest_info; } const BubbleAnimation* @@ -138,7 +198,7 @@ void animation_storage_cache_animation(StorageAnimation* storage_animation) { if(storage_animation->external) { if(!storage_animation->animation) { storage_animation->animation = - animation_storage_load_animation(string_get_cstr(storage_animation->meta.name)); + animation_storage_load_animation(storage_animation->manifest_info.name); } } } @@ -161,7 +221,9 @@ void animation_storage_free_storage_animation(StorageAnimation** storage_animati if((*storage_animation)->external) { animation_storage_free_animation((BubbleAnimation**)&(*storage_animation)->animation); - string_clear((*storage_animation)->meta.name); + if((*storage_animation)->manifest_info.name) { + free((void*)(*storage_animation)->manifest_info.name); + } free(*storage_animation); } @@ -188,41 +250,15 @@ static bool animation_storage_cast_align(string_t align_str, Align* align) { static void animation_storage_free_frames(BubbleAnimation* animation) { furi_assert(animation); - furi_assert(animation->icons); - const Icon** icons = animation->icons; - uint16_t frames = animation->active_frames + animation->passive_frames; - furi_assert(frames > 0); - - for(int i = 0; i < frames; ++i) { - if(!icons[i]) continue; - - const Icon* icon = icons[i]; - free((void*)icon->frames[0]); - free(icon->frames); - free((void*)icon); - for(int j = i; j < frames; ++j) { - if(icons[j] == icon) { - icons[j] = NULL; - } + const Icon* icon = &animation->icon_animation; + for(int i = 0; i < icon->frame_count; ++i) { + if(icon->frames[i]) { + free((void*)icon->frames[i]); } } - free(animation->icons); - animation->icons = NULL; -} - -static Icon* animation_storage_alloc_icon(size_t frame_size) { - Icon* icon = furi_alloc(sizeof(Icon)); - icon->frames = furi_alloc(sizeof(const uint8_t*)); - icon->frames[0] = furi_alloc(frame_size); - return icon; -} - -static void animation_storage_free_icon(Icon* icon) { - free((void*)icon->frames[0]); free(icon->frames); - free(icon); } static bool animation_storage_load_frames( @@ -230,22 +266,25 @@ static bool animation_storage_load_frames( const char* name, BubbleAnimation* animation, uint32_t* frame_order, - uint32_t width, - uint32_t height) { - furi_assert(!animation->icons); + uint8_t width, + uint8_t height) { uint16_t frame_order_size = animation->passive_frames + animation->active_frames; bool frames_ok = false; - animation->icons = furi_alloc(sizeof(const Icon*) * frame_order_size); File* file = storage_file_alloc(storage); FileInfo file_info; string_t filename; string_init(filename); size_t max_filesize = ROUND_UP_TO(width, 8) * height + 1; + Icon* icon = (Icon*)&animation->icon_animation; + FURI_CONST_ASSIGN(icon->frame_count, frame_order_size); + FURI_CONST_ASSIGN(icon->frame_rate, 0); + FURI_CONST_ASSIGN(icon->height, height); + FURI_CONST_ASSIGN(icon->width, width); + + icon->frames = furi_alloc(sizeof(const uint8_t*) * frame_order_size); for(int i = 0; i < frame_order_size; ++i) { - if(animation->icons[i]) continue; - frames_ok = false; string_printf(filename, ANIMATION_DIR "/%s/frame_%d.bm", name, frame_order[i]); @@ -265,24 +304,12 @@ static bool animation_storage_load_frames( break; } - Icon* icon = animation_storage_alloc_icon(file_info.size); - if(storage_file_read(file, (void*)icon->frames[0], file_info.size) != file_info.size) { + icon->frames[i] = furi_alloc(file_info.size); + if(storage_file_read(file, (void*)icon->frames[i], file_info.size) != file_info.size) { FURI_LOG_E(TAG, "Read failed: \'%s\'", string_get_cstr(filename)); - animation_storage_free_icon(icon); break; } storage_file_close(file); - FURI_CONST_ASSIGN(icon->frame_count, 1); - FURI_CONST_ASSIGN(icon->frame_rate, 0); - FURI_CONST_ASSIGN(icon->height, height); - FURI_CONST_ASSIGN(icon->width, width); - - /* Claim 1 allocation for 1 files blob and several links to it */ - for(int j = i; j < frame_order_size; ++j) { - if(frame_order[i] == frame_order[j]) { - animation->icons[j] = icon; - } - } frames_ok = true; } @@ -295,11 +322,10 @@ static bool animation_storage_load_frames( height, file_info.size); animation_storage_free_frames(animation); - animation->icons = NULL; } else { - for(int i = 0; i < frame_order_size; ++i) { - furi_check(animation->icons[i]); - furi_check(animation->icons[i]->frames[0]); + furi_check(animation->icon_animation.frames); + for(int i = 0; i < animation->icon_animation.frame_count; ++i) { + furi_check(animation->icon_animation.frames[i]); } } @@ -314,72 +340,73 @@ static bool animation_storage_load_bubbles(BubbleAnimation* animation, FlipperFi string_t str; string_init(str); bool success = false; - furi_assert(!animation->frame_bubbles); + furi_assert(!animation->frame_bubble_sequences); do { if(!flipper_file_read_uint32(ff, "Bubble slots", &u32value, 1)) break; if(u32value > 20) break; - animation->frame_bubbles_count = u32value; - if(animation->frame_bubbles_count == 0) { - animation->frame_bubbles = NULL; + animation->frame_bubble_sequences_count = u32value; + if(animation->frame_bubble_sequences_count == 0) { + animation->frame_bubble_sequences = NULL; success = true; break; } - animation->frame_bubbles = - furi_alloc(sizeof(FrameBubble*) * animation->frame_bubbles_count); + animation->frame_bubble_sequences = + furi_alloc(sizeof(FrameBubble*) * animation->frame_bubble_sequences_count); uint32_t current_slot = 0; - for(int i = 0; i < animation->frame_bubbles_count; ++i) { - animation->frame_bubbles[i] = furi_alloc(sizeof(FrameBubble)); + for(int i = 0; i < animation->frame_bubble_sequences_count; ++i) { + FURI_CONST_ASSIGN_PTR( + animation->frame_bubble_sequences[i], furi_alloc(sizeof(FrameBubble))); } - FrameBubble* bubble = animation->frame_bubbles[0]; + const FrameBubble* bubble = animation->frame_bubble_sequences[0]; int8_t index = -1; for(;;) { if(!flipper_file_read_uint32(ff, "Slot", ¤t_slot, 1)) break; if((current_slot != 0) && (index == -1)) break; if(current_slot == index) { - bubble->next_bubble = furi_alloc(sizeof(FrameBubble)); + FURI_CONST_ASSIGN_PTR(bubble->next_bubble, furi_alloc(sizeof(FrameBubble))); bubble = bubble->next_bubble; } else if(current_slot == index + 1) { ++index; - bubble = animation->frame_bubbles[index]; + bubble = animation->frame_bubble_sequences[index]; } else { /* slots have to start from 0, be ascending sorted, and * have exact number of slots as specified in "Bubble slots" */ break; } - if(index >= animation->frame_bubbles_count) break; + if(index >= animation->frame_bubble_sequences_count) break; if(!flipper_file_read_uint32(ff, "X", &u32value, 1)) break; - bubble->bubble.x = u32value; + FURI_CONST_ASSIGN(bubble->bubble.x, u32value); if(!flipper_file_read_uint32(ff, "Y", &u32value, 1)) break; - bubble->bubble.y = u32value; + FURI_CONST_ASSIGN(bubble->bubble.y, u32value); if(!flipper_file_read_string(ff, "Text", str)) break; if(string_size(str) > 100) break; string_replace_all_str(str, "\\n", "\n"); - bubble->bubble.str = furi_alloc(string_size(str) + 1); - strcpy((char*)bubble->bubble.str, string_get_cstr(str)); + FURI_CONST_ASSIGN_PTR(bubble->bubble.text, furi_alloc(string_size(str) + 1)); + strcpy((char*)bubble->bubble.text, string_get_cstr(str)); if(!flipper_file_read_string(ff, "AlignH", str)) break; - if(!animation_storage_cast_align(str, &bubble->bubble.horizontal)) break; + if(!animation_storage_cast_align(str, (Align*)&bubble->bubble.align_h)) break; if(!flipper_file_read_string(ff, "AlignV", str)) break; - if(!animation_storage_cast_align(str, &bubble->bubble.vertical)) break; + if(!animation_storage_cast_align(str, (Align*)&bubble->bubble.align_v)) break; if(!flipper_file_read_uint32(ff, "StartFrame", &u32value, 1)) break; - bubble->starts_at_frame = u32value; + FURI_CONST_ASSIGN(bubble->start_frame, u32value); if(!flipper_file_read_uint32(ff, "EndFrame", &u32value, 1)) break; - bubble->ends_at_frame = u32value; + FURI_CONST_ASSIGN(bubble->end_frame, u32value); } - success = (index + 1) == animation->frame_bubbles_count; + success = (index + 1) == animation->frame_bubble_sequences_count; } while(0); if(!success) { - if(animation->frame_bubbles) { + if(animation->frame_bubble_sequences) { FURI_LOG_E(TAG, "Failed to load animation bubbles"); animation_storage_free_bubbles(animation); } @@ -402,7 +429,7 @@ static BubbleAnimation* animation_storage_load_animation(const char* name) { flipper_file_set_strict_mode(ff, true); string_t str; string_init(str); - animation->frame_bubbles = NULL; + animation->frame_bubble_sequences = NULL; bool success = false; do { @@ -424,8 +451,17 @@ static BubbleAnimation* animation_storage_load_animation(const char* name) { animation->active_frames = u32value; uint8_t frames = animation->passive_frames + animation->active_frames; + uint32_t count = 0; + if(!flipper_file_get_value_count(ff, "Frames order", &count)) break; + if((count != frames) || (frames > COUNT_OF(animation->frame_order))) { + FURI_LOG_E(TAG, "Error loading animation: frames order"); + break; + } u32array = furi_alloc(sizeof(uint32_t) * frames); if(!flipper_file_read_uint32(ff, "Frames order", u32array, frames)) break; + for(int i = 0; i < frames; ++i) { + animation->frame_order[i] = u32array[i]; + } /* passive and active frames must be loaded up to this point */ if(!animation_storage_load_frames(storage, name, animation, u32array, width, height)) @@ -434,7 +470,7 @@ static BubbleAnimation* animation_storage_load_animation(const char* name) { if(!flipper_file_read_uint32(ff, "Active cycles", &u32value, 1)) break; animation->active_cycles = u32value; if(!flipper_file_read_uint32(ff, "Frame rate", &u32value, 1)) break; - animation->frame_rate = u32value; + FURI_CONST_ASSIGN(animation->icon_animation.frame_rate, u32value); if(!flipper_file_read_uint32(ff, "Duration", &u32value, 1)) break; animation->duration = u32value; if(!flipper_file_read_uint32(ff, "Active cooldown", &u32value, 1)) break; @@ -460,10 +496,10 @@ static BubbleAnimation* animation_storage_load_animation(const char* name) { } static void animation_storage_free_bubbles(BubbleAnimation* animation) { - if(!animation->frame_bubbles) return; + if(!animation->frame_bubble_sequences) return; - for(int i = 0; i < animation->frame_bubbles_count;) { - FrameBubble** bubble = &animation->frame_bubbles[i]; + for(int i = 0; i < animation->frame_bubble_sequences_count;) { + const FrameBubble* const* bubble = &animation->frame_bubble_sequences[i]; if((*bubble) == NULL) break; @@ -471,15 +507,15 @@ static void animation_storage_free_bubbles(BubbleAnimation* animation) { bubble = &(*bubble)->next_bubble; } - if((*bubble)->bubble.str) { - free((void*)(*bubble)->bubble.str); + if((*bubble)->bubble.text) { + free((void*)(*bubble)->bubble.text); } - if((*bubble) == animation->frame_bubbles[i]) { + if((*bubble) == animation->frame_bubble_sequences[i]) { ++i; } - free(*bubble); - *bubble = NULL; + free((void*)*bubble); + FURI_CONST_ASSIGN_PTR(*bubble, NULL); } - free(animation->frame_bubbles); - animation->frame_bubbles = NULL; + free((void*)animation->frame_bubble_sequences); + animation->frame_bubble_sequences = NULL; } diff --git a/applications/desktop/animations/animation_storage.h b/applications/desktop/animations/animation_storage.h index f246129db..e53c1133f 100644 --- a/applications/desktop/animations/animation_storage.h +++ b/applications/desktop/animations/animation_storage.h @@ -4,15 +4,6 @@ #include "views/bubble_animation_view.h" #include -#define HARDCODED_ANIMATION_NAME "tv" -#define NO_SD_ANIMATION_NAME "no_sd" -#define BAD_BATTERY_ANIMATION_NAME "bad_battery" -#define NO_DB_ANIMATION_NAME "no_db" -#define BAD_SD_ANIMATION_NAME "bad_sd" -#define SD_OK_ANIMATION_NAME "sd_ok" -#define URL_ANIMATION_NAME "url" -#define LEVELUP_ANIMATION_NAME "level" - /** Main structure to handle animation data. * Contains all, including animation playing data (BubbleAnimation), * data for random animation selection (StorageAnimationMeta) and @@ -20,13 +11,13 @@ typedef struct StorageAnimation StorageAnimation; typedef struct { - string_t name; + const char* name; uint8_t min_butthurt; uint8_t max_butthurt; uint8_t min_level; uint8_t max_level; uint8_t weight; -} StorageAnimationMeta; +} StorageAnimationManifestInfo; /** Container to return available animations list */ LIST_DEF(StorageAnimationList, StorageAnimation*, M_PTR_OPLIST) @@ -81,7 +72,7 @@ StorageAnimation* animation_storage_find_animation(const char* name); * @storage_animation item of whom we have to extract meta. * @return meta itself */ -StorageAnimationMeta* animation_storage_get_meta(StorageAnimation* storage_animation); +StorageAnimationManifestInfo* animation_storage_get_meta(StorageAnimation* storage_animation); /** * Free storage_animation, which previously acquired diff --git a/applications/desktop/animations/animation_storage_i.h b/applications/desktop/animations/animation_storage_i.h index c4f680391..cae9cad5b 100644 --- a/applications/desktop/animations/animation_storage_i.h +++ b/applications/desktop/animations/animation_storage_i.h @@ -1,195 +1,9 @@ #pragma once #include "animation_storage.h" -#include "assets_icons.h" #include "animation_manager.h" -#include "gui/canvas.h" struct StorageAnimation { const BubbleAnimation* animation; bool external; - StorageAnimationMeta meta; + StorageAnimationManifestInfo manifest_info; }; - -// Hard-coded, always available idle animation -FrameBubble tv_bubble1 = { - .bubble = - {.x = 1, - .y = 23, - .str = "Take the red pill", - .horizontal = AlignRight, - .vertical = AlignBottom}, - .starts_at_frame = 7, - .ends_at_frame = 9, - .next_bubble = NULL, -}; -FrameBubble tv_bubble2 = { - .bubble = - {.x = 1, - .y = 23, - .str = "I can joke better", - .horizontal = AlignRight, - .vertical = AlignBottom}, - .starts_at_frame = 7, - .ends_at_frame = 9, - .next_bubble = NULL, -}; -FrameBubble* tv_bubbles[] = {&tv_bubble1, &tv_bubble2}; -const Icon* tv_icons[] = { - &I_tv1, - &I_tv2, - &I_tv3, - &I_tv4, - &I_tv5, - &I_tv6, - &I_tv7, - &I_tv8, -}; -const BubbleAnimation tv_bubble_animation = { - .icons = tv_icons, - .frame_bubbles = tv_bubbles, - .frame_bubbles_count = COUNT_OF(tv_bubbles), - .passive_frames = 6, - .active_frames = 2, - .active_cycles = 2, - .frame_rate = 2, - .duration = 3600, - .active_cooldown = 5, -}; - -// System animation - no SD card -const Icon* no_sd_icons[] = { - &I_no_sd1, - &I_no_sd2, - &I_no_sd1, - &I_no_sd2, - &I_no_sd1, - &I_no_sd3, - &I_no_sd4, - &I_no_sd5, - &I_no_sd4, - &I_no_sd6, -}; -FrameBubble no_sd_bubble = { - .bubble = - {.x = 40, - .y = 18, - .str = "Need an\nSD card", - .horizontal = AlignRight, - .vertical = AlignBottom}, - .starts_at_frame = 0, - .ends_at_frame = 9, - .next_bubble = NULL, -}; -FrameBubble* no_sd_bubbles[] = {&no_sd_bubble}; -const BubbleAnimation no_sd_bubble_animation = { - .icons = no_sd_icons, - .frame_bubbles = no_sd_bubbles, - .frame_bubbles_count = COUNT_OF(no_sd_bubbles), - .passive_frames = 10, - .active_frames = 0, - .frame_rate = 2, - .duration = 3600, - .active_cooldown = 0, - .active_cycles = 0, -}; - -// BLOCKING ANIMATION - no_db, bad_sd, sd_ok, url -const Icon* no_db_icons[] = { - &I_no_databases1, - &I_no_databases2, - &I_no_databases3, - &I_no_databases4, -}; -const BubbleAnimation no_db_bubble_animation = { - .icons = no_db_icons, - .passive_frames = COUNT_OF(no_db_icons), - .frame_rate = 2, -}; - -const Icon* bad_sd_icons[] = { - &I_card_bad1, - &I_card_bad2, -}; -const BubbleAnimation bad_sd_bubble_animation = { - .icons = bad_sd_icons, - .passive_frames = COUNT_OF(bad_sd_icons), - .frame_rate = 2, -}; - -const Icon* url_icons[] = { - &I_url1, - &I_url2, - &I_url3, - &I_url4, -}; -const BubbleAnimation url_bubble_animation = { - .icons = url_icons, - .passive_frames = COUNT_OF(url_icons), - .frame_rate = 2, -}; - -const Icon* sd_ok_icons[] = { - &I_card_ok1, - &I_card_ok2, - &I_card_ok3, - &I_card_ok4, -}; -const BubbleAnimation sd_ok_bubble_animation = { - .icons = sd_ok_icons, - .passive_frames = COUNT_OF(sd_ok_icons), - .frame_rate = 2, -}; - -static StorageAnimation StorageAnimationInternal[] = { - {.animation = &tv_bubble_animation, - .external = false, - .meta = - { - .min_butthurt = 0, - .max_butthurt = 11, - .min_level = 1, - .max_level = 3, - .weight = 3, - }}, - {.animation = &no_sd_bubble_animation, - .external = false, - .meta = - { - .min_butthurt = 0, - .max_butthurt = 14, - .min_level = 1, - .max_level = 3, - .weight = 6, - }}, - { - .animation = &no_db_bubble_animation, - .external = false, - }, - { - .animation = &bad_sd_bubble_animation, - .external = false, - }, - { - .animation = &sd_ok_bubble_animation, - .external = false, - }, - { - .animation = &url_bubble_animation, - .external = false, - }, -}; - -void animation_storage_initialize_internal_animations(void) { - /* not in constructor - no memory pool yet */ - /* called in 1 thread - no need in double check */ - static bool initialized = false; - if(!initialized) { - initialized = true; - string_init_set_str(StorageAnimationInternal[0].meta.name, HARDCODED_ANIMATION_NAME); - string_init_set_str(StorageAnimationInternal[1].meta.name, NO_SD_ANIMATION_NAME); - string_init_set_str(StorageAnimationInternal[2].meta.name, NO_DB_ANIMATION_NAME); - string_init_set_str(StorageAnimationInternal[3].meta.name, BAD_SD_ANIMATION_NAME); - string_init_set_str(StorageAnimationInternal[4].meta.name, SD_OK_ANIMATION_NAME); - string_init_set_str(StorageAnimationInternal[5].meta.name, URL_ANIMATION_NAME); - } -} diff --git a/applications/desktop/animations/views/bubble_animation_view.c b/applications/desktop/animations/views/bubble_animation_view.c index b18e7b754..aaffc4bc6 100644 --- a/applications/desktop/animations/views/bubble_animation_view.c +++ b/applications/desktop/animations/views/bubble_animation_view.c @@ -1,23 +1,19 @@ -#include "cmsis_os2.h" #include "../animation_manager.h" #include "../animation_storage.h" -#include "furi_hal_delay.h" -#include "furi_hal_resources.h" -#include "furi/check.h" -#include "furi/memmgr.h" -#include "gui/canvas.h" -#include "gui/elements.h" -#include "gui/view.h" -#include "input/input.h" +#include "bubble_animation_view.h" + +#include #include -#include "portmacro.h" -#include +#include +#include +#include +#include +#include #include #include #include -#include "bubble_animation_view.h" -#include +#include #define ACTIVE_SHIFT 2 @@ -43,7 +39,7 @@ struct BubbleAnimationView { static void bubble_animation_activate(BubbleAnimationView* view, bool force); static void bubble_animation_activate_right_now(BubbleAnimationView* view); -static uint8_t bubble_animation_get_icon_index(BubbleAnimationViewModel* model) { +static uint8_t bubble_animation_get_frame_index(BubbleAnimationViewModel* model) { furi_assert(model); uint8_t icon_index = 0; const BubbleAnimation* animation = model->current; @@ -57,7 +53,7 @@ static uint8_t bubble_animation_get_icon_index(BubbleAnimationViewModel* model) } furi_assert(icon_index < (animation->passive_frames + animation->active_frames)); - return icon_index; + return animation->frame_order[icon_index]; } static void bubble_animation_draw_callback(Canvas* canvas, void* model_) { @@ -79,23 +75,26 @@ static void bubble_animation_draw_callback(Canvas* canvas, void* model_) { furi_assert(model->current_frame < 255); - const Icon* icon = animation->icons[bubble_animation_get_icon_index(model)]; - furi_assert(icon); - uint8_t y_offset = canvas_height(canvas) - icon_get_height(icon); - canvas_draw_icon(canvas, 0, y_offset, icon); + uint8_t index = bubble_animation_get_frame_index(model); + uint8_t width = icon_get_width(&animation->icon_animation); + uint8_t height = icon_get_height(&animation->icon_animation); + uint8_t y_offset = canvas_height(canvas) - height; + canvas_draw_bitmap( + canvas, 0, y_offset, width, height, animation->icon_animation.frames[index]); const FrameBubble* bubble = model->current_bubble; if(bubble) { - if((model->current_frame >= bubble->starts_at_frame) && - (model->current_frame <= bubble->ends_at_frame)) { + if((model->current_frame >= bubble->start_frame) && + (model->current_frame <= bubble->end_frame)) { const Bubble* b = &bubble->bubble; - elements_bubble_str(canvas, b->x, b->y, b->str, b->horizontal, b->vertical); + elements_bubble_str(canvas, b->x, b->y, b->text, b->align_h, b->align_v); } } } -static FrameBubble* bubble_animation_pick_bubble(BubbleAnimationViewModel* model, bool active) { - FrameBubble* bubble = NULL; +static const FrameBubble* + bubble_animation_pick_bubble(BubbleAnimationViewModel* model, bool active) { + const FrameBubble* bubble = NULL; if((model->active_bubbles == 0) && (model->passive_bubbles == 0)) { return NULL; @@ -104,10 +103,11 @@ static FrameBubble* bubble_animation_pick_bubble(BubbleAnimationViewModel* model uint8_t index = random() % (active ? model->active_bubbles : model->passive_bubbles); const BubbleAnimation* animation = model->current; - for(int i = 0; i < animation->frame_bubbles_count; ++i) { - if((animation->frame_bubbles[i]->starts_at_frame < animation->passive_frames) ^ active) { + for(int i = 0; i < animation->frame_bubble_sequences_count; ++i) { + if((animation->frame_bubble_sequences[i]->start_frame < animation->passive_frames) ^ + active) { if(!index) { - bubble = animation->frame_bubbles[i]; + bubble = animation->frame_bubble_sequences[i]; } --index; } @@ -135,10 +135,6 @@ static bool bubble_animation_input_callback(InputEvent* event, void* context) { animation_view->interact_callback(animation_view->interact_callback_context); } } - } else if(event->key == InputKeyBack) { - /* Prevent back button to fall down to common handler - leaving - * application, so consume */ - consumed = true; } return consumed; @@ -190,7 +186,7 @@ static void bubble_animation_activate_right_now(BubbleAnimationView* view) { if(model->current && (model->current->active_frames > 0) && (!model->freeze_frame)) { model->current_frame = model->current->passive_frames; model->current_bubble = bubble_animation_pick_bubble(model, true); - frame_rate = model->current->frame_rate; + frame_rate = model->current->icon_animation.frame_rate; } view_commit_model(view->view, true); @@ -222,7 +218,7 @@ static void bubble_animation_next_frame(BubbleAnimationViewModel* model) { } if(model->current_bubble) { - if(model->current_frame > model->current_bubble->ends_at_frame) { + if(model->current_frame > model->current_bubble->end_frame) { model->current_bubble = model->current_bubble->next_bubble; } } @@ -251,7 +247,11 @@ static void bubble_animation_timer_callback(void* context) { } } -static Icon* bubble_animation_clone_frame(const Icon* icon_orig) { +/* always freeze first passive frame, because + * animation is always activated at unfreezing and played + * passive frame first, and 2 frames after - active + */ +static Icon* bubble_animation_clone_first_frame(const Icon* icon_orig) { furi_assert(icon_orig); furi_assert(icon_orig->frames); furi_assert(icon_orig->frames[0]); @@ -268,6 +268,7 @@ static Icon* bubble_animation_clone_frame(const Icon* icon_orig) { size_t max_bitmap_size = ROUND_UP_TO(icon_orig->width, 8) * icon_orig->height + 1; icon_clone->frames[0] = furi_alloc(max_bitmap_size); memcpy((void*)icon_clone->frames[0], icon_orig->frames[0], max_bitmap_size); + FURI_CONST_ASSIGN(icon_clone->frame_count, 1); return icon_clone; } @@ -288,7 +289,7 @@ static void bubble_animation_enter(void* context) { bubble_animation_activate(view, false); BubbleAnimationViewModel* model = view_get_model(view->view); - uint8_t frame_rate = model->current->frame_rate; + uint8_t frame_rate = model->current->icon_animation.frame_rate; view_commit_model(view->view, false); if(frame_rate) { @@ -353,8 +354,8 @@ void bubble_animation_view_set_animation( model->active_ended_at = xTaskGetTickCount() - (model->current->active_cooldown * 1000); model->active_bubbles = 0; model->passive_bubbles = 0; - for(int i = 0; i < new_animation->frame_bubbles_count; ++i) { - if(new_animation->frame_bubbles[i]->starts_at_frame < new_animation->passive_frames) { + for(int i = 0; i < new_animation->frame_bubble_sequences_count; ++i) { + if(new_animation->frame_bubble_sequences[i]->start_frame < new_animation->passive_frames) { ++model->passive_bubbles; } else { ++model->active_bubbles; @@ -367,7 +368,7 @@ void bubble_animation_view_set_animation( model->active_cycle = 0; view_commit_model(view->view, true); - osTimerStart(view->timer, 1000 / new_animation->frame_rate); + osTimerStart(view->timer, 1000 / new_animation->icon_animation.frame_rate); } void bubble_animation_freeze(BubbleAnimationView* view) { @@ -376,12 +377,7 @@ void bubble_animation_freeze(BubbleAnimationView* view) { BubbleAnimationViewModel* model = view_get_model(view->view); furi_assert(model->current); furi_assert(!model->freeze_frame); - /* always freeze first passive frame, because - * animation is always activated at unfreezing and played - * passive frame first, and 2 frames after - active - */ - uint8_t icon_index = 0; - model->freeze_frame = bubble_animation_clone_frame(model->current->icons[icon_index]); + model->freeze_frame = bubble_animation_clone_first_frame(&model->current->icon_animation); model->current = NULL; view_commit_model(view->view, false); osTimerStop(view->timer); @@ -395,8 +391,7 @@ void bubble_animation_unfreeze(BubbleAnimationView* view) { furi_assert(model->freeze_frame); bubble_animation_release_frame(&model->freeze_frame); furi_assert(model->current); - furi_assert(model->current->icons); - frame_rate = model->current->frame_rate; + frame_rate = model->current->icon_animation.frame_rate; view_commit_model(view->view, true); osTimerStart(view->timer, 1000 / frame_rate); diff --git a/applications/desktop/animations/views/one_shot_animation_view.c b/applications/desktop/animations/views/one_shot_animation_view.c new file mode 100644 index 000000000..106cef551 --- /dev/null +++ b/applications/desktop/animations/views/one_shot_animation_view.c @@ -0,0 +1,130 @@ + +#include "one_shot_animation_view.h" +#include +#include +#include +#include +#include +#include + +typedef void (*OneShotInteractCallback)(void*); + +struct OneShotView { + View* view; + TimerHandle_t update_timer; + OneShotInteractCallback interact_callback; + void* interact_callback_context; +}; + +typedef struct { + const Icon* icon; + uint32_t index; + bool block_input; +} OneShotViewModel; + +static void one_shot_view_update_timer_callback(TimerHandle_t xTimer) { + OneShotView* view = (void*)pvTimerGetTimerID(xTimer); + + OneShotViewModel* model = view_get_model(view->view); + if((model->index + 1) < model->icon->frame_count) { + ++model->index; + } else { + model->block_input = false; + model->index = model->icon->frame_count - 2; + } + view_commit_model(view->view, true); +} + +static void one_shot_view_draw(Canvas* canvas, void* model_) { + furi_assert(canvas); + furi_assert(model_); + + OneShotViewModel* model = model_; + furi_check(model->index < model->icon->frame_count); + uint8_t y_offset = canvas_height(canvas) - model->icon->height; + canvas_draw_bitmap( + canvas, + 0, + y_offset, + model->icon->width, + model->icon->height, + model->icon->frames[model->index]); +} + +static bool one_shot_view_input(InputEvent* event, void* context) { + furi_assert(context); + furi_assert(event); + + OneShotView* view = context; + bool consumed = false; + + OneShotViewModel* model = view_get_model(view->view); + consumed = model->block_input; + view_commit_model(view->view, false); + + if(!consumed) { + if(event->key == InputKeyRight) { + /* Right button reserved for animation activation, so consume */ + consumed = true; + if(event->type == InputTypeShort) { + if(view->interact_callback) { + view->interact_callback(view->interact_callback_context); + } + } + } + } + + return consumed; +} + +OneShotView* one_shot_view_alloc(void) { + OneShotView* view = furi_alloc(sizeof(OneShotView)); + view->view = view_alloc(); + view->update_timer = + xTimerCreate("Update timer", 1000, pdTRUE, view, one_shot_view_update_timer_callback); + + view_allocate_model(view->view, ViewModelTypeLocking, sizeof(OneShotViewModel)); + view_set_context(view->view, view); + view_set_draw_callback(view->view, one_shot_view_draw); + view_set_input_callback(view->view, one_shot_view_input); + + return view; +} + +void one_shot_view_free(OneShotView* view) { + furi_assert(view); + + xTimerDelete(view->update_timer, portMAX_DELAY); + view_free(view->view); + view->view = NULL; + free(view); +} + +void one_shot_view_set_interact_callback( + OneShotView* view, + OneShotInteractCallback callback, + void* context) { + furi_assert(view); + + view->interact_callback_context = context; + view->interact_callback = callback; +} + +void one_shot_view_start_animation(OneShotView* view, const Icon* icon) { + furi_assert(view); + furi_assert(icon); + furi_check(icon->frame_count >= 2); + + OneShotViewModel* model = view_get_model(view->view); + model->index = 0; + model->icon = icon; + model->block_input = true; + view_commit_model(view->view, true); + xTimerChangePeriod(view->update_timer, 1000 / model->icon->frame_rate, portMAX_DELAY); +} + +View* one_shot_view_get_view(OneShotView* view) { + furi_assert(view); + + return view->view; +} diff --git a/applications/desktop/animations/views/one_shot_animation_view.h b/applications/desktop/animations/views/one_shot_animation_view.h new file mode 100644 index 000000000..3f78e6036 --- /dev/null +++ b/applications/desktop/animations/views/one_shot_animation_view.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include +#include + +typedef void (*OneShotInteractCallback)(void*); +typedef struct OneShotView OneShotView; + +OneShotView* one_shot_view_alloc(void); +void one_shot_view_free(OneShotView* view); +void one_shot_view_set_interact_callback( + OneShotView* view, + OneShotInteractCallback callback, + void* context); +void one_shot_view_start_animation(OneShotView* view, const Icon* icon); +View* one_shot_view_get_view(OneShotView* view); diff --git a/applications/desktop/desktop.c b/applications/desktop/desktop.c index 171322a97..5d9b7b80a 100644 --- a/applications/desktop/desktop.c +++ b/applications/desktop/desktop.c @@ -1,17 +1,16 @@ -#include "assets_icons.h" -#include "cmsis_os2.h" -#include "desktop/desktop.h" -#include "desktop_i.h" -#include "gui/view_composed.h" -#include -#include -#include -#include "portmacro.h" -#include "storage/filesystem_api_defines.h" -#include "storage/storage.h" -#include -#include #include "animations/animation_manager.h" +#include "desktop/scenes/desktop_scene.h" +#include "desktop/scenes/desktop_scene_i.h" +#include "desktop/views/desktop_locked.h" +#include "desktop_i.h" + +#include +#include +#include +#include +#include +#include +#include static void desktop_lock_icon_callback(Canvas* canvas, void* context) { furi_assert(canvas); @@ -50,44 +49,27 @@ Desktop* desktop_alloc() { view_dispatcher_set_navigation_event_callback( desktop->view_dispatcher, desktop_back_event_callback); - desktop->dolphin_view = animation_manager_get_animation_view(desktop->animation_manager); - - desktop->main_view_composed = view_composed_alloc(); - desktop->main_view = desktop_main_alloc(); - view_composed_tie_views( - desktop->main_view_composed, - desktop->dolphin_view, - desktop_main_get_view(desktop->main_view)); - view_composed_top_enable(desktop->main_view_composed, true); - - desktop->locked_view_composed = view_composed_alloc(); desktop->locked_view = desktop_locked_alloc(); - view_composed_tie_views( - desktop->locked_view_composed, - desktop->dolphin_view, - desktop_locked_get_view(desktop->locked_view)); - view_composed_top_enable(desktop->locked_view_composed, true); - desktop->lock_menu = desktop_lock_menu_alloc(); desktop->debug_view = desktop_debug_alloc(); desktop->first_start_view = desktop_first_start_alloc(); desktop->hw_mismatch_popup = popup_alloc(); desktop->code_input = code_input_alloc(); + desktop->main_view_stack = view_stack_alloc(); + desktop->main_view = desktop_main_alloc(); + View* dolphin_view = animation_manager_get_animation_view(desktop->animation_manager); + view_stack_add_view(desktop->main_view_stack, desktop_main_get_view(desktop->main_view)); + view_stack_add_view(desktop->main_view_stack, dolphin_view); + view_stack_add_view(desktop->main_view_stack, desktop_locked_get_view(desktop->locked_view)); view_dispatcher_add_view( - desktop->view_dispatcher, - DesktopViewMain, - view_composed_get_view(desktop->main_view_composed)); + desktop->view_dispatcher, DesktopViewMain, view_stack_get_view(desktop->main_view_stack)); view_dispatcher_add_view( desktop->view_dispatcher, DesktopViewLockMenu, desktop_lock_menu_get_view(desktop->lock_menu)); view_dispatcher_add_view( desktop->view_dispatcher, DesktopViewDebug, desktop_debug_get_view(desktop->debug_view)); - view_dispatcher_add_view( - desktop->view_dispatcher, - DesktopViewLocked, - view_composed_get_view(desktop->locked_view_composed)); view_dispatcher_add_view( desktop->view_dispatcher, DesktopViewFirstStart, @@ -123,8 +105,8 @@ void desktop_free(Desktop* desktop) { scene_manager_free(desktop->scene_manager); animation_manager_free(desktop->animation_manager); - view_composed_free(desktop->main_view_composed); - view_composed_free(desktop->locked_view_composed); + view_stack_free(desktop->main_view_stack); + view_stack_free(desktop->locked_view_stack); desktop_main_free(desktop->main_view); desktop_lock_menu_free(desktop->lock_menu); desktop_locked_free(desktop->locked_view); @@ -163,15 +145,14 @@ int32_t desktop_srv(void* p) { SAVE_DESKTOP_SETTINGS(&desktop->settings); } - scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock)) { furi_hal_usb_disable(); scene_manager_set_scene_state( - desktop->scene_manager, DesktopSceneLocked, DesktopLockedWithPin); - scene_manager_next_scene(desktop->scene_manager, DesktopSceneLocked); + desktop->scene_manager, DesktopSceneMain, DesktopMainSceneStateLockedWithPin); } + scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); + if(desktop_is_first_start()) { scene_manager_next_scene(desktop->scene_manager, DesktopSceneFirstStart); } diff --git a/applications/desktop/desktop_i.h b/applications/desktop/desktop_i.h index 8d74c00f5..b6d0d9233 100644 --- a/applications/desktop/desktop_i.h +++ b/applications/desktop/desktop_i.h @@ -1,31 +1,21 @@ #pragma once -#include "cmsis_os2.h" #include "desktop.h" - #include "animations/animation_manager.h" -#include "gui/view_composed.h" -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - #include "views/desktop_main.h" #include "views/desktop_first_start.h" #include "views/desktop_lock_menu.h" #include "views/desktop_locked.h" #include "views/desktop_debug.h" - -#include "scenes/desktop_scene.h" #include "desktop/desktop_settings/desktop_settings.h" -#include + +#include +#include +#include +#include +#include +#include +#include #define STATUS_BAR_Y_SHIFT 13 @@ -54,12 +44,11 @@ struct Desktop { DesktopDebugView* debug_view; CodeInput* code_input; - View* dolphin_view; DesktopMainView* main_view; DesktopLockedView* locked_view; - ViewComposed* main_view_composed; - ViewComposed* locked_view_composed; + ViewStack* main_view_stack; + ViewStack* locked_view_stack; DesktopSettings settings; PinCode pincode_buffer; @@ -69,8 +58,6 @@ struct Desktop { AnimationManager* animation_manager; osSemaphoreId_t unload_animation_semaphore; FuriPubSubSubscription* app_start_stop_subscription; - - char* text_buffer; }; Desktop* desktop_alloc(); diff --git a/applications/desktop/desktop_settings/desktop_settings_app.c b/applications/desktop/desktop_settings/desktop_settings_app.c index c8a5f2b72..1c65f58ba 100644 --- a/applications/desktop/desktop_settings/desktop_settings_app.c +++ b/applications/desktop/desktop_settings/desktop_settings_app.c @@ -1,4 +1,6 @@ #include "desktop_settings_app.h" +#include +#include "scenes/desktop_settings_scene.h" static bool desktop_settings_custom_event_callback(void* context, uint32_t event) { furi_assert(context); diff --git a/applications/desktop/desktop_settings/desktop_settings_app.h b/applications/desktop/desktop_settings/desktop_settings_app.h index 8ec8e8928..9c37a1549 100644 --- a/applications/desktop/desktop_settings/desktop_settings_app.h +++ b/applications/desktop/desktop_settings/desktop_settings_app.h @@ -1,8 +1,6 @@ #pragma once -#include #include -#include #include #include #include @@ -10,8 +8,6 @@ #include "desktop_settings.h" -#include "scenes/desktop_settings_scene.h" - typedef enum { CodeEventsSetPin, CodeEventsChangePin, diff --git a/applications/desktop/desktop_settings/scenes/desktop_settings_scene_favorite.c b/applications/desktop/desktop_settings/scenes/desktop_settings_scene_favorite.c index 67d0f2184..b1b576fce 100644 --- a/applications/desktop/desktop_settings/scenes/desktop_settings_scene_favorite.c +++ b/applications/desktop/desktop_settings/scenes/desktop_settings_scene_favorite.c @@ -1,6 +1,6 @@ #include "../desktop_settings_app.h" #include "applications.h" -#include "desktop/desktop_settings/desktop_settings.h" +#include "desktop_settings_scene.h" static void desktop_settings_scene_favorite_submenu_callback(void* context, uint32_t index) { DesktopSettingsApp* app = context; diff --git a/applications/desktop/desktop_settings/scenes/desktop_settings_scene_pincode_input.c b/applications/desktop/desktop_settings/scenes/desktop_settings_scene_pincode_input.c index 70b059a4d..a24551c4d 100644 --- a/applications/desktop/desktop_settings/scenes/desktop_settings_scene_pincode_input.c +++ b/applications/desktop/desktop_settings/scenes/desktop_settings_scene_pincode_input.c @@ -1,5 +1,5 @@ #include "../desktop_settings_app.h" -#include "desktop/desktop_settings/desktop_settings.h" +#include "desktop_settings_scene.h" #define SCENE_EXIT_EVENT (0U) diff --git a/applications/desktop/desktop_settings/scenes/desktop_settings_scene_pincode_menu.c b/applications/desktop/desktop_settings/scenes/desktop_settings_scene_pincode_menu.c index 252d3a51a..9e72f52ae 100644 --- a/applications/desktop/desktop_settings/scenes/desktop_settings_scene_pincode_menu.c +++ b/applications/desktop/desktop_settings/scenes/desktop_settings_scene_pincode_menu.c @@ -1,5 +1,6 @@ #include "../desktop_settings_app.h" #include "applications.h" +#include "desktop_settings_scene.h" static void desktop_settings_scene_pincode_menu_submenu_callback(void* context, uint32_t index) { DesktopSettingsApp* app = context; diff --git a/applications/desktop/desktop_settings/scenes/desktop_settings_scene_start.c b/applications/desktop/desktop_settings/scenes/desktop_settings_scene_start.c old mode 100755 new mode 100644 index 008d908ed..4ea7e0cce --- a/applications/desktop/desktop_settings/scenes/desktop_settings_scene_start.c +++ b/applications/desktop/desktop_settings/scenes/desktop_settings_scene_start.c @@ -1,5 +1,6 @@ #include "../desktop_settings_app.h" #include "applications.h" +#include "desktop_settings_scene.h" enum DesktopSettingsStartSubmenuIndex { DesktopSettingsStartSubmenuIndexFavorite, diff --git a/applications/desktop/scenes/desktop_scene_config.h b/applications/desktop/scenes/desktop_scene_config.h index ba0893aa1..b4e39dd35 100644 --- a/applications/desktop/scenes/desktop_scene_config.h +++ b/applications/desktop/scenes/desktop_scene_config.h @@ -1,6 +1,5 @@ ADD_SCENE(desktop, main, Main) ADD_SCENE(desktop, lock_menu, LockMenu) -ADD_SCENE(desktop, locked, Locked) ADD_SCENE(desktop, debug, Debug) ADD_SCENE(desktop, first_start, FirstStart) ADD_SCENE(desktop, hw_mismatch, HwMismatch) diff --git a/applications/desktop/scenes/desktop_scene_debug.c b/applications/desktop/scenes/desktop_scene_debug.c index 089192835..bf8607f88 100644 --- a/applications/desktop/scenes/desktop_scene_debug.c +++ b/applications/desktop/scenes/desktop_scene_debug.c @@ -1,8 +1,11 @@ -#include "../desktop_i.h" -#include "../views/desktop_debug.h" + #include #include +#include "../desktop_i.h" +#include "../views/desktop_debug.h" +#include "desktop_scene.h" + void desktop_scene_debug_callback(DesktopEvent event, void* context) { Desktop* desktop = (Desktop*)context; view_dispatcher_send_custom_event(desktop->view_dispatcher, event); @@ -31,13 +34,13 @@ bool desktop_scene_debug_on_event(void* context, SceneManagerEvent event) { break; case DesktopDebugEventDeed: - dolphin_deed(dolphin, DolphinDeedIButtonEmulate); + dolphin_deed(dolphin, DolphinDeedIbuttonEmulate); desktop_debug_get_dolphin_data(desktop->debug_view); consumed = true; break; case DesktopDebugEventWrongDeed: - dolphin_deed(dolphin, DolphinDeedWrong); + dolphin_deed(dolphin, DolphinDeedIbuttonRead); desktop_debug_get_dolphin_data(desktop->debug_view); consumed = true; break; diff --git a/applications/desktop/scenes/desktop_scene_fault.c b/applications/desktop/scenes/desktop_scene_fault.c index eec27ec44..a2555e64c 100644 --- a/applications/desktop/scenes/desktop_scene_fault.c +++ b/applications/desktop/scenes/desktop_scene_fault.c @@ -1,3 +1,5 @@ +#include + #include "../desktop_i.h" #define DesktopFaultEventExit 0x00FF00FF diff --git a/applications/desktop/scenes/desktop_scene_first_start.c b/applications/desktop/scenes/desktop_scene_first_start.c index db1b51dcb..8dfc96dcf 100644 --- a/applications/desktop/scenes/desktop_scene_first_start.c +++ b/applications/desktop/scenes/desktop_scene_first_start.c @@ -1,3 +1,6 @@ +#include +#include + #include "../desktop_i.h" #include "../views/desktop_first_start.h" #include "../views/desktop_events.h" diff --git a/applications/desktop/scenes/desktop_scene_hw_mismatch.c b/applications/desktop/scenes/desktop_scene_hw_mismatch.c index 892a0d84e..7ca090b96 100644 --- a/applications/desktop/scenes/desktop_scene_hw_mismatch.c +++ b/applications/desktop/scenes/desktop_scene_hw_mismatch.c @@ -1,6 +1,9 @@ -#include "../desktop_i.h" +#include #include +#include "desktop_scene.h" +#include "../desktop_i.h" + #define HW_MISMATCH_BACK_EVENT (0UL) void desktop_scene_hw_mismatch_callback(void* context) { @@ -11,11 +14,14 @@ void desktop_scene_hw_mismatch_callback(void* context) { void desktop_scene_hw_mismatch_on_enter(void* context) { Desktop* desktop = (Desktop*)context; furi_assert(desktop); - furi_assert(!desktop->text_buffer); Popup* popup = desktop->hw_mismatch_popup; - desktop->text_buffer = furi_alloc(256); + + char* text_buffer = furi_alloc(256); + scene_manager_set_scene_state( + desktop->scene_manager, DesktopSceneHwMismatch, (uint32_t)text_buffer); + snprintf( - desktop->text_buffer, + text_buffer, 256, "HW target: %d\nFW target: %d", furi_hal_version_get_hw_target(), @@ -23,8 +29,7 @@ void desktop_scene_hw_mismatch_on_enter(void* context) { popup_set_context(popup, desktop); popup_set_header( popup, "!!!! HW Mismatch !!!!", 60, 14 + STATUS_BAR_Y_SHIFT, AlignCenter, AlignCenter); - popup_set_text( - popup, desktop->text_buffer, 60, 37 + STATUS_BAR_Y_SHIFT, AlignCenter, AlignCenter); + popup_set_text(popup, text_buffer, 60, 37 + STATUS_BAR_Y_SHIFT, AlignCenter, AlignCenter); popup_set_callback(popup, desktop_scene_hw_mismatch_callback); view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewHwMismatch); } @@ -50,12 +55,13 @@ bool desktop_scene_hw_mismatch_on_event(void* context, SceneManagerEvent event) void desktop_scene_hw_mismatch_on_exit(void* context) { Desktop* desktop = (Desktop*)context; furi_assert(desktop); - furi_assert(desktop->text_buffer); Popup* popup = desktop->hw_mismatch_popup; popup_set_header(popup, NULL, 0, 0, AlignCenter, AlignBottom); popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); popup_set_callback(popup, NULL); popup_set_context(popup, NULL); - free(desktop->text_buffer); - desktop->text_buffer = NULL; + char* text_buffer = + (char*)scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneHwMismatch); + free(text_buffer); + scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneHwMismatch, 0); } diff --git a/applications/desktop/scenes/desktop_scene_i.h b/applications/desktop/scenes/desktop_scene_i.h new file mode 100644 index 000000000..f459eb4ab --- /dev/null +++ b/applications/desktop/scenes/desktop_scene_i.h @@ -0,0 +1,7 @@ +#pragma once + +typedef enum { + DesktopMainSceneStateUnlocked, + DesktopMainSceneStateLockedWithPin, + DesktopMainSceneStateLockedNoPin, +} DesktopMainSceneState; diff --git a/applications/desktop/scenes/desktop_scene_lock_menu.c b/applications/desktop/scenes/desktop_scene_lock_menu.c index 510ccecbb..1c94b83e2 100644 --- a/applications/desktop/scenes/desktop_scene_lock_menu.c +++ b/applications/desktop/scenes/desktop_scene_lock_menu.c @@ -1,8 +1,11 @@ -#include "../desktop_i.h" -#include "../views/desktop_lock_menu.h" #include #include +#include "../desktop_i.h" +#include "../views/desktop_lock_menu.h" +#include "desktop_scene_i.h" +#include "desktop_scene.h" + void desktop_scene_lock_menu_callback(DesktopEvent event, void* context) { Desktop* desktop = (Desktop*)context; view_dispatcher_send_custom_event(desktop->view_dispatcher, event); @@ -26,17 +29,15 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { switch(event.event) { case DesktopLockMenuEventLock: scene_manager_set_scene_state( - desktop->scene_manager, DesktopSceneLocked, DesktopLockedNoPin); - scene_manager_next_scene(desktop->scene_manager, DesktopSceneLocked); + desktop->scene_manager, DesktopSceneMain, DesktopMainSceneStateLockedNoPin); + scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); consumed = true; break; case DesktopLockMenuEventPinLock: if(desktop->settings.pincode.length > 0) { - furi_hal_rtc_set_flag(FuriHalRtcFlagLock); - furi_hal_usb_disable(); scene_manager_set_scene_state( - desktop->scene_manager, DesktopSceneLocked, DesktopLockedWithPin); - scene_manager_next_scene(desktop->scene_manager, DesktopSceneLocked); + desktop->scene_manager, DesktopSceneMain, DesktopMainSceneStateLockedWithPin); + scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); } else { scene_manager_next_scene(desktop->scene_manager, DesktopScenePinSetup); } diff --git a/applications/desktop/scenes/desktop_scene_locked.c b/applications/desktop/scenes/desktop_scene_locked.c deleted file mode 100644 index e6c8aa4bc..000000000 --- a/applications/desktop/scenes/desktop_scene_locked.c +++ /dev/null @@ -1,101 +0,0 @@ -#include "../desktop_i.h" -#include "../views/desktop_locked.h" -#include "desktop/views/desktop_main.h" - -void desktop_scene_locked_callback(DesktopEvent event, void* context) { - Desktop* desktop = (Desktop*)context; - view_dispatcher_send_custom_event(desktop->view_dispatcher, event); -} - -static void desktop_scene_locked_new_idle_animation_callback(void* context) { - furi_assert(context); - Desktop* desktop = context; - view_dispatcher_send_custom_event(desktop->view_dispatcher, DesktopLockedEventCheckAnimation); -} - -void desktop_scene_locked_on_enter(void* context) { - Desktop* desktop = (Desktop*)context; - DesktopLockedView* locked_view = desktop->locked_view; - - animation_manager_set_new_idle_callback( - desktop->animation_manager, desktop_scene_locked_new_idle_animation_callback); - desktop_locked_set_callback(locked_view, desktop_scene_locked_callback, desktop); - desktop_locked_reset_door_pos(locked_view); - desktop_locked_update_hint_timeout(locked_view); - - uint32_t state = scene_manager_get_scene_state(desktop->scene_manager, DesktopViewLocked); - - desktop_locked_with_pin(desktop->locked_view, state == DesktopLockedWithPin); - - view_port_enabled_set(desktop->lock_viewport, true); - osTimerStart(locked_view->timer, osKernelGetTickFreq() / 16); - - view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewLocked); -} - -static bool desktop_scene_locked_check_pin(Desktop* desktop, DesktopEvent event) { - bool match = false; - - size_t length = desktop->pincode_buffer.length; - length = code_input_push(desktop->pincode_buffer.data, length, event); - desktop->pincode_buffer.length = length; - - match = code_input_compare( - desktop->pincode_buffer.data, - length, - desktop->settings.pincode.data, - desktop->settings.pincode.length); - - if(match) { - desktop->pincode_buffer.length = 0; - furi_hal_usb_enable(); - furi_hal_rtc_reset_flag(FuriHalRtcFlagLock); - desktop_main_unlocked(desktop->main_view); - } - - return match; -} - -bool desktop_scene_locked_on_event(void* context, SceneManagerEvent event) { - Desktop* desktop = (Desktop*)context; - - bool consumed = false; - if(event.type == SceneManagerEventTypeCustom) { - switch(event.event) { - case DesktopLockedEventUnlock: - scene_manager_set_scene_state( - desktop->scene_manager, DesktopSceneMain, DesktopMainEventUnlocked); - scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); - consumed = true; - break; - case DesktopLockedEventUpdate: - desktop_locked_manage_redraw(desktop->locked_view); - consumed = true; - break; - case DesktopLockedEventInputReset: - desktop->pincode_buffer.length = 0; - break; - case DesktopLockedEventCheckAnimation: - animation_manager_check_blocking_process(desktop->animation_manager); - consumed = true; - break; - default: - if(desktop_scene_locked_check_pin(desktop, event.event)) { - scene_manager_set_scene_state( - desktop->scene_manager, DesktopSceneMain, DesktopMainEventUnlocked); - scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); - consumed = true; - } - break; - } - } - - return consumed; -} - -void desktop_scene_locked_on_exit(void* context) { - Desktop* desktop = (Desktop*)context; - animation_manager_set_new_idle_callback(desktop->animation_manager, NULL); - desktop_locked_reset_counter(desktop->locked_view); - osTimerStop(desktop->locked_view->timer); -} diff --git a/applications/desktop/scenes/desktop_scene_main.c b/applications/desktop/scenes/desktop_scene_main.c index 08ddf6063..7faa50fe8 100644 --- a/applications/desktop/scenes/desktop_scene_main.c +++ b/applications/desktop/scenes/desktop_scene_main.c @@ -1,17 +1,14 @@ -#include "../desktop_i.h" -#include "../views/desktop_main.h" -#include "applications.h" -#include "assets_icons.h" -#include "cmsis_os2.h" -#include "desktop/desktop.h" -#include "desktop/views/desktop_events.h" -#include "dolphin/dolphin.h" -#include "furi/pubsub.h" -#include "furi/record.h" -#include "furi/thread.h" -#include "storage/storage_glue.h" +#include +#include +#include +#include #include -#include + +#include "desktop/desktop_i.h" +#include "desktop/views/desktop_main.h" +#include "desktop_scene.h" +#include "desktop_scene_i.h" + #define MAIN_VIEW_DEFAULT (0UL) static void desktop_scene_main_app_started_callback(const void* message, void* context) { @@ -81,17 +78,31 @@ void desktop_scene_main_on_enter(void* context) { desktop->animation_manager, desktop_scene_main_check_animation_callback); animation_manager_set_interact_callback( desktop->animation_manager, desktop_scene_main_interact_animation_callback); + desktop_locked_set_callback(desktop->locked_view, desktop_scene_main_callback, desktop); furi_assert(osSemaphoreGetCount(desktop->unload_animation_semaphore) == 0); + Loader* loader = furi_record_open("loader"); desktop->app_start_stop_subscription = furi_pubsub_subscribe( - loader_get_pubsub(), desktop_scene_main_app_started_callback, desktop); + loader_get_pubsub(loader), desktop_scene_main_app_started_callback, desktop); + furi_record_close("loader"); desktop_main_set_callback(main_view, desktop_scene_main_callback, desktop); - view_port_enabled_set(desktop->lock_viewport, false); - if(scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneMain) == - DesktopMainEventUnlocked) { - desktop_main_unlocked(desktop->main_view); + DesktopMainSceneState state = + scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneMain); + if(state == DesktopMainSceneStateLockedNoPin) { + desktop_locked_lock(desktop->locked_view); + view_port_enabled_set(desktop->lock_viewport, true); + } else if(state == DesktopMainSceneStateLockedWithPin) { + LOAD_DESKTOP_SETTINGS(&desktop->settings); + furi_assert(desktop->settings.pincode.length > 0); + desktop_locked_lock_pincode(desktop->locked_view, desktop->settings.pincode); + view_port_enabled_set(desktop->lock_viewport, true); + furi_hal_rtc_set_flag(FuriHalRtcFlagLock); + furi_hal_usb_disable(); + } else { + furi_assert(state == DesktopMainSceneStateUnlocked); + view_port_enabled_set(desktop->lock_viewport, false); } view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewMain); @@ -120,22 +131,22 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { case DesktopMainEventOpenArchive: #ifdef APP_ARCHIVE - animation_manager_unload_and_stall_animation(desktop->animation_manager); desktop_switch_to_app(desktop, &FLIPPER_ARCHIVE); - animation_manager_load_and_continue_animation(desktop->animation_manager); #endif consumed = true; break; case DesktopMainEventOpenFavorite: LOAD_DESKTOP_SETTINGS(&desktop->settings); - animation_manager_unload_and_stall_animation(desktop->animation_manager); if(desktop->settings.favorite < FLIPPER_APPS_COUNT) { - desktop_switch_to_app(desktop, &FLIPPER_APPS[desktop->settings.favorite]); + Loader* loader = furi_record_open("loader"); + LoaderStatus status = + loader_start(loader, FLIPPER_APPS[desktop->settings.favorite].name, NULL); + furi_check(status == LoaderStatusOk); + furi_record_close("loader"); } else { FURI_LOG_E("DesktopSrv", "Can't find favorite application"); } - animation_manager_load_and_continue_animation(desktop->animation_manager); consumed = true; break; @@ -160,6 +171,18 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { animation_manager_load_and_continue_animation(desktop->animation_manager); consumed = true; break; + case DesktopMainEventUnlocked: + consumed = true; + furi_hal_rtc_reset_flag(FuriHalRtcFlagLock); + furi_hal_usb_enable(); + view_port_enabled_set(desktop->lock_viewport, false); + scene_manager_set_scene_state( + desktop->scene_manager, DesktopSceneMain, DesktopMainSceneStateUnlocked); + break; + case DesktopMainEventUpdate: + desktop_locked_update(desktop->locked_view); + consumed = true; + break; default: break; @@ -177,7 +200,9 @@ void desktop_scene_main_on_exit(void* context) { * is finished, that's why we can be sure there is no task waiting * for start/stop semaphore */ - furi_pubsub_unsubscribe(loader_get_pubsub(), desktop->app_start_stop_subscription); + Loader* loader = furi_record_open("loader"); + furi_pubsub_unsubscribe(loader_get_pubsub(loader), desktop->app_start_stop_subscription); + furi_record_close("loader"); furi_assert(osSemaphoreGetCount(desktop->unload_animation_semaphore) == 0); animation_manager_set_new_idle_callback(desktop->animation_manager, NULL); @@ -185,5 +210,4 @@ void desktop_scene_main_on_exit(void* context) { animation_manager_set_interact_callback(desktop->animation_manager, NULL); animation_manager_set_context(desktop->animation_manager, desktop); scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneMain, MAIN_VIEW_DEFAULT); - desktop_main_reset_hint(desktop->main_view); } diff --git a/applications/desktop/views/desktop_debug.c b/applications/desktop/views/desktop_debug.c index 91a32e95b..0d793dcae 100644 --- a/applications/desktop/views/desktop_debug.c +++ b/applications/desktop/views/desktop_debug.c @@ -1,7 +1,9 @@ +#include #include +#include + #include "../desktop_i.h" #include "desktop_debug.h" - #include "dolphin/helpers/dolphin_state.h" #include "dolphin/dolphin.h" diff --git a/applications/desktop/views/desktop_debug.h b/applications/desktop/views/desktop_debug.h index 0faca9319..fecbb2aae 100644 --- a/applications/desktop/views/desktop_debug.h +++ b/applications/desktop/views/desktop_debug.h @@ -1,12 +1,7 @@ #pragma once -#include +#include #include -#include -#include -#include -#include -#include #include "desktop_events.h" typedef struct DesktopDebugView DesktopDebugView; diff --git a/applications/desktop/views/desktop_events.h b/applications/desktop/views/desktop_events.h index 38ee21079..56d9729f4 100644 --- a/applications/desktop/views/desktop_events.h +++ b/applications/desktop/views/desktop_events.h @@ -6,6 +6,7 @@ typedef enum { DesktopMainEventOpenFavorite, DesktopMainEventOpenMenu, DesktopMainEventOpenDebug, + DesktopMainEventUpdate, DesktopMainEventUnlocked, DesktopMainEventRightShort, DesktopMainEventCheckAnimation, @@ -14,8 +15,6 @@ typedef enum { DesktopMainEventBeforeAppStarted, DesktopMainEventAfterAppFinished, DesktopLockedEventUnlock, - DesktopLockedEventUpdate, - DesktopLockedEventInputReset, DesktopLockedEventCheckAnimation, DesktopLockedEventMax, DesktopDebugEventDeed, diff --git a/applications/desktop/views/desktop_first_start.c b/applications/desktop/views/desktop_first_start.c index 21901c954..c0ef3a5f4 100644 --- a/applications/desktop/views/desktop_first_start.c +++ b/applications/desktop/views/desktop_first_start.c @@ -1,4 +1,6 @@ #include +#include +#include #include "../desktop_i.h" #include "desktop_first_start.h" diff --git a/applications/desktop/views/desktop_first_start.h b/applications/desktop/views/desktop_first_start.h index 10414f2eb..9b7b3c93d 100644 --- a/applications/desktop/views/desktop_first_start.h +++ b/applications/desktop/views/desktop_first_start.h @@ -1,10 +1,7 @@ #pragma once -#include #include -#include -#include -#include + #include "desktop_events.h" typedef struct DesktopFirstStartView DesktopFirstStartView; diff --git a/applications/desktop/views/desktop_lock_menu.c b/applications/desktop/views/desktop_lock_menu.c index a9794417f..ad8a0a3f0 100644 --- a/applications/desktop/views/desktop_lock_menu.c +++ b/applications/desktop/views/desktop_lock_menu.c @@ -1,4 +1,6 @@ #include +#include + #include "../desktop_i.h" #include "desktop_lock_menu.h" diff --git a/applications/desktop/views/desktop_lock_menu.h b/applications/desktop/views/desktop_lock_menu.h index 3b0fffcc5..80854520e 100644 --- a/applications/desktop/views/desktop_lock_menu.h +++ b/applications/desktop/views/desktop_lock_menu.h @@ -1,10 +1,6 @@ #pragma once -#include #include -#include -#include -#include #include "desktop_events.h" #define HINT_TIMEOUT 2 diff --git a/applications/desktop/views/desktop_locked.c b/applications/desktop/views/desktop_locked.c index 5a9e7203a..bbb9978a7 100644 --- a/applications/desktop/views/desktop_locked.c +++ b/applications/desktop/views/desktop_locked.c @@ -1,6 +1,42 @@ +#include "desktop/desktop_settings/desktop_settings.h" +#include "furi/check.h" +#include "gui/view.h" +#include "portmacro.h" #include +#include +#include #include "../desktop_i.h" #include "desktop_locked.h" +#include + +#define DOOR_MOVING_INTERVAL_MS (1000 / 16) +#define UNLOCKED_HINT_TIMEOUT_MS (2000) + +struct DesktopLockedView { + View* view; + DesktopLockedViewCallback callback; + void* context; + + TimerHandle_t timer; + uint8_t lock_count; + uint32_t lock_lastpress; + + PinCode pincode; + PinCode pincode_input; +}; + +typedef struct { + uint32_t hint_icon_expire_at; + bool unlocked_hint; + bool locked; + bool pin_locked; + + int8_t door_left_x; + int8_t door_right_x; + bool animation_seq_end; +} DesktopLockedViewModel; + +static void desktop_locked_unlock(DesktopLockedView* locked_view); void desktop_locked_set_callback( DesktopLockedView* locked_view, @@ -12,98 +48,69 @@ void desktop_locked_set_callback( locked_view->context = context; } -void locked_view_timer_callback(void* context) { - DesktopLockedView* locked_view = context; - locked_view->callback(DesktopLockedEventUpdate, locked_view->context); +void locked_view_timer_callback(TimerHandle_t timer) { + DesktopLockedView* locked_view = pvTimerGetTimerID(timer); + locked_view->callback(DesktopMainEventUpdate, locked_view->context); } -void desktop_locked_update_hint_timeout(DesktopLockedView* locked_view) { - with_view_model( - locked_view->view, (DesktopLockedViewModel * model) { - model->hint_expire_at = osKernelGetTickCount() + osKernelGetTickFreq(); - return true; - }); +static void desktop_locked_update_hint_icon_timeout(DesktopLockedView* locked_view) { + DesktopLockedViewModel* model = view_get_model(locked_view->view); + model->hint_icon_expire_at = osKernelGetTickCount() + osKernelGetTickFreq(); + view_commit_model(locked_view->view, true); } -void desktop_locked_reset_door_pos(DesktopLockedView* locked_view) { - with_view_model( - locked_view->view, (DesktopLockedViewModel * model) { - model->animation_seq_end = false; - model->door_left_x = DOOR_L_POS; - model->door_right_x = DOOR_R_POS; - return true; - }); +static void desktop_locked_reset_door_pos(DesktopLockedView* locked_view) { + DesktopLockedViewModel* model = view_get_model(locked_view->view); + model->animation_seq_end = false; + model->door_left_x = DOOR_L_POS; + model->door_right_x = DOOR_R_POS; + view_commit_model(locked_view->view, true); } -void desktop_locked_manage_redraw(DesktopLockedView* locked_view) { - bool animation_seq_end; +void desktop_locked_update(DesktopLockedView* locked_view) { + bool stop_timer = false; - with_view_model( - locked_view->view, (DesktopLockedViewModel * model) { - model->animation_seq_end = !model->door_left_x; - animation_seq_end = model->animation_seq_end; + DesktopLockedViewModel* model = view_get_model(locked_view->view); + if(model->locked) { + if(model->door_left_x != DOOR_L_POS_MAX) { + model->door_left_x = CLAMP(model->door_left_x + 5, DOOR_L_POS_MAX, DOOR_L_POS); + model->door_right_x = CLAMP(model->door_right_x - 5, DOOR_R_POS, DOOR_R_POS_MIN); + } else { + model->animation_seq_end = true; + } + stop_timer = model->animation_seq_end; + } else { + model->unlocked_hint = false; + stop_timer = true; + } + view_commit_model(locked_view->view, true); - if(!model->animation_seq_end) { - model->door_left_x = CLAMP(model->door_left_x + 5, DOOR_L_POS_MAX, DOOR_L_POS); - model->door_right_x = CLAMP(model->door_right_x - 5, DOOR_R_POS, DOOR_R_POS_MIN); - } else { - model->hint_expire_at = !model->hint_expire_at; - } - - return true; - }); - - if(animation_seq_end) { - osTimerStop(locked_view->timer); + if(stop_timer) { + xTimerStop(locked_view->timer, portMAX_DELAY); } } -void desktop_locked_reset_counter(DesktopLockedView* locked_view) { - locked_view->lock_count = 0; - locked_view->lock_lastpress = 0; - - with_view_model( - locked_view->view, (DesktopLockedViewModel * model) { - model->hint_expire_at = 0; - return true; - }); -} - -void desktop_locked_with_pin(DesktopLockedView* locked_view, bool locked) { - with_view_model( - locked_view->view, (DesktopLockedViewModel * model) { - model->pin_lock = locked; - return true; - }); -} - -void desktop_locked_render(Canvas* canvas, void* model) { +void desktop_locked_draw(Canvas* canvas, void* model) { DesktopLockedViewModel* m = model; uint32_t now = osKernelGetTickCount(); canvas_set_color(canvas, ColorBlack); - if(!m->animation_seq_end) { - canvas_draw_icon(canvas, m->door_left_x, 0 + STATUS_BAR_Y_SHIFT, &I_DoorLeft_70x55); - canvas_draw_icon(canvas, m->door_right_x, 0 + STATUS_BAR_Y_SHIFT, &I_DoorRight_70x55); - } - - if(m->animation && m->animation_seq_end) { - if(m->status_bar_background_black) { - canvas_draw_box(canvas, 0, 0, GUI_STATUS_BAR_WIDTH, GUI_STATUS_BAR_HEIGHT); - } - canvas_draw_icon_animation(canvas, 0, 0 + STATUS_BAR_Y_SHIFT, m->animation); - } - - if(now < m->hint_expire_at) { + if(m->locked) { if(!m->animation_seq_end) { + canvas_draw_icon(canvas, m->door_left_x, 0 + STATUS_BAR_Y_SHIFT, &I_DoorLeft_70x55); + canvas_draw_icon(canvas, m->door_right_x, 0 + STATUS_BAR_Y_SHIFT, &I_DoorRight_70x55); canvas_set_font(canvas, FontPrimary); elements_multiline_text_framed(canvas, 42, 30 + STATUS_BAR_Y_SHIFT, "Locked"); - - } else if(!m->pin_lock) { + } else if((now < m->hint_icon_expire_at) && !m->pin_locked) { canvas_set_font(canvas, FontSecondary); canvas_draw_icon(canvas, 13, 2 + STATUS_BAR_Y_SHIFT, &I_LockPopup_100x49); elements_multiline_text(canvas, 65, 20 + STATUS_BAR_Y_SHIFT, "To unlock\npress:"); } + } else { + if(m->unlocked_hint) { + canvas_set_font(canvas, FontPrimary); + elements_multiline_text_framed(canvas, 42, 30 + STATUS_BAR_Y_SHIFT, "Unlocked"); + } } } @@ -116,85 +123,72 @@ bool desktop_locked_input(InputEvent* event, void* context) { furi_assert(event); furi_assert(context); DesktopLockedView* locked_view = context; - - uint32_t press_time = 0; + bool locked = false; bool locked_with_pin = false; + uint32_t press_time = xTaskGetTickCount(); - with_view_model( - locked_view->view, (DesktopLockedViewModel * model) { - locked_with_pin = model->pin_lock; - return false; - }); - - if(event->type == InputTypeShort) { - if(locked_with_pin) { - press_time = osKernelGetTickCount(); - - if(press_time - locked_view->lock_lastpress > UNLOCK_RST_TIMEOUT * 3) { - locked_view->lock_lastpress = press_time; - locked_view->callback(DesktopLockedEventInputReset, locked_view->context); - } - - locked_view->callback(event->key, locked_view->context); - } else { - desktop_locked_update_hint_timeout(locked_view); - - if(event->key == InputKeyBack) { - press_time = osKernelGetTickCount(); - // check if pressed sequentially - if(press_time - locked_view->lock_lastpress < UNLOCK_RST_TIMEOUT) { - locked_view->lock_lastpress = press_time; - locked_view->lock_count++; - } - - if(locked_view->lock_count == UNLOCK_CNT) { - locked_view->lock_count = 0; - locked_view->callback(DesktopLockedEventUnlock, locked_view->context); - } - } + { + DesktopLockedViewModel* model = view_get_model(locked_view->view); + bool changed = false; + locked = model->locked; + locked_with_pin = model->pin_locked; + if(!locked && model->unlocked_hint && event->type == InputTypePress) { + model->unlocked_hint = false; + changed = true; } + view_commit_model(locked_view->view, changed); + } - if(press_time - locked_view->lock_lastpress > UNLOCK_RST_TIMEOUT) { + if(!locked || (event->type != InputTypeShort)) { + return locked; + } + + if(press_time - locked_view->lock_lastpress > UNLOCK_RST_TIMEOUT) { + locked_view->lock_lastpress = press_time; + locked_view->lock_count = 0; + locked_view->pincode_input.length = 0; + } + + if(locked_with_pin) { + locked_view->pincode_input.length = code_input_push( + locked_view->pincode_input.data, locked_view->pincode_input.length, event->key); + bool match = code_input_compare( + locked_view->pincode_input.data, + locked_view->pincode_input.length, + locked_view->pincode.data, + locked_view->pincode.length); + + if(match) { + desktop_locked_unlock(locked_view); + } + } else { + if(event->key == InputKeyBack) { locked_view->lock_lastpress = press_time; + locked_view->lock_count++; + if(locked_view->lock_count == UNLOCK_CNT) { + desktop_locked_unlock(locked_view); + } + } else { + desktop_locked_update_hint_icon_timeout(locked_view); locked_view->lock_count = 0; } } - // All events consumed - return true; -} -void desktop_locked_enter(void* context) { - DesktopLockedView* locked_view = context; + locked_view->lock_lastpress = press_time; - with_view_model( - locked_view->view, (DesktopLockedViewModel * model) { - if(model->animation) icon_animation_start(model->animation); - return false; - }); -} - -void desktop_locked_exit(void* context) { - DesktopLockedView* locked_view = context; - - with_view_model( - locked_view->view, (DesktopLockedViewModel * model) { - if(model->animation) icon_animation_stop(model->animation); - return false; - }); + return locked; } DesktopLockedView* desktop_locked_alloc() { DesktopLockedView* locked_view = furi_alloc(sizeof(DesktopLockedView)); locked_view->view = view_alloc(); locked_view->timer = - osTimerNew(locked_view_timer_callback, osTimerPeriodic, locked_view, NULL); + xTimerCreate("Locked view", 1000 / 16, pdTRUE, locked_view, locked_view_timer_callback); view_allocate_model(locked_view->view, ViewModelTypeLocking, sizeof(DesktopLockedViewModel)); view_set_context(locked_view->view, locked_view); - view_set_draw_callback(locked_view->view, (ViewDrawCallback)desktop_locked_render); + view_set_draw_callback(locked_view->view, (ViewDrawCallback)desktop_locked_draw); view_set_input_callback(locked_view->view, desktop_locked_input); - view_set_enter_callback(locked_view->view, desktop_locked_enter); - view_set_exit_callback(locked_view->view, desktop_locked_exit); return locked_view; } @@ -205,3 +199,37 @@ void desktop_locked_free(DesktopLockedView* locked_view) { view_free(locked_view->view); free(locked_view); } + +void desktop_locked_lock(DesktopLockedView* locked_view) { + locked_view->pincode.length = 0; + DesktopLockedViewModel* model = view_get_model(locked_view->view); + model->locked = true; + model->pin_locked = false; + view_commit_model(locked_view->view, true); + desktop_locked_reset_door_pos(locked_view); + xTimerChangePeriod(locked_view->timer, DOOR_MOVING_INTERVAL_MS, portMAX_DELAY); +} + +void desktop_locked_lock_pincode(DesktopLockedView* locked_view, PinCode pincode) { + locked_view->pincode = pincode; + locked_view->pincode_input.length = 0; + DesktopLockedViewModel* model = view_get_model(locked_view->view); + model->locked = true; + model->pin_locked = true; + view_commit_model(locked_view->view, true); + desktop_locked_reset_door_pos(locked_view); + xTimerChangePeriod(locked_view->timer, DOOR_MOVING_INTERVAL_MS, portMAX_DELAY); +} + +static void desktop_locked_unlock(DesktopLockedView* locked_view) { + furi_assert(locked_view); + + locked_view->lock_count = 0; + DesktopLockedViewModel* model = view_get_model(locked_view->view); + model->locked = false; + model->pin_locked = false; + model->unlocked_hint = true; + view_commit_model(locked_view->view, true); + locked_view->callback(DesktopMainEventUnlocked, locked_view->context); + xTimerChangePeriod(locked_view->timer, UNLOCKED_HINT_TIMEOUT_MS, portMAX_DELAY); +} diff --git a/applications/desktop/views/desktop_locked.h b/applications/desktop/views/desktop_locked.h index 81b75ef76..61e91e4ec 100644 --- a/applications/desktop/views/desktop_locked.h +++ b/applications/desktop/views/desktop_locked.h @@ -1,14 +1,11 @@ #pragma once -#include +#include #include -#include -#include -#include #include "desktop_events.h" #define UNLOCK_RST_TIMEOUT 300 -#define UNLOCK_CNT 2 // 3 actually +#define UNLOCK_CNT 3 #define DOOR_L_POS -57 #define DOOR_L_POS_MAX 0 @@ -24,40 +21,16 @@ typedef struct DesktopLockedView DesktopLockedView; typedef void (*DesktopLockedViewCallback)(DesktopEvent event, void* context); -struct DesktopLockedView { - View* view; - DesktopLockedViewCallback callback; - void* context; - - osTimerId_t timer; - uint8_t lock_count; - uint32_t lock_lastpress; -}; - -typedef struct { - IconAnimation* animation; - uint32_t hint_expire_at; - - bool status_bar_background_black; - uint8_t scene_num; - int8_t door_left_x; - int8_t door_right_x; - bool animation_seq_end; - - bool pin_lock; -} DesktopLockedViewModel; - void desktop_locked_set_callback( DesktopLockedView* locked_view, DesktopLockedViewCallback callback, void* context); -void desktop_locked_update_hint_timeout(DesktopLockedView* locked_view); -void desktop_locked_reset_counter(DesktopLockedView* locked_view); -void desktop_locked_reset_door_pos(DesktopLockedView* locked_view); -void desktop_locked_manage_redraw(DesktopLockedView* locked_view); +void desktop_locked_update(DesktopLockedView* locked_view); View* desktop_locked_get_view(DesktopLockedView* locked_view); DesktopLockedView* desktop_locked_alloc(); void desktop_locked_free(DesktopLockedView* locked_view); -void desktop_locked_with_pin(DesktopLockedView* lock_menu, bool locked); + +void desktop_locked_lock_pincode(DesktopLockedView* locked_view, PinCode pincode); +void desktop_locked_lock(DesktopLockedView* locked_view); diff --git a/applications/desktop/views/desktop_main.c b/applications/desktop/views/desktop_main.c index 5da12d102..b03381b91 100644 --- a/applications/desktop/views/desktop_main.c +++ b/applications/desktop/views/desktop_main.c @@ -1,13 +1,19 @@ -#include "dolphin/dolphin.h" -#include "furi/record.h" -#include "gui/canvas.h" -#include "gui/view.h" -#include "gui/view_composed.h" -#include "input/input.h" +#include +#include +#include +#include #include +#include +#include + #include "../desktop_i.h" #include "desktop_main.h" -//#include "../animations/views/bubble_animation_view.h" + +struct DesktopMainView { + View* view; + DesktopMainViewCallback callback; + void* context; +}; void desktop_main_set_callback( DesktopMainView* main_view, @@ -19,59 +25,6 @@ void desktop_main_set_callback( main_view->context = context; } -void desktop_main_reset_hint(DesktopMainView* main_view) { - with_view_model( - main_view->view, (DesktopMainViewModel * model) { - model->hint_expire_at = 0; - return true; - }); -} - -void desktop_main_switch_dolphin_animation( - DesktopMainView* main_view, - const Icon* icon, - bool status_bar_background_black) { - with_view_model( - main_view->view, (DesktopMainViewModel * model) { - if(model->animation) icon_animation_free(model->animation); - model->animation = icon_animation_alloc(icon); - view_tie_icon_animation(main_view->view, model->animation); - icon_animation_start(model->animation); - model->icon = NULL; - model->status_bar_background_black = status_bar_background_black; - return true; - }); -} - -void desktop_main_switch_dolphin_icon(DesktopMainView* main_view, const Icon* icon) { - with_view_model( - main_view->view, (DesktopMainViewModel * model) { - if(model->animation) icon_animation_free(model->animation); - model->animation = NULL; - model->icon = icon; - return true; - }); -} - -void desktop_main_render(Canvas* canvas, void* model) { - DesktopMainViewModel* m = model; - uint32_t now = osKernelGetTickCount(); - - if(m->status_bar_background_black) { - canvas_draw_box(canvas, 0, 0, GUI_STATUS_BAR_WIDTH, GUI_STATUS_BAR_HEIGHT); - } - if(m->icon) { - canvas_draw_icon(canvas, 0, 0 + STATUS_BAR_Y_SHIFT, m->icon); - } else if(m->animation) { - canvas_draw_icon_animation(canvas, 0, 0 + STATUS_BAR_Y_SHIFT, m->animation); - } - - if(now < m->hint_expire_at) { - canvas_set_font(canvas, FontPrimary); - elements_multiline_text_framed(canvas, 42, 30 + STATUS_BAR_Y_SHIFT, "Unlocked"); - } -} - View* desktop_main_get_view(DesktopMainView* main_view) { furi_assert(main_view); return main_view->view; @@ -100,40 +53,16 @@ bool desktop_main_input(InputEvent* event, void* context) { consumed = true; } - desktop_main_reset_hint(main_view); - return consumed; } -void desktop_main_enter(void* context) { - DesktopMainView* main_view = context; - - with_view_model( - main_view->view, (DesktopMainViewModel * model) { - if(model->animation) icon_animation_start(model->animation); - return false; - }); -} - -void desktop_main_exit(void* context) { - DesktopMainView* main_view = context; - with_view_model( - main_view->view, (DesktopMainViewModel * model) { - if(model->animation) icon_animation_stop(model->animation); - return false; - }); -} - DesktopMainView* desktop_main_alloc() { DesktopMainView* main_view = furi_alloc(sizeof(DesktopMainView)); main_view->view = view_alloc(); - view_allocate_model(main_view->view, ViewModelTypeLocking, sizeof(DesktopMainViewModel)); + view_allocate_model(main_view->view, ViewModelTypeLockFree, 1); view_set_context(main_view->view, main_view); - view_set_draw_callback(main_view->view, (ViewDrawCallback)desktop_main_render); view_set_input_callback(main_view->view, desktop_main_input); - view_set_enter_callback(main_view->view, desktop_main_enter); - view_set_exit_callback(main_view->view, desktop_main_exit); return main_view; } @@ -143,11 +72,3 @@ void desktop_main_free(DesktopMainView* main_view) { view_free(main_view->view); free(main_view); } - -void desktop_main_unlocked(DesktopMainView* main_view) { - with_view_model( - main_view->view, (DesktopMainViewModel * model) { - model->hint_expire_at = osKernelGetTickCount() + osKernelGetTickFreq(); - return true; - }); -} diff --git a/applications/desktop/views/desktop_main.h b/applications/desktop/views/desktop_main.h index ea805507a..329d95486 100644 --- a/applications/desktop/views/desktop_main.h +++ b/applications/desktop/views/desktop_main.h @@ -1,31 +1,12 @@ #pragma once -#include "gui/view_composed.h" -#include #include -#include -#include -#include #include "desktop_events.h" typedef struct DesktopMainView DesktopMainView; typedef void (*DesktopMainViewCallback)(DesktopEvent event, void* context); -struct DesktopMainView { - View* view; - DesktopMainViewCallback callback; - void* context; -}; - -typedef struct { - IconAnimation* animation; - const Icon* icon; - uint8_t scene_num; - bool status_bar_background_black; - uint32_t hint_expire_at; -} DesktopMainViewModel; - void desktop_main_set_callback( DesktopMainView* main_view, DesktopMainViewCallback callback, @@ -34,10 +15,3 @@ void desktop_main_set_callback( View* desktop_main_get_view(DesktopMainView* main_view); DesktopMainView* desktop_main_alloc(); void desktop_main_free(DesktopMainView* main_view); -void desktop_main_switch_dolphin_animation( - DesktopMainView* main_view, - const Icon* icon, - bool status_bar_background_black); -void desktop_main_unlocked(DesktopMainView* main_view); -void desktop_main_reset_hint(DesktopMainView* main_view); -void desktop_main_switch_dolphin_icon(DesktopMainView* main_view, const Icon* icon); diff --git a/applications/dolphin/dolphin.c b/applications/dolphin/dolphin.c index b401a2172..2213ebb98 100644 --- a/applications/dolphin/dolphin.c +++ b/applications/dolphin/dolphin.c @@ -1,13 +1,18 @@ #include "dolphin/dolphin.h" -#include "desktop/desktop.h" #include "dolphin/helpers/dolphin_state.h" #include "dolphin_i.h" -#include "furi/pubsub.h" -#include "sys/_stdint.h" +#include "portmacro.h" +#include "projdefs.h" +#include +#include #include -#define DOLPHIN_TIMEGATE 86400 // one day #define DOLPHIN_LOCK_EVENT_FLAG (0x1) +#define TAG "Dolphin" +#define HOURS_IN_TICKS(x) ((x)*60 * 60 * 1000) + +static void dolphin_update_clear_limits_timer_period(Dolphin* dolphin); + void dolphin_deed(Dolphin* dolphin, DolphinDeed deed) { furi_assert(dolphin); DolphinEvent event; @@ -39,12 +44,51 @@ void dolphin_flush(Dolphin* dolphin) { dolphin_event_send_wait(dolphin, &event); } +void dolphin_butthurt_timer_callback(TimerHandle_t xTimer) { + Dolphin* dolphin = pvTimerGetTimerID(xTimer); + furi_assert(dolphin); + + DolphinEvent event; + event.type = DolphinEventTypeIncreaseButthurt; + dolphin_event_send_async(dolphin, &event); +} + +void dolphin_flush_timer_callback(TimerHandle_t xTimer) { + Dolphin* dolphin = pvTimerGetTimerID(xTimer); + furi_assert(dolphin); + + DolphinEvent event; + event.type = DolphinEventTypeFlush; + dolphin_event_send_async(dolphin, &event); +} + +void dolphin_clear_limits_timer_callback(TimerHandle_t xTimer) { + Dolphin* dolphin = pvTimerGetTimerID(xTimer); + furi_assert(dolphin); + + xTimerChangePeriod(dolphin->clear_limits_timer, HOURS_IN_TICKS(24), portMAX_DELAY); + + DolphinEvent event; + event.type = DolphinEventTypeClearLimits; + dolphin_event_send_async(dolphin, &event); +} + Dolphin* dolphin_alloc() { Dolphin* dolphin = furi_alloc(sizeof(Dolphin)); dolphin->state = dolphin_state_alloc(); dolphin->event_queue = osMessageQueueNew(8, sizeof(DolphinEvent), NULL); dolphin->pubsub = furi_pubsub_alloc(); + dolphin->butthurt_timer = xTimerCreate( + "Butthurt timer", HOURS_IN_TICKS(2 * 24), pdTRUE, dolphin, dolphin_butthurt_timer_callback); + dolphin->flush_timer = + xTimerCreate("Flush timer", 30 * 1000, pdFALSE, dolphin, dolphin_flush_timer_callback); + dolphin->clear_limits_timer = xTimerCreate( + "Clear limits timer", + HOURS_IN_TICKS(24), + pdTRUE, + dolphin, + dolphin_clear_limits_timer_callback); return dolphin; } @@ -83,50 +127,72 @@ void dolphin_event_release(Dolphin* dolphin, DolphinEvent* event) { } } -static void dolphin_check_butthurt(DolphinState* state) { - furi_assert(state); - float diff_time = difftime(state->data.timestamp, dolphin_state_timestamp()); - - if((fabs(diff_time)) > DOLPHIN_TIMEGATE) { - dolphin_state_butthurted(state); - } -} - FuriPubSub* dolphin_get_pubsub(Dolphin* dolphin) { return dolphin->pubsub; } +static void dolphin_update_clear_limits_timer_period(Dolphin* dolphin) { + furi_assert(dolphin); + TickType_t now_ticks = xTaskGetTickCount(); + TickType_t timer_expires_at = xTimerGetExpiryTime(dolphin->clear_limits_timer); + + if((timer_expires_at - now_ticks) > HOURS_IN_TICKS(0.1)) { + FuriHalRtcDateTime date; + furi_hal_rtc_get_datetime(&date); + TickType_t now_time_in_ms = ((date.hour * 60 + date.minute) * 60 + date.second) * 1000; + TickType_t time_to_clear_limits = 0; + + if(date.hour < 5) { + time_to_clear_limits = HOURS_IN_TICKS(5) - now_time_in_ms; + } else { + time_to_clear_limits = HOURS_IN_TICKS(24 + 5) - now_time_in_ms; + } + + xTimerChangePeriod(dolphin->clear_limits_timer, time_to_clear_limits, portMAX_DELAY); + } +} + int32_t dolphin_srv(void* p) { Dolphin* dolphin = dolphin_alloc(); furi_record_create("dolphin", dolphin); dolphin_state_load(dolphin->state); + xTimerReset(dolphin->butthurt_timer, portMAX_DELAY); + dolphin_update_clear_limits_timer_period(dolphin); + xTimerReset(dolphin->clear_limits_timer, portMAX_DELAY); DolphinEvent event; while(1) { - if(osMessageQueueGet(dolphin->event_queue, &event, NULL, 60000) == osOK) { + if(osMessageQueueGet(dolphin->event_queue, &event, NULL, HOURS_IN_TICKS(1)) == osOK) { if(event.type == DolphinEventTypeDeed) { - if(dolphin_state_on_deed(dolphin->state, event.deed)) { - DolphinPubsubEvent event = DolphinPubsubEventUpdate; - furi_pubsub_publish(dolphin->pubsub, &event); - } + dolphin_state_on_deed(dolphin->state, event.deed); + DolphinPubsubEvent event = DolphinPubsubEventUpdate; + furi_pubsub_publish(dolphin->pubsub, &event); + xTimerReset(dolphin->butthurt_timer, portMAX_DELAY); + xTimerReset(dolphin->flush_timer, portMAX_DELAY); } else if(event.type == DolphinEventTypeStats) { - // TODO: correct icounter/butthurt changing, stub till then - event.stats->icounter = 0; - event.stats->butthurt = 0; + event.stats->icounter = dolphin->state->data.icounter; + event.stats->butthurt = dolphin->state->data.butthurt; event.stats->timestamp = dolphin->state->data.timestamp; - event.stats->level = 1; - event.stats->level_up_is_pending = 0; + event.stats->level = dolphin_get_level(dolphin->state->data.icounter); + event.stats->level_up_is_pending = + !dolphin_state_xp_to_levelup(dolphin->state->data.icounter); } else if(event.type == DolphinEventTypeFlush) { - // TODO: correct icounter/butthurt changing, stub till then - dolphin->state->data.butthurt = 0; - dolphin->state->data.icounter = 0; + FURI_LOG_I(TAG, "Flush stats"); + dolphin_state_save(dolphin->state); + } else if(event.type == DolphinEventTypeClearLimits) { + FURI_LOG_I(TAG, "Clear limits"); + dolphin_state_clear_limits(dolphin->state); + dolphin_state_save(dolphin->state); + } else if(event.type == DolphinEventTypeIncreaseButthurt) { + FURI_LOG_I(TAG, "Increase butthurt"); + dolphin_state_butthurted(dolphin->state); dolphin_state_save(dolphin->state); } dolphin_event_release(dolphin, &event); } else { - dolphin_check_butthurt(dolphin->state); - dolphin_state_save(dolphin->state); + /* once per hour check rtc time is not changed */ + dolphin_update_clear_limits_timer_period(dolphin); } } diff --git a/applications/dolphin/dolphin.h b/applications/dolphin/dolphin.h index 150b2de91..ca3bb4b34 100644 --- a/applications/dolphin/dolphin.h +++ b/applications/dolphin/dolphin.h @@ -5,6 +5,10 @@ #include "helpers/dolphin_deed.h" #include +#ifdef __cplusplus +extern "C" { +#endif + typedef struct Dolphin Dolphin; typedef struct { @@ -19,6 +23,13 @@ typedef enum { DolphinPubsubEventUpdate, } DolphinPubsubEvent; +#define DOLPHIN_DEED(deed) \ + do { \ + Dolphin* dolphin = (Dolphin*)furi_record_open("dolphin"); \ + dolphin_deed(dolphin, deed); \ + furi_record_close("dolphin"); \ + } while(0) + /** Deed complete notification. Call it on deed completion. * See dolphin_deed.h for available deeds. In futures it will become part of assets. * Thread safe, async @@ -38,3 +49,7 @@ void dolphin_flush(Dolphin* dolphin); void dolphin_upgrade_level(Dolphin* dolphin); FuriPubSub* dolphin_get_pubsub(Dolphin* dolphin); + +#ifdef __cplusplus +} +#endif diff --git a/applications/dolphin/dolphin_i.h b/applications/dolphin/dolphin_i.h index 1e7614369..46f149155 100644 --- a/applications/dolphin/dolphin_i.h +++ b/applications/dolphin/dolphin_i.h @@ -11,9 +11,8 @@ typedef enum { DolphinEventTypeDeed, DolphinEventTypeStats, DolphinEventTypeFlush, - DolphinEventTypeAnimationStartNewIdle, - DolphinEventTypeAnimationCheckBlocking, - DolphinEventTypeAnimationInteract, + DolphinEventTypeIncreaseButthurt, + DolphinEventTypeClearLimits, } DolphinEventType; typedef struct { @@ -31,6 +30,9 @@ struct Dolphin { // Queue osMessageQueueId_t event_queue; FuriPubSub* pubsub; + TimerHandle_t butthurt_timer; + TimerHandle_t flush_timer; + TimerHandle_t clear_limits_timer; }; Dolphin* dolphin_alloc(); diff --git a/applications/dolphin/helpers/dolphin_deed.c b/applications/dolphin/helpers/dolphin_deed.c index c7b2305e6..b112d82a1 100644 --- a/applications/dolphin/helpers/dolphin_deed.c +++ b/applications/dolphin/helpers/dolphin_deed.c @@ -1,14 +1,65 @@ #include "dolphin_deed.h" #include -static const DolphinDeedWeight dolphin_deed_weights[DolphinDeedMax] = { - {1, -1, 60}, - {1, -1, 60}, - {1, -1, 60}, - {-1, 1, 60}, +static const DolphinDeedWeight dolphin_deed_weights[] = { + {1, DolphinAppSubGhz}, // DolphinDeedSubGhzReceiverInfo + {3, DolphinAppSubGhz}, // DolphinDeedSubGhzSave + {1, DolphinAppSubGhz}, // DolphinDeedSubGhzRawRec + {2, DolphinAppSubGhz}, // DolphinDeedSubGhzAddManually + {2, DolphinAppSubGhz}, // DolphinDeedSubGhzSend + {1, DolphinAppSubGhz}, // DolphinDeedSubGhzFrequencyAnalyzer + + {1, DolphinAppRfid}, // DolphinDeedRfidRead + {3, DolphinAppRfid}, // DolphinDeedRfidReadSuccess + {3, DolphinAppRfid}, // DolphinDeedRfidSave + {2, DolphinAppRfid}, // DolphinDeedRfidEmulate + {2, DolphinAppRfid}, // DolphinDeedRfidAdd + + {1, DolphinAppNfc}, // DolphinDeedNfcRead + {3, DolphinAppNfc}, // DolphinDeedNfcReadSuccess + {3, DolphinAppNfc}, // DolphinDeedNfcSave + {2, DolphinAppNfc}, // DolphinDeedNfcEmulate + {2, DolphinAppNfc}, // DolphinDeedNfcAdd + + {1, DolphinAppIr}, // DolphinDeedIrSend + {3, DolphinAppIr}, // DolphinDeedIrLearnSuccess + {3, DolphinAppIr}, // DolphinDeedIrSave + {2, DolphinAppIr}, // DolphinDeedIrBruteForce + + {1, DolphinAppIbutton}, // DolphinDeedIbuttonRead + {3, DolphinAppIbutton}, // DolphinDeedIbuttonReadSuccess + {3, DolphinAppIbutton}, // DolphinDeedIbuttonSave + {2, DolphinAppIbutton}, // DolphinDeedIbuttonEmulate + {2, DolphinAppIbutton}, // DolphinDeedIbuttonAdd + + {3, DolphinAppBadusb}, // DolphinDeedBadUsbPlayScript + {3, DolphinAppU2f}, // DolphinDeedU2fAuthorized }; -const DolphinDeedWeight* dolphin_deed_weight(DolphinDeed deed) { - furi_assert(deed < DolphinDeedMax); - return &dolphin_deed_weights[deed]; +static uint8_t dolphin_deed_limits[] = { + 15, // DolphinAppSubGhz + 15, // DolphinAppRfid + 15, // DolphinAppNfc + 15, // DolphinAppIr + 15, // DolphinAppIbutton + 15, // DolphinAppBadusb + 15, // DolphinAppU2f +}; + +_Static_assert(COUNT_OF(dolphin_deed_weights) == DolphinDeedMAX, "dolphin_deed_weights size error"); +_Static_assert(COUNT_OF(dolphin_deed_limits) == DolphinAppMAX, "dolphin_deed_limits size error"); + +uint8_t dolphin_deed_get_weight(DolphinDeed deed) { + furi_check(deed < DolphinDeedMAX); + return dolphin_deed_weights[deed].icounter; +} + +DolphinApp dolphin_deed_get_app(DolphinDeed deed) { + furi_check(deed < DolphinDeedMAX); + return dolphin_deed_weights[deed].app; +} + +uint8_t dolphin_deed_get_app_limit(DolphinApp app) { + furi_check(app < DolphinAppMAX); + return dolphin_deed_limits[app]; } diff --git a/applications/dolphin/helpers/dolphin_deed.h b/applications/dolphin/helpers/dolphin_deed.h index afbf94c25..20e18d705 100644 --- a/applications/dolphin/helpers/dolphin_deed.h +++ b/applications/dolphin/helpers/dolphin_deed.h @@ -2,23 +2,73 @@ #include -/* Countable deed that affects icounter*/ +#ifdef __cplusplus +extern "C" { +#endif + typedef enum { - // iButton - DolphinDeedIButtonRead, - DolphinDeedIButtonWrite, - DolphinDeedIButtonEmulate, - // for debug - DolphinDeedWrong, - // Special value, do not use - DolphinDeedMax + DolphinAppSubGhz, + DolphinAppRfid, + DolphinAppNfc, + DolphinAppIr, + DolphinAppIbutton, + DolphinAppBadusb, + DolphinAppU2f, + DolphinAppMAX, +} DolphinApp; + +typedef enum { + DolphinDeedSubGhzReceiverInfo, + DolphinDeedSubGhzSave, + DolphinDeedSubGhzRawRec, + DolphinDeedSubGhzAddManually, + DolphinDeedSubGhzSend, + DolphinDeedSubGhzFrequencyAnalyzer, + + DolphinDeedRfidRead, + DolphinDeedRfidReadSuccess, + DolphinDeedRfidSave, + DolphinDeedRfidEmulate, + DolphinDeedRfidAdd, + + DolphinDeedNfcRead, + DolphinDeedNfcReadSuccess, + DolphinDeedNfcSave, + DolphinDeedNfcEmulate, + DolphinDeedNfcAdd, + + DolphinDeedIrSend, + DolphinDeedIrLearnSuccess, + DolphinDeedIrSave, + DolphinDeedIrBruteForce, + + DolphinDeedIbuttonRead, + DolphinDeedIbuttonReadSuccess, + DolphinDeedIbuttonSave, + DolphinDeedIbuttonEmulate, + DolphinDeedIbuttonAdd, + + DolphinDeedBadUsbPlayScript, + + DolphinDeedU2fAuthorized, + + DolphinDeedMAX } DolphinDeed; typedef struct { - int32_t icounter; // how many icounter get by Deed - int32_t butthurt; // how many icounter get by Deed - uint32_t limit_value; // how many deeds in limit interval - uint32_t limit_interval; // interval, in minutes + uint8_t icounter; + DolphinApp app; } DolphinDeedWeight; -const DolphinDeedWeight* dolphin_deed_weight(DolphinDeed deed); +typedef struct { + DolphinApp app; + uint8_t icounter_limit; +} DolphinDeedLimits; + +DolphinApp dolphin_deed_get_app(DolphinDeed deed); +uint8_t dolphin_deed_get_app_limit(DolphinApp app); +uint8_t dolphin_deed_get_weight(DolphinDeed deed); + +#ifdef __cplusplus +} +#endif diff --git a/applications/dolphin/helpers/dolphin_state.c b/applications/dolphin/helpers/dolphin_state.c index c57694acd..a14b106db 100644 --- a/applications/dolphin/helpers/dolphin_state.c +++ b/applications/dolphin/helpers/dolphin_state.c @@ -1,4 +1,5 @@ #include "dolphin_state.h" +#include "dolphin/helpers/dolphin_deed.h" #include #include #include @@ -10,9 +11,8 @@ #define DOLPHIN_STATE_PATH "/int/dolphin.state" #define DOLPHIN_STATE_HEADER_MAGIC 0xD0 #define DOLPHIN_STATE_HEADER_VERSION 0x01 -#define DOLPHIN_LVL_THRESHOLD 20.0f -#define LEVEL2_THRESHOLD 20 -#define LEVEL3_THRESHOLD 100 +#define LEVEL2_THRESHOLD 735 +#define LEVEL3_THRESHOLD 2940 #define BUTTHURT_MAX 14 #define BUTTHURT_MIN 0 @@ -125,50 +125,68 @@ uint32_t dolphin_state_xp_to_levelup(uint32_t icounter) { return threshold - icounter; } -bool dolphin_state_on_deed(DolphinState* dolphin_state, DolphinDeed deed) { - const DolphinDeedWeight* deed_weight = dolphin_deed_weight(deed); - int32_t icounter = dolphin_state->data.icounter + deed_weight->icounter; - bool level_up = false; - bool mood_changed = false; - - if(icounter <= 0) { - icounter = 0; - if(dolphin_state->data.icounter == 0) { - return false; - } - } +void dolphin_state_on_deed(DolphinState* dolphin_state, DolphinDeed deed) { + DolphinApp app = dolphin_deed_get_app(deed); + int8_t weight_limit = + dolphin_deed_get_app_limit(app) - dolphin_state->data.icounter_daily_limit[app]; + uint8_t deed_weight = CLAMP(dolphin_deed_get_weight(deed), weight_limit, 0); uint8_t xp_to_levelup = dolphin_state_xp_to_levelup(dolphin_state->data.icounter); if(xp_to_levelup) { - level_up = true; - dolphin_state->data.icounter += MIN(xp_to_levelup, deed_weight->icounter); + deed_weight = MIN(xp_to_levelup, deed_weight); + dolphin_state->data.icounter += deed_weight; + dolphin_state->data.icounter_daily_limit[app] += deed_weight; } - uint32_t new_butthurt = CLAMP( - ((int32_t)dolphin_state->data.butthurt) + deed_weight->butthurt, - BUTTHURT_MAX, - BUTTHURT_MIN); + /* decrease butthurt: + * 0 deeds accumulating --> 0 butthurt + * +1....+15 deeds accumulating --> -1 butthurt + * +16...+30 deeds accumulating --> -1 butthurt + * +31...+45 deeds accumulating --> -1 butthurt + * +46...... deeds accumulating --> -1 butthurt + * -4 butthurt per day is maximum + * */ + uint8_t butthurt_icounter_level_old = dolphin_state->data.butthurt_daily_limit / 15 + + !!(dolphin_state->data.butthurt_daily_limit % 15); + dolphin_state->data.butthurt_daily_limit = + CLAMP(dolphin_state->data.butthurt_daily_limit + deed_weight, 46, 0); + uint8_t butthurt_icounter_level_new = dolphin_state->data.butthurt_daily_limit / 15 + + !!(dolphin_state->data.butthurt_daily_limit % 15); + int32_t new_butthurt = ((int32_t)dolphin_state->data.butthurt) - + (butthurt_icounter_level_old != butthurt_icounter_level_new); + new_butthurt = CLAMP(new_butthurt, BUTTHURT_MAX, BUTTHURT_MIN); - if(!!dolphin_state->data.butthurt != !!new_butthurt) { - mood_changed = true; - } dolphin_state->data.butthurt = new_butthurt; dolphin_state->data.timestamp = dolphin_state_timestamp(); dolphin_state->dirty = true; - return level_up || mood_changed; + FURI_LOG_D( + TAG, + "icounter %d, butthurt %d", + dolphin_state->data.icounter, + dolphin_state->data.butthurt); } void dolphin_state_butthurted(DolphinState* dolphin_state) { if(dolphin_state->data.butthurt < BUTTHURT_MAX) { dolphin_state->data.butthurt++; - FURI_LOG_I("DolphinState", "Increasing butthurt"); dolphin_state->data.timestamp = dolphin_state_timestamp(); dolphin_state->dirty = true; } } void dolphin_state_increase_level(DolphinState* dolphin_state) { + furi_assert(dolphin_state_is_levelup(dolphin_state->data.icounter)); ++dolphin_state->data.icounter; dolphin_state->dirty = true; } + +void dolphin_state_clear_limits(DolphinState* dolphin_state) { + furi_assert(dolphin_state); + + for(int i = 0; i < DolphinAppMAX; ++i) { + dolphin_state->data.icounter_daily_limit[i] = 0; + } + dolphin_state->data.butthurt_daily_limit = 0; + dolphin_state->dirty = true; +} diff --git a/applications/dolphin/helpers/dolphin_state.h b/applications/dolphin/helpers/dolphin_state.h index 8c9f3aa93..07d0b427c 100644 --- a/applications/dolphin/helpers/dolphin_state.h +++ b/applications/dolphin/helpers/dolphin_state.h @@ -7,10 +7,8 @@ typedef struct DolphinState DolphinState; typedef struct { - uint32_t limit_ibutton; - uint32_t limit_nfc; - uint32_t limit_ir; - uint32_t limit_rfid; + uint8_t icounter_daily_limit[DolphinAppMAX]; + uint8_t butthurt_daily_limit; uint32_t flags; uint32_t icounter; @@ -31,11 +29,11 @@ bool dolphin_state_save(DolphinState* dolphin_state); bool dolphin_state_load(DolphinState* dolphin_state); -void dolphin_state_clear(DolphinState* dolphin_state); +void dolphin_state_clear_limits(DolphinState* dolphin_state); uint64_t dolphin_state_timestamp(); -bool dolphin_state_on_deed(DolphinState* dolphin_state, DolphinDeed deed); +void dolphin_state_on_deed(DolphinState* dolphin_state, DolphinDeed deed); void dolphin_state_butthurted(DolphinState* dolphin_state); diff --git a/applications/gui/canvas.c b/applications/gui/canvas.c old mode 100755 new mode 100644 index c69212ab3..3706b176b --- a/applications/gui/canvas.c +++ b/applications/gui/canvas.c @@ -4,6 +4,7 @@ #include #include +#include #include const CanvasFontParameters canvas_font_params[FontTotalNumber] = { @@ -202,6 +203,22 @@ uint8_t canvas_glyph_width(Canvas* canvas, char symbol) { return u8g2_GetGlyphWidth(&canvas->fb, symbol); } +void canvas_draw_bitmap( + Canvas* canvas, + uint8_t x, + uint8_t y, + uint8_t width, + uint8_t height, + const uint8_t* compressed_bitmap_data) { + furi_assert(canvas); + + x += canvas->offset_x; + y += canvas->offset_y; + uint8_t* bitmap_data = NULL; + furi_hal_compress_icon_decode(compressed_bitmap_data, &bitmap_data); + u8g2_DrawXBM(&canvas->fb, x, y, width, height, bitmap_data); +} + void canvas_draw_icon_animation( Canvas* canvas, uint8_t x, diff --git a/applications/gui/canvas.h b/applications/gui/canvas.h index ec8cf4333..4923e2e66 100755 --- a/applications/gui/canvas.h +++ b/applications/gui/canvas.h @@ -178,6 +178,23 @@ uint16_t canvas_string_width(Canvas* canvas, const char* str); */ uint8_t canvas_glyph_width(Canvas* canvas, char symbol); +/** Draw bitmap picture at position defined by x,y. + * + * @param canvas Canvas instance + * @param x x coordinate + * @param y y coordinate + * @param width width of bitmap + * @param height height of bitmap + * @param compressed_bitmap_data compressed bitmap data + */ +void canvas_draw_bitmap( + Canvas* canvas, + uint8_t x, + uint8_t y, + uint8_t width, + uint8_t height, + const uint8_t* compressed_bitmap_data); + /** Draw animation at position defined by x,y. * * @param canvas Canvas instance diff --git a/applications/gui/icon_i.h b/applications/gui/icon_i.h index c01f5cce5..63e9e94c7 100644 --- a/applications/gui/icon_i.h +++ b/applications/gui/icon_i.h @@ -3,6 +3,7 @@ * GUI: internal Icon API */ +#pragma once #include "icon.h" struct Icon { diff --git a/applications/gui/view_composed.c b/applications/gui/view_composed.c deleted file mode 100644 index 5815d9dd8..000000000 --- a/applications/gui/view_composed.c +++ /dev/null @@ -1,166 +0,0 @@ -#include "gui/view.h" -#include "furi/memmgr.h" -#include "view_composed.h" -#include "view_i.h" - -typedef struct { - View* bottom; - View* top; - bool top_enabled; -} ViewComposedModel; - -struct ViewComposed { - View* view; -}; - -static void view_composed_draw(Canvas* canvas, void* model); -static bool view_composed_input(InputEvent* event, void* context); - -static void view_composed_update_callback(View* view_top_or_bottom, void* context) { - furi_assert(view_top_or_bottom); - furi_assert(context); - - View* view_composed_view = context; - view_composed_view->update_callback( - view_composed_view, view_composed_view->update_callback_context); -} - -static void view_composed_enter(void* context) { - furi_assert(context); - - ViewComposed* view_composed = context; - ViewComposedModel* model = view_get_model(view_composed->view); - - /* if more than 1 composed views hold same view it has to reassign update_callback_context */ - if(model->bottom) { - view_set_update_callback_context(model->bottom, view_composed->view); - if(model->bottom->enter_callback) { - model->bottom->enter_callback(model->bottom->context); - } - } - if(model->top) { - view_set_update_callback_context(model->top, view_composed->view); - if(model->top->enter_callback) { - model->top->enter_callback(model->top->context); - } - } - - view_commit_model(view_composed->view, false); -} - -static void view_composed_exit(void* context) { - furi_assert(context); - - ViewComposed* view_composed = context; - ViewComposedModel* model = view_get_model(view_composed->view); - - if(model->bottom) { - if(model->bottom->exit_callback) { - model->bottom->exit_callback(model->bottom->context); - } - } - if(model->top) { - if(model->top->exit_callback) { - model->top->exit_callback(model->top->context); - } - } - - view_commit_model(view_composed->view, false); -} - -ViewComposed* view_composed_alloc(void) { - ViewComposed* view_composed = furi_alloc(sizeof(ViewComposed)); - view_composed->view = view_alloc(); - - view_allocate_model(view_composed->view, ViewModelTypeLocking, sizeof(ViewComposedModel)); - view_set_draw_callback(view_composed->view, view_composed_draw); - view_set_input_callback(view_composed->view, view_composed_input); - view_set_context(view_composed->view, view_composed); - view_set_enter_callback(view_composed->view, view_composed_enter); - view_set_exit_callback(view_composed->view, view_composed_exit); - return view_composed; -} - -void view_composed_free(ViewComposed* view_composed) { - furi_assert(view_composed); - - ViewComposedModel* view_composed_model = view_get_model(view_composed->view); - view_set_update_callback(view_composed_model->bottom, NULL); - view_set_update_callback_context(view_composed_model->bottom, NULL); - view_set_update_callback(view_composed_model->top, NULL); - view_set_update_callback_context(view_composed_model->top, NULL); - view_commit_model(view_composed->view, true); - - view_free(view_composed->view); - free(view_composed); -} - -static void view_composed_draw(Canvas* canvas, void* model) { - furi_assert(model); - - ViewComposedModel* view_composed_model = model; - - view_draw(view_composed_model->bottom, canvas); - if(view_composed_model->top_enabled && view_composed_model->top) { - view_draw(view_composed_model->top, canvas); - } -} - -static bool view_composed_input(InputEvent* event, void* context) { - furi_assert(event); - furi_assert(context); - - ViewComposed* view_composed = context; - ViewComposedModel* view_composed_model = view_get_model(view_composed->view); - bool consumed = false; - - if(view_composed_model->top_enabled && view_composed_model->top) { - consumed = view_input(view_composed_model->top, event); - } - if(!consumed) { - consumed = view_input(view_composed_model->bottom, event); - } - - view_commit_model(view_composed->view, false); - - return consumed; -} - -void view_composed_top_enable(ViewComposed* view_composed, bool enable) { - furi_assert(view_composed); - - ViewComposedModel* view_composed_model = view_get_model(view_composed->view); - bool update = (view_composed_model->top_enabled != enable); - view_composed_model->top_enabled = enable; - view_commit_model(view_composed->view, update); -} - -void view_composed_tie_views(ViewComposed* view_composed, View* view_bottom, View* view_top) { - furi_assert(view_composed); - furi_assert(view_bottom); - - ViewComposedModel* view_composed_model = view_get_model(view_composed->view); - - if(view_composed_model->bottom) { - view_set_update_callback(view_composed_model->bottom, NULL); - view_set_update_callback_context(view_composed_model->bottom, NULL); - } - if(view_composed_model->top) { - view_set_update_callback(view_composed_model->top, NULL); - view_set_update_callback_context(view_composed_model->top, NULL); - } - - view_composed_model->bottom = view_bottom; - view_set_update_callback(view_bottom, view_composed_update_callback); - view_set_update_callback_context(view_bottom, view_composed->view); - view_composed_model->top = view_top; - view_set_update_callback(view_top, view_composed_update_callback); - view_set_update_callback_context(view_top, view_composed->view); - - view_commit_model(view_composed->view, true); -} - -View* view_composed_get_view(ViewComposed* view_composed) { - furi_assert(view_composed); - return view_composed->view; -} diff --git a/applications/gui/view_composed.h b/applications/gui/view_composed.h deleted file mode 100644 index eaf82b5c5..000000000 --- a/applications/gui/view_composed.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include -#include "view.h" - -typedef struct ViewComposed ViewComposed; - -ViewComposed* view_composed_alloc(void); -void view_composed_free(ViewComposed* view_composed); -void view_composed_top_enable(ViewComposed* view_composed, bool enable); -void view_composed_tie_views(ViewComposed* view_composed, View* view_bottom, View* view_top); -View* view_composed_get_view(ViewComposed* view_composed); diff --git a/applications/gui/view_stack.c b/applications/gui/view_stack.c new file mode 100644 index 000000000..39ffc8c79 --- /dev/null +++ b/applications/gui/view_stack.c @@ -0,0 +1,165 @@ +#include "gui/view.h" +#include "furi/memmgr.h" +#include "view_stack.h" +#include "view_i.h" + +#define MAX_VIEWS 3 + +typedef struct { + View* views[MAX_VIEWS]; +} ViewStackModel; + +struct ViewStack { + View* view; +}; + +static void view_stack_draw(Canvas* canvas, void* model); +static bool view_stack_input(InputEvent* event, void* context); + +static void view_stack_update_callback(View* view_top_or_bottom, void* context) { + furi_assert(view_top_or_bottom); + furi_assert(context); + + View* view_stack_view = context; + if(view_stack_view->update_callback) { + view_stack_view->update_callback( + view_stack_view, view_stack_view->update_callback_context); + } +} + +static void view_stack_enter(void* context) { + furi_assert(context); + + ViewStack* view_stack = context; + ViewStackModel* model = view_get_model(view_stack->view); + + /* if more than 1 composite views hold same view they have to reassign update_callback_context */ + for(int i = 0; i < MAX_VIEWS; ++i) { + if(model->views[i]) { + view_set_update_callback_context(model->views[i], view_stack->view); + if(model->views[i]->enter_callback) { + model->views[i]->enter_callback(model->views[i]->context); + } + } + } + + view_commit_model(view_stack->view, false); +} + +static void view_stack_exit(void* context) { + furi_assert(context); + + ViewStack* view_stack = context; + ViewStackModel* model = view_get_model(view_stack->view); + + for(int i = 0; i < MAX_VIEWS; ++i) { + if(model->views[i] && model->views[i]->exit_callback) { + model->views[i]->exit_callback(model->views[i]->context); + } + } + + view_commit_model(view_stack->view, false); +} + +ViewStack* view_stack_alloc(void) { + ViewStack* view_stack = furi_alloc(sizeof(ViewStack)); + view_stack->view = view_alloc(); + + view_allocate_model(view_stack->view, ViewModelTypeLocking, sizeof(ViewStackModel)); + view_set_draw_callback(view_stack->view, view_stack_draw); + view_set_input_callback(view_stack->view, view_stack_input); + view_set_context(view_stack->view, view_stack); + view_set_enter_callback(view_stack->view, view_stack_enter); + view_set_exit_callback(view_stack->view, view_stack_exit); + return view_stack; +} + +void view_stack_free(ViewStack* view_stack) { + furi_assert(view_stack); + + ViewStackModel* model = view_get_model(view_stack->view); + for(int i = 0; i < MAX_VIEWS; ++i) { + if(model->views[i]) { + view_set_update_callback(model->views[i], NULL); + view_set_update_callback_context(model->views[i], NULL); + } + } + view_commit_model(view_stack->view, false); + + view_free(view_stack->view); + free(view_stack); +} + +static void view_stack_draw(Canvas* canvas, void* _model) { + furi_assert(_model); + + ViewStackModel* model = _model; + for(int i = 0; i < MAX_VIEWS; ++i) { + if(model->views[i]) { + view_draw(model->views[i], canvas); + } + } +} + +static bool view_stack_input(InputEvent* event, void* context) { + furi_assert(event); + furi_assert(context); + + bool consumed = false; + ViewStack* view_stack = context; + + ViewStackModel* model = view_get_model(view_stack->view); + for(int i = MAX_VIEWS - 1; !consumed && (i >= 0); --i) { + if(model->views[i]) { + consumed = view_input(model->views[i], event); + } + } + view_commit_model(view_stack->view, false); + + return consumed; +} + +void view_stack_add_view(ViewStack* view_stack, View* view) { + furi_assert(view_stack); + furi_assert(view); + + bool result = false; + ViewStackModel* model = view_get_model(view_stack->view); + for(int i = 0; i < MAX_VIEWS; ++i) { + if(!model->views[i]) { + model->views[i] = view; + view_set_update_callback(model->views[i], view_stack_update_callback); + view_set_update_callback_context(model->views[i], view_stack->view); + result = true; + break; + } + } + view_commit_model(view_stack->view, result); + furi_assert(result); +} + +void view_stack_remove_view(ViewStack* view_stack, View* view) { + furi_assert(view_stack); + furi_assert(view); + + /* Removing view on-the-go is dangerous, but it is protected with + * Locking model, so system is consistent at any time. */ + bool result = false; + ViewStackModel* model = view_get_model(view_stack->view); + for(int i = 0; i < MAX_VIEWS; ++i) { + if(model->views[i] == view) { + view_set_update_callback(model->views[i], NULL); + view_set_update_callback_context(model->views[i], NULL); + model->views[i] = NULL; + result = true; + break; + } + } + view_commit_model(view_stack->view, result); + furi_assert(result); +} + +View* view_stack_get_view(ViewStack* view_stack) { + furi_assert(view_stack); + return view_stack->view; +} diff --git a/applications/gui/view_stack.h b/applications/gui/view_stack.h new file mode 100644 index 000000000..f733e6ad1 --- /dev/null +++ b/applications/gui/view_stack.h @@ -0,0 +1,53 @@ +/** + * @file view_stack.h + * GUI: ViewStack API + * + * ViewStack accumulates several Views in one stack. + * Draw callbacks are called sequenctially starting from + * first added. Input callbacks are called in reverse order. + * Consumed input is not passed on underlying layers. + */ + +#pragma once + +#include +#include "view.h" + +/** ViewStack, anonymous type. */ +typedef struct ViewStack ViewStack; + +/** Allocate and init ViewStack + * + * @return ViewStack instance + */ +ViewStack* view_stack_alloc(void); + +/** Free ViewStack instance + * + * @param view_stack instance + */ +void view_stack_free(ViewStack* view_stack); + +/** Get View of ViewStack. + * Should this View to any view manager such as + * ViewDispatcher or ViewHolder. + * + * @param view_stack instance + */ +View* view_stack_get_view(ViewStack* view_stack); + +/** Add View to ViewStack. + * Adds View on top of ViewStack. + * + * @param view_stack instance + * @view view view to add + */ +void view_stack_add_view(ViewStack* view_stack, View* view); + +/** Remove any View in ViewStack. + * If no View to remove found - ignore. + * + * @param view_stack instance + * @view view view to remove + */ +void view_stack_remove_view(ViewStack* view_stack, View* view); diff --git a/applications/ibutton/scene/ibutton_scene_add_value.cpp b/applications/ibutton/scene/ibutton_scene_add_value.cpp index 39a6aa4ad..d91408b68 100755 --- a/applications/ibutton/scene/ibutton_scene_add_value.cpp +++ b/applications/ibutton/scene/ibutton_scene_add_value.cpp @@ -3,6 +3,7 @@ #include "../ibutton_view_manager.h" #include "../ibutton_event.h" #include +#include void iButtonSceneAddValue::on_enter(iButtonApp* app) { iButtonAppViewManager* view_manager = app->get_view_manager(); @@ -20,6 +21,7 @@ bool iButtonSceneAddValue::on_event(iButtonApp* app, iButtonEvent* event) { bool consumed = false; if(event->type == iButtonEvent::Type::EventTypeByteEditResult) { + DOLPHIN_DEED(DolphinDeedIbuttonAdd); app->switch_to_next_scene(iButtonApp::Scene::SceneSaveName); consumed = true; } @@ -42,4 +44,4 @@ void iButtonSceneAddValue::byte_input_callback(void* context) { event.type = iButtonEvent::Type::EventTypeByteEditResult; memcpy(app->get_key()->get_data(), this->new_key_data, app->get_key()->get_type_data_size()); app->get_view_manager()->send_event(&event); -} \ No newline at end of file +} diff --git a/applications/ibutton/scene/ibutton_scene_emulate.cpp b/applications/ibutton/scene/ibutton_scene_emulate.cpp index 621c08d1d..7fe6df28d 100644 --- a/applications/ibutton/scene/ibutton_scene_emulate.cpp +++ b/applications/ibutton/scene/ibutton_scene_emulate.cpp @@ -3,6 +3,7 @@ #include "../ibutton_view_manager.h" #include "../ibutton_event.h" #include "../ibutton_key.h" +#include #include void iButtonSceneEmulate::on_enter(iButtonApp* app) { @@ -12,6 +13,7 @@ void iButtonSceneEmulate::on_enter(iButtonApp* app) { uint8_t* key_data = key->get_data(); const char* key_name = key->get_name(); uint8_t line_count = 2; + DOLPHIN_DEED(DolphinDeedIbuttonEmulate); // check that stored key has name if(strcmp(key_name, "") != 0) { @@ -90,4 +92,4 @@ void iButtonSceneEmulate::on_exit(iButtonApp* app) { popup_set_header(popup, NULL, 0, 0, AlignCenter, AlignBottom); popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); popup_set_icon(popup, 0, 0, NULL); -} \ No newline at end of file +} diff --git a/applications/ibutton/scene/ibutton_scene_read.cpp b/applications/ibutton/scene/ibutton_scene_read.cpp index daf5446b3..a16cb23d7 100644 --- a/applications/ibutton/scene/ibutton_scene_read.cpp +++ b/applications/ibutton/scene/ibutton_scene_read.cpp @@ -2,10 +2,12 @@ #include "../ibutton_app.h" #include "../ibutton_view_manager.h" #include "../ibutton_event.h" +#include void iButtonSceneRead::on_enter(iButtonApp* app) { iButtonAppViewManager* view_manager = app->get_view_manager(); Popup* popup = view_manager->get_popup(); + DOLPHIN_DEED(DolphinDeedIbuttonRead); popup_set_header(popup, "iButton", 95, 26, AlignCenter, AlignBottom); popup_set_text(popup, "waiting\nfor key ...", 95, 30, AlignCenter, AlignTop); @@ -50,4 +52,4 @@ void iButtonSceneRead::on_exit(iButtonApp* app) { popup_set_header(popup, NULL, 0, 0, AlignCenter, AlignBottom); popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); popup_set_icon(popup, 0, 0, NULL); -} \ No newline at end of file +} diff --git a/applications/ibutton/scene/ibutton_scene_read_success.cpp b/applications/ibutton/scene/ibutton_scene_read_success.cpp index 1c6a5e64c..afeb154f0 100644 --- a/applications/ibutton/scene/ibutton_scene_read_success.cpp +++ b/applications/ibutton/scene/ibutton_scene_read_success.cpp @@ -2,12 +2,14 @@ #include "../ibutton_app.h" #include "../ibutton_view_manager.h" #include "../ibutton_event.h" +#include #include void iButtonSceneReadSuccess::on_enter(iButtonApp* app) { iButtonAppViewManager* view_manager = app->get_view_manager(); DialogEx* dialog_ex = view_manager->get_dialog_ex(); auto callback = cbc::obtain_connector(this, &iButtonSceneReadSuccess::dialog_ex_callback); + DOLPHIN_DEED(DolphinDeedIbuttonReadSuccess); iButtonKey* key = app->get_key(); uint8_t* key_data = key->get_data(); @@ -87,4 +89,4 @@ void iButtonSceneReadSuccess::dialog_ex_callback(DialogExResult result, void* co event.payload.dialog_result = result; app->get_view_manager()->send_event(&event); -} \ No newline at end of file +} diff --git a/applications/ibutton/scene/ibutton_scene_save_success.cpp b/applications/ibutton/scene/ibutton_scene_save_success.cpp index 042790528..c652e5d11 100644 --- a/applications/ibutton/scene/ibutton_scene_save_success.cpp +++ b/applications/ibutton/scene/ibutton_scene_save_success.cpp @@ -3,12 +3,14 @@ #include "../ibutton_view_manager.h" #include "../ibutton_event.h" #include "../ibutton_key.h" +#include #include void iButtonSceneSaveSuccess::on_enter(iButtonApp* app) { iButtonAppViewManager* view_manager = app->get_view_manager(); Popup* popup = view_manager->get_popup(); auto callback = cbc::obtain_connector(this, &iButtonSceneSaveSuccess::popup_callback); + DOLPHIN_DEED(DolphinDeedIbuttonSave); popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); popup_set_text(popup, "Saved!", 13, 22, AlignLeft, AlignBottom); @@ -51,4 +53,4 @@ void iButtonSceneSaveSuccess::popup_callback(void* context) { iButtonEvent event; event.type = iButtonEvent::Type::EventTypeBack; app->get_view_manager()->send_event(&event); -} \ No newline at end of file +} diff --git a/applications/irda/scene/irda_app_scene_learn_done.cpp b/applications/irda/scene/irda_app_scene_learn_done.cpp index 1ffebc560..c659b5ce9 100644 --- a/applications/irda/scene/irda_app_scene_learn_done.cpp +++ b/applications/irda/scene/irda_app_scene_learn_done.cpp @@ -1,10 +1,12 @@ #include "../irda_app.h" +#include void IrdaAppSceneLearnDone::on_enter(IrdaApp* app) { IrdaAppViewManager* view_manager = app->get_view_manager(); Popup* popup = view_manager->get_popup(); popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); + DOLPHIN_DEED(DolphinDeedIrSave); if(app->get_learn_new_remote()) { popup_set_text(popup, "New remote\ncreated!", 5, 7, AlignLeft, AlignTop); diff --git a/applications/irda/scene/irda_app_scene_learn_success.cpp b/applications/irda/scene/irda_app_scene_learn_success.cpp index f34d27745..d7bd85d24 100644 --- a/applications/irda/scene/irda_app_scene_learn_success.cpp +++ b/applications/irda/scene/irda_app_scene_learn_success.cpp @@ -2,6 +2,7 @@ #include #include "irda.h" #include +#include static void dialog_result_callback(DialogExResult result, void* context) { auto app = static_cast(context); @@ -17,6 +18,7 @@ void IrdaAppSceneLearnSuccess::on_enter(IrdaApp* app) { IrdaAppViewManager* view_manager = app->get_view_manager(); DialogEx* dialog_ex = view_manager->get_dialog_ex(); + DOLPHIN_DEED(DolphinDeedIrLearnSuccess); app->notify_green_on(); auto signal = app->get_received_signal(); diff --git a/applications/irda/scene/irda_app_scene_remote.cpp b/applications/irda/scene/irda_app_scene_remote.cpp index c46d2e299..7138eb44f 100644 --- a/applications/irda/scene/irda_app_scene_remote.cpp +++ b/applications/irda/scene/irda_app_scene_remote.cpp @@ -2,6 +2,7 @@ #include "gui/modules/button_menu.h" #include "input/input.h" #include "irda_worker.h" +#include typedef enum { ButtonIndexPlus = -2, @@ -106,6 +107,7 @@ bool IrdaAppSceneRemote::on_event(IrdaApp* app, IrdaAppEvent* event) { app->get_irda_worker(), &button_signal.get_message()); } + DOLPHIN_DEED(DolphinDeedIrSend); irda_worker_tx_start(app->get_irda_worker()); } else if(!pressed && button_pressed) { button_pressed = false; diff --git a/applications/irda/scene/irda_app_scene_universal_common.cpp b/applications/irda/scene/irda_app_scene_universal_common.cpp index c55a7af7f..1b54791d4 100644 --- a/applications/irda/scene/irda_app_scene_universal_common.cpp +++ b/applications/irda/scene/irda_app_scene_universal_common.cpp @@ -1,5 +1,6 @@ #include "../irda_app.h" #include "assets_icons.h" +#include #include "gui/modules/button_menu.h" #include "gui/modules/button_panel.h" #include "../view/irda_app_brut_view.h" @@ -84,6 +85,7 @@ bool IrdaAppSceneUniversalCommon::on_event(IrdaApp* app, IrdaAppEvent* event) { if(event->type == IrdaAppEvent::Type::ButtonPanelPressed) { int record_amount = 0; if(brute_force.start_bruteforce(event->payload.menu_index, record_amount)) { + DOLPHIN_DEED(DolphinDeedIrBruteForce); brute_force_started = true; show_popup(app, record_amount); } else { diff --git a/applications/lfrfid/scene/lfrfid_app_scene_emulate.cpp b/applications/lfrfid/scene/lfrfid_app_scene_emulate.cpp index 69b291cce..a46286d09 100644 --- a/applications/lfrfid/scene/lfrfid_app_scene_emulate.cpp +++ b/applications/lfrfid/scene/lfrfid_app_scene_emulate.cpp @@ -1,8 +1,10 @@ #include "lfrfid_app_scene_emulate.h" +#include void LfRfidAppSceneEmulate::on_enter(LfRfidApp* app, bool need_restore) { string_init(data_string); + DOLPHIN_DEED(DolphinDeedRfidEmulate); const uint8_t* data = app->worker.key.get_data(); for(uint8_t i = 0; i < app->worker.key.get_type_data_count(); i++) { diff --git a/applications/lfrfid/scene/lfrfid_app_scene_read.cpp b/applications/lfrfid/scene/lfrfid_app_scene_read.cpp index eec1e0d92..f5608fe4c 100644 --- a/applications/lfrfid/scene/lfrfid_app_scene_read.cpp +++ b/applications/lfrfid/scene/lfrfid_app_scene_read.cpp @@ -1,8 +1,10 @@ #include "lfrfid_app_scene_read.h" +#include void LfRfidAppSceneRead::on_enter(LfRfidApp* app, bool need_restore) { auto popup = app->view_controller.get(); + DOLPHIN_DEED(DolphinDeedRfidRead); popup->set_header("Reading\nLF RFID", 89, 34, AlignCenter, AlignTop); popup->set_icon(0, 3, &I_RFIDDolphinReceive_97x61); @@ -15,6 +17,7 @@ bool LfRfidAppSceneRead::on_event(LfRfidApp* app, LfRfidApp::Event* event) { if(event->type == LfRfidApp::EventType::Tick) { if(app->worker.read()) { + DOLPHIN_DEED(DolphinDeedRfidReadSuccess); notification_message(app->notification, &sequence_success); app->scene_controller.switch_to_next_scene(LfRfidApp::SceneType::ReadSuccess); } else { diff --git a/applications/lfrfid/scene/lfrfid_app_scene_save_data.cpp b/applications/lfrfid/scene/lfrfid_app_scene_save_data.cpp index 14e8d89ba..b36ff7e37 100644 --- a/applications/lfrfid/scene/lfrfid_app_scene_save_data.cpp +++ b/applications/lfrfid/scene/lfrfid_app_scene_save_data.cpp @@ -1,4 +1,5 @@ #include "lfrfid_app_scene_save_data.h" +#include static void print_buffer(const uint8_t* buffer) { for(uint8_t i = 0; i < LFRFID_KEY_SIZE; i++) { @@ -40,6 +41,7 @@ bool LfRfidAppSceneSaveData::on_event(LfRfidApp* app, LfRfidApp::Event* event) { if(event->type == LfRfidApp::EventType::Next) { key.set_data(new_key_data, key.get_type_data_count()); + DOLPHIN_DEED(DolphinDeedRfidAdd); app->scene_controller.switch_to_next_scene(LfRfidApp::SceneType::SaveName); } diff --git a/applications/lfrfid/scene/lfrfid_app_scene_save_success.cpp b/applications/lfrfid/scene/lfrfid_app_scene_save_success.cpp index 6300edade..3a37da86b 100644 --- a/applications/lfrfid/scene/lfrfid_app_scene_save_success.cpp +++ b/applications/lfrfid/scene/lfrfid_app_scene_save_success.cpp @@ -1,8 +1,12 @@ #include "lfrfid_app_scene_save_success.h" +#include +#include +#include void LfRfidAppSceneSaveSuccess::on_enter(LfRfidApp* app, bool need_restore) { auto popup = app->view_controller.get(); + DOLPHIN_DEED(DolphinDeedRfidSave); popup->set_icon(32, 5, &I_DolphinNice_96x59); popup->set_text("Saved!", 13, 22, AlignLeft, AlignBottom); popup->set_context(app); @@ -43,4 +47,4 @@ void LfRfidAppSceneSaveSuccess::timeout_callback(void* context) { LfRfidApp::Event event; event.type = LfRfidApp::EventType::Back; app->view_controller.send_event(&event); -} \ No newline at end of file +} diff --git a/applications/loader/loader.c b/applications/loader/loader.c index f78e5bc02..d131de498 100644 --- a/applications/loader/loader.c +++ b/applications/loader/loader.c @@ -1,4 +1,4 @@ -#include +#include #include "loader/loader.h" #include "loader_i.h" @@ -464,11 +464,12 @@ int32_t loader_srv(void* p) { } } + furi_record_destroy("loader"); loader_free(loader_instance); return 0; } -FuriPubSub* loader_get_pubsub() { - return loader_instance->pubsub; +FuriPubSub* loader_get_pubsub(Loader* instance) { + return instance->pubsub; } diff --git a/applications/loader/loader.h b/applications/loader/loader.h index edfa01b8f..b65539fea 100644 --- a/applications/loader/loader.h +++ b/applications/loader/loader.h @@ -46,4 +46,4 @@ void loader_show_menu(); void loader_update_menu(); /** Show primary loader */ -FuriPubSub* loader_get_pubsub(); +FuriPubSub* loader_get_pubsub(Loader* instance); diff --git a/applications/nfc/scenes/nfc_scene_emulate_mifare_ul.c b/applications/nfc/scenes/nfc_scene_emulate_mifare_ul.c index bacdd347a..a712b03e3 100755 --- a/applications/nfc/scenes/nfc_scene_emulate_mifare_ul.c +++ b/applications/nfc/scenes/nfc_scene_emulate_mifare_ul.c @@ -1,4 +1,5 @@ #include "../nfc_i.h" +#include #define NFC_MF_UL_DATA_NOT_CHANGED (0UL) #define NFC_MF_UL_DATA_CHANGED (1UL) @@ -11,6 +12,7 @@ void nfc_emulate_mifare_ul_worker_callback(void* context) { void nfc_scene_emulate_mifare_ul_on_enter(void* context) { Nfc* nfc = (Nfc*)context; + DOLPHIN_DEED(DolphinDeedNfcEmulate); // Setup view Popup* popup = nfc->popup; diff --git a/applications/nfc/scenes/nfc_scene_emulate_uid.c b/applications/nfc/scenes/nfc_scene_emulate_uid.c index a8fff57ba..a7af371cb 100755 --- a/applications/nfc/scenes/nfc_scene_emulate_uid.c +++ b/applications/nfc/scenes/nfc_scene_emulate_uid.c @@ -1,7 +1,9 @@ #include "../nfc_i.h" +#include void nfc_scene_emulate_uid_on_enter(void* context) { Nfc* nfc = (Nfc*)context; + DOLPHIN_DEED(DolphinDeedNfcEmulate); // Setup view Popup* popup = nfc->popup; diff --git a/applications/nfc/scenes/nfc_scene_read_card.c b/applications/nfc/scenes/nfc_scene_read_card.c index d01fa75d1..10cf74f2e 100755 --- a/applications/nfc/scenes/nfc_scene_read_card.c +++ b/applications/nfc/scenes/nfc_scene_read_card.c @@ -1,4 +1,5 @@ #include "../nfc_i.h" +#include #define NFC_READ_CARD_CUSTOM_EVENT (10UL) @@ -9,6 +10,7 @@ void nfc_read_card_worker_callback(void* context) { void nfc_scene_read_card_on_enter(void* context) { Nfc* nfc = (Nfc*)context; + DOLPHIN_DEED(DolphinDeedNfcRead); // Setup view Popup* popup = nfc->popup; diff --git a/applications/nfc/scenes/nfc_scene_read_card_success.c b/applications/nfc/scenes/nfc_scene_read_card_success.c index ef6709ada..097cdd8d3 100755 --- a/applications/nfc/scenes/nfc_scene_read_card_success.c +++ b/applications/nfc/scenes/nfc_scene_read_card_success.c @@ -1,4 +1,5 @@ #include "../nfc_i.h" +#include void nfc_scene_read_card_success_widget_callback( GuiButtonType result, @@ -17,6 +18,7 @@ void nfc_scene_read_card_success_on_enter(void* context) { string_t uid_str; string_init(data_str); string_init(uid_str); + DOLPHIN_DEED(DolphinDeedNfcReadSuccess); // Send notification notification_message(nfc->notifications, &sequence_success); diff --git a/applications/nfc/scenes/nfc_scene_read_emv_app.c b/applications/nfc/scenes/nfc_scene_read_emv_app.c index 665a121b2..c6eff352b 100755 --- a/applications/nfc/scenes/nfc_scene_read_emv_app.c +++ b/applications/nfc/scenes/nfc_scene_read_emv_app.c @@ -1,4 +1,5 @@ #include "../nfc_i.h" +#include #define NFC_READ_EMV_APP_CUSTOM_EVENT (10UL) @@ -9,6 +10,7 @@ void nfc_read_emv_app_worker_callback(void* context) { void nfc_scene_read_emv_app_on_enter(void* context) { Nfc* nfc = (Nfc*)context; + DOLPHIN_DEED(DolphinDeedNfcRead); // Setup view Popup* popup = nfc->popup; diff --git a/applications/nfc/scenes/nfc_scene_read_emv_app_success.c b/applications/nfc/scenes/nfc_scene_read_emv_app_success.c index 3fe62f3f9..057dd59e3 100755 --- a/applications/nfc/scenes/nfc_scene_read_emv_app_success.c +++ b/applications/nfc/scenes/nfc_scene_read_emv_app_success.c @@ -1,5 +1,6 @@ #include "../nfc_i.h" #include "../helpers/nfc_emv_parser.h" +#include #define NFC_SCENE_READ_SUCCESS_SHIFT " " @@ -11,6 +12,7 @@ void nfc_scene_read_emv_app_success_dialog_callback(DialogExResult result, void* void nfc_scene_read_emv_app_success_on_enter(void* context) { Nfc* nfc = (Nfc*)context; + DOLPHIN_DEED(DolphinDeedNfcReadSuccess); // Setup view NfcDeviceCommonData* nfc_data = &nfc->dev->dev_data.nfc_data; diff --git a/applications/nfc/scenes/nfc_scene_read_emv_data.c b/applications/nfc/scenes/nfc_scene_read_emv_data.c index 4da1aaa79..36f525f14 100755 --- a/applications/nfc/scenes/nfc_scene_read_emv_data.c +++ b/applications/nfc/scenes/nfc_scene_read_emv_data.c @@ -1,4 +1,5 @@ #include "../nfc_i.h" +#include #define NFC_READ_EMV_DATA_CUSTOM_EVENT (10UL) @@ -9,6 +10,7 @@ void nfc_read_emv_data_worker_callback(void* context) { void nfc_scene_read_emv_data_on_enter(void* context) { Nfc* nfc = (Nfc*)context; + DOLPHIN_DEED(DolphinDeedNfcRead); // Setup view Popup* popup = nfc->popup; diff --git a/applications/nfc/scenes/nfc_scene_read_emv_data_success.c b/applications/nfc/scenes/nfc_scene_read_emv_data_success.c index 0867311f4..999124503 100755 --- a/applications/nfc/scenes/nfc_scene_read_emv_data_success.c +++ b/applications/nfc/scenes/nfc_scene_read_emv_data_success.c @@ -1,5 +1,6 @@ #include "../nfc_i.h" #include "../helpers/nfc_emv_parser.h" +#include void nfc_scene_read_emv_data_success_widget_callback( GuiButtonType result, @@ -15,6 +16,7 @@ void nfc_scene_read_emv_data_success_on_enter(void* context) { Nfc* nfc = (Nfc*)context; NfcEmvData* emv_data = &nfc->dev->dev_data.emv_data; NfcDeviceCommonData* nfc_data = &nfc->dev->dev_data.nfc_data; + DOLPHIN_DEED(DolphinDeedNfcReadSuccess); // Setup Custom Widget view // Add frame diff --git a/applications/nfc/scenes/nfc_scene_read_mifare_ul.c b/applications/nfc/scenes/nfc_scene_read_mifare_ul.c index a0bd057d2..c5b7c4979 100755 --- a/applications/nfc/scenes/nfc_scene_read_mifare_ul.c +++ b/applications/nfc/scenes/nfc_scene_read_mifare_ul.c @@ -1,4 +1,5 @@ #include "../nfc_i.h" +#include #define NFC_READ_MIFARE_UL_CUSTOM_EVENT (10UL) @@ -9,6 +10,7 @@ void nfc_read_mifare_ul_worker_callback(void* context) { void nfc_scene_read_mifare_ul_on_enter(void* context) { Nfc* nfc = (Nfc*)context; + DOLPHIN_DEED(DolphinDeedNfcRead); // Setup view Popup* popup = nfc->popup; diff --git a/applications/nfc/scenes/nfc_scene_read_mifare_ul_success.c b/applications/nfc/scenes/nfc_scene_read_mifare_ul_success.c index db5762adb..a7fcc2fc7 100755 --- a/applications/nfc/scenes/nfc_scene_read_mifare_ul_success.c +++ b/applications/nfc/scenes/nfc_scene_read_mifare_ul_success.c @@ -1,4 +1,5 @@ #include "../nfc_i.h" +#include #define NFC_SCENE_READ_SUCCESS_SHIFT " " #define NFC_SCENE_READ_MF_UL_CUSTOM_EVENT (0UL) @@ -22,6 +23,7 @@ void nfc_scene_read_mifare_ul_success_text_box_callback(void* context) { void nfc_scene_read_mifare_ul_success_on_enter(void* context) { Nfc* nfc = (Nfc*)context; + DOLPHIN_DEED(DolphinDeedNfcReadSuccess); // Send notification notification_message(nfc->notifications, &sequence_success); diff --git a/applications/nfc/scenes/nfc_scene_save_success.c b/applications/nfc/scenes/nfc_scene_save_success.c index 57b08b074..67599c24a 100755 --- a/applications/nfc/scenes/nfc_scene_save_success.c +++ b/applications/nfc/scenes/nfc_scene_save_success.c @@ -1,4 +1,5 @@ #include "../nfc_i.h" +#include #define SCENE_SAVE_SUCCESS_CUSTOM_EVENT (0UL) @@ -9,6 +10,7 @@ void nfc_scene_save_success_popup_callback(void* context) { void nfc_scene_save_success_on_enter(void* context) { Nfc* nfc = (Nfc*)context; + DOLPHIN_DEED(DolphinDeedNfcSave); // Setup view Popup* popup = nfc->popup; diff --git a/applications/nfc/scenes/nfc_scene_set_uid.c b/applications/nfc/scenes/nfc_scene_set_uid.c index 5d179f77d..e23efe793 100755 --- a/applications/nfc/scenes/nfc_scene_set_uid.c +++ b/applications/nfc/scenes/nfc_scene_set_uid.c @@ -1,4 +1,5 @@ #include "../nfc_i.h" +#include #define SCENE_SET_UID_CUSTOM_EVENT (0UL) @@ -30,6 +31,7 @@ bool nfc_scene_set_uid_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == SCENE_SET_UID_CUSTOM_EVENT) { + DOLPHIN_DEED(DolphinDeedNfcAdd); scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName); return true; } diff --git a/applications/subghz/scenes/subghz_scene_frequency_analyzer.c b/applications/subghz/scenes/subghz_scene_frequency_analyzer.c index 548a0f8fc..554030ad3 100644 --- a/applications/subghz/scenes/subghz_scene_frequency_analyzer.c +++ b/applications/subghz/scenes/subghz_scene_frequency_analyzer.c @@ -1,5 +1,6 @@ #include "../subghz_i.h" #include "../views/subghz_frequency_analyzer.h" +#include void subghz_scene_frequency_analyzer_callback(SubghzCustomEvent event, void* context) { furi_assert(context); @@ -9,6 +10,7 @@ void subghz_scene_frequency_analyzer_callback(SubghzCustomEvent event, void* con void subghz_scene_frequency_analyzer_on_enter(void* context) { SubGhz* subghz = context; + DOLPHIN_DEED(DolphinDeedSubGhzFrequencyAnalyzer); subghz_frequency_analyzer_set_callback( subghz->subghz_frequency_analyzer, subghz_scene_frequency_analyzer_callback, subghz); view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewFrequencyAnalyzer); diff --git a/applications/subghz/scenes/subghz_scene_read_raw.c b/applications/subghz/scenes/subghz_scene_read_raw.c index 50edcb22b..481138dc4 100644 --- a/applications/subghz/scenes/subghz_scene_read_raw.c +++ b/applications/subghz/scenes/subghz_scene_read_raw.c @@ -1,5 +1,6 @@ #include "../subghz_i.h" #include "../views/subghz_read_raw.h" +#include #include #include #include @@ -199,6 +200,7 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { if(!subghz_tx_start(subghz)) { scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx); } else { + DOLPHIN_DEED(DolphinDeedSubGhzSend); subghz->state_notifications = SubGhzNotificationStateTX; } } @@ -240,6 +242,7 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { RAW_FILE_NAME, subghz->txrx->frequency, string_get_cstr(subghz->error_str))) { + DOLPHIN_DEED(DolphinDeedSubGhzRawRec); if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) || (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) { subghz_begin(subghz, subghz->txrx->preset); diff --git a/applications/subghz/scenes/subghz_scene_receiver_info.c b/applications/subghz/scenes/subghz_scene_receiver_info.c index a8935a1ce..64d3633cf 100644 --- a/applications/subghz/scenes/subghz_scene_receiver_info.c +++ b/applications/subghz/scenes/subghz_scene_receiver_info.c @@ -1,5 +1,6 @@ #include "../subghz_i.h" #include "../helpers/subghz_custom_event.h" +#include void subghz_scene_receiver_info_callback(GuiButtonType result, InputType type, void* context) { furi_assert(context); @@ -39,6 +40,7 @@ static bool subghz_scene_receiver_info_update_parser(void* context) { void subghz_scene_receiver_info_on_enter(void* context) { SubGhz* subghz = context; + DOLPHIN_DEED(DolphinDeedSubGhzReceiverInfo); if(subghz_scene_receiver_info_update_parser(subghz)) { string_t frequency_str; string_t modulation_str; diff --git a/applications/subghz/scenes/subghz_scene_save_success.c b/applications/subghz/scenes/subghz_scene_save_success.c index 923a06b64..3d9d28d1e 100644 --- a/applications/subghz/scenes/subghz_scene_save_success.c +++ b/applications/subghz/scenes/subghz_scene_save_success.c @@ -1,5 +1,7 @@ #include "../subghz_i.h" #include "../helpers/subghz_custom_event.h" +#include "dolphin/helpers/dolphin_deed.h" +#include void subghz_scene_save_success_popup_callback(void* context) { SubGhz* subghz = context; @@ -8,6 +10,7 @@ void subghz_scene_save_success_popup_callback(void* context) { void subghz_scene_save_success_on_enter(void* context) { SubGhz* subghz = context; + DOLPHIN_DEED(DolphinDeedSubGhzSave); // Setup view Popup* popup = subghz->popup; diff --git a/applications/subghz/scenes/subghz_scene_set_type.c b/applications/subghz/scenes/subghz_scene_set_type.c index ddd8b9760..0d8f0ad2e 100644 --- a/applications/subghz/scenes/subghz_scene_set_type.c +++ b/applications/subghz/scenes/subghz_scene_set_type.c @@ -1,5 +1,6 @@ #include "../subghz_i.h" #include "../lib/subghz/protocols/subghz_protocol_keeloq.h" +#include enum SubmenuIndex { SubmenuIndexPricenton, @@ -192,6 +193,7 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { subghz->txrx->frequency = subghz_frequencies[subghz_frequencies_433_92]; subghz->txrx->preset = FuriHalSubGhzPresetOok650Async; subghz_file_name_clear(subghz); + DOLPHIN_DEED(DolphinDeedSubGhzAddManually); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName); return true; } diff --git a/applications/subghz/scenes/subghz_scene_transmitter.c b/applications/subghz/scenes/subghz_scene_transmitter.c index 287e1afd0..48ed0fd86 100644 --- a/applications/subghz/scenes/subghz_scene_transmitter.c +++ b/applications/subghz/scenes/subghz_scene_transmitter.c @@ -1,6 +1,7 @@ #include "../subghz_i.h" #include "../views/subghz_transmitter.h" #include +#include void subghz_scene_transmitter_callback(SubghzCustomEvent event, void* context) { furi_assert(context); @@ -50,6 +51,7 @@ bool subghz_scene_transmitter_update_data_show(void* context) { void subghz_scene_transmitter_on_enter(void* context) { SubGhz* subghz = context; + DOLPHIN_DEED(DolphinDeedSubGhzSend); if(!subghz_scene_transmitter_update_data_show(subghz)) { view_dispatcher_send_custom_event( subghz->view_dispatcher, SubghzCustomEventViewTransmitterError); diff --git a/applications/u2f/scenes/u2f_scene_main.c b/applications/u2f/scenes/u2f_scene_main.c index 5d2694d48..4ff5e6013 100644 --- a/applications/u2f/scenes/u2f_scene_main.c +++ b/applications/u2f/scenes/u2f_scene_main.c @@ -1,5 +1,6 @@ #include "../u2f_app_i.h" #include "../views/u2f_view.h" +#include #include "furi_hal.h" #include "../u2f.h" @@ -63,6 +64,7 @@ bool u2f_scene_main_on_event(void* context, SceneManagerEvent event) { } else if(event.event == U2fCustomEventWink) { notification_message(app->notifications, &sequence_blink_green_10); } else if(event.event == U2fCustomEventAuthSuccess) { + DOLPHIN_DEED(DolphinDeedU2fAuthorized); osTimerStart(app->timer, U2F_SUCCESS_TIMEOUT); app->event_cur = U2fCustomEventNone; u2f_view_set_state(app->u2f_view, U2fMsgSuccess); diff --git a/assets/Makefile b/assets/Makefile index 31b252b94..91cc06713 100644 --- a/assets/Makefile +++ b/assets/Makefile @@ -20,14 +20,18 @@ $(PROTOBUF) &: $(PROTOBUF_SOURCES) $(PROTOBUF_COMPILER) .PHONY: protobuf protobuf: $(PROTOBUF) -$(DOLPHIN_OUTPUT_DIR): $(DOLPHIN_SOURCE_DIR) - @echo "\tDOLPHIN" - @$(ASSETS_COMPILLER) dolphin "$(DOLPHIN_SOURCE_DIR)" "$(DOLPHIN_OUTPUT_DIR)" +$(DOLPHIN_EXTERNAL_OUTPUT_DIR): $(DOLPHIN_SOURCE_DIR) + @echo "\tDOLPHIN blocking" + @$(ASSETS_COMPILLER) dolphin -s dolphin_blocking "$(DOLPHIN_SOURCE_DIR)/blocking" "$(DOLPHIN_INTERNAL_OUTPUT_DIR)" + @echo "\tDOLPHIN internal" + @$(ASSETS_COMPILLER) dolphin -s dolphin_internal "$(DOLPHIN_SOURCE_DIR)/internal" "$(DOLPHIN_INTERNAL_OUTPUT_DIR)" + @echo "\tDOLPHIN external" + @$(ASSETS_COMPILLER) dolphin "$(DOLPHIN_SOURCE_DIR)/external" "$(DOLPHIN_EXTERNAL_OUTPUT_DIR)" .PHONY: dolphin -dolphin: $(DOLPHIN_OUTPUT_DIR) +dolphin: $(DOLPHIN_EXTERNAL_OUTPUT_DIR) clean: @echo "\tCLEAN\t" @$(RM) $(ASSETS_COMPILED_DIR)/* - @$(RM) -rf $(DOLPHIN_OUTPUT_DIR) + @$(RM) -rf $(DOLPHIN_EXTERNAL_OUTPUT_DIR) diff --git a/assets/assets.mk b/assets/assets.mk index 2d84f1d1d..cd5a9b2ec 100644 --- a/assets/assets.mk +++ b/assets/assets.mk @@ -6,8 +6,9 @@ ASSETS_SOURCE_DIR := $(ASSETS_DIR)/icons ASSETS_SOURCES += $(shell find $(ASSETS_SOURCE_DIR) -type f -iname '*.png' -or -iname 'frame_rate') ASSETS += $(ASSETS_COMPILED_DIR)/assets_icons.c -DOLPHIN_SOURCE_DIR := $(ASSETS_DIR)/dolphin -DOLPHIN_OUTPUT_DIR := $(ASSETS_DIR)/resources/dolphin +DOLPHIN_SOURCE_DIR := $(ASSETS_DIR)/dolphin +DOLPHIN_INTERNAL_OUTPUT_DIR := $(ASSETS_COMPILED_DIR) +DOLPHIN_EXTERNAL_OUTPUT_DIR := $(ASSETS_DIR)/resources/dolphin PROTOBUF_SOURCE_DIR := $(ASSETS_DIR)/protobuf PROTOBUF_COMPILER := $(PROJECT_ROOT)/lib/nanopb/generator/nanopb_generator.py diff --git a/assets/compiled/assets_dolphin_blocking.c b/assets/compiled/assets_dolphin_blocking.c new file mode 100644 index 000000000..a14b8c5fe --- /dev/null +++ b/assets/compiled/assets_dolphin_blocking.c @@ -0,0 +1,320 @@ +#include +#include +#include +#include + + + +const uint8_t _A_L0_NoDb_128x51_0[] = { + 0x1,0x0,0x43,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xff,0x11,0x0,0x88,0x0,0x4,0x16,0x34,0x0,0x10,0xc1,0x1,0xf7,0x20,0x7,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x7,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x4,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x1,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x7,0x9c,0x4a,0xb,0x22,0x7,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x7,0xf8,0x3f,0xc1,0xf9,0x7,0x7,0xbd,0xc2,0x3c,0xaf,0x2a,0x7,0xff,0xf3,0xfc,0x7,0xb6,0x22,0x44,0xf,0x2d,0x7,0xff,0x1d,0xfb,0x7,0xa6,0x2,0x73,0x8,0x91,0x63,0x27,0x70,0x7e,0x85,0xff,0xf7,0xf7,0x7,0xa5,0x2,0x95,0x70,0x91,0x54,0xb1,0x50,0x4f,0x86,0xff,0xfb,0xef,0x7,0xb6,0x2,0x45,0x42,0x7,0x9f,0xfc,0x1e,0xe3,0xf1,0xf,0x9f,0x7e,0x3f,0xdf,0x1f,0xad,0x24,0xbe,0x38,0xc8,0x5c,0x1c,0x1e,0x3e,0xfe,0xf1,0xfe,0xc1,0xe3,0xff,0x7,0xe7,0x0,0x5a,0x22,0xf5,0x7,0xc6,0xfc,0x1f,0xa5,0xf7,0x7,0xc6,0xfc,0x1e,0xff,0xe6,0xd1,0x40,0x68,0x17,0xff,0xff,0x9c,0x1e,0xb8,0x8,0x8,0x10,0xa0,0x4b,0xf1,0xff,0x70,0xc1,0xeb,0xc0,0x2,0x1c,0x13,0xa0,0xdf,0x1c,0x0,0x3e,0xfe,0xf,0xf1,0x83,0x83,0xda,0x11,0x2,0x80,0x42,0x1,0xe5,0xff,0x87,0xdf,0x81,0xeb,0x18,0x81,0xc0,0x23,0x0,0xf3,0x8f,0xdf,0x1,0xeb,0xa8,0x99,0x59,0xe7,0x0,0xf3,0x9f,0xde,0x1,0xeb,0x48,0xa5,0x64,0x6f,0x0,0xf3,0xbf,0x83,0xda,0x11,0x4a,0xf8,0x87,0xd3,0xfe,0xf,0x88,0x88,0xfd,0x4,0x2,0xf,0x69,0x95,0x84,0xbe,0x80,0xf7,0x3f,0xb0,0x3f,0xc1,0xf0,0xbf,0x40,0x7c,0xe0,0x1,0x24,0xdf,0x1f,0x0,0x10,0xa7,0xee,0xf5,0x7,0x98,0x25,0x40,0x1e,0x0,0xf0,0x7,0x80,0x28 +}; + +const uint8_t _A_L0_NoDb_128x51_1[] = { + 0x1,0x0,0x45,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xff,0x11,0x0,0x88,0x0,0x4,0x16,0x34,0x0,0x10,0xc1,0x1,0xf7,0x20,0x7,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x7,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x4,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x1,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x7,0x9c,0x4a,0xb,0x22,0x7,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x7,0xf8,0x3f,0xc1,0xf9,0x1f,0xfe,0x3,0xda,0xe1,0x1e,0x57,0x95,0x3,0xff,0xe7,0xf9,0x83,0xdb,0x11,0x22,0x7,0x96,0x83,0xff,0x3b,0xf7,0x3,0xd3,0x1,0x39,0x84,0x48,0xb1,0x93,0xb8,0x3f,0x43,0xff,0xed,0xef,0x83,0xd2,0x81,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc3,0xff,0xf6,0xdf,0x83,0xdb,0x1,0x22,0xa1,0x3,0xcf,0xfc,0xf,0x71,0xf8,0x87,0xce,0xff,0x1f,0xbf,0x8f,0xd6,0x92,0x5f,0x1c,0x64,0x2e,0xe,0xf,0x1f,0x7d,0xf8,0xff,0x60,0xf1,0xff,0x83,0xf3,0x80,0x2d,0x11,0x7a,0x83,0xe0,0x9c,0x20,0xfc,0x2f,0xb8,0x3e,0x37,0xc0,0xf7,0xff,0x36,0x8a,0x2,0xbf,0x1f,0xee,0x7c,0x1e,0xb8,0x8,0x8,0x10,0xa0,0x4b,0xf1,0xfd,0xc3,0xc1,0xeb,0xc0,0x2,0x1c,0x11,0x7e,0x3e,0x78,0x1d,0xf8,0x1f,0x4a,0xf1,0x8f,0xc7,0x2f,0x80,0xf5,0x84,0x40,0xa0,0x10,0x80,0x79,0x7f,0xe7,0xf7,0x80,0x7a,0xc6,0x20,0x70,0x8,0xc0,0x3c,0xef,0xf7,0x0,0x7a,0xea,0x26,0x56,0x79,0xc0,0x3c,0xff,0xf6,0x0,0x7a,0xd2,0x29,0x59,0x1b,0xc0,0x3d,0x2c,0x23,0xf6,0xa5,0x7c,0x43,0xeb,0x63,0x7,0xbc,0x44,0x7e,0x84,0x1,0x7,0xb4,0xca,0xc2,0x5f,0x40,0x7b,0x9f,0xd8,0x1f,0xe0,0xf8,0x5f,0xa0,0x3e,0x70,0x0,0x92,0x6f,0x8f,0x80,0x8,0x53,0xf7,0x7a,0x83,0xcc,0x12,0xa0,0xf,0x0,0x78,0x3,0xc0,0x14 +}; + +const uint8_t _A_L0_NoDb_128x51_2[] = { + 0x1,0x0,0x43,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xff,0x11,0x0,0x88,0x0,0x4,0x16,0x34,0x0,0x10,0xc1,0x1,0xf7,0x20,0x7,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x7,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x4,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x1,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x7,0x9c,0x4a,0xb,0x22,0x7,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x7,0xf8,0x3f,0xc1,0xfe,0xa,0x5b,0x84,0x79,0x5e,0x54,0x0,0x7c,0xe2,0x24,0x40,0xf2,0xd0,0x7f,0xe3,0xff,0xc0,0x7a,0x60,0x27,0x30,0x89,0x16,0x32,0x77,0x7,0xe8,0x7f,0xfc,0xff,0x30,0x7a,0x50,0x29,0x57,0x9,0x15,0x4b,0x15,0x4,0xf8,0x7f,0xe7,0x7e,0xe0,0x7b,0x60,0x24,0x54,0x20,0x79,0xfb,0x7b,0xe0,0xf6,0x1f,0x88,0x7d,0x22,0xdb,0xf1,0xfa,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xe3,0xee,0xdf,0x1f,0xef,0xe1,0x7f,0xff,0xdf,0x81,0xf7,0xc0,0xbf,0x80,0x8,0x1f,0x83,0xe1,0x7,0xea,0x78,0x43,0xfe,0xf,0x6f,0xf2,0xe8,0xa0,0x2b,0xf1,0xff,0x1b,0xd4,0xe0,0x30,0x10,0x21,0x40,0x97,0xe2,0xf,0x7e,0x0,0x10,0xe0,0x8b,0xf1,0xfe,0xe7,0xc1,0xf6,0x8f,0x1f,0xdc,0x3c,0x1e,0xd0,0x88,0x14,0x2,0x10,0xf,0x2f,0x3c,0xe,0xfc,0xf,0x58,0xc4,0xe,0x1,0x18,0x7,0x94,0x7e,0x39,0x7c,0x7,0xae,0xa2,0x65,0x67,0x9c,0x3,0xcb,0xff,0x3f,0xbc,0x3,0xd6,0x91,0x4a,0xc8,0xde,0x1,0xe7,0x7f,0xb8,0xf,0xda,0x95,0xf1,0xf,0xa7,0xfe,0xc0,0xf,0x78,0x88,0xfc,0xc0,0x3,0x61,0x7,0xb4,0xca,0xc2,0x5f,0x30,0x0,0xd8,0xcf,0xf8,0x40,0x20,0x7f,0x83,0xd5,0x7e,0x80,0xf9,0xc0,0x2,0x49,0xbe,0x3e,0x0,0x21,0x4f,0xdd,0xea,0xf,0x30,0x4a,0x80,0x3c,0x1,0xe0,0xf,0x0,0x50 +}; + +const uint8_t _A_L0_NoDb_128x51_3[] = { + 0x1,0x0,0x43,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xff,0x11,0x0,0x88,0x0,0x4,0x16,0x34,0x0,0x10,0xc1,0x1,0xf7,0x20,0x7,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x7,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x4,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x1,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x7,0x9c,0x4a,0xb,0x22,0x7,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x7,0xf8,0x3f,0xc1,0xfe,0xa,0x5b,0x84,0x79,0x5e,0x54,0x0,0x7c,0xe2,0x24,0x40,0xf2,0xd0,0x7f,0xe0,0xe0,0xf5,0xc0,0x4e,0x61,0x12,0x2c,0x64,0xee,0xf,0xd0,0xff,0xfe,0x7f,0x80,0xf4,0xa0,0x52,0xae,0x12,0x2a,0x96,0x2a,0x9,0xf0,0xff,0xe3,0xbf,0x60,0xf6,0xc0,0x48,0xa8,0x40,0xf2,0xbf,0xfe,0xfe,0xe0,0xf6,0x1f,0x88,0x7c,0xf7,0xf1,0xdf,0x78,0xfd,0x69,0x25,0xf1,0xc6,0x42,0xe0,0xe0,0xf1,0xf7,0xfb,0x8f,0xf7,0xf0,0xef,0xff,0xfb,0xc0,0xfb,0xe0,0x77,0xef,0xe0,0x11,0x7,0xe6,0xfc,0x1f,0xdf,0xf0,0xff,0x83,0xdf,0xfc,0xba,0x28,0xd,0x3,0x7f,0xff,0x37,0xa9,0xc0,0x60,0x20,0x42,0x81,0x68,0x1,0xf1,0xc0,0x2,0x1c,0x13,0xa1,0x7f,0xff,0xf9,0xc1,0xf6,0xbf,0x1f,0xf7,0xc,0x1e,0xd0,0x88,0x14,0x2,0x10,0xf,0x2f,0xce,0x0,0x1e,0xd1,0x88,0x1c,0x2,0x30,0xf,0x28,0x3c,0x1c,0x1e,0xda,0x89,0x95,0x9e,0x70,0xf,0x2f,0xfc,0x3e,0xfc,0xf,0x5a,0x45,0x2b,0x23,0x78,0x7,0x9c,0x7e,0xf8,0x3f,0x6a,0x57,0xc4,0x3e,0x93,0xfb,0xc0,0x3d,0xe2,0x23,0xf3,0xff,0xdf,0xc1,0xef,0x32,0xb0,0x97,0xcc,0x0,0x20,0xf6,0x3f,0xb0,0x80,0x81,0xfe,0xf,0x55,0xfa,0x3,0xe7,0x0,0x9,0x26,0xf8,0xf8,0x0,0x85,0x3f,0x77,0xa8,0x3c,0xc1,0x2a,0x0,0xf0,0x7,0x80,0x3c,0x1,0x40 +}; + + +const uint8_t *_A_L0_NoDb_128x51[] = { + + _A_L0_NoDb_128x51_0, + + _A_L0_NoDb_128x51_1, + + _A_L0_NoDb_128x51_2, + + _A_L0_NoDb_128x51_3, + +}; + + + +const BubbleAnimation BA_L0_NoDb_128x51 = { + .icon_animation = { + .width = 128, + .height = 51, + .frame_count = 4, + .frame_rate = 2, + .frames = _A_L0_NoDb_128x51 + }, + .frame_order = { 0, 1, 2, 3 }, + .passive_frames = 4, + .active_frames = 0, + .active_cooldown = 0, + .active_cycles = 0, + .duration = 0, + + .frame_bubble_sequences = NULL, + .frame_bubble_sequences_count = 0, + +}; + + +const uint8_t _A_L0_SdBad_128x51_0[] = { + 0x1,0x0,0x1,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfe,0x1,0x82,0x4,0xc,0x4a,0x1,0x70,0x8f,0x1,0x46,0x8,0xf,0x5e,0x30,0x24,0x60,0x50,0xc,0x44,0x88,0x1f,0x1a,0xaa,0x64,0xeb,0xaf,0x71,0x84,0x48,0xb1,0x93,0xb8,0x39,0x3d,0x72,0x55,0x2a,0x50,0x4,0x6e,0x12,0x2a,0x96,0x28,0x3e,0x20,0xf4,0xc1,0x3,0xcf,0x1,0x22,0xa1,0x3,0xf0,0x7e,0x21,0xf9,0xc6,0x52,0xea,0x57,0x22,0xf8,0xe3,0x21,0x63,0xf6,0x0,0x1d,0x1,0x3f,0xd3,0x5,0x7f,0x83,0xfc,0x1f,0xe0,0xf5,0xcf,0xfc,0xee,0x77,0xe0,0x5b,0x7e,0x28,0x10,0x18,0x25,0x2,0x7f,0xf9,0x93,0x87,0xde,0x11,0x0,0x7,0x8e,0x82,0xff,0xfc,0xc7,0x83,0xe2,0xb9,0x19,0x83,0xf4,0x1,0xf5,0x78,0xa9,0x69,0x60,0x9f,0x1,0x7d,0xd4,0xb7,0xa0,0xf1,0x27,0xd0,0x3c,0x70,0xa0,0xf1,0x37,0xd0,0xfc,0xc1,0xf6,0x0,0x30,0x7f,0xf0,0x1,0xff,0xff,0x83,0xfe,0x1,0xfb,0xf9,0xf0,0x83,0xf6,0x19,0xc6,0x7,0xb0,0xe8,0xe0,0x34,0xf,0xfc,0x1b,0x90,0xf,0x69,0x80,0xc,0xa0,0x5a,0xf,0xfc,0xd8,0x1e,0xf1,0x80,0x19,0x41,0x3a,0x5,0xd1,0xfe,0x3,0xec,0xff,0x51,0x8b,0x84,0x8a,0x4,0xf,0xcc,0x44,0x4a,0xc,0xf,0xd8,0x54,0x38,0x1f,0xb0,0x68,0xf0,0x7f,0xc7,0xfe,0x5f,0xf0,0x7e,0x1f,0xfc,0x1f,0xd3,0x85,0xf9,0x83,0xe8,0x14,0x70,0x1f,0x0,0x10,0xa7,0xe0,0xf5,0x5,0x18,0x25,0x40,0x1e,0x0,0xf0,0x7,0x80,0x28 +}; + +const uint8_t _A_L0_SdBad_128x51_1[] = { + 0x1,0x0,0x12,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfe,0x1,0x82,0x4,0xc,0x4a,0x1,0x70,0x8f,0x1,0x46,0x8,0xf,0x5e,0x30,0x24,0x60,0x50,0xc,0x44,0x88,0x1f,0x1a,0xaa,0x64,0xeb,0xaf,0x71,0x84,0x48,0xb1,0x93,0xb8,0x39,0x3d,0x72,0x55,0x2a,0x50,0x4,0x6e,0x12,0x2a,0x96,0x28,0x3e,0x20,0xf4,0xc1,0x3,0xcf,0x1,0x22,0xa1,0x3,0xf0,0x7e,0x21,0xf9,0xc6,0x52,0xea,0x57,0x22,0xf8,0xe3,0x21,0x63,0xf6,0x0,0x1d,0x1,0x3f,0xd3,0x5,0x7f,0x83,0xfc,0x1f,0xe0,0xf5,0xcf,0xfc,0xee,0x77,0xe0,0x5b,0x7e,0x28,0x10,0x18,0x25,0x2,0x7f,0xf9,0x93,0x87,0xde,0x11,0x0,0x7,0x8e,0x82,0xff,0xfc,0xc7,0x83,0xe2,0xb9,0x19,0x83,0xf4,0x1,0xf5,0x78,0xa9,0x69,0x60,0x9f,0x1,0x7d,0xd4,0xb7,0xa0,0xf1,0x27,0xd0,0x3c,0x70,0xa0,0xf1,0x37,0xd0,0xfc,0xc1,0xf6,0x0,0x30,0x7f,0xf0,0x1,0xff,0xff,0x81,0xfc,0x1,0xfb,0xf8,0xe0,0x83,0xf2,0xff,0x4c,0xc3,0x3,0xd8,0x74,0x70,0x15,0xf8,0xe1,0xa1,0x0,0xf6,0x98,0x0,0xca,0x5,0xa0,0x9f,0xc5,0xa1,0x20,0xf6,0x8c,0x0,0xca,0x9,0xd0,0xbb,0xcf,0xb3,0x17,0xb0,0x7d,0x7c,0x3e,0xf3,0xff,0xc0,0x3d,0xee,0x12,0x28,0x10,0x3c,0x7d,0xee,0x1,0xbe,0x83,0xdb,0x11,0x12,0x83,0x2f,0xec,0x1e,0x30,0xa8,0x70,0x3f,0x60,0xd1,0xe0,0xff,0x83,0xf4,0x7f,0xc5,0xf4,0x7,0xd1,0xfd,0x1,0xfe,0xf,0x99,0xc2,0xfc,0xc1,0xf4,0xa,0x38,0xf,0x80,0x8,0x53,0xf0,0x7a,0x82,0x8c,0x12,0xa0,0xf,0x0,0x78,0x3,0xc0,0x14 +}; + + +const uint8_t *_A_L0_SdBad_128x51[] = { + + _A_L0_SdBad_128x51_0, + + _A_L0_SdBad_128x51_1, + +}; + + + +const BubbleAnimation BA_L0_SdBad_128x51 = { + .icon_animation = { + .width = 128, + .height = 51, + .frame_count = 2, + .frame_rate = 2, + .frames = _A_L0_SdBad_128x51 + }, + .frame_order = { 0, 1 }, + .passive_frames = 2, + .active_frames = 0, + .active_cooldown = 0, + .active_cycles = 0, + .duration = 0, + + .frame_bubble_sequences = NULL, + .frame_bubble_sequences_count = 0, + +}; + + +const uint8_t _A_L0_SdOk_128x51_0[] = { + 0x1,0x0,0x19,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0xe,0x54,0xec,0xe,0x0,0x8,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x3,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x3,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x7,0xcc,0x1f,0xf8,0xf,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x9,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x9,0x4e,0xf4,0x1e,0x38,0x9,0x15,0x8,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x7,0xa4,0xc3,0x9d,0x18,0xc3,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xea,0x0,0x90,0x78,0x9f,0x84,0x1f,0x7c,0x0,0x7f,0xf7,0xfe,0xe0,0xfe,0x1f,0xef,0x0,0xfe,0x80,0xa5,0x75,0x14,0x6,0x80,0xf,0x99,0x80,0xc,0xa0,0x4b,0xf5,0x0,0x24,0x61,0xaa,0x7d,0x6,0xfb,0x83,0xdb,0xe0,0xff,0x70,0x79,0x34,0x6,0x4,0xf,0x28,0x3f,0xf0,0x1e,0xf8,0x88,0x94,0x18,0x1e,0x40,0x1,0x7,0xc4,0x2a,0x1c,0xf,0xd8,0x34,0x78,0x3f,0xe0,0xfd,0x1f,0xf1,0x7d,0x41,0xf2,0x7f,0x50,0x7f,0x83,0xe2,0x70,0xbf,0x30,0x7d,0x2,0x8e,0x3,0xe0,0x2,0x14,0xfc,0x1e,0xa0,0xa3,0x4,0xa8,0x3,0xc0,0x1e,0x0,0xf0,0x5,0x0 +}; + +const uint8_t _A_L0_SdOk_128x51_1[] = { + 0x1,0x0,0x1e,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0xe,0x54,0xec,0xe,0x0,0x8,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x3,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x3,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x7,0xcc,0x1f,0xf8,0xf,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x9,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x9,0x4e,0xf4,0x1e,0x38,0x9,0x15,0x8,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x7,0xa4,0xc3,0x9d,0x18,0xc3,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xea,0x0,0x90,0x78,0x9f,0x84,0x1f,0x7c,0xe,0xff,0x8c,0x1f,0xd8,0x70,0x7f,0x63,0xc1,0xfb,0xbf,0xcf,0x9f,0xc8,0x14,0xae,0xa2,0x80,0xd0,0x11,0xe8,0x0,0x49,0x80,0xc,0xa0,0x4b,0xf5,0x0,0x24,0x61,0xaa,0x7d,0x6,0xfb,0x83,0xdb,0xe0,0xff,0x70,0x79,0x34,0x6,0x4,0xf,0x28,0x3f,0xf0,0x1e,0xf8,0x88,0x94,0x18,0x1e,0x40,0x1,0x7,0xc4,0x2a,0x1c,0xf,0xd8,0x34,0x78,0x3f,0xe0,0xfd,0x1f,0xf1,0x7d,0x41,0xf2,0x7f,0x50,0x7f,0x83,0xe2,0x70,0xbf,0x30,0x7d,0x2,0x8e,0x3,0xe0,0x2,0x14,0xfc,0x1e,0xa0,0xa3,0x4,0xa8,0x3,0xc0,0x1e,0x0,0xf0,0x5,0x0 +}; + +const uint8_t _A_L0_SdOk_128x51_2[] = { + 0x1,0x0,0x22,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0xe,0x54,0xec,0xe,0x0,0x8,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x3,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x3,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x7,0xcc,0x1f,0xf8,0xf,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x9,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x9,0x4e,0xf4,0x1e,0x38,0x9,0x15,0x8,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x7,0xa4,0xc3,0x9d,0x18,0xc3,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xe5,0x7d,0x3f,0xd8,0x3c,0x7e,0x77,0xc0,0x7d,0xf0,0x3b,0xf6,0x30,0x7f,0x41,0xef,0xc0,0xfd,0x87,0x93,0xc8,0x1f,0x5b,0xfc,0xf9,0xfc,0x81,0x4a,0xea,0x28,0xd,0x1,0x1e,0x80,0x4,0x98,0x0,0xca,0x4,0xbf,0x50,0x2,0x46,0x1a,0xa7,0xd0,0x6f,0xb8,0x3d,0xbe,0xf,0xf7,0x7,0x93,0x40,0x60,0x40,0xf2,0x83,0xff,0x1,0xef,0x88,0x89,0x41,0x81,0xe4,0x0,0x10,0x7c,0x42,0xa1,0xc0,0xfd,0x83,0x47,0x83,0xfe,0xf,0xd1,0xff,0x17,0xd4,0x1f,0x27,0xf5,0x7,0xf8,0x3e,0x27,0xb,0xf3,0x7,0xd0,0x28,0xe0,0x3e,0x0,0x21,0x4f,0xc1,0xea,0xa,0x30,0x4a,0x80,0x3c,0x1,0xe0,0xf,0x0,0x50 +}; + +const uint8_t _A_L0_SdOk_128x51_3[] = { + 0x1,0x0,0x26,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0xe,0x54,0xec,0xe,0x0,0x8,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x3,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x3,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x7,0xcc,0x1f,0xf8,0xf,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x9,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x9,0x4e,0xf4,0x1e,0x38,0x9,0x15,0x8,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x7,0x8d,0xcc,0x1e,0x33,0xe,0x74,0x63,0xf,0x49,0x2f,0x8e,0x32,0x17,0x7,0x7,0x95,0xc4,0xff,0x60,0xf1,0xf9,0xde,0x1,0xf7,0xc0,0xef,0xd8,0xef,0x80,0xfd,0x83,0xdf,0x81,0xfb,0xf,0x2f,0x90,0x3e,0xb7,0xf9,0xf3,0xf9,0x2,0x95,0xd4,0x50,0x1a,0x2,0x3d,0x0,0x9,0x30,0x1,0x94,0x9,0x7e,0xa0,0x4,0x8c,0x35,0x4f,0xa0,0xdf,0x70,0x7b,0x7c,0x1f,0xee,0xf,0x26,0x80,0xc0,0x81,0xe5,0x7,0xfe,0x3,0xdf,0x11,0x12,0x83,0x3,0xc8,0x0,0x20,0xf8,0x85,0x43,0x81,0xfb,0x6,0x8f,0x7,0xfc,0x1f,0xa3,0xfe,0x2f,0xa8,0x3e,0x4f,0xea,0xf,0xf0,0x7c,0x4e,0x17,0xe6,0xf,0xa0,0x51,0xc0,0x7c,0x0,0x42,0x9f,0x83,0xd4,0x14,0x60,0x95,0x0,0x78,0x3,0xc0,0x1e,0x0,0xa0 +}; + + +const uint8_t *_A_L0_SdOk_128x51[] = { + + _A_L0_SdOk_128x51_0, + + _A_L0_SdOk_128x51_1, + + _A_L0_SdOk_128x51_2, + + _A_L0_SdOk_128x51_3, + +}; + + + +const BubbleAnimation BA_L0_SdOk_128x51 = { + .icon_animation = { + .width = 128, + .height = 51, + .frame_count = 4, + .frame_rate = 2, + .frames = _A_L0_SdOk_128x51 + }, + .frame_order = { 0, 1, 2, 3 }, + .passive_frames = 4, + .active_frames = 0, + .active_cooldown = 0, + .active_cycles = 0, + .duration = 0, + + .frame_bubble_sequences = NULL, + .frame_bubble_sequences_count = 0, + +}; + + +const uint8_t _A_L0_Url_128x51_0[] = { + 0x1,0x0,0x33,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x8,0x20,0x3f,0x32,0x80,0xff,0x7,0xee,0x2,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0xf,0xf0,0x7f,0x83,0xd6,0xe,0xf,0x29,0xf0,0x20,0x60,0x30,0x1d,0x40,0x10,0x8e,0x63,0xff,0xfc,0xff,0x1,0xe3,0x47,0x7,0x9c,0x90,0x1e,0x7a,0xf,0xfe,0x3b,0xf7,0x7f,0xc0,0x6b,0xa9,0x1c,0x7d,0xcc,0xcf,0x49,0xce,0xe0,0xe6,0x60,0x9d,0xb,0xff,0xef,0xee,0xf,0x1d,0xe5,0x22,0x53,0x25,0xa4,0xeb,0x2a,0x52,0x2d,0x2c,0x13,0xe1,0xbf,0xfe,0xfb,0xc1,0xe3,0x8f,0x7,0x95,0xe7,0x48,0xf,0x1d,0xe8,0x3c,0xbf,0xe0,0xf2,0xcf,0x3,0xca,0x12,0xf,0x2c,0x28,0x3c,0x7b,0xf1,0xfe,0xf8,0x3c,0x7b,0xd7,0xe,0x3c,0xe6,0x63,0xa5,0xe7,0x72,0x63,0x30,0x30,0x78,0xfb,0xfb,0xc5,0xf1,0x0,0x89,0x64,0x40,0x3,0x42,0x1,0x90,0x3c,0x7f,0xe0,0xf2,0x3f,0x88,0x3d,0xf8,0x2,0xd1,0x0,0x8a,0x7e,0x81,0xe3,0xbf,0x7,0xe9,0x7c,0xc1,0xf9,0xbf,0x7,0xc7,0xe1,0xb4,0x30,0x1a,0x5,0xff,0xff,0xe7,0x7,0xbc,0x18,0x4,0x30,0x25,0xf8,0xff,0xb8,0x60,0xf7,0x81,0x80,0x85,0x7e,0x2d,0xf1,0xc0,0x3,0xef,0xe0,0xff,0x18,0x38,0x3d,0xf8,0x78,0x98,0x40,0x3c,0xbf,0xf0,0xfb,0xf0,0x3d,0xa4,0x74,0xa8,0xc0,0x3c,0xe3,0xf7,0xc0,0x7b,0xca,0xa7,0x0,0xf3,0x9f,0xde,0x1,0xef,0x1a,0xbc,0x3,0xce,0xfe,0xf,0x80,0xfa,0xff,0xc1,0xf0,0x3f,0x51,0x0,0x97,0xf4,0x1f,0x7,0xf5,0x7,0xf8,0x3e,0x60,0xeb,0xf2,0x7,0xdf,0xf9,0xbe,0x5e,0x0,0x79,0x4f,0xc1,0xed,0xfc,0x5,0x8,0x25,0x80,0x1e,0x0,0xf0,0x7,0x80,0x24 +}; + +const uint8_t _A_L0_Url_128x51_1[] = { + 0x1,0x0,0x33,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x8,0x20,0x3f,0x32,0x80,0xff,0x7,0xee,0x2,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0xf,0xf0,0x7f,0x83,0xd6,0x3f,0xfc,0x7,0x8c,0xf8,0x10,0x30,0x18,0xe,0xa0,0x8,0x47,0x31,0xff,0xf9,0xfe,0x60,0xf1,0xa3,0x83,0xce,0x48,0xf,0x3d,0x7,0xfe,0x77,0xee,0xbf,0xe0,0x35,0xd4,0x8e,0x3e,0xe6,0x67,0xa4,0xe7,0x70,0x73,0x30,0x4e,0x87,0xff,0xdb,0xdf,0x7,0x8e,0xf2,0x91,0x29,0x92,0xd2,0x75,0x95,0x29,0x16,0x96,0x9,0xf0,0xff,0xfd,0xb7,0xe0,0xf1,0xc7,0x83,0xca,0xf3,0xa4,0x7,0x8e,0xf4,0x1e,0x5f,0xe0,0x79,0x67,0x81,0xe5,0x9,0x7,0x96,0x14,0x1e,0x37,0xf8,0xfd,0xfc,0x1e,0x3d,0xeb,0x87,0x1e,0x73,0x31,0xd2,0xf3,0xb9,0x31,0x98,0x18,0x3c,0x7d,0xf7,0xe2,0xf8,0x80,0x44,0xb2,0x20,0x1,0xa1,0x0,0xc8,0x1e,0x3f,0xf0,0x79,0x1f,0xc4,0x1e,0xfc,0x1,0x68,0x80,0x5,0x3f,0x40,0xf1,0x27,0x8,0x3f,0xb,0xe6,0xf,0xcd,0xf0,0x3e,0x3f,0xd,0xa1,0x80,0xaf,0xc7,0xfb,0x9f,0x7,0xbc,0x18,0x4,0x30,0x25,0xf8,0xfe,0xe1,0xe0,0xf7,0x81,0x80,0x85,0x7e,0x5e,0x78,0x1d,0xf8,0x1f,0x4a,0xf1,0x8f,0xc7,0x2f,0x80,0xf6,0xe1,0xe2,0x61,0x0,0xf2,0xff,0xcf,0xef,0x0,0xf6,0x91,0xd2,0xa3,0x0,0xf3,0xbf,0xdc,0x1,0xef,0x2a,0x9c,0x3,0xcf,0xff,0x60,0x7,0xbc,0x6a,0xf0,0xf,0x4b,0x8,0x7f,0xac,0x63,0xfd,0x20,0x9,0x7f,0x41,0xf0,0x7f,0x50,0x7f,0x83,0xe6,0xe,0xbf,0x20,0x7d,0xff,0x9b,0xe5,0xe0,0x7,0x94,0xfc,0x1e,0xdf,0xc0,0x50,0x82,0x58,0x1,0xe0,0xf,0x0,0x78,0x2,0x40 +}; + +const uint8_t _A_L0_Url_128x51_2[] = { + 0x1,0x0,0x2e,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x8,0x20,0x3f,0x32,0x80,0xff,0x7,0xee,0x2,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0xf,0xf0,0x7f,0x83,0xe6,0x7c,0x8,0x18,0xc,0x7,0x50,0x4,0x23,0x98,0x83,0xd2,0x8e,0xf,0x39,0x20,0x3c,0xf4,0x1f,0xf8,0xff,0xf2,0xff,0x80,0xd7,0x52,0x38,0xfb,0x99,0x9e,0x93,0x9d,0xc1,0xcc,0xc1,0x3a,0x1f,0xff,0x3f,0xcc,0x1e,0x3b,0xca,0x44,0xa6,0x4b,0x49,0xd6,0x54,0xa4,0x5a,0x58,0x27,0xc3,0xff,0x3b,0xf7,0x3,0xc7,0x1e,0xf,0x2b,0xce,0x90,0x1e,0x3b,0xd0,0x79,0x7b,0x7b,0xe0,0xf1,0xcf,0x3,0xca,0x12,0xf,0x2c,0x28,0x3c,0xa2,0xdb,0xf0,0x78,0xf7,0xae,0x1c,0x79,0xcc,0xc7,0x4b,0xce,0xe4,0xc6,0x60,0x60,0xf1,0xf7,0x6f,0x8b,0xe2,0x1,0x12,0xc8,0x80,0x6,0x84,0x3,0x2f,0x85,0xff,0xff,0x7e,0x3f,0x98,0x3d,0xf8,0x17,0xf0,0x1,0x27,0xe8,0x1e,0x23,0xe1,0x7,0xea,0x78,0x43,0xfe,0xf,0x7f,0xc2,0xe8,0x60,0x2b,0xf1,0xff,0x4,0x4,0x1e,0xd0,0x60,0x10,0xc0,0x97,0xe2,0xf,0x98,0x18,0x8,0x57,0xe5,0xfd,0xcf,0x83,0xed,0x1e,0x3f,0xb8,0x78,0x3d,0xf8,0x78,0x98,0x40,0x3c,0xbc,0xf0,0x3b,0xf0,0x3d,0xa4,0x74,0xa8,0xc0,0x3c,0xa3,0xf1,0xcb,0xe0,0x3d,0xe5,0x53,0x80,0x79,0x7f,0xe7,0xf7,0x80,0x7b,0xc6,0xaf,0x0,0xf3,0xbf,0xdc,0x3,0xfb,0xff,0xb0,0xf,0xf0,0x0,0x36,0x12,0xfe,0x0,0x6,0xc6,0x7f,0xc2,0x1,0x3,0xfc,0x1e,0xd0,0x75,0xf9,0x3,0xef,0xfc,0xdf,0x2f,0x0,0x3c,0xa7,0xe0,0xf6,0xfe,0x2,0x84,0x12,0xc0,0xf,0x0,0x78,0x3,0xc0,0x12 +}; + +const uint8_t _A_L0_Url_128x51_3[] = { + 0x1,0x0,0x31,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x8,0x20,0x3f,0x32,0x80,0xff,0x7,0xee,0x2,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0xf,0xf0,0x7f,0x83,0xe6,0x7c,0x8,0x18,0xc,0x7,0x50,0x4,0x23,0x98,0x83,0xd2,0x8e,0xf,0x39,0x20,0x3c,0xf4,0x1f,0xf8,0x38,0x3c,0x70,0x1a,0xea,0x47,0x1f,0x73,0x33,0xd2,0x73,0xb8,0x39,0x98,0x27,0x43,0xff,0xf9,0xfe,0x3,0xc7,0x79,0x48,0x94,0xc9,0x69,0x3a,0xca,0x94,0x8b,0x4b,0x4,0xf8,0x7f,0xf1,0xdf,0xb0,0x78,0xe3,0xc1,0xe5,0x79,0xd2,0x3,0xc7,0x7a,0xf,0x1b,0xff,0xef,0xee,0xf,0x1c,0xf0,0x3c,0xa1,0x20,0xf2,0xc2,0x83,0xc7,0x7f,0x1d,0xf7,0x83,0xc7,0xbd,0x70,0xe3,0xce,0x66,0x3a,0x5e,0x77,0x26,0x33,0x3,0x7,0x8f,0xbf,0xdc,0x5f,0x10,0x8,0x96,0x44,0x0,0x34,0x20,0x19,0x7c,0x3b,0xff,0xfe,0xf1,0xfc,0xc1,0xef,0xc0,0xef,0xdf,0xc0,0x22,0x9f,0xa0,0x78,0xef,0xc1,0xfd,0xff,0xf,0xf8,0x3e,0x3f,0xb,0xa1,0x80,0xd0,0x37,0xff,0xf3,0x78,0x83,0xda,0xc,0x2,0x18,0x16,0x80,0x1f,0x50,0x30,0x10,0xaf,0xc6,0xff,0xff,0xf3,0x83,0xed,0x7e,0x3f,0xee,0x18,0x3d,0xf8,0x78,0x98,0x40,0x3c,0xbf,0x38,0x0,0x7b,0xc8,0xe9,0x51,0x80,0x79,0x41,0xe0,0xe0,0xf8,0x95,0x4e,0x1,0xe5,0xff,0x87,0xdf,0x81,0xef,0x1a,0xbc,0x3,0xce,0x3f,0x7c,0xf,0xec,0xfe,0xf0,0x3f,0xcf,0xfd,0xfc,0x1e,0xe5,0xf5,0x0,0x8,0x3d,0xcf,0xea,0x20,0x20,0x7f,0x83,0xda,0xe,0xbf,0x20,0x7d,0xff,0x9b,0xe5,0xe0,0x7,0x94,0xfc,0x1e,0xdf,0xc0,0x50,0x82,0x58,0x1,0xe0,0xf,0x0,0x78,0x2,0x40 +}; + + +const uint8_t *_A_L0_Url_128x51[] = { + + _A_L0_Url_128x51_0, + + _A_L0_Url_128x51_1, + + _A_L0_Url_128x51_2, + + _A_L0_Url_128x51_3, + +}; + + + +const BubbleAnimation BA_L0_Url_128x51 = { + .icon_animation = { + .width = 128, + .height = 51, + .frame_count = 4, + .frame_rate = 2, + .frames = _A_L0_Url_128x51 + }, + .frame_order = { 0, 1, 2, 3 }, + .passive_frames = 4, + .active_frames = 0, + .active_cooldown = 0, + .active_cycles = 0, + .duration = 0, + + .frame_bubble_sequences = NULL, + .frame_bubble_sequences_count = 0, + +}; + + +const uint8_t _A_L0_NewMail_128x51_0[] = { + 0x1,0x0,0x50,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf0,0x7,0x80,0x3c,0x1,0xe0,0x6,0xf8,0x40,0x40,0x63,0x30,0xfb,0x73,0x61,0x80,0xf7,0xfe,0x41,0xc0,0x63,0x70,0x9b,0x73,0x1,0xf1,0xfe,0x87,0x83,0xf7,0xff,0x1f,0x1,0x8e,0xc3,0xed,0xd9,0x83,0x3,0xdf,0x7e,0xf,0x39,0xb7,0x60,0x1e,0xf8,0xc,0xfc,0xfc,0x9e,0x53,0x7f,0xc1,0x14,0x81,0xeb,0xbf,0x7,0xa4,0xc2,0x6,0xa,0x2f,0xf8,0x0,0xc1,0xe9,0xf6,0x98,0x83,0xcb,0x80,0x1f,0x80,0x2,0xd0,0x11,0x24,0xf,0xc8,0x10,0x14,0xe1,0xf1,0xe0,0x7c,0x41,0xf,0xef,0xc,0xe3,0x6c,0x6c,0x20,0xf2,0x84,0x27,0xde,0x39,0xc7,0x7,0xa4,0x40,0x1e,0x7f,0xd3,0xc9,0x47,0x2c,0xfb,0x30,0x79,0xc8,0x9,0xe6,0xdf,0x3d,0xe0,0x3d,0x68,0x4,0x43,0x2,0x1e,0xb3,0xcd,0xb3,0x90,0x82,0x8b,0x0,0xa,0x29,0x0,0x3c,0xfd,0x93,0x6d,0xb0,0x3c,0xe0,0x2,0xa2,0x88,0x3,0xce,0x98,0xf,0x10,0x51,0x2,0x45,0x0,0x50,0x80,0x7b,0x5b,0xc1,0xe6,0x80,0x28,0x20,0x3c,0xd1,0xec,0x1c,0x10,0x20,0xc0,0x81,0xf6,0x80,0x28,0x8,0x3e,0xe6,0x7,0xe1,0x7,0xe5,0x21,0xa6,0x40,0xfb,0xc2,0x1f,0x84,0x9e,0x9f,0xef,0xf8,0x0,0x4e,0x2,0x6f,0x28,0xc,0x40,0xde,0x63,0x41,0x9,0x91,0xec,0x51,0xe5,0x2,0x84,0x23,0xcf,0x80,0x2d,0x33,0xd8,0xab,0xca,0x9,0x4,0x57,0x98,0x3d,0xc1,0x43,0xf8,0x81,0xb3,0xcf,0x81,0x8,0x16,0xc,0x20,0x1e,0x4e,0xf4,0x7,0x9c,0x62,0x7,0x0,0x8c,0x3,0xc9,0x1c,0x40,0x1,0xa0,0x83,0xcb,0x51,0x32,0xb3,0xce,0x1,0xe4,0xae,0x20,0x0,0xd0,0x81,0xe5,0x48,0xa5,0x64,0x6f,0x0,0xf2,0x67,0x10,0x0,0x68,0x83,0xf3,0xa5,0x7c,0x43,0xe6,0xee,0x20,0x0,0xa8,0xc4,0x1e,0x71,0x11,0xf9,0xa1,0x8e,0x1,0x50,0x7,0x9c,0xca,0xc2,0x5f,0x23,0xb2,0x40,0x2c,0x7,0xf8,0xc0,0x2d,0x48,0x0,0x33,0xf0,0x7c,0x0,0x23,0x80,0xbf,0x50,0x4,0xa,0x10,0x98,0x80,0x6,0x7,0x98,0x3a,0x80,0x1e,0x0,0xf0,0x7,0x80,0x14 +}; + +const uint8_t _A_L0_NewMail_128x51_1[] = { + 0x1,0x0,0x5d,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf0,0x7,0x80,0x3c,0x1,0xe0,0xa,0x98,0x7d,0xb9,0xb0,0xc0,0x7d,0xdc,0x26,0xdc,0xc0,0x7f,0x83,0xe3,0xe1,0x1,0x1,0x8e,0xc3,0xed,0xd9,0x83,0x3,0x13,0xfd,0xf,0x80,0x7f,0x20,0xe0,0xf2,0x9b,0x76,0x1,0xe9,0xc0,0x80,0xdc,0x2,0x46,0x4f,0x19,0xbf,0xe0,0x2a,0x40,0x1,0x9c,0x7f,0xb1,0xf0,0x3f,0xfc,0x7c,0x1e,0x73,0x8,0x18,0x38,0xb0,0x1c,0x7f,0xfd,0xfe,0x79,0xbf,0x7,0x9f,0xda,0x62,0xf,0x3b,0x87,0xf3,0xff,0xff,0xe3,0xe7,0xe7,0xe6,0x68,0xe7,0x3,0x84,0x0,0x3b,0xf0,0x7c,0x60,0x1,0xc6,0xf,0xae,0x0,0x3e,0x21,0x9c,0x6d,0x8d,0x84,0xa,0x34,0x0,0x7c,0x47,0x38,0xe0,0xf4,0x41,0xa4,0x3e,0x3c,0xf,0x2b,0x3e,0xcc,0x1e,0x70,0x40,0x79,0x9f,0xcf,0x78,0xf,0x58,0x42,0xc9,0xa0,0x1a,0xcf,0x36,0xce,0x42,0xf,0x28,0x80,0x3c,0xff,0xaa,0x92,0xf6,0x4d,0xb6,0xc0,0xf3,0xd0,0x13,0x8d,0xbe,0x74,0xc0,0x78,0x81,0x4a,0x81,0x40,0xf,0x10,0x11,0x1,0xe5,0x6f,0x5,0x16,0x0,0x14,0x52,0x0,0x79,0x80,0x14,0x12,0x22,0x42,0x88,0x3,0xef,0xfc,0x3f,0x18,0x78,0x3e,0xf0,0x82,0xe1,0x82,0x3,0xee,0x90,0x3,0x18,0x10,0x3e,0xe6,0xe,0x31,0x80,0x83,0xcc,0x6e,0x5f,0xf2,0x58,0x82,0x45,0x20,0x40,0xf3,0xa,0x8,0x4c,0xa0,0x40,0xf2,0x58,0x10,0xbc,0xf8,0x2,0xd3,0x66,0x8,0x24,0x5a,0x4,0x4f,0x30,0x7c,0x8,0xc4,0x44,0x20,0xf3,0x84,0x2,0x6,0x10,0xf,0x34,0x7b,0x70,0x23,0x10,0x38,0x4,0x60,0x1e,0x4a,0xf7,0xe0,0x6a,0x26,0x56,0x79,0xc0,0x3c,0x99,0xef,0xc0,0xa4,0x52,0xb2,0x37,0x80,0x79,0x48,0x1,0xe5,0x80,0x1f,0xa5,0x2b,0xe2,0x1f,0x33,0xf1,0x0,0x6,0x82,0xf,0x48,0x88,0xfc,0xcf,0xc4,0x0,0x1a,0x10,0x3c,0xe6,0x56,0x12,0xf9,0x9f,0x88,0x0,0x34,0x43,0xfc,0x9f,0x88,0x0,0x2d,0x31,0x7,0xc2,0xd8,0xe0,0x15,0x0,0x79,0x2f,0xd4,0x2c,0x90,0xb,0x1,0x8c,0x9b,0xc4,0xdf,0x20,0x32,0x7f,0xe7,0xe1,0x32,0x3,0x98,0x71,0x0,0x1e,0x0,0xf0,0x7,0x80,0x2c +}; + +const uint8_t _A_L0_NewMail_128x51_2[] = { + 0x1,0x0,0x79,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf0,0x1,0xfc,0x20,0x20,0xfd,0x84,0x40,0x81,0xfb,0xf6,0x86,0x83,0xf7,0xf3,0x13,0x3,0x24,0xc3,0xed,0xcd,0x86,0x1,0xcf,0x81,0xfe,0xb7,0x83,0xd2,0xe1,0x36,0xe6,0x3,0xd2,0x41,0xff,0xcf,0x83,0xf3,0xb1,0xff,0xbf,0xc0,0xc0,0xe7,0xb0,0xfb,0x76,0x60,0xc0,0x73,0xf2,0x7f,0xff,0xf0,0x40,0x7a,0x4d,0xbb,0x0,0xf4,0xfd,0x83,0xc6,0x36,0x82,0x39,0x84,0xdf,0xf1,0x7,0x7,0x16,0x3,0xf8,0xf,0x19,0x3f,0xf0,0x12,0x40,0xf1,0x98,0xd,0xcc,0x1c,0x40,0x2,0x87,0x9b,0xce,0x62,0xf,0x31,0xda,0x7f,0xe3,0xe8,0xd8,0x7,0xa6,0xfc,0x1f,0x25,0x33,0xc0,0x67,0xe7,0xe0,0xf8,0x82,0x83,0xcf,0x7e,0xf,0x28,0x67,0x1b,0x63,0x61,0x5,0x16,0x1c,0x9a,0x5b,0xf0,0x79,0xc7,0x38,0xe0,0xf3,0xe0,0x1c,0xd0,0x1e,0x96,0x7d,0x98,0x3c,0xa8,0x0,0xf8,0xde,0x3,0xd5,0x46,0x90,0xf8,0xf0,0xc,0x75,0x9e,0x6d,0x9c,0x84,0x1e,0x58,0x41,0xf9,0x4f,0xcf,0xe7,0xec,0x9b,0x6d,0x81,0xe7,0x8,0xf,0x9f,0xf9,0x3e,0x54,0xc0,0x78,0xb1,0x4a,0x81,0x10,0x7,0x9f,0xf4,0x8a,0x40,0xf2,0xb7,0x83,0xca,0x40,0x4f,0x36,0xf9,0x80,0x16,0x81,0xc0,0x1f,0x95,0xfe,0x80,0x9e,0x8a,0x6,0x0,0x8,0x52,0x0,0x7d,0x40,0x5,0x45,0x10,0x7,0xdc,0x8,0xd8,0x30,0x80,0x7d,0xff,0x20,0x1e,0x8,0x38,0x3c,0xff,0xc4,0x82,0x15,0x88,0x24,0x69,0x0,0x31,0x81,0x3,0xcb,0x0,0x62,0x38,0x10,0x3c,0xa6,0x0,0xa2,0x7,0x97,0x0,0x5a,0x70,0x40,0x79,0x24,0x8,0x1f,0x8b,0x2,0x17,0x9f,0x2,0x10,0x2c,0x18,0x40,0x3c,0xc0,0x62,0x2,0x10,0x79,0xc6,0x20,0x70,0x8,0xc0,0x3c,0xc2,0xc2,0x17,0x10,0x79,0xea,0x26,0x56,0x79,0xc0,0x3c,0xd1,0xed,0xc0,0xa4,0x52,0xb2,0x37,0x80,0x79,0x2b,0xdc,0x7e,0x34,0xaf,0x88,0x7c,0xd1,0x46,0x4,0x30,0x79,0x44,0x47,0xe6,0xef,0x40,0x7a,0x4c,0xac,0x25,0xf3,0x3f,0x10,0x0,0x68,0x27,0xf9,0x3f,0x10,0x0,0x68,0x40,0xf9,0x3f,0x10,0x0,0x68,0x80,0xf2,0x5f,0xb1,0xf8,0x80,0x2,0xd3,0x12,0x18,0xb7,0x89,0xbe,0x61,0x63,0x80,0x54,0x0,0x64,0xf,0x31,0xb3,0x40,0x2c,0x0,0x54,0x0,0x18,0x99,0x3f,0xf3,0xf0,0x7c,0x0,0x3c,0x1,0xc0 +}; + +const uint8_t _A_L0_NewMail_128x51_3[] = { + 0x1,0x0,0x77,0x1,0x0,0x1f,0xe2,0x6,0xf,0xd8,0x24,0x10,0x1f,0xbf,0xa8,0x58,0x3f,0x7f,0xb1,0x70,0x76,0x60,0x3f,0xd2,0xf0,0x7e,0x50,0x3f,0xf5,0xf0,0x7e,0x68,0x3f,0xfb,0xf0,0x7e,0x74,0x3f,0xf7,0xf8,0x8,0x1c,0xe6,0x1f,0x6e,0x6c,0x30,0xc,0x5f,0xcf,0xf8,0x0,0xa0,0xe0,0x82,0xb8,0x4d,0xb9,0x80,0xf3,0x3e,0x20,0x10,0xc1,0xff,0xb0,0xfb,0x76,0x60,0xc0,0xfc,0x9b,0x76,0x1,0xf9,0x30,0x9b,0xfe,0x8,0xc7,0x84,0x27,0x14,0xff,0xe8,0x61,0x20,0x78,0xcc,0x1b,0x6,0x1f,0x4f,0xe0,0x64,0x8d,0xe3,0x31,0x7,0xc7,0xfa,0x1e,0xed,0x90,0x21,0xff,0xe3,0xe0,0xf8,0x1f,0xa6,0xfc,0x1f,0x26,0x33,0xc0,0x67,0xe7,0xe0,0x41,0x86,0x71,0xb6,0x36,0x10,0x59,0x41,0x41,0xe7,0xbf,0x7,0x94,0x73,0x8e,0xf,0x3c,0x0,0x7d,0x1,0xe9,0x67,0xd9,0x83,0xcb,0x81,0x87,0x1f,0x96,0xfc,0x1e,0x7b,0xc0,0x7a,0x50,0x12,0x66,0x1f,0x4d,0x67,0x9b,0x67,0x21,0x7,0x90,0xbc,0xe0,0x10,0xf8,0xf0,0xc,0x7d,0x93,0x6d,0xb0,0x3c,0xcf,0xf1,0x4c,0x7,0x8a,0xd4,0xa8,0x18,0x83,0xf9,0xa7,0xcc,0x1e,0x56,0xf0,0x79,0x44,0x3,0xe7,0xfd,0x22,0x98,0x1,0x28,0x12,0x2,0x79,0xfc,0x5,0x24,0xf,0x6a,0x0,0x11,0xc1,0xed,0x80,0x1f,0x98,0x3e,0xa0,0x2,0xa2,0x88,0x3,0xee,0x4,0x6c,0x18,0x40,0x3c,0xff,0xc2,0x82,0xd,0x88,0x24,0x70,0x90,0x9,0x4,0x10,0x1e,0x58,0x2,0x91,0xc0,0x81,0xe5,0x48,0x1,0x8c,0x8,0x1e,0x5c,0x1,0x69,0xa7,0x4,0x12,0x33,0x0,0xd1,0x3,0xed,0x20,0x40,0xf4,0x84,0xb,0x6,0x10,0xf,0x38,0x40,0xd8,0x81,0xe7,0x18,0x81,0xc0,0x23,0x0,0xf3,0x68,0x11,0x3c,0xf8,0x1a,0x89,0x95,0x9e,0x70,0xf,0x31,0x30,0x88,0x84,0x1e,0x74,0x8a,0x56,0x46,0xf0,0xf,0x34,0x7b,0xf,0xc6,0x95,0xf1,0xf,0x9e,0x0,0xac,0x52,0x0,0x7a,0xc4,0x47,0xe6,0xcf,0x70,0x78,0xcc,0xac,0x25,0xf3,0x77,0xa1,0xfe,0x8f,0xc4,0x0,0x1a,0x8,0x3e,0x4f,0xc4,0x0,0x1a,0x10,0x3c,0x97,0xec,0x7e,0x20,0x0,0xd1,0x6,0x64,0xde,0x26,0xf9,0x9f,0x88,0x0,0x2d,0x31,0x0,0x8,0x3c,0xcb,0x44,0x26,0x38,0x5,0x40,0x8,0x60,0x4,0x23,0x24,0x2,0xc0,0xf,0x81,0xb2,0x7f,0xe7,0xe0,0xf8,0x0,0x70 +}; + + +const uint8_t *_A_L0_NewMail_128x51[] = { + + _A_L0_NewMail_128x51_0, + + _A_L0_NewMail_128x51_1, + + _A_L0_NewMail_128x51_2, + + _A_L0_NewMail_128x51_3, + +}; + + + +const BubbleAnimation BA_L0_NewMail_128x51 = { + .icon_animation = { + .width = 128, + .height = 51, + .frame_count = 4, + .frame_rate = 2, + .frames = _A_L0_NewMail_128x51 + }, + .frame_order = { 0, 1, 2, 3, 2, 1 }, + .passive_frames = 6, + .active_frames = 0, + .active_cooldown = 0, + .active_cycles = 0, + .duration = 0, + + .frame_bubble_sequences = NULL, + .frame_bubble_sequences_count = 0, + +}; + + +const StorageAnimation dolphin_blocking[] = { + + { + .animation = &BA_L0_NoDb_128x51, + .manifest_info = { + .name = "L0_NoDb_128x51", + .min_butthurt = 0, + .max_butthurt = 0, + .min_level = 0, + .max_level = 0, + .weight = 0, + } + }, + + { + .animation = &BA_L0_SdBad_128x51, + .manifest_info = { + .name = "L0_SdBad_128x51", + .min_butthurt = 0, + .max_butthurt = 0, + .min_level = 0, + .max_level = 0, + .weight = 0, + } + }, + + { + .animation = &BA_L0_SdOk_128x51, + .manifest_info = { + .name = "L0_SdOk_128x51", + .min_butthurt = 0, + .max_butthurt = 0, + .min_level = 0, + .max_level = 0, + .weight = 0, + } + }, + + { + .animation = &BA_L0_Url_128x51, + .manifest_info = { + .name = "L0_Url_128x51", + .min_butthurt = 0, + .max_butthurt = 0, + .min_level = 0, + .max_level = 0, + .weight = 0, + } + }, + + { + .animation = &BA_L0_NewMail_128x51, + .manifest_info = { + .name = "L0_NewMail_128x51", + .min_butthurt = 0, + .max_butthurt = 0, + .min_level = 0, + .max_level = 0, + .weight = 0, + } + }, + +}; + +const size_t dolphin_blocking_size = COUNT_OF(dolphin_blocking); diff --git a/assets/compiled/assets_dolphin_blocking.h b/assets/compiled/assets_dolphin_blocking.h new file mode 100644 index 000000000..ba3996ca1 --- /dev/null +++ b/assets/compiled/assets_dolphin_blocking.h @@ -0,0 +1,7 @@ +#pragma once + +#include +#include + +extern const StorageAnimation dolphin_blocking[]; +extern const size_t dolphin_blocking_size; diff --git a/assets/compiled/assets_dolphin_internal.c b/assets/compiled/assets_dolphin_internal.c new file mode 100644 index 000000000..99cab8190 --- /dev/null +++ b/assets/compiled/assets_dolphin_internal.c @@ -0,0 +1,324 @@ +#include +#include +#include +#include + + + +const uint8_t _A_L1_Tv_128x47_0[] = { + 0x1,0x0,0xca,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x66,0x33,0x30,0x50,0x81,0x88,0x1e,0xd0,0x50,0x19,0xa,0x8a,0x8,0x24,0x21,0x31,0x40,0x38,0x0,0x81,0x2d,0x20,0x8,0x41,0xeb,0x38,0x7,0xc0,0xb4,0x46,0xc4,0x78,0x10,0x79,0x80,0xc8,0x64,0x20,0xf4,0x86,0x2,0xcc,0x1e,0xa6,0x21,0xe8,0x40,0x21,0xe5,0x61,0x82,0x60,0x2f,0xe0,0xf7,0xa8,0x78,0x66,0x7,0x61,0x81,0x58,0x11,0xa3,0x2,0xc0,0x43,0xce,0x47,0x48,0x8f,0x25,0x8a,0x5,0x30,0x80,0x41,0x90,0x64,0xf,0x43,0xf9,0xc0,0x7f,0x5,0xb1,0x81,0x78,0x27,0xe0,0xf1,0xff,0xff,0xc7,0x2,0xba,0x20,0x30,0xc0,0x7e,0x10,0x3f,0x4,0x9f,0xc1,0x1f,0x22,0x8e,0x10,0x1e,0x56,0x1,0x39,0x2,0xc6,0xc1,0x26,0xf0,0x48,0xc4,0xc3,0x82,0x7,0x94,0x78,0x1e,0x5c,0x8,0x1f,0x2,0x27,0xc0,0xa0,0x8d,0x8a,0x7,0x0,0xf0,0x38,0x8a,0x8,0x55,0x12,0xf8,0xf0,0x11,0xc3,0x10,0x80,0xa3,0x44,0xec,0x41,0x71,0x30,0x8b,0x1c,0x81,0xe7,0xf0,0x9f,0xae,0x48,0x1e,0x20,0x43,0x7,0x96,0x80,0xa,0x34,0x0,0x51,0xc4,0x16,0x46,0xf,0xa9,0x7,0xd0,0x1e,0xbf,0x2,0x58,0x83,0xd6,0x18,0x5f,0x10,0x79,0xff,0x20,0xe0,0xf1,0x27,0x9d,0x2,0x9,0x7c,0x63,0x88,0x3c,0xbf,0xd0,0xf0,0x7a,0xe0,0x21,0x6,0xe1,0x16,0xe,0xf,0xff,0xfd,0xfb,0xaa,0xc7,0xfe,0xa6,0x10,0x78,0x9b,0xce,0x19,0x9c,0xff,0xa3,0x4,0x1e,0x51,0xd0,0x59,0x70,0x52,0xe2,0xa4,0x1d,0xc0,0x30,0x80,0x3,0x3f,0xf,0x97,0xe0,0x54,0x22,0xf1,0x45,0x88,0x3d,0x39,0xe0,0xf1,0xc0,0x15,0x87,0xff,0x3,0x26,0x8f,0x81,0xf8,0x64,0x61,0x7,0x8d,0xc0,0xa,0x3f,0xc0,0xa0,0x8f,0x10,0x0,0x3f,0x30,0x78,0xc3,0x82,0xe7,0x40,0x7,0xb7,0xd2,0x7f,0xf0,0xe0,0x83,0xd7,0xf8,0xe,0x3b,0xff,0xdf,0xbf,0xf,0xd3,0x18,0x8c,0x1e,0x3c,0x30,0x79,0xe7,0xfe,0xf1,0xfd,0x85,0xe6,0xfc,0xb3,0x3c,0x6,0x0,0x1e,0x7e,0xf0,0x78,0xd3,0xe9,0x39,0x26,0x38,0x83,0xc6,0x80,0xf,0x4f,0x9f,0xdf,0x3e,0x5,0x23,0xe8,0x83,0xc4,0x40,0x24,0x63,0xfe,0x3,0xc4,0xa,0x51,0x80,0x7a,0x7,0xcd,0x84,0x31,0xf1,0x61,0x47,0x1,0xe5,0x10,0x7,0xbc,0x8,0x18,0x31,0xe0,0x10,0xd8,0x1,0xf1,0x4,0x6,0x8,0xfc,0xae,0xf,0x31,0xf3,0x83,0xd4,0x78,0x3c,0x6,0x99,0x6f,0x1,0xe3,0xc3,0xb,0xf,0xe0,0x1e,0x56,0x6,0x18,0xdf,0xc1,0xe3,0x3f,0x83,0x83,0xc7,0x5f,0x32,0xfd,0x83,0xc5,0x6a,0x8f,0x72,0x68,0x8f,0x9c,0x3e,0xae,0x64,0x80,0x4e,0x1,0xe2,0x4f,0x60,0x7a,0xc8,0x1,0xfe,0x2f,0x20,0x7f,0x0 +}; + +const uint8_t _A_L1_Tv_128x47_1[] = { + 0x1,0x0,0xcc,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x45,0x6,0x7,0x98,0x28,0x47,0x44,0xf,0x58,0x48,0x3c,0xc5,0x45,0x4,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0xa,0x20,0x7b,0xb,0x44,0x6c,0x53,0x80,0x7a,0xb,0x4,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x8,0x9c,0xaf,0xe0,0xf9,0x10,0x88,0x28,0x6c,0x8,0xd1,0x81,0x60,0x21,0xe7,0x23,0xd,0x88,0x44,0x41,0xe3,0x30,0x41,0x8a,0xdc,0x81,0xea,0x1,0x10,0x50,0xfe,0x0,0xa3,0x2,0xf0,0x4f,0xc1,0xe3,0xff,0x0,0x14,0x3e,0x1,0xfe,0x2,0xc,0x7,0xe1,0x3,0xf0,0x49,0xfc,0x11,0xf1,0x50,0xc1,0x3c,0xe,0x61,0x8,0x88,0x88,0x41,0x63,0x20,0x7,0x8c,0xfc,0x4c,0x30,0x68,0xe1,0x70,0x60,0x60,0xf2,0xe0,0x40,0xf8,0x11,0x3e,0x5,0x1c,0x1e,0x31,0xa0,0x60,0xf8,0xf,0xa6,0x75,0x12,0xf8,0xf0,0x30,0x65,0xc1,0xf2,0x82,0xc6,0xf0,0xad,0x33,0x8,0xae,0x8,0x1e,0x50,0x50,0x30,0xc7,0x81,0xe6,0xa3,0x30,0x79,0x68,0x12,0xc4,0x50,0x14,0xd1,0x1,0xc8,0x1e,0x81,0x72,0x27,0x12,0x28,0x7e,0x80,0xf5,0xf8,0x44,0x60,0x10,0xe0,0xf9,0xc8,0x21,0x85,0xf1,0x7,0x9f,0xf3,0xcf,0xc0,0x84,0xc1,0x81,0xe5,0x40,0x82,0x5f,0x26,0x10,0x10,0x79,0x7f,0xa1,0xf3,0xf8,0x80,0x3c,0xf0,0x10,0x83,0x70,0x8b,0x7,0x3f,0xff,0xfe,0xfd,0xd6,0x24,0xa6,0x10,0x78,0x9b,0xce,0x19,0xbc,0xff,0xa3,0x4,0x1e,0x51,0xd0,0x59,0x70,0x54,0x87,0xf8,0x67,0x9f,0xfe,0x7e,0x1f,0x2f,0xc6,0xc,0x4a,0x4d,0x41,0x7,0xa7,0x3c,0x12,0x38,0x3,0x18,0xff,0xe0,0xf8,0x5,0xca,0x0,0x7,0xe0,0xf,0x1b,0x80,0x14,0x7f,0x90,0x10,0x79,0x7,0xd3,0xe6,0xf,0x18,0x70,0x5c,0xe8,0x0,0xf6,0xfa,0x4f,0xfe,0x1c,0x10,0x7a,0xff,0x1,0xc7,0x7f,0xfb,0xf7,0xe1,0xfa,0x63,0x11,0x83,0xc4,0x3c,0x99,0xff,0xbc,0x7f,0x61,0x79,0xbf,0x2c,0xcf,0x1,0x87,0x7,0x9f,0xbc,0x1e,0x34,0xfa,0x4e,0x4a,0x2,0xf,0x2e,0x6,0x4,0x9c,0x9f,0x75,0x30,0x80,0x8,0x1e,0x5e,0x3,0x8,0x80,0xb,0xf8,0xf,0x10,0x29,0x7e,0x1,0xe5,0x60,0xc0,0x6,0xd,0x84,0x31,0xf1,0x61,0x7f,0x1,0xe5,0x30,0x7,0xbc,0x8,0x18,0x25,0x2,0xb0,0x3,0xe2,0x8,0xc,0x1b,0xf8,0x8,0x6e,0x11,0x8c,0x7,0x9c,0x1e,0xb1,0x88,0x7,0x0,0x9e,0x5b,0xc0,0x78,0xf0,0xe1,0xe4,0x81,0x7,0x95,0x81,0x86,0x3f,0xf7,0x78,0xcf,0xe1,0xe0,0xf1,0xd7,0xcc,0xbf,0x60,0xf1,0x4b,0x23,0xdc,0x9c,0xc3,0xe7,0xf,0xab,0x99,0x20,0x13,0x80,0x78,0x93,0xd8,0x1e,0xb2,0x0,0x7f,0x8b,0xc8,0x1f,0xc0 +}; + +const uint8_t _A_L1_Tv_128x47_2[] = { + 0x1,0x0,0xc1,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x66,0x33,0x30,0x50,0x81,0x88,0x1e,0xd0,0x50,0x19,0xa,0x8a,0x8,0x24,0x21,0x31,0x40,0x38,0x0,0x81,0x2d,0x20,0x8,0x41,0xeb,0x38,0x7,0xc0,0xb4,0x46,0xc4,0x78,0x10,0x79,0x80,0xc8,0x64,0x20,0xf4,0x86,0x2,0xcc,0x1e,0xa6,0x21,0xe8,0x40,0x21,0xe5,0x61,0x7,0xd5,0x43,0xc3,0x30,0x3b,0x9,0xbc,0xe0,0x58,0x8,0x79,0xc8,0xe9,0x11,0xe4,0xb1,0x3,0xd1,0x4,0xb4,0x83,0xf9,0xa8,0xce,0x5,0xe0,0x9f,0x83,0xc7,0xff,0xff,0xbf,0xae,0x8c,0xc,0x20,0x1,0x81,0xf8,0x24,0xfe,0x8,0xf9,0x14,0x70,0x80,0xf2,0xb0,0x8,0xce,0x3d,0x60,0x93,0x78,0x24,0x68,0x21,0xc1,0x2,0x8c,0x1e,0x70,0x3e,0x4,0x4f,0x81,0x41,0x7,0x8c,0xa,0x7,0x0,0xf0,0xf,0x8c,0xaa,0x25,0xf1,0xe0,0x23,0x86,0x21,0x1,0x46,0x89,0xd8,0x80,0x3,0x30,0x9,0x98,0x3c,0xfe,0x13,0xf5,0xc9,0x40,0x3f,0x10,0x90,0x7a,0xe8,0x0,0xa3,0x40,0x7,0x9c,0x1e,0xc,0xf,0xc1,0xe8,0xfd,0x1,0xeb,0xf0,0x25,0x88,0x3c,0xd1,0x23,0xfc,0x2f,0x88,0x3c,0xff,0x90,0x70,0x78,0x93,0xc8,0x4,0x3e,0xb,0xfb,0x1c,0x41,0xe5,0xfe,0x87,0x83,0xdb,0x81,0xe1,0x4,0x8f,0xc3,0x7,0xff,0xfe,0xfd,0xd5,0x44,0xa6,0x11,0x90,0xce,0x3e,0x1,0x51,0x86,0x67,0x3f,0xe2,0x71,0x7,0x94,0x74,0x1e,0x30,0x8f,0xe0,0x78,0x5a,0x43,0xb8,0x64,0x1f,0xfe,0x7e,0x1f,0x2f,0xc4,0x4e,0x1,0xe,0x73,0xf,0xc0,0x1e,0x9c,0xf0,0x79,0x44,0x3c,0x1c,0x8,0x19,0x34,0x7c,0xa,0x93,0x23,0x8,0x3c,0xdf,0x42,0xf,0x30,0xfa,0x7c,0xc1,0xe3,0x1e,0x40,0x9,0x3c,0x68,0x0,0xf6,0xfa,0x4f,0xfe,0x13,0x99,0x30,0x9c,0x81,0xe3,0xfc,0x7,0x1d,0xff,0xef,0xdf,0x87,0xfd,0xa7,0xe0,0xf4,0xe1,0x83,0xcf,0x3f,0xf7,0x8f,0xec,0x2f,0x37,0xe0,0x79,0x48,0x30,0x18,0x0,0x79,0xfb,0xc1,0xe3,0x4f,0xa4,0xe6,0x98,0xe2,0xf,0x1a,0x0,0x3d,0x3e,0x7f,0x7c,0xf8,0x14,0x91,0xc5,0x20,0x10,0x9,0xb8,0xff,0x80,0xf1,0x2,0x94,0x60,0x1e,0x81,0xf3,0x61,0xc,0x7c,0x58,0x51,0xc0,0x79,0x44,0x1,0xef,0x2,0x6,0xc,0x78,0x4,0x36,0x0,0x7c,0x41,0x1,0x82,0x3f,0x2b,0x84,0x23,0x1,0xe7,0x7,0xa8,0xf0,0x78,0xa,0x31,0x80,0x6f,0x1,0xe3,0xc3,0xb,0xf,0xe0,0x1e,0x56,0x5,0x68,0xdf,0xc1,0xe3,0x3f,0x83,0x83,0xc7,0x5f,0x32,0xfd,0x83,0xc5,0x6a,0x8f,0x72,0x80,0xb,0xc4,0x3e,0xae,0x64,0x80,0x4e,0x1,0xe2,0x4f,0x60,0x7a,0xb8,0xc4,0x1f,0xe5,0xf7,0x7,0xc0 +}; + +const uint8_t _A_L1_Tv_128x47_3[] = { + 0x1,0x0,0xc0,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x45,0x6,0x7,0x98,0x28,0x47,0x44,0xf,0x58,0x48,0x3c,0xc5,0x45,0x4,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0xa,0x20,0x7b,0xb,0x44,0x6c,0x53,0x80,0x7a,0xb,0x4,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x8,0x3f,0x44,0x22,0xa,0x23,0x61,0x60,0x21,0xe7,0x23,0xd,0x88,0x44,0x41,0xea,0x82,0x50,0x78,0x80,0x45,0x84,0x90,0x2f,0x4,0xfc,0x1e,0x3f,0xf0,0x1,0x43,0xe0,0x1f,0xe0,0x31,0xc0,0xfc,0x12,0x7f,0x4,0x7c,0x54,0x30,0x4f,0x3,0x98,0x42,0x22,0x0,0x28,0xf4,0x80,0x1e,0x33,0xf1,0x60,0xc1,0xa3,0x87,0x41,0x81,0x83,0xce,0x7,0xc0,0x89,0xf0,0x28,0xe0,0xf1,0x8d,0x3,0x7,0xc0,0xe,0x33,0xa8,0x97,0xc7,0x81,0x83,0x2e,0xf,0x94,0x14,0x37,0x80,0x79,0xcc,0x2,0x66,0xf,0x28,0x28,0xe4,0x97,0xcc,0xf,0x3d,0x1,0xec,0x8a,0x2,0x9e,0x43,0x68,0x83,0xcc,0x2e,0x44,0xe4,0xf2,0x2e,0x4c,0x1e,0x3f,0x8,0x8c,0x2,0x1c,0x1f,0x39,0xe5,0xf2,0xd,0x18,0x7,0x9f,0xf3,0xcf,0xc0,0x84,0xc1,0x81,0xe5,0xc2,0x87,0xf3,0x11,0x82,0xf,0x2f,0xf4,0x3e,0x7f,0x10,0x7,0x9c,0x4,0x42,0x22,0xf1,0xf8,0x67,0xff,0xff,0xdf,0xba,0xa8,0x83,0x23,0x80,0x8,0x8c,0x38,0x9e,0x30,0xcd,0xe7,0xfd,0x18,0x20,0xf2,0x8e,0x83,0xcc,0x8a,0x50,0x2f,0xc3,0x20,0xff,0xf3,0xf0,0xf9,0xe0,0x4,0xa5,0x1,0xf8,0x3,0xd3,0x9e,0xf,0x31,0x38,0xc1,0xc0,0x84,0x79,0x32,0x30,0x83,0xc6,0xe1,0x1,0xfe,0x7f,0x20,0x21,0x43,0x0,0x1f,0xcc,0x1e,0x30,0xef,0xf3,0xa8,0x60,0x14,0x0,0x7b,0x7d,0x27,0xff,0xe,0x8,0x9c,0xc1,0xe3,0xfc,0x7,0x1d,0xff,0xef,0xdf,0x87,0xe9,0x8c,0x42,0xf,0x30,0xf2,0x67,0xfe,0xf1,0xfd,0x85,0xe6,0xfc,0xf,0x29,0x6,0x3,0xe,0xf,0x3f,0x78,0x3c,0x69,0xf4,0x9c,0x92,0x80,0x41,0xe3,0xc0,0xc0,0x93,0x93,0xee,0xa6,0x10,0x1,0x3,0xcb,0xc0,0x96,0x20,0x0,0xff,0x1,0xe2,0x5,0x2f,0xc0,0x3c,0xac,0x9,0x41,0x0,0x13,0x8,0x63,0xe2,0xc2,0xfe,0x3,0xca,0x60,0xf,0x78,0x10,0x30,0x4a,0x5,0x60,0x7,0xc4,0x10,0x18,0x37,0xf0,0x10,0xdc,0x23,0x18,0xf,0x38,0x3d,0x63,0x10,0xe,0x1,0x3c,0xb7,0x80,0xf1,0xe1,0xc3,0xc9,0x2,0xf,0x2b,0x3,0xc,0x7f,0xf0,0x38,0x4,0xfe,0x1e,0xf,0x1d,0x7c,0xcb,0xf6,0xf,0x14,0xb2,0x3d,0xc9,0xcc,0x3e,0x70,0xfa,0xb9,0x92,0x1,0x38,0x7,0x89,0x3d,0x81,0xeb,0x20,0x7,0xf8,0xbc,0x81,0xfc +}; + +const uint8_t _A_L1_Tv_128x47_4[] = { + 0x1,0x0,0xcb,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x45,0x6,0x7,0x98,0x28,0x47,0x44,0xf,0x58,0x48,0x3c,0xc5,0x45,0x4,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0xa,0x20,0x7b,0xb,0x44,0x6c,0x53,0x80,0x7a,0xb,0x4,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x8,0x9c,0xaf,0xe0,0xf9,0x10,0x88,0x28,0x6c,0x8,0xd1,0x81,0x60,0x21,0xe7,0x23,0xd,0x88,0x44,0x41,0xe3,0x30,0x41,0x8a,0xdc,0x81,0xea,0x1,0x10,0x50,0xfe,0x0,0xa3,0x2,0xf0,0x4f,0xc1,0xe3,0xff,0x0,0x14,0x3e,0x1,0xfe,0x2,0xc,0x7,0xe1,0x3,0xf0,0x49,0xfc,0x11,0xf1,0x50,0xc1,0x3c,0xe,0x61,0x61,0x10,0x74,0x63,0xf6,0x9,0x37,0x82,0x46,0x26,0x18,0x34,0x71,0x64,0x90,0x2e,0x4,0xf,0x81,0x13,0xe0,0x50,0x41,0xe3,0x1a,0x81,0x97,0x4,0xfa,0x67,0x51,0x2f,0x8f,0x0,0x32,0x31,0xf,0x28,0x2c,0x63,0xa,0xd3,0x30,0x8a,0xe0,0x81,0xe5,0x5,0x77,0x2c,0x20,0xca,0x25,0xd1,0x7,0x96,0x81,0x2c,0x44,0xe2,0xb,0x88,0x1c,0x55,0x24,0xf,0x25,0xd9,0x3,0xce,0x41,0xf4,0x1b,0x10,0x3c,0xbe,0x11,0x18,0x4,0x38,0x1e,0x90,0xc8,0x7c,0x58,0x1e,0x7f,0xcf,0x3f,0x2,0x12,0xa9,0x28,0x5,0x2,0x8,0x19,0x20,0x79,0x7f,0xa1,0xf3,0xf8,0x80,0x3c,0xf0,0x4,0xf3,0xf8,0x60,0xff,0xff,0xdf,0xba,0xc4,0x94,0xc2,0xf,0x13,0x79,0xc3,0x33,0x9f,0xf8,0x7,0x80,0x1e,0x51,0xd0,0x59,0x70,0x52,0xe2,0xa4,0x1d,0xc3,0x3c,0xff,0xf3,0xf0,0xf9,0x7e,0x5,0x42,0xd7,0x16,0xa0,0x83,0xd3,0x9e,0xf,0x1c,0x3,0x50,0x7f,0xf0,0x32,0x68,0xf8,0x5,0x4,0x0,0x1f,0x80,0x3c,0x6e,0x0,0x51,0xfe,0x40,0x41,0xe4,0x1f,0x4f,0x98,0x3c,0x61,0xc1,0x73,0xa0,0x3,0xdb,0xe9,0x3f,0xf8,0x70,0x41,0xeb,0xfc,0x7,0x1d,0xff,0xef,0xdf,0x87,0xe9,0x8c,0x46,0xf,0x1e,0x18,0x3c,0xf3,0xff,0x78,0xfe,0xc2,0xf3,0x7e,0x59,0x9e,0x3,0x0,0xf,0x3f,0x78,0x3c,0x69,0xf4,0x9c,0x93,0x10,0xa4,0x14,0x0,0x7a,0x7c,0xfe,0xf9,0xf0,0x29,0x1f,0x44,0x1e,0x22,0x1,0x23,0x1f,0xf0,0x1e,0x20,0x52,0x76,0x88,0x3c,0xc3,0xe6,0xc2,0x18,0xf8,0xb0,0xa3,0x80,0xf2,0x88,0x3,0xdd,0xc2,0x51,0xe0,0x10,0xd8,0x1,0xf1,0x4,0x6,0x8,0xfc,0xae,0x10,0x8c,0x7,0x9c,0x1e,0xa3,0xc1,0xe0,0x34,0xcb,0x78,0xf,0x1e,0x18,0x58,0x7f,0x0,0xf2,0xb0,0x30,0xc6,0xfe,0xf,0x19,0xfc,0x1c,0x1e,0x3a,0xf9,0x97,0xec,0x1e,0x2b,0x54,0x7b,0x93,0x98,0x7c,0xe1,0xf5,0x73,0x24,0x2,0x70,0xf,0x12,0x7b,0x3,0xd6,0x40,0xf,0xf1,0x79,0x3,0xf8 +}; + +const uint8_t _A_L1_Tv_128x47_5[] = { + 0x1,0x0,0xd1,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x45,0x6,0x7,0x98,0x28,0x47,0x44,0xf,0x58,0x48,0x3c,0xc5,0x45,0x4,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0xa,0x20,0x7b,0xb,0x44,0x6c,0x53,0x80,0x7a,0xb,0x4,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x8,0x9c,0xaf,0xe0,0xf9,0x10,0x88,0x28,0x6c,0x8,0xd1,0x81,0x60,0x21,0xe7,0x23,0xd,0x88,0x44,0x41,0xe3,0x30,0x41,0x8a,0xdc,0x81,0xea,0x1,0x10,0x50,0xfe,0x0,0xa3,0x2,0xf0,0x4f,0xc1,0xe3,0xff,0x0,0x14,0x3e,0x1,0xfe,0x2,0xc,0x7,0xe1,0x3,0xf0,0x49,0xfc,0x11,0xf1,0x50,0xc1,0x3c,0xe,0x61,0x8,0x88,0x88,0x41,0x63,0x20,0x7,0x8c,0xfc,0x4c,0x30,0x68,0xe1,0x70,0x60,0x60,0xf2,0xe0,0x40,0xf8,0x11,0x3e,0x5,0x1c,0x1e,0x31,0xa0,0x60,0xf8,0xf,0xa6,0x75,0x12,0xf8,0xf0,0x30,0x65,0xc1,0xf2,0x82,0xc6,0xf0,0xad,0x33,0x8,0xae,0x8,0x1e,0x50,0x50,0x30,0xc7,0x81,0xe6,0xa3,0x30,0x79,0x68,0x12,0xc4,0x50,0x14,0xd1,0x1,0xc8,0x1e,0x81,0x72,0x27,0x12,0x28,0x7e,0x9f,0x3,0xe8,0x83,0xcb,0xe1,0x11,0x80,0x43,0x83,0xe7,0x20,0x86,0x43,0xe2,0x60,0xf3,0xfe,0x79,0xf8,0x10,0x98,0x30,0x3c,0xa8,0x2,0xf1,0x3c,0x8,0x3c,0xbf,0xd0,0xf9,0xfc,0x40,0x1e,0x78,0x6,0x39,0xfc,0x33,0xff,0xff,0xef,0xdd,0x62,0x4a,0x61,0x7,0x89,0xbc,0x41,0xe3,0xc,0xde,0x7f,0xd1,0x82,0xf,0x28,0xe8,0x80,0xb8,0x30,0x32,0x78,0xc0,0xbf,0xc,0xf3,0xff,0xcf,0xc3,0xe5,0xf8,0xc1,0x89,0x49,0xa8,0x20,0xf4,0xe7,0x82,0x47,0x0,0x63,0x1f,0xfc,0x1f,0x0,0xb9,0x40,0x0,0xfc,0x1,0xe3,0x70,0x2,0x8f,0xf2,0x2,0xf,0x20,0xfa,0x7c,0xc1,0xe3,0xe,0xb,0x9d,0x0,0x1e,0xdf,0x49,0xff,0xc3,0x82,0xf,0x5f,0xe0,0x38,0xef,0xff,0x7e,0xfc,0x3f,0x4c,0x62,0x30,0x78,0x87,0x93,0x3f,0xf7,0x8f,0xec,0x2f,0x37,0xe5,0x99,0xe0,0x30,0xe0,0xf3,0xf7,0x83,0xc6,0x9f,0x49,0xc9,0x40,0x41,0xe5,0xc0,0xc0,0x93,0x93,0xee,0xa6,0x10,0x1,0x3,0xcb,0xc0,0x61,0x10,0x1,0x7f,0x1,0xe2,0x5,0x2f,0xc0,0x3c,0xac,0x18,0x0,0xc1,0xb0,0x86,0x3e,0x2c,0x2f,0xe0,0x3c,0xa6,0x0,0xf7,0x81,0x3,0x4,0xa0,0x56,0x0,0x7c,0x3f,0x6,0x1,0x7f,0x1,0xd,0xc2,0x31,0x80,0xf3,0x83,0xd6,0x31,0x0,0xe0,0x13,0xcb,0x78,0xf,0x1e,0x1c,0x3c,0x90,0x20,0xf2,0xb0,0x30,0xc7,0xff,0x3,0x80,0x4f,0xe1,0xe0,0xf1,0xd7,0xcc,0xbf,0x60,0xf1,0x4b,0x23,0xdc,0x9c,0xc3,0xe7,0xf,0xab,0x99,0x20,0x13,0x80,0x78,0x93,0xd8,0x1e,0xb2,0x0,0x7f,0x8b,0xc8,0x1f,0xc0 +}; + +const uint8_t _A_L1_Tv_128x47_6[] = { + 0x1,0x0,0xc1,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x45,0x6,0x7,0x98,0x28,0x47,0x44,0xf,0x58,0x48,0x3c,0xc5,0x45,0x4,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0xa,0x20,0x7b,0xb,0x44,0x6c,0x53,0x80,0x7a,0xb,0x4,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x8,0x3f,0x44,0x22,0xa,0x23,0x61,0x60,0x21,0xe7,0x23,0xd,0x88,0x44,0x41,0xea,0x82,0x50,0x78,0x80,0x45,0x84,0x90,0x2f,0x4,0xfc,0x1e,0x3f,0xf0,0x1,0x43,0xe0,0x1f,0xe0,0x31,0xc0,0xfc,0x12,0x7f,0x4,0x7c,0x54,0x30,0x4f,0x3,0x98,0x58,0x49,0x1e,0xb0,0x49,0xbc,0x12,0x31,0x60,0xc1,0xa3,0x8b,0x24,0x0,0xc,0xf,0x81,0x13,0xe0,0x50,0x41,0xe3,0x1a,0x81,0xc0,0x2c,0x0,0xe3,0x3a,0x89,0x7c,0x78,0x1,0x91,0x88,0x79,0x41,0x43,0x18,0x7,0x9c,0xc0,0x26,0x60,0xf2,0x82,0xbb,0x8f,0xf0,0x41,0x14,0x99,0x83,0xcb,0x40,0x7b,0x20,0x60,0xc1,0x2f,0xc8,0x34,0x7,0x98,0x5c,0x81,0xe5,0x80,0x8f,0xfd,0x1,0xeb,0xf0,0x88,0xc0,0x21,0xc2,0xc3,0xf0,0x43,0xcf,0x62,0xf,0x3f,0xe7,0x9f,0x81,0x9,0x4f,0xb,0x20,0x90,0xe2,0x10,0x10,0x79,0x7f,0xa1,0xf3,0xf8,0x80,0x3c,0x57,0x4,0x22,0x10,0x20,0xfc,0x30,0x7f,0xff,0xef,0xdd,0x54,0x51,0xf3,0xe0,0x9b,0xd2,0x19,0x9c,0xff,0x8e,0x4,0x1e,0x51,0xd8,0x2,0xcc,0x78,0x9,0x71,0x69,0xe,0xe1,0x90,0x7f,0xf9,0xf8,0xe4,0x6f,0x1f,0x81,0x50,0xb5,0xc6,0x3,0xf0,0x7,0xa7,0x3c,0x1e,0x38,0x1,0x0,0xb8,0x4,0x9a,0x3e,0x6,0x4a,0x7c,0x1,0xe3,0x70,0x2,0x8f,0xf1,0xae,0x43,0xc3,0x0,0xf,0xcc,0x1e,0x30,0xe0,0xb9,0xd0,0x1,0xed,0xf4,0x9f,0xfc,0x38,0x20,0xf5,0xfe,0x3,0x8e,0xff,0xf7,0xef,0xc3,0xf4,0xc6,0x21,0x7,0x9f,0xc,0x1e,0x79,0xff,0xbc,0x7f,0x61,0x79,0x68,0x8,0x0,0x64,0x18,0xc,0x0,0x3c,0xfd,0xe0,0xf1,0xa7,0xd2,0x72,0x4c,0x41,0x7,0x8d,0x0,0x1e,0x9f,0x3f,0xbe,0x7c,0xa,0x47,0xd1,0x7,0x88,0x80,0x48,0xc7,0xfc,0x7,0x88,0x14,0xa3,0x0,0xf4,0xf,0x9b,0x8,0x63,0xe2,0xc2,0x8e,0x3,0xca,0x20,0xf,0x77,0x8,0xc0,0x23,0xc0,0x21,0xb0,0x3,0xe2,0x8,0xc,0x11,0xf9,0x5c,0x21,0x18,0xf,0x38,0x3d,0x47,0x83,0xc0,0x51,0x8c,0x3,0x78,0xf,0x1e,0x18,0x58,0x7f,0x0,0xf2,0xb0,0x30,0xc6,0xfe,0xf,0x19,0xfc,0x1c,0x1e,0x3a,0xf9,0x97,0xec,0x1e,0x2b,0x54,0x7b,0x93,0x44,0x7c,0xe1,0xf5,0x73,0x24,0x2,0x70,0xf,0x12,0x7b,0x3,0xd6,0x40,0xf,0xf1,0x79,0x3,0xf8 +}; + +const uint8_t _A_L1_Tv_128x47_7[] = { + 0x1,0x0,0xcd,0x1,0x84,0x0,0x86,0x4,0xb,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0xc,0x62,0x0,0x21,0x80,0x83,0x9b,0x1,0x1,0xe0,0x3,0xf2,0x80,0xa,0x39,0x0,0x58,0x41,0x45,0x6,0x7,0x98,0x28,0x47,0x44,0xf,0x58,0x48,0x3c,0xc5,0x45,0x4,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0xa,0x20,0x7b,0xb,0x44,0x6c,0x53,0x80,0x7a,0xb,0x4,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x8,0x3f,0x44,0x22,0xa,0x23,0x61,0x60,0x21,0xe7,0x23,0xd,0x88,0x44,0x41,0xea,0x82,0x50,0x78,0x80,0x45,0x84,0x7f,0x8,0x1f,0x82,0x7e,0xf,0x1f,0xf8,0x0,0xa1,0xf0,0xf,0xf0,0x14,0xe1,0xde,0x9,0x3f,0x82,0x3e,0x2a,0x18,0x27,0x81,0xcc,0x21,0x11,0x27,0x14,0xc2,0x40,0xf,0x19,0xf8,0xb0,0x60,0xd1,0xc3,0xa0,0xc0,0xc1,0xe5,0x74,0xe0,0x70,0x22,0x7c,0xa,0x38,0x3c,0x63,0x40,0xc1,0xf0,0x13,0x8f,0xf9,0x1,0x2f,0x8f,0x3,0x6,0x5c,0x1f,0x28,0x28,0x6f,0x0,0xf3,0xfc,0xd,0x85,0x12,0x20,0xf2,0x82,0x81,0x86,0x3c,0xc,0x17,0xc8,0x92,0xc8,0x1e,0x7a,0x3,0xd9,0x6,0x46,0x9,0x7e,0x22,0xd,0xfc,0x1e,0xaa,0xb2,0x20,0x8c,0x13,0x0,0x1d,0x1c,0x38,0x18,0x41,0xe5,0xf0,0x88,0xc0,0x21,0xc1,0xf1,0xa,0xf,0x83,0x1f,0x1,0x9,0x8,0x3c,0xbf,0x9e,0x7e,0x4,0x26,0xc,0xc8,0x3f,0xc7,0xfd,0x3a,0x20,0xf2,0xff,0x43,0xe7,0xf1,0x0,0x78,0xae,0x9,0xc6,0x7f,0xc,0xff,0xff,0xfb,0xf7,0x55,0x94,0x7d,0xe4,0x20,0xf4,0x86,0x6f,0x3f,0xe3,0x81,0x7,0x94,0x74,0xc4,0x53,0x7,0x11,0x8d,0x4,0x0,0x73,0xf2,0x48,0xde,0x3f,0x1c,0x31,0x28,0xc0,0x20,0x3f,0x0,0x7a,0x73,0xc1,0x23,0x80,0x83,0xe0,0x3f,0xe0,0x21,0x5c,0xa9,0x18,0x41,0xe3,0x70,0x2,0x8f,0xf9,0x80,0x23,0xc4,0x0,0xf,0xcc,0x1e,0x30,0xe0,0xb9,0xd0,0x1,0xed,0xf4,0x9f,0xfc,0x38,0x20,0xf5,0xfe,0x3,0x8e,0xff,0xf7,0xef,0xc3,0xf4,0xc6,0x21,0x7,0x98,0x79,0x33,0xff,0x78,0xfe,0xc2,0xf2,0xd0,0x10,0x0,0xc8,0x30,0x18,0x70,0x79,0xfb,0xc1,0xe3,0x4f,0xa4,0xe4,0x9e,0x22,0xf,0x1e,0x6,0x4,0x9c,0x9f,0x75,0x30,0x80,0x8,0x1e,0x5e,0x3,0x8,0x80,0xb,0xf8,0xf,0x10,0x29,0x7e,0x1,0xe5,0x60,0x42,0x8,0x0,0x98,0x43,0x1f,0x16,0x17,0xf0,0x1e,0x53,0x0,0x7b,0xc0,0x81,0x82,0x50,0x2b,0x0,0x3e,0x20,0x80,0xc1,0xbf,0x80,0x86,0xe1,0x18,0xc0,0x79,0xc1,0xeb,0x18,0x80,0x70,0x9,0xe5,0xbc,0x7,0x8f,0xe,0x1e,0x48,0x10,0x79,0x58,0x18,0x63,0xff,0x81,0xc0,0x27,0xf0,0xf0,0x78,0xeb,0xe6,0x5f,0xb0,0x78,0xa5,0x91,0xee,0x4e,0x61,0xf3,0x87,0xd5,0xcc,0x90,0x9,0xc0,0x3c,0x49,0xec,0xf,0x59,0x0,0x3f,0xc5,0xe4,0xf,0xe0 +}; + + +const uint8_t *_A_L1_Tv_128x47[] = { + + _A_L1_Tv_128x47_0, + + _A_L1_Tv_128x47_1, + + _A_L1_Tv_128x47_2, + + _A_L1_Tv_128x47_3, + + _A_L1_Tv_128x47_4, + + _A_L1_Tv_128x47_5, + + _A_L1_Tv_128x47_6, + + _A_L1_Tv_128x47_7, + +}; + + + +const FrameBubble L1_Tv_128x47_bubble_0_0; + +const FrameBubble L1_Tv_128x47_bubble_1_0; + + +const FrameBubble* const L1_Tv_128x47_bubble_sequences[] = { + + &L1_Tv_128x47_bubble_0_0, + + &L1_Tv_128x47_bubble_1_0, + +}; + + + +const FrameBubble L1_Tv_128x47_bubble_0_0 = { + .bubble = { + .x = 1, + .y = 23, + .text = "Take the red pill", + .align_h = AlignRight, + .align_v = AlignBottom, + }, + .start_frame = 7, + .end_frame = 9, + .next_bubble = NULL, +}; + + +const FrameBubble L1_Tv_128x47_bubble_1_0 = { + .bubble = { + .x = 1, + .y = 23, + .text = "I can joke better", + .align_h = AlignRight, + .align_v = AlignBottom, + }, + .start_frame = 7, + .end_frame = 9, + .next_bubble = NULL, +}; + + + +const BubbleAnimation BA_L1_Tv_128x47 = { + .icon_animation = { + .width = 128, + .height = 47, + .frame_count = 8, + .frame_rate = 2, + .frames = _A_L1_Tv_128x47 + }, + .frame_order = { 0, 1, 2, 3, 4, 5, 6, 7 }, + .passive_frames = 6, + .active_frames = 2, + .active_cooldown = 5, + .active_cycles = 2, + .duration = 3600, + + .frame_bubble_sequences = L1_Tv_128x47_bubble_sequences, + .frame_bubble_sequences_count = COUNT_OF(L1_Tv_128x47_bubble_sequences), + +}; + + +const uint8_t _A_L1_BadBattery_128x47_0[] = { + 0x1,0x0,0xb,0x1,0x0,0x47,0xfb,0xfe,0x0,0x2b,0x38,0x3e,0x60,0x40,0x43,0xbf,0x3,0xe7,0xa5,0xf3,0xff,0xf9,0x2f,0xf5,0x60,0xff,0x5a,0x81,0xf3,0xa,0x2,0x18,0x7e,0x81,0xe9,0xea,0x87,0x8b,0xf7,0xad,0x1d,0x7,0xef,0xaa,0x30,0x2f,0xd0,0xfd,0x62,0xa6,0x30,0x9,0x84,0x18,0x7f,0x50,0xa8,0xdc,0x2,0xc1,0x3,0x2f,0xdc,0x3a,0x1,0xc0,0x80,0x9f,0xec,0x1e,0x61,0xfb,0x17,0x98,0x7e,0x89,0xe8,0x9f,0xf5,0xff,0x87,0xfc,0xff,0x69,0xf4,0x8f,0x83,0xe3,0xc5,0x1,0xff,0x40,0xd7,0xf7,0xfa,0x83,0xfc,0x60,0xe1,0xfb,0x7,0x8f,0xfc,0x1e,0x23,0xfa,0xff,0x2,0x8c,0xbf,0x40,0xf4,0x3f,0xd0,0x7f,0xfe,0x5c,0xff,0xff,0xd2,0xa2,0x1f,0xaf,0x9,0x34,0x40,0x3,0x7e,0x7,0x46,0x3,0x8f,0xff,0x0,0x15,0x9c,0x1f,0x1c,0xe,0x7c,0x4,0x57,0x20,0x2,0xa0,0x4b,0xc1,0xd9,0x0,0x90,0x47,0x81,0xfb,0x10,0x87,0x3,0xf6,0x10,0x5e,0x30,0x5,0x61,0x20,0xa0,0xfd,0xa1,0x3,0xfa,0x4c,0xf,0x64,0x29,0x80,0xe,0x3e,0xf,0xe0,0x7,0x97,0x9f,0x8f,0x18,0xb3,0x62,0xe6,0xd6,0xed,0xc,0x6c,0x1e,0xfb,0x7e,0xb5,0x6f,0xbb,0xd4,0xa7,0xef,0x7d,0x70,0x78,0x84,0xe6,0x71,0xe6,0xf7,0x53,0xa0,0x21,0xf1,0xa1,0x77,0xaa,0x52,0xed,0xe,0x6a,0xf,0xb0,0x82,0xd2,0x29,0x32,0x4a,0x94,0x7,0x6f,0xda,0xf,0x8f,0x5a,0xdd,0xbd,0xbd,0x41,0xea,0x11,0x99,0xc5,0x3f,0xc9,0x8e,0x1f,0x8c,0x5a,0xb4,0x3f,0x1b,0x7d,0x87,0x1a,0x2f,0x19,0x8,0x7c,0xb1,0x46,0xf8,0x7,0x8e,0x76,0x71,0x49,0xf2,0x64,0x81,0xf2,0x5f,0x60,0x7f,0x80 +}; + +const uint8_t _A_L1_BadBattery_128x47_1[] = { + 0x1,0x0,0x11,0x1,0x0,0x47,0xfb,0xfe,0x0,0x2b,0x38,0x3e,0x60,0x40,0x43,0xbf,0x3,0xe7,0xa5,0xf3,0xff,0xf9,0x2f,0xf5,0x60,0xff,0x5a,0x81,0xf3,0xa,0x2,0x18,0x7e,0x81,0xe9,0xea,0x87,0x8b,0xf7,0xad,0x1d,0x7,0xef,0xaa,0x30,0x2f,0xd0,0xfd,0x62,0xa6,0x30,0x9,0x84,0x18,0x7f,0x50,0xa8,0xdc,0x2,0xc1,0x3,0x2f,0xdc,0x3a,0x1,0xc0,0x80,0x9f,0xec,0x1e,0x61,0xfb,0x17,0x98,0x7e,0x89,0xe8,0x9f,0xf5,0xff,0x87,0xfc,0xff,0x70,0xf,0xe4,0x5,0x3e,0x31,0xf0,0x7c,0x78,0xa0,0x3c,0x28,0x1a,0xfe,0xff,0x50,0x7f,0x8c,0x1c,0x3f,0x60,0xf1,0xfc,0x83,0xc4,0x7f,0x5f,0xe8,0x7f,0xfc,0x1e,0x25,0xfa,0x7,0x89,0xff,0x41,0xe8,0x1f,0xaf,0x97,0x3f,0xff,0xf4,0xa8,0x87,0xeb,0xc2,0x3d,0x10,0x0,0xdf,0x81,0xd1,0x80,0xe3,0xff,0xc0,0x5,0x67,0x7,0xc7,0x3,0x9e,0x9d,0x10,0x5,0xd0,0x25,0xe0,0xec,0x80,0x48,0x23,0xc0,0xfd,0x88,0x43,0x81,0xfb,0x8,0x2f,0x18,0x2,0xb0,0x90,0x50,0x7e,0xd0,0x81,0xfd,0x26,0x7,0xb2,0x14,0xc0,0x7,0x1f,0x7,0xf0,0x3,0xcb,0xcf,0xc7,0x8c,0x59,0xb1,0x73,0x6b,0x76,0x86,0x36,0xf,0x7d,0xbf,0x5a,0xb7,0xdd,0xea,0x53,0xf7,0xbe,0xb8,0x3c,0x42,0x73,0x38,0xf3,0x7b,0xa9,0xd0,0x10,0xf8,0xd0,0xbb,0xd5,0x29,0x76,0x87,0x35,0x7,0xd8,0x41,0x69,0x14,0x99,0x25,0x4a,0x3,0xb7,0xed,0x7,0xc7,0xad,0x6e,0xde,0xde,0xa0,0xf5,0x8,0xcc,0xe2,0x9f,0xe4,0xc7,0xf,0xc6,0x2d,0x5a,0x1f,0x8d,0xbe,0xc3,0x8d,0x17,0x8c,0x84,0x3e,0x58,0xa3,0x7c,0x3,0xc7,0x3b,0x38,0xa4,0xf9,0x32,0x40,0xf9,0x2f,0xb0,0x3f,0xc0 +}; + + +const uint8_t *_A_L1_BadBattery_128x47[] = { + + _A_L1_BadBattery_128x47_0, + + _A_L1_BadBattery_128x47_1, + +}; + + + +const FrameBubble L1_BadBattery_128x47_bubble_0_0; + + +const FrameBubble* const L1_BadBattery_128x47_bubble_sequences[] = { + + &L1_BadBattery_128x47_bubble_0_0, + +}; + + + +const FrameBubble L1_BadBattery_128x47_bubble_0_0 = { + .bubble = { + .x = 4, + .y = 21, + .text = "I feel so sick!\nI'm dying...", + .align_h = AlignRight, + .align_v = AlignCenter, + }, + .start_frame = 0, + .end_frame = 1, + .next_bubble = NULL, +}; + + + +const BubbleAnimation BA_L1_BadBattery_128x47 = { + .icon_animation = { + .width = 128, + .height = 47, + .frame_count = 2, + .frame_rate = 2, + .frames = _A_L1_BadBattery_128x47 + }, + .frame_order = { 0, 1 }, + .passive_frames = 2, + .active_frames = 0, + .active_cooldown = 0, + .active_cycles = 0, + .duration = 3600, + + .frame_bubble_sequences = L1_BadBattery_128x47_bubble_sequences, + .frame_bubble_sequences_count = COUNT_OF(L1_BadBattery_128x47_bubble_sequences), + +}; + + +const uint8_t _A_L1_NoSd_128x49_0[] = { + 0x1,0x0,0x49,0x1,0x0,0x5e,0x3,0xff,0x7,0x7,0xe5,0xc2,0x1,0x38,0x7,0xe4,0x32,0x1,0xc0,0x7,0xe4,0xc,0x4,0x5c,0xf,0xf8,0x0,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x0,0xf2,0x22,0xb5,0x0,0x6,0x50,0x8b,0x6,0x4a,0x49,0x49,0x83,0x3,0xd6,0x40,0x3,0x28,0x80,0x3e,0xa2,0x1,0x33,0x7,0xd4,0x20,0x1f,0xe4,0x33,0x7,0xd4,0x10,0x1e,0x65,0xfa,0x7,0x9e,0x0,0x1f,0x50,0x20,0x7f,0x81,0xc,0x1f,0xe0,0xfa,0x80,0x80,0x86,0x1e,0xf,0xde,0x4,0xf0,0x1f,0xb6,0xb,0xc0,0x3f,0xc1,0xfb,0x70,0xfc,0x40,0x3a,0x0,0xfc,0xec,0x40,0x3d,0x0,0xfb,0xf8,0x7f,0x20,0x1f,0x40,0x7d,0xec,0x35,0xf0,0xf,0xe7,0x26,0x4d,0xe7,0xf,0xce,0xf4,0x1e,0x38,0xd,0xdf,0x68,0x1f,0x1e,0xa,0xe8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xb0,0x9,0x5,0x1c,0x1e,0x5a,0x61,0x7b,0xc0,0xd3,0xe3,0x30,0x7,0x92,0xff,0x7e,0x19,0x48,0x1f,0x44,0x1e,0xb8,0x0,0x1a,0x3,0xc7,0xf3,0x2f,0x7,0xad,0x0,0x6,0x54,0x88,0x17,0xc3,0xff,0xc0,0x8f,0x83,0xd6,0x40,0x3,0x29,0x24,0x4,0x1e,0x38,0x18,0x78,0x3d,0x62,0x0,0x32,0xc9,0x2f,0xcb,0x1f,0x0,0x7,0xac,0x20,0x6,0x54,0x95,0xf8,0xdf,0xf0,0x18,0x8,0x3f,0x80,0x22,0x70,0x40,0x10,0xc1,0x80,0x43,0xf4,0x7,0x8f,0x2,0xf,0x10,0xec,0x4,0x8,0x1e,0x38,0x3,0x89,0x7f,0x19,0xe7,0x10,0x90,0xb,0x8,0x1e,0x37,0x81,0x29,0x3,0xd8,0x98,0x40,0xf1,0x1a,0x98,0x3d,0x2c,0x0,0xf3,0xf2,0x78,0x16,0x24,0xf,0x5c,0x4,0xff,0xc0,0x3a,0x18,0xc4,0x7c,0x8,0x40,0xf6,0x45,0x8c,0xf8,0xfe,0x5f,0xc0,0x7b,0xd0,0x28,0x10,0x4e,0x4,0x3e,0xc1,0x80,0xff,0x8f,0xdc,0x1e,0x4c,0x81,0x3,0x8c,0xfc,0x1f,0x1c,0x2,0x49,0x40,0x3f,0xce,0xd1,0x7,0xc2,0xc0,0xff,0xc1,0x43,0x7,0xd4,0x8,0x8,0x60,0xff,0xfc,0x3,0xca,0x7,0x80,0xb0,0x2,0x8c,0xda,0x40,0x7,0xb0,0x83,0xfb,0xfc,0xb,0x30,0x7a,0x0 +}; + +const uint8_t _A_L1_NoSd_128x49_1[] = { + 0x1,0x0,0x42,0x1,0x0,0x5e,0x3,0xff,0x7,0x7,0xe5,0xc2,0x1,0x38,0x7,0xe4,0x32,0x1,0xc0,0x7,0xe4,0xc,0x4,0x5c,0xf,0xf8,0x0,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x0,0xf2,0x22,0xb5,0x0,0x6,0x50,0x8b,0x6,0x4a,0x49,0x49,0x83,0x3,0xd6,0x40,0x3,0x28,0x80,0x3e,0xa2,0x1,0x33,0x7,0xd4,0x20,0x1f,0xe4,0x33,0x7,0xd4,0x10,0x1e,0x65,0xfa,0x7,0x9e,0x0,0x1f,0x50,0x20,0x7f,0x81,0xc,0x1f,0xe0,0xfa,0x80,0x80,0x86,0x1e,0xf,0xde,0x4,0xf0,0x1f,0xb6,0xb,0xc0,0x3f,0xc1,0xfb,0x70,0xfc,0x40,0x3a,0x0,0xfc,0xec,0x40,0x3d,0x0,0xfb,0xf8,0x7f,0x20,0x1f,0x40,0x7d,0xec,0x35,0xf0,0xf,0xe7,0x26,0x4d,0xe7,0xf,0xce,0xf4,0x1e,0x38,0xd,0xdf,0x68,0x1f,0x1e,0xa,0xe8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xb0,0x9,0x5,0x1c,0x1e,0x5a,0x61,0x7b,0xc0,0xd3,0xe3,0x30,0x7,0x92,0xff,0x7e,0x19,0x48,0x1f,0x44,0x1e,0xb8,0x0,0x1a,0x3,0xc7,0xf3,0x2f,0x7,0xad,0x0,0x6,0x54,0x88,0x17,0xc3,0xff,0xc0,0x8f,0x83,0xd6,0x40,0x3,0x29,0x24,0x4,0x1e,0x38,0x18,0x78,0x3d,0x62,0x0,0x32,0xc9,0x2f,0xcb,0x1f,0x0,0x7,0xac,0x20,0x6,0x54,0x95,0xf8,0xdf,0xf0,0x18,0x0,0x7a,0xc1,0x0,0x43,0x6,0x1,0xf,0xd0,0x1e,0x3c,0x0,0x78,0xf8,0x2,0x44,0xf,0x1c,0x1,0xc4,0xbf,0x8c,0xf4,0x88,0x76,0x0,0x62,0xf,0x1b,0xc0,0x94,0x81,0xed,0x20,0x1e,0x88,0x3c,0x46,0xe6,0xf,0x72,0xe8,0xf9,0x3c,0xb,0x12,0x7,0xb5,0x80,0x1e,0x51,0x88,0xff,0x80,0x7f,0x18,0x9,0xf8,0x2c,0x42,0x23,0xfc,0x7,0xca,0x70,0x67,0xd6,0xc,0x7,0xfc,0x7f,0x14,0xa,0x4,0x13,0x81,0x8f,0xff,0xcf,0xc1,0xf6,0xd9,0x1f,0xfb,0xb4,0x41,0xf1,0xc0,0x2d,0x17,0xf8,0x6,0x40,0xf8,0x5,0x14,0x9,0x6a,0x60,0xff,0xfc,0x3,0xc8,0x4e,0x20,0xf4,0x36,0x90,0x1,0xf0,0x16,0x0,0x7e,0xc0,0x2c,0x20,0xf7 +}; + +const uint8_t _A_L1_NoSd_128x49_2[] = { + 0x1,0x0,0x41,0x1,0x0,0x5e,0x3,0xff,0x7,0x7,0xe5,0xc2,0x1,0x38,0x7,0xe4,0x32,0x1,0xc0,0x7,0xe4,0xc,0x4,0x5c,0xf,0xf8,0x0,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x0,0xf2,0x22,0xb5,0x0,0x6,0x50,0x8b,0x6,0x4a,0x49,0x49,0x83,0x3,0xd6,0x40,0x3,0x28,0x80,0x3e,0xa2,0x1,0x33,0x7,0xd4,0x20,0x1f,0xe4,0x33,0x7,0xd4,0x10,0x1e,0x65,0xfa,0x7,0x9e,0x0,0x1f,0x50,0x20,0x7f,0x81,0xc,0x1f,0xe0,0xfa,0x80,0x83,0xfc,0x1f,0xe0,0xff,0x2e,0x8c,0xfc,0x1f,0xbe,0xb,0xc4,0x3,0xa0,0xf,0xbb,0x6,0xe2,0x1,0xe8,0x7,0xdf,0xc3,0xf9,0x0,0xfa,0x3,0xef,0x61,0xdf,0x80,0x7f,0x39,0x32,0x6f,0x38,0x7e,0x77,0x20,0xf1,0xc0,0x6e,0xfb,0x44,0xf9,0xac,0x83,0xc7,0x29,0xba,0xed,0x83,0xda,0xb,0x0,0xe0,0x1b,0xc4,0x1e,0x3a,0x61,0x7b,0xc0,0xc0,0x86,0xf,0x14,0xfd,0xe4,0x8,0x43,0x94,0x81,0xf4,0x41,0xeb,0x80,0x1,0x95,0x22,0x4,0xf,0x1f,0xcc,0xbc,0x1e,0xb4,0x0,0x91,0x49,0x20,0x3f,0xf,0xff,0x2,0x3e,0xf,0x59,0x0,0x48,0xb2,0x50,0x40,0x78,0xe0,0x61,0xe0,0xf5,0x88,0x4,0x8a,0x93,0x2,0x5f,0x8e,0x3e,0x0,0xf,0x58,0x40,0x8c,0xe1,0x3e,0x8b,0xfe,0x3,0x0,0xf,0x58,0x20,0x8,0x60,0xd8,0x8,0x27,0xd0,0x1e,0x3c,0x0,0x7b,0xe0,0xe,0x25,0xfc,0x67,0xc0,0x3c,0x5f,0xa2,0xf,0x7f,0xc0,0x64,0x81,0xe3,0x1f,0x7,0xc4,0x13,0xec,0x10,0x1f,0x27,0x80,0x4e,0x60,0xf6,0x84,0x40,0xa0,0x1d,0x8f,0xf8,0x90,0x81,0xf0,0x2d,0x1f,0x7,0xc5,0x62,0x60,0xf5,0x8c,0x3,0xce,0x3f,0x70,0x7,0xc7,0x82,0x1e,0x5b,0x15,0x78,0xcf,0x1,0xf1,0x20,0x84,0x60,0x21,0xe0,0xf1,0x2f,0xcc,0x42,0x20,0xd8,0x1a,0x1f,0x2,0x1e,0xf,0xb0,0x49,0x1b,0xe6,0x21,0xf0,0x5,0x17,0xf8,0xde,0x7f,0x80,0x79,0x40,0xc1,0xe3,0x30,0x5,0x15,0xf5,0x6c,0x8f,0xb5,0x7,0x98,0x78,0xc1,0xff,0x0 +}; + +const uint8_t _A_L1_NoSd_128x49_3[] = { + 0x1,0x0,0x45,0x1,0x0,0x5e,0x3,0xff,0x7,0x7,0xe5,0xc2,0x1,0x38,0x7,0xe4,0x32,0x1,0xc0,0x7,0xe4,0xc,0x4,0x5c,0xf,0xf8,0x0,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x0,0xf2,0x22,0xb5,0x0,0x6,0x50,0x8b,0x6,0x4a,0x49,0x49,0x83,0x3,0xd6,0x40,0x3,0x28,0x80,0x3e,0xa2,0x1,0x33,0x7,0xd4,0x20,0x1f,0xe4,0x33,0x7,0xd4,0x10,0x1e,0x65,0xfa,0x7,0x9e,0x0,0x1f,0x50,0x20,0x7f,0x81,0xc,0x1f,0xe0,0xfa,0x80,0x83,0xfc,0x1f,0xe0,0xff,0x2e,0x8c,0xfc,0x1f,0xbe,0xb,0xc4,0x3,0xa0,0xf,0xbb,0x6,0xe2,0x1,0xe8,0x7,0xdf,0xc3,0xf9,0x0,0xfa,0x3,0xef,0x61,0xdf,0x80,0x7f,0x39,0x32,0x6f,0x38,0x7e,0x77,0x20,0xf1,0xc0,0x6e,0xfb,0x44,0xf9,0xac,0x83,0xc7,0x29,0xba,0xed,0x83,0xda,0xb,0x0,0xe0,0x1b,0xc4,0x1e,0x3a,0x61,0x7b,0xc0,0xc0,0x86,0xf,0x14,0xfd,0xe4,0x8,0x43,0x94,0x81,0xf4,0x41,0xeb,0x80,0x1,0x95,0x22,0x4,0xf,0x1f,0xcc,0xbc,0x1e,0xb4,0x0,0x91,0x49,0x20,0x3f,0xf,0xff,0x2,0x3e,0xf,0x59,0x0,0x48,0xb2,0x50,0x40,0x78,0xe0,0x61,0xe0,0xf5,0x88,0x4,0x8a,0x93,0x2,0x5f,0x8e,0x3e,0x0,0xf,0x58,0x40,0x8c,0xe1,0x3e,0x8b,0xfe,0x3,0x0,0xf,0x58,0x20,0x8,0x60,0xd8,0x8,0x27,0xd0,0x1e,0x3c,0x0,0x7b,0xe0,0xe,0x25,0xfc,0x67,0xc0,0x3c,0x5f,0xa2,0xf,0x7f,0xc0,0x64,0x81,0xe2,0x17,0x30,0x7a,0xc1,0x3e,0xc1,0x1,0xf2,0x78,0x16,0x26,0xf,0x68,0x44,0xa,0x1,0x18,0x8f,0xf8,0x7,0xf0,0xf,0x11,0x68,0x9f,0xc7,0xf8,0xf,0x88,0xc0,0x3c,0xac,0x18,0xf,0xf8,0xfe,0x3c,0x10,0xf2,0xd8,0x83,0x85,0xfa,0x20,0xf7,0x90,0x42,0x30,0x10,0xf8,0x7,0xf8,0x4,0x20,0xf7,0x88,0x44,0x1b,0x3,0x3,0xff,0x17,0x88,0x1f,0x20,0x91,0x8f,0xa5,0x4c,0x1e,0xdf,0x0,0x51,0x1c,0x84,0x0,0x5f,0x80,0x79,0x9,0xc6,0x21,0x30,0x5,0x11,0xb4,0x80,0xe,0xf,0xf0,0x7c,0x80 +}; + +const uint8_t _A_L1_NoSd_128x49_4[] = { + 0x1,0x0,0x3d,0x1,0x0,0x5e,0x3,0xff,0x7,0x7,0xe5,0xc2,0x1,0x38,0x7,0xe4,0x32,0x1,0xc0,0x7,0xe4,0xc,0x4,0x5c,0xf,0xf8,0x0,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x0,0xf2,0x22,0xb5,0x0,0x6,0x50,0x8b,0x6,0x4a,0x49,0x49,0x83,0x3,0xd6,0x40,0x3,0x28,0x80,0x3e,0xa2,0x1,0x33,0x7,0xd4,0x20,0x1f,0xe4,0x33,0x7,0xd4,0x10,0x1e,0x65,0xfa,0x7,0x9e,0x0,0x1f,0x50,0x20,0x7f,0x81,0xc,0x1f,0xe0,0xfa,0x80,0x83,0xfc,0x1f,0xe0,0xff,0x7,0xf8,0x10,0xfa,0x0,0xfc,0xe0,0x40,0x3d,0x0,0xfc,0xf0,0x40,0x3e,0x80,0xfb,0x98,0x7c,0x20,0x1f,0xce,0x4c,0x9b,0xce,0xf,0x8f,0x85,0xfc,0x1e,0x38,0xd,0xdf,0x68,0x1f,0x1e,0x9,0xf8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xa4,0xe1,0x8f,0x83,0xcb,0x4c,0x2f,0x78,0x18,0x10,0xc1,0xe2,0x5f,0xbc,0x81,0x8,0x72,0x90,0x3e,0x88,0x3d,0x70,0x0,0x32,0xa4,0x40,0x81,0xe3,0xf9,0x97,0x83,0xd6,0x80,0x12,0x29,0x24,0x7,0xe1,0xff,0x22,0x8,0x3d,0x64,0x1,0x22,0xc9,0x41,0x1,0xe3,0x81,0x87,0x83,0xd6,0x20,0x12,0x2a,0x4c,0x9,0x7e,0x38,0xf8,0x0,0x3d,0x61,0x2,0x33,0x84,0xfa,0x2f,0xf8,0xc,0x0,0x3d,0x60,0x80,0x21,0x83,0x60,0x20,0x9f,0x40,0x78,0xf0,0x1,0xef,0x80,0x38,0x97,0xf1,0x9f,0x0,0xf1,0xbc,0x23,0xcc,0x1e,0x9f,0x80,0xc9,0x3,0xc5,0x5a,0x20,0xf7,0x82,0x7d,0x82,0x3,0xe4,0xf0,0x9,0xcc,0x1e,0xd0,0x88,0x14,0x3,0xb1,0xff,0x12,0x10,0x3e,0x5,0xa3,0xe0,0xf8,0xac,0x4c,0x1e,0xb1,0x80,0x79,0xc7,0xee,0x0,0xf8,0xf0,0x43,0xcb,0x62,0xaf,0x19,0xe0,0x3e,0x24,0x10,0x8c,0x4,0x3c,0x1e,0x25,0xf9,0x88,0x44,0x1b,0x3,0x43,0xe0,0x43,0xc1,0xf6,0x9,0x23,0x7c,0xc4,0x3e,0x0,0xa2,0xff,0x1b,0xcf,0xf0,0xf,0x28,0x18,0x3c,0x66,0x0,0xa2,0xbe,0xad,0x91,0xf6,0xa0,0xf3,0xf,0x18,0x3f,0xe0,0x0 +}; + +const uint8_t _A_L1_NoSd_128x49_5[] = { + 0x1,0x0,0x43,0x1,0x0,0x5e,0x3,0xff,0x7,0x7,0xe5,0xc2,0x1,0x38,0x7,0xe4,0x32,0x1,0xc0,0x7,0xe4,0xc,0x4,0x5c,0xf,0xf8,0x0,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x0,0xf2,0x22,0xb5,0x0,0x6,0x50,0x8b,0x6,0x4a,0x49,0x49,0x83,0x3,0xd6,0x40,0x3,0x28,0x80,0x3e,0xa2,0x1,0x33,0x7,0xd4,0x20,0x1f,0xe4,0x33,0x7,0xd4,0x10,0x1e,0x65,0xfa,0x7,0x9e,0x0,0x1f,0x50,0x20,0x7f,0x81,0xc,0x1f,0xe0,0xfa,0x80,0x80,0x86,0x1e,0xf,0xde,0x4,0xf0,0x1f,0xb6,0xb,0xc0,0x3f,0xc1,0xfb,0x70,0xfc,0x40,0x3a,0x0,0xfc,0xec,0x40,0x3d,0x0,0xfb,0xf8,0x7f,0x20,0x1f,0x40,0x7d,0xec,0x35,0xf0,0xf,0xe7,0x26,0x4d,0xe7,0xf,0xce,0xf4,0x1e,0x38,0xd,0xdf,0x68,0x1f,0x1e,0xa,0xe8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xb0,0x9,0x5,0x1c,0x1e,0x5a,0x61,0x7b,0xc0,0xd3,0xe3,0x30,0x7,0x92,0xff,0x7e,0x19,0x48,0x1f,0x44,0x1e,0xb8,0x0,0x1a,0x3,0xc7,0xf3,0x2f,0x7,0xad,0x0,0x6,0x54,0x88,0x17,0xc3,0xff,0xc0,0x8f,0x83,0xd6,0x40,0x3,0x29,0x24,0x4,0x1e,0x38,0x18,0x78,0x3d,0x62,0x0,0x32,0xc9,0x2f,0xcb,0x1f,0x0,0x7,0xac,0x20,0x6,0x54,0x95,0xf8,0xdf,0xf0,0x18,0x0,0x7a,0xc1,0x0,0x43,0x6,0x1,0xf,0xd0,0x1e,0x3c,0x0,0x7b,0xe0,0xe,0x25,0xfc,0x67,0xc0,0x3c,0x6f,0x0,0x52,0x7,0xaf,0xe0,0x32,0x40,0xf1,0x8f,0x83,0xe2,0x9,0xf6,0x8,0xf,0x93,0xc0,0x27,0x30,0x7b,0x42,0x20,0x50,0xe,0xc7,0xfc,0x48,0x40,0xf8,0x16,0x8f,0x83,0xe2,0xb1,0x30,0x7a,0xc6,0x1,0xe7,0x1f,0xb8,0x3,0xe3,0xc1,0xf,0x2d,0x8a,0xbc,0x67,0x80,0xf8,0x90,0x42,0x30,0x10,0xf0,0x78,0x97,0xe6,0x21,0x10,0x64,0xd,0xf,0x80,0xfd,0x10,0x7d,0x2,0x48,0xdf,0x31,0xf,0x80,0x28,0xbf,0xc6,0xf3,0xfc,0x3,0xca,0x6,0xf,0x19,0x80,0x28,0xaf,0xab,0x64,0x7d,0xa8,0x3c,0xc3,0xc6,0xf,0xf8,0x0 +}; + + +const uint8_t *_A_L1_NoSd_128x49[] = { + + _A_L1_NoSd_128x49_0, + + _A_L1_NoSd_128x49_1, + + _A_L1_NoSd_128x49_2, + + _A_L1_NoSd_128x49_3, + + _A_L1_NoSd_128x49_4, + + _A_L1_NoSd_128x49_5, + +}; + + + +const FrameBubble L1_NoSd_128x49_bubble_0_0; + + +const FrameBubble* const L1_NoSd_128x49_bubble_sequences[] = { + + &L1_NoSd_128x49_bubble_0_0, + +}; + + + +const FrameBubble L1_NoSd_128x49_bubble_0_0 = { + .bubble = { + .x = 40, + .y = 18, + .text = "Need an\nSD card", + .align_h = AlignRight, + .align_v = AlignBottom, + }, + .start_frame = 0, + .end_frame = 9, + .next_bubble = NULL, +}; + + + +const BubbleAnimation BA_L1_NoSd_128x49 = { + .icon_animation = { + .width = 128, + .height = 49, + .frame_count = 6, + .frame_rate = 2, + .frames = _A_L1_NoSd_128x49 + }, + .frame_order = { 0, 1, 0, 1, 0, 2, 3, 4, 3, 5 }, + .passive_frames = 10, + .active_frames = 0, + .active_cooldown = 0, + .active_cycles = 0, + .duration = 3600, + + .frame_bubble_sequences = L1_NoSd_128x49_bubble_sequences, + .frame_bubble_sequences_count = COUNT_OF(L1_NoSd_128x49_bubble_sequences), + +}; + + +const StorageAnimation dolphin_internal[] = { + + { + .animation = &BA_L1_Tv_128x47, + .manifest_info = { + .name = "L1_Tv_128x47", + .min_butthurt = 0, + .max_butthurt = 14, + .min_level = 1, + .max_level = 3, + .weight = 3, + } + }, + + { + .animation = &BA_L1_BadBattery_128x47, + .manifest_info = { + .name = "L1_BadBattery_128x47", + .min_butthurt = 0, + .max_butthurt = 14, + .min_level = 1, + .max_level = 3, + .weight = 3, + } + }, + + { + .animation = &BA_L1_NoSd_128x49, + .manifest_info = { + .name = "L1_NoSd_128x49", + .min_butthurt = 0, + .max_butthurt = 14, + .min_level = 1, + .max_level = 3, + .weight = 6, + } + }, + +}; + +const size_t dolphin_internal_size = COUNT_OF(dolphin_internal); diff --git a/assets/compiled/assets_dolphin_internal.h b/assets/compiled/assets_dolphin_internal.h new file mode 100644 index 000000000..f4f415fa7 --- /dev/null +++ b/assets/compiled/assets_dolphin_internal.h @@ -0,0 +1,7 @@ +#pragma once + +#include +#include + +extern const StorageAnimation dolphin_internal[]; +extern const size_t dolphin_internal_size; diff --git a/assets/compiled/assets_icons.c b/assets/compiled/assets_icons.c index 71316998d..bb540f5a1 100644 --- a/assets/compiled/assets_icons.c +++ b/assets/compiled/assets_icons.c @@ -8,89 +8,31 @@ const uint8_t *_I_Certification1_103x23[] = {_I_Certification1_103x23_0}; const uint8_t _I_Certification2_119x30_0[] = {0x01,0x00,0x3c,0x01,0x00,0x5c,0x06,0x01,0x40,0x07,0x5e,0x0b,0xff,0x20,0x07,0x5d,0x92,0x01,0x13,0x03,0xa4,0x70,0x06,0x5f,0xe0,0x10,0xc6,0x20,0x10,0xc8,0x1c,0xce,0x70,0x07,0x19,0xf0,0x08,0x70,0x10,0x18,0x1c,0x03,0xe1,0xff,0x83,0x83,0x84,0x34,0x57,0xf0,0x10,0xd8,0x03,0x23,0x00,0x1c,0x8c,0x08,0x1c,0x30,0xf0,0xc8,0xf8,0xc1,0xc3,0x10,0x00,0x90,0x48,0x60,0x70,0x3d,0x98,0x90,0x70,0x1c,0x10,0x70,0xc2,0x03,0x65,0xa0,0xc0,0x07,0x47,0xe6,0x6d,0x1e,0x07,0x04,0x06,0x20,0xe3,0x90,0x5f,0x41,0xc9,0xe0,0xc0,0x08,0x46,0x09,0x18,0x41,0x0c,0x82,0x44,0x0e,0x11,0x61,0x5c,0x27,0xd0,0x70,0x70,0xc5,0xc1,0xc3,0x40,0x8a,0x17,0x84,0x94,0x53,0x0a,0x0c,0x1a,0x01,0xe2,0x88,0x7e,0x01,0xc3,0x08,0x80,0xff,0xcd,0x05,0xb8,0x80,0x43,0xa0,0x11,0xe8,0x80,0x84,0x43,0xa5,0xfe,0x98,0xa1,0x86,0xb9,0x00,0x8e,0x9c,0x47,0xe0,0x5d,0x1a,0x04,0x88,0x8e,0x20,0x02,0x97,0x60,0x27,0x40,0xe1,0x03,0x95,0x02,0x82,0x0e,0x49,0x35,0x0a,0x65,0x00,0xe1,0x28,0x04,0xfe,0x38,0x05,0xc8,0xf8,0xe3,0xf0,0x09,0x3c,0x8a,0xe4,0x0e,0x4e,0x02,0xe0,0x7f,0xff,0x39,0xfe,0x02,0x47,0x14,0xf1,0x0b,0x13,0x41,0xc0,0x52,0x0c,0xc2,0x61,0xc0,0x90,0xc3,0x38,0x50,0x1e,0x27,0xfe,0x8f,0x00,0xc8,0x48,0x20,0xc0,0xe3,0x40,0x0e,0x04,0x1c,0x98,0x8d,0x04,0x28,0x1c,0x4a,0x31,0x00,0x0c,0x0e,0x11,0x38,0x59,0x8c,0x12,0x7f,0x12,0x81,0xfc,0x27,0xf7,0x08,0x05,0x06,0x01,0x07,0x07,0x1c,0x08,0x6c,0x20,0xe2,0x98,0x40,0x27,0xd0,0x08,0x34,0x42,0x70,0xef,0x13,0xa8,0xd0,0x05,0x84,0x1d,0x10,0x00,0xc1,0xdf,0x43,0x0c,0x41,0x1a,0xcc,0x47,0x63,0xff,0x00,0x0c,0x0c,0xe4,0x2d,0x91,0x00,0x17,0xf8,0x1c,0x3c,0x00,0x71,0x09,0xc7,0xfc,0x0d,0x30,0x06,0x7f,0x3f,0xea,0x11,0x07,0x78,0x3b,0xc1,0xd6,}; const uint8_t *_I_Certification2_119x30[] = {_I_Certification2_119x30_0}; -const uint8_t _I_card_bad1_0[] = {0x01,0x00,0x01,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfe,0x01,0x82,0x04,0x0c,0x4a,0x01,0x70,0x8f,0x01,0x46,0x08,0x0f,0x5e,0x30,0x24,0x60,0x50,0x0c,0x44,0x88,0x1f,0x1a,0xaa,0x64,0xeb,0xaf,0x71,0x84,0x48,0xb1,0x93,0xb8,0x39,0x3d,0x72,0x55,0x2a,0x50,0x04,0x6e,0x12,0x2a,0x96,0x28,0x3e,0x20,0xf4,0xc1,0x03,0xcf,0x01,0x22,0xa1,0x03,0xf0,0x7e,0x21,0xf9,0xc6,0x52,0xea,0x57,0x22,0xf8,0xe3,0x21,0x63,0xf6,0x00,0x1d,0x01,0x3f,0xd3,0x05,0x7f,0x83,0xfc,0x1f,0xe0,0xf5,0xcf,0xfc,0xee,0x77,0xe0,0x5b,0x7e,0x28,0x10,0x18,0x25,0x02,0x7f,0xf9,0x93,0x87,0xde,0x11,0x00,0x07,0x8e,0x82,0xff,0xfc,0xc7,0x83,0xe2,0xb9,0x19,0x83,0xf4,0x01,0xf5,0x78,0xa9,0x69,0x60,0x9f,0x01,0x7d,0xd4,0xb7,0xa0,0xf1,0x27,0xd0,0x3c,0x70,0xa0,0xf1,0x37,0xd0,0xfc,0xc1,0xf6,0x00,0x30,0x7f,0xf0,0x01,0xff,0xff,0x83,0xfe,0x01,0xfb,0xf9,0xf0,0x83,0xf6,0x19,0xc6,0x07,0xb0,0xe8,0xe0,0x34,0x0f,0xfc,0x1b,0x90,0x0f,0x69,0x80,0x0c,0xa0,0x5a,0x0f,0xfc,0xd8,0x1e,0xf1,0x80,0x19,0x41,0x3a,0x05,0xd1,0xfe,0x03,0xec,0xff,0x51,0x8b,0x84,0x8a,0x04,0x0f,0xcc,0x44,0x4a,0x0c,0x0f,0xd8,0x54,0x38,0x1f,0xb0,0x68,0xf0,0x7f,0xc7,0xfe,0x5f,0xf0,0x7e,0x1f,0xfc,0x1f,0xd3,0x85,0xf9,0x83,0xe8,0x14,0x70,0x1f,0x00,0x10,0xa7,0xe0,0xf5,0x05,0x18,0x25,0x40,0x1e,0x00,0xf0,0x07,0x80,0x28,}; -const uint8_t *_I_card_bad1[] = {_I_card_bad1_0}; +const uint8_t _A_Levelup1_128x64_0[] = {0x01,0x00,0x22,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0x38,0x1f,0xe0,0x1d,0x97,0xff,0xe7,0x1c,0x1f,0x99,0xf8,0x1c,0xe0,0x1f,0x96,0x78,0x07,0x03,0xf8,0x0f,0xb8,0xdc,0x02,0x01,0xfb,0x07,0xdc,0x14,0x1e,0x3f,0x40,0x7d,0xc0,0x81,0xe3,0xe8,0x2f,0x5c,0x04,0x1e,0x3d,0x00,0x7d,0x6f,0xc1,0xc3,0x00,0xd0,0x03,0xea,0xbe,0x0f,0xf0,0x79,0x50,0x01,0xf5,0x2f,0x07,0xf8,0x38,0x63,0xf8,0x0f,0xf1,0x7a,0x62,0x10,0x0c,0x04,0x80,0x1f,0x59,0xf8,0xf8,0xb4,0x6f,0x80,0xfa,0xb7,0xcc,0x20,0x12,0x0f,0x34,0x03,0xfa,0x0f,0x88,0xbd,0x00,0x1e,0x3e,0x30,0x7d,0x42,0xf0,0x10,0x18,0x87,0x9c,0x1f,0x70,0x08,0x16,0x43,0xfe,0x0f,0xaf,0x5c,0x02,0x18,0x0f,0xc8,0xdc,0x0e,0x20,0x0f,0xc8,0x5c,0x31,0x7a,0x37,0xf0,0x7d,0xa3,0xc6,0x81,0x3f,0x37,0xdc,0x82,0x01,0xc0,0x49,0x09,0xff,0x61,0x00,0xfa,0x97,0x9f,0xc6,0x00,0x32,0x10,0x7d,0x40,0x20,0xc0,0xfc,0xaf,0xc0,0x23,0x0f,0x01,0x07,0xd6,0xfe,0x01,0xe0,0x07,0xe5,0xfc,0x7c,0x30,0xf0,0x7d,0xff,0xe0,0x41,0xe2,0x07,0xdc,0x14,0x1f,0xd0,0xd0,0x7f,0x45,0x45,0xfe,0x0f,0xf0,0x7f,0x17,0xd3,0xf4,0x7f,0x98,0x18,0x3f,0xc1,0xe7,0xf4,0x57,0xc8,0xbd,0x01,0xff,0xe8,0x6f,0xc8,0x3d,0x3a,0x0f,0xf9,0x67,0x88,0x00,0xb4,0x00,0xf8,0x8b,0x83,0xd2,0x80,0x0f,0x88,0x48,0x3d,0x30,0x1f,0xc0,0x6a,0xe3,0xef,0xf0,0x60,0x7a,0x40,0x3e,0x60,0xf5,0xbb,0xe0,0x20,0x20,0xf4,0x80,0xf3,0x01,0xeb,0x8b,0xbf,0x82,0x84,0x1e,0x93,0x0c,0x00,0x3d,0x21,0x60,0xa2,0x07,0xa7,0x02,0xfe,0x0f,0xd2,0x88,0xff,0x81,0xe6,}; +const uint8_t _A_Levelup1_128x64_1[] = {0x01,0x00,0x02,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x2f,0xf8,0x17,0x59,0xfe,0xf8,0x6b,0x37,0xf9,0xf0,0x32,0x7e,0xc1,0xac,0x02,0x19,0xff,0xfe,0x03,0xfc,0x11,0x5c,0xfe,0x7f,0xfe,0xf1,0x8c,0x2e,0x3d,0xce,0x80,0xe7,0x3e,0xff,0x90,0x7c,0xc3,0xe6,0x10,0x0b,0x07,0xfb,0xf0,0x61,0x8c,0x7c,0x3e,0x19,0x00,0xc0,0x43,0x6f,0xc1,0xe8,0xbf,0xe3,0xa0,0x50,0x08,0x04,0x0a,0xfe,0x83,0x7f,0xdf,0xf6,0x09,0x01,0x07,0x8e,0x11,0x25,0x1f,0x7f,0x7e,0x00,0x1c,0x30,0x09,0x41,0xfd,0xc0,0x03,0x1f,0xa0,0x03,0xca,0x21,0xfe,0x30,0x45,0xfe,0x90,0x0f,0x3f,0xe7,0xf4,0x1e,0xff,0x79,0x00,0x3c,0xa4,0x1b,0xc4,0xf4,0xca,0x01,0xe5,0xa0,0xfc,0x03,0xe6,0x20,0x0f,0x2a,0x00,0x3c,0x7c,0xef,0x96,0xbf,0xcc,0x81,0xc3,0xf8,0x07,0x93,0x0d,0xaf,0xbf,0xf5,0x70,0xc0,0x20,0x94,0x1d,0xc4,0x3f,0xf9,0xef,0x08,0x2f,0xf0,0x7e,0x5e,0x2c,0x17,0xf3,0xee,0x6f,0x89,0xc0,0x3c,0xb0,0x7f,0xc7,0x93,0x83,0x87,0xf1,0x07,0x80,0x79,0x70,0xbf,0x80,0x7b,0xc9,0xe0,0x13,0x86,0xf8,0xff,0x70,0xbc,0x0f,0x80,0x3d,0xb0,0xfa,0x18,0xe1,0x40,0x7f,0xb0,0x58,0x4f,0xf3,0xff,0xdf,0x08,0x2c,0x0e,0x18,0xc0,0x10,0x78,0xc0,0x7f,0xdb,0xfd,0xf8,0x3d,0x74,0x70,0x4c,0x04,0x07,0xfb,0x03,0x84,0xe3,0xfe,0xe0,0xf6,0x87,0xf9,0x20,0x10,0x6f,0xd4,0x0b,0x03,0xe7,0xf9,0xf7,0xce,0x47,0x7b,0xbf,0x67,0xe2,0x90,0x38,0x05,0xfe,0x03,0xc9,0xff,0xfe,0xfd,0xee,0x23,0x9f,0xff,0x27,0xd0,0xc2,0xf8,0xfc,0x20,0x18,0x16,0x6b,0xff,0xf3,0xf0,0xe6,0x81,0xca,0x7c,0x00,0xf5,0x22,0x0c,0x02,0x15,0x20,0x07,0x94,0x04,0x1e,0xd7,0xf8,0xfe,0x82,0x14,0x6f,0x10,0x00,0xea,0x51,0xe3,0xf3,0x08,0x26,0x7a,0x03,0x12,0x37,0x88,0x7c,0x91,0xe3,0xe7,0x3f,0xb4,0x48,0xde,0x21,0xf2,0xff,0x7f,0xf9,0xe7,0xf6,0x91,0x40,0x2f,0x01,0xf2,0x07,0xba,0x58,0x68,0x43,0xe2,0x0f,0x88,0xbc,0x7d,0xff,0xb0,0x79,0xf3,0xe1,0x78,0x20,0x79,0xc0,0x47,0xc2,0x8f,0x43,0xf0,0xe8,0xe0,0x44,0xe2,0x0f,0x8f,0xdf,0xc6,0xae,0x35,0x28,0xb7,0xc6,0x05,0x02,0x07,0x97,0x07,0xff,0xf1,0x17,0x20,0x10,0x74,0xe0,0xe3,0x80,0x72,0x67,0xff,0x82,0xf2,0xfc,0xe1,0xec,0xe1,0x00,0x15,0x0a,0x1e,0x60,0x12,0x72,0x70,0xe5,0xe0,0xf4,0x85,0x41,0x83,0xcb,0x37,0x83,0xe1,0xc5,0xe9,0x04,0x81,0x07,0xc7,0xde,0x0f,0x2a,0x5c,0x3b,0x40,0x0f,0x4d,0x24,0x83,0x3d,0xbf,0x30,0x1e,0x2e,0x39,0x40,0x07,0xa4,0x22,0x01,0x67,0xcf,0x8b,0xce,0x17,0x83,0x91,0x03,0xd2,0x61,0x2a,0xcc,0xf3,0x81,0xe9,0x1c,0x8c,0x03,0xd3,0x81,0x00,0xc3,0x18,0x12,0x2f,0xe0,0x83,0x83,0xd2,0x01,0xff,0xc0,0x83,0xd4,0x12,0x20,0xf5,0x80,0x60,0x01,0xe2,0x50,0x29,0x78,0x3d,0x98,0x63,0x40,0x48,0xa0,0x3e,0xac,0xc0,0xf3,0xa0,0x83,0xe2,0x41,0xc0,0x3f,0x9e,0x04,0x1f,0x3e,0x0f,0xc8,0x80,0xa0,0x60,0x81,0x07,0xb6,0x42,0x85,0xfc,0x0f,0x90,}; +const uint8_t _A_Levelup1_128x64_2[] = {0x01,0x00,0xc1,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x3f,0xe4,0x1f,0xdf,0x40,0x43,0xf3,0xc0,0xa9,0x7f,0xfb,0x03,0xdf,0x66,0x05,0x4d,0xff,0xbc,0x1e,0xf3,0xbf,0xf0,0x14,0xe3,0xf7,0x8f,0xf7,0xc4,0x1e,0xb1,0x3f,0xe0,0x14,0xe1,0xf9,0x02,0x0b,0xc5,0xc1,0xeb,0xcc,0xff,0x03,0xda,0x1e,0x0f,0x48,0x3f,0xbf,0xfd,0xf8,0x07,0xad,0xfc,0x1e,0x57,0xff,0xf4,0x0f,0xe7,0xff,0x07,0xaf,0x8e,0xff,0xf8,0xed,0xc7,0xee,0x1f,0xc8,0x18,0x34,0x41,0xeb,0xc3,0x9f,0xfc,0x3f,0x70,0xfe,0x07,0xfe,0x01,0x9c,0x0b,0x88,0x88,0x41,0xe7,0x1f,0xc8,0x5f,0xe0,0x7c,0x08,0x7c,0x03,0xf9,0x7f,0x9e,0x07,0xd3,0x8f,0x17,0x80,0x7e,0xe0,0x2f,0x71,0x85,0x7f,0xa7,0xf1,0xe0,0x7a,0x63,0xe7,0xf0,0x09,0x99,0x34,0x42,0x03,0xfb,0x9f,0xa5,0xd3,0xf1,0x3f,0xbf,0xc1,0x38,0x10,0x1c,0xe6,0xaa,0x04,0x1f,0x10,0xf2,0x7e,0x26,0xff,0x88,0x74,0xc2,0x01,0x60,0x0f,0x8d,0xfc,0x5c,0x2c,0x23,0xff,0x4c,0xed,0x18,0xe8,0x64,0x03,0x01,0xa9,0xc1,0x5e,0xf3,0xc1,0xf4,0x9f,0xcc,0xf8,0x10,0x48,0x10,0x74,0x60,0x58,0x0b,0xfe,0x32,0xfe,0xbe,0x50,0x78,0x97,0x8b,0x49,0xc0,0xf7,0xe0,0x14,0xc4,0xbe,0x3c,0x06,0x00,0x1c,0x30,0x08,0x46,0x02,0x78,0x0f,0x20,0x01,0xdf,0xb0,0x14,0x00,0x79,0x64,0x21,0x41,0x11,0x07,0x23,0x30,0x60,0x00,0xf3,0x88,0x00,0x87,0x81,0xbf,0x07,0x9e,0x73,0xdf,0x01,0x90,0x03,0xcb,0x40,0x53,0x19,0x02,0x3d,0x23,0x3f,0xf0,0x7a,0x00,0xc8,0x1e,0x5c,0x70,0x78,0xc6,0xb9,0xd0,0x11,0x59,0x0c,0xc7,0x51,0x0a,0x80,0x03,0x07,0x16,0x02,0x13,0xc0,0x83,0xd4,0x04,0x38,0xef,0xff,0x8f,0xfa,0x0f,0x18,0x3a,0x6c,0x43,0x22,0x00,0x1c,0x06,0xaa,0x14,0xd9,0x1f,0x38,0xfc,0xa1,0xa4,0x81,0x84,0x03,0xcc,0x02,0x3f,0xf0,0x71,0x80,0x06,0x02,0x1f,0x5d,0x14,0x2b,0xf0,0x0f,0x51,0x80,0xc1,0x01,0xe5,0x00,0x0b,0x0f,0xe7,0xf6,0x0f,0x5c,0x50,0x3d,0x35,0x3e,0x07,0x59,0x03,0x8a,0xff,0x0f,0x80,0x51,0x13,0xe7,0x01,0xf8,0x7b,0xff,0xa0,0xf2,0x87,0xff,0xe3,0xd2,0x8e,0x20,0x3c,0xa3,0x1a,0x9f,0x87,0x1e,0xff,0xde,0xc7,0x8b,0x47,0xd2,0x1f,0x10,0x7a,0x07,0xc7,0x8f,0x3f,0xff,0x61,0xff,0xff,0x7e,0xfc,0x1f,0x40,0x1f,0x5f,0x07,0x9d,0xfa,0x3e,0x37,0xf9,0x87,0xc6,0x02,0x0f,0x18,0xe4,0x07,0x80,0x0c,0x24,0xf9,0x14,0x04,0x3e,0x31,0xf7,0x58,0xc7,0xf5,0x38,0x0f,0x1b,0xbd,0x00,0x03,0x00,0xc2,0x03,0xca,0x1e,0x23,0x1f,0x80,0x28,0x73,0xe0,0x21,0xf9,0xff,0x70,0x30,0x41,0x90,0xe0,0x20,0xfa,0x98,0x17,0xf3,0xee,0x0f,0x2f,0xe7,0x83,0xdf,0x01,0x4f,0xac,0x03,0xfc,0x0f,0x10,0xe8,0xa4,0xc9,0x5e,0xba,0x96,0xf8,0x87,0x87,0xcf,0xf1,0xff,0xf1,0xe7,0x80,0xf1,0x88,0x3f,0x88,0x3e,0x3f,0xfe,0x7f,0x7f,0xcf,0xf9,0xff,0xc0,0xa3,0x1a,0x08,0x24,0x82,0x00,0x01,0x1d,0x4e,0x0b,0x3f,0xc7,0xf3,0xfc,0xff,0x9f,0xf9,0x08,0xa8,0x41,0xe8,0xdf,0x18,0x7f,0x07,0xcf,0x78,0x1e,0x8d,0xfe,0x00,0x1f,0x5c,0x0c,0x2a,0x0f,0xe0,0xbb,0xc7,0x0f,0xc7,0x00,0x83,0x0f,0x44,0x82,0x30,0x30,0x38,0xf8,0x22,0x78,0x00,0x70,0xf3,0xf0,0x1a,0xa0,0x7a,0x60,0xe1,0x50,0xaf,0x84,0x07,0xc0,0x0f,0x1d,0xb8,0x5c,0x60,0xbc,0x06,0x70,0x81,0x06,0x01,0x60,0xf0,0x28,0x85,0x64,0x34,0xad,0x46,0x2a,0x09,0x80,0xfc,0xc3,0x20,0x18,0x9d,0x56,0x48,0x32,0x3f,0x80,0xf8,0xe2,0xa0,0x36,0x00,0x78,0xc1,0xd6,0x23,0x31,0x80,0x63,0x01,0xe3,0xb8,0xfd,0xff,0xe1,0x10,0xe8,0xc2,0x7c,0x56,0x45,0xc1,0xc0,0x60,0xe0,0x52,0xae,0x41,0xb8,0x61,0x1f,0x08,0x38,0x30,0x60,0xc5,0xd1,0x80,0xdf,0xf0,0x06,0x12,0x17,0x89,0x64,0x57,0xe5,0xf8,0x60,0x9d,0x03,0x44,0x61,0x10,0x7b,0x00,0x10,0xea,0x25,0xf1,0x07,0x8a,0xbc,0xc1,0xeb,0xa0,0xd5,0x42,0x97,0xc3,0xff,0x54,0x88,0x3d,0xc1,0x25,0xfe,0x5f,0x88,0x94,0x80,0x0d,0x90,0xd5,0x4a,0x81,0xc3,0xfe,0xce,0x03,0xe2,0x10,0x1f,0x2f,0xff,0xe2,0x7f,0x01,0x06,0xa8,0x18,0x74,0x83,0xf1,0xfb,0x7f,0xff,0x33,0xf8,0x30,0xfd,0x41,0xe2,0xe1,0x25,0x79,0x41,0xcf,0x62,0x0f,0x5f,0xc6,0xa3,0x55,0x8a,0x07,0x90,}; +const uint8_t _A_Levelup1_128x64_3[] = {0x01,0x00,0x0a,0x03,0x8f,0xc0,0xb8,0x1f,0xfb,0xfd,0xe2,0x7f,0xf8,0x02,0x0f,0xff,0xff,0x03,0xff,0x00,0xc6,0xff,0x36,0xe0,0x47,0xfd,0xff,0x08,0xff,0xf3,0xff,0x3f,0x05,0x8f,0xf0,0x1e,0x5f,0xf8,0xfe,0x02,0xfb,0xff,0xf8,0x43,0xff,0x99,0xfd,0xf8,0x44,0x81,0xe7,0x17,0x88,0x7d,0x37,0xe0,0xf2,0x87,0xe7,0xff,0xe0,0x11,0xfe,0x83,0xca,0x1f,0x20,0xf8,0x0f,0x46,0x0f,0xfe,0x83,0xf6,0xff,0xfc,0xf0,0xfa,0x47,0xec,0x1e,0x08,0xf8,0x3c,0xa0,0x7c,0x3f,0xff,0x9c,0x1e,0x93,0xf8,0x06,0x02,0x1f,0xf8,0x2c,0x8c,0x07,0xc1,0xff,0xfd,0x83,0xdb,0xc1,0x07,0xfc,0x40,0x6f,0xda,0x0d,0x47,0xff,0xf2,0x0f,0x4b,0xf8,0x7c,0x60,0xda,0x88,0x0c,0x72,0x01,0xb0,0xff,0xe0,0x01,0xe9,0xff,0x80,0x68,0x21,0xff,0xa9,0x06,0x02,0x01,0xf2,0xbf,0x40,0x12,0x44,0x1f,0x2b,0x82,0xa1,0x7d,0x11,0xf8,0x05,0xf8,0x1e,0x74,0x7f,0x80,0xc0,0x75,0x50,0xa8,0x04,0x83,0xf0,0x0f,0x1b,0xe1,0x48,0x6f,0xfb,0x78,0x38,0x3c,0x40,0x09,0xfc,0x81,0x83,0xcb,0xfb,0xbf,0xbf,0xcb,0xbe,0x1a,0x8d,0x56,0xaa,0x55,0x80,0x85,0x18,0xc4,0x5e,0xb3,0xce,0x00,0x7d,0x7b,0x80,0x21,0xdf,0xcf,0xef,0xee,0x72,0x2f,0x8e,0xaa,0x01,0xa8,0xd1,0x62,0xa7,0xfa,0x0c,0x06,0x7d,0x82,0x33,0x8f,0x3d,0xfe,0x04,0x18,0x15,0x68,0xc0,0x1e,0xa2,0x02,0x1f,0x0f,0xff,0xbf,0x3f,0xe3,0xcf,0xc7,0x63,0xca,0xd5,0xe7,0xb5,0x58,0xa8,0x3e,0xa3,0x80,0x8e,0x29,0xfe,0x3c,0x2e,0x30,0x0b,0x85,0x56,0xea,0x73,0x11,0x10,0xd8,0x01,0xe5,0xcf,0x9f,0xcf,0xf5,0x50,0x2d,0x61,0x80,0x75,0x38,0xa2,0x28,0xda,0x09,0x63,0x9f,0x1f,0x0c,0xf8,0x3e,0x35,0x6a,0xad,0x54,0x3a,0x20,0x01,0xba,0x7f,0xf7,0xf9,0xff,0xbc,0xfe,0x7c,0x9c,0x1d,0x58,0x7c,0x74,0xd0,0xad,0x16,0xab,0x71,0xbf,0xef,0xfb,0xc1,0xe3,0x0c,0x1d,0x08,0x78,0x6a,0xb0,0xd0,0xf9,0x66,0x3f,0xbf,0xff,0x3f,0x9c,0x9c,0x3a,0x8e,0x50,0x78,0x75,0x59,0xa8,0x50,0x0c,0x7c,0x9f,0xff,0xcf,0x9f,0xe3,0x07,0x0b,0x8d,0x00,0x3e,0x51,0x50,0xf9,0x7c,0x3e,0x7f,0x99,0x3f,0xe2,0x0f,0x2a,0x5f,0x10,0x00,0xb1,0x4c,0x31,0xf8,0x7c,0x77,0x10,0x3f,0xe4,0x3c,0x2e,0x36,0x00,0xf9,0x4d,0x43,0xe5,0xe0,0x9c,0xfb,0xa0,0x7e,0x88,0x78,0x68,0x76,0x41,0xe2,0xb5,0x17,0x86,0x05,0xf8,0xcc,0x7f,0xe0,0x3f,0xc8,0x30,0x5c,0x6a,0x01,0xf2,0xaa,0x87,0xcb,0xf1,0xc2,0xff,0xc0,0x00,0x22,0x3e,0x50,0x01,0x42,0xaf,0x1d,0x09,0xfe,0x00,0x1e,0x20,0x01,0xac,0x07,0x8b,0xaa,0x07,0x29,0xe7,0x0a,0x1e,0x0f,0x20,0xfc,0x4a,0xa7,0x9e,0x85,0xa8,0xf0,0xc2,0xe5,0x54,0x1f,0x9c,0x04,0x3e,0x5e,0x00,0x18,0xf1,0xe0,0x3a,0x06,0xf1,0xb8,0x08,0x7e,0x33,0x8a,0x04,0x02,0x51,0xe3,0x4f,0x90,0x7d,0xc0,0x07,0xfa,0x80,0x68,0xe1,0x5e,0xc0,0xf1,0x6e,0x83,0xe4,0x0e,0x28,0x57,0xe3,0xce,0x18,0x1e,0xa0,0x78,0xab,0xa1,0xf6,0xfc,0x7f,0xf0,0x72,0xa0,0xfa,0xca,0xa5,0x50,0x08,0x46,0x01,0x46,0x3f,0xf3,0x18,0x87,0xf3,0xbf,0x00,0xd5,0x7b,0x37,0xfa,0xaf,0x56,0xff,0x53,0x82,0x0f,0x8c,0x83,0x51,0x02,0xff,0x5f,0xc2,0x63,0xd4,0xaf,0xa7,0x86,0xbe,0x1f,0x6d,0xf5,0xff,0x51,0x2a,0xd6,0x6b,0xc7,0xe3,0xaf,0xd4,0xe0,0x03,0xe2,0x06,0x18,0x17,0xf2,0xf6,0x7f,0xd2,0x78,0xea,0x21,0x49,0xf4,0x80,0xe0,0x35,0x40,0x11,0x0f,0x97,0xfc,0x30,0x21,0xfb,0xbf,0x43,0xc3,0xed,0x81,0x0e,0x90,0x7c,0xa7,0xd1,0xf1,0xf9,0x5d,0x6a,0xa0,0x11,0x0f,0xb4,0xf2,0x7c,0x57,0x16,0xfa,0xe2,0x80,0xa7,0x00,0x9c,0x07,0xca,0xac,0x3f,0x35,0x30,0x80,0x19,0x6e,0x3a,0xef,0x52,0xf8,0x75,0x5a,0xbd,0x10,0x80,0x90,0x43,0xe0,0x98,0x04,0x45,0x3a,0x2b,0xe1,0xaa,0xc1,0x60,0x16,0x00,0xe9,0xfd,0x2d,0x1a,0xac,0x56,0xbb,0x55,0xfb,0x01,0x0e,0x2f,0x45,0xb2,0x0f,0x8c,0x2a,0x01,0xfc,0xec,0x40,0x6c,0x01,0xf1,0xab,0xb0,0x46,0x6b,0x00,0xee,0x27,0xd3,0x51,0x0e,0xdc,0x07,0x07,0x56,0x02,0x1f,0x5e,0x03,0x56,0x1f,0x1d,0x04,0x2b,0xfd,0x59,0xfa,0xd5,0xcb,0x83,0x57,0x01,0x95,0xff,0xaa,0x1f,0x3f,0xfe,0xdc,0x2a,0x21,0xc1,0xfd,0x1e,0xce,0xd5,0x0a,0x85,0x10,0x06,0x7b,0x53,0x3e,0x18,0x01,0x43,0xe7,0xc0,0x7d,0x90,0x7c,0x40,0x09,0x2a,0x94,0x4a,0x17,0xe3,0xe3,0xb5,0x87,0xa0,0xc2,0x20,0x01,0xc0,0x78,0x7b,0xe1,0xc5,0x00,0x16,0x68,0x42,0x3a,0xae,0x17,0xc7,0x3e,0x1f,0x88,0x68,0xf8,0xfe,0x10,0x13,0xb1,0x00,0x0c,0x0c,0x3a,0x65,0x48,0x8f,0xc7,0xf0,0xdd,0x57,0x0c,0x7f,0x14,0x22,0x5f,0x5d,0x5f,0xeb,0x51,0xaa,0xd1,0x07,0xc7,0xf8,}; +const uint8_t _A_Levelup1_128x64_4[] = {0x01,0x00,0x7e,0x02,0xff,0x80,0x3c,0x01,0xf1,0xff,0xe0,0x3f,0x7d,0xff,0xd1,0x0f,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x2d,0xff,0xee,0x0f,0xef,0x47,0xff,0xfc,0x06,0x2d,0xf8,0x3d,0xe0,0x3e,0x49,0x3f,0xc0,0xfc,0x7f,0x8f,0xfc,0xed,0x02,0x37,0xff,0xc5,0xbe,0x01,0xf0,0xaf,0xe0,0xc1,0xe7,0xe0,0xff,0xc0,0xc2,0xe3,0x1f,0xf8,0x4f,0xe0,0x17,0x0b,0xf5,0x81,0x34,0x40,0xf1,0xb8,0xc1,0x38,0x1f,0xd8,0x3f,0xe2,0x73,0x00,0xf7,0xc7,0xe4,0x02,0xb1,0xff,0xcf,0xf0,0x02,0x81,0xc0,0x77,0xe0,0x37,0xf8,0x47,0x82,0xff,0x0e,0x6e,0x1c,0x1d,0xc4,0x3e,0x08,0x0d,0xfb,0x80,0x2e,0x1f,0x00,0x08,0x60,0x06,0x02,0xc3,0xc0,0x41,0x23,0x81,0x04,0x89,0x38,0x6c,0x11,0xfc,0x04,0x3c,0x1e,0x3f,0x78,0x3c,0x0e,0x01,0xc0,0x83,0xff,0xa0,0x60,0x52,0x8c,0x88,0x45,0x00,0x63,0x02,0xe2,0x6a,0xe3,0xc0,0x41,0x00,0x09,0xf8,0xd2,0x63,0x4f,0x04,0x1d,0xfc,0x1e,0x65,0xd2,0x01,0x09,0xc8,0x60,0xd0,0x0d,0x66,0xab,0x54,0x45,0x10,0x00,0xfb,0x3f,0xff,0x3f,0x8f,0xcf,0xd9,0xf9,0x87,0xd4,0x06,0xc5,0x03,0x8a,0x03,0xc7,0xf9,0xcf,0xf3,0xdf,0xfc,0xfc,0x4f,0xfc,0x2e,0x01,0xab,0x0f,0x88,0x90,0x45,0xe5,0x87,0x1f,0x94,0x02,0x9f,0x08,0xca,0x01,0x8a,0x9f,0x15,0x07,0x8d,0xe3,0x80,0x0f,0x30,0xc8,0xf0,0x03,0xc3,0xaa,0x8d,0x14,0x13,0x9f,0xfb,0x07,0x8c,0x02,0x21,0xd0,0x0b,0x15,0x7e,0x2a,0x51,0x1b,0x07,0xfb,0xcd,0xff,0xe1,0x9f,0x8b,0x40,0x1f,0x29,0x50,0x78,0xa7,0x93,0x9c,0x87,0xfe,0x03,0x1f,0x5f,0x90,0x7c,0xa7,0xf5,0x5a,0x84,0x07,0x7c,0x95,0x1f,0xbb,0x48,0x41,0xe3,0xb0,0x0f,0x95,0xa8,0x3e,0x51,0xe7,0x00,0xdf,0xe6,0x0a,0xf1,0x82,0x29,0xce,0xff,0x55,0xaa,0xc0,0x60,0x90,0x0c,0x04,0x7f,0xfd,0xfd,0x20,0x0e,0xa0,0x3e,0x5a,0xa2,0xf9,0x9a,0x47,0x8e,0x19,0x14,0xf0,0xfe,0x58,0xe7,0x54,0xaa,0x84,0x13,0xdf,0xfb,0x12,0x88,0x7e,0x4b,0x43,0xe3,0xb7,0xc0,0x2a,0x9f,0xd0,0xf9,0x8f,0xc5,0xe4,0x9c,0x38,0x18,0x10,0x5b,0xc4,0xe0,0x50,0x79,0x60,0x40,0x63,0x40,0x0f,0xbd,0x50,0x26,0xaf,0x71,0x0f,0x16,0xe8,0x16,0xd1,0xfb,0x85,0xc2,0x00,0x1f,0x50,0x80,0xd5,0x22,0x20,0xf1,0xff,0x7e,0x3f,0x01,0xfb,0xec,0x7f,0xef,0x12,0x08,0x07,0xf0,0x3e,0x71,0x58,0x24,0x16,0x28,0x1e,0x20,0x40,0xf8,0xe0,0x3e,0xcd,0xfe,0xab,0xd5,0xbf,0x0f,0xad,0x6d,0x3e,0x41,0xf5,0xa8,0xd5,0x60,0xa0,0x11,0x67,0x8e,0xfa,0xfe,0x0f,0x1d,0x66,0xbc,0x7e,0x3a,0xf0,0xfa,0xff,0xe3,0xe0,0x11,0x0f,0xad,0x56,0x8b,0x41,0xaa,0xc5,0x60,0x1f,0xb8,0x4e,0x5c,0x1e,0x29,0xf9,0xe0,0x7f,0xe1,0xb1,0xf8,0x7a,0xfd,0xc3,0xe3,0x05,0xb0,0x43,0xf8,0x17,0xf6,0xf8,0x87,0xe6,0x61,0x04,0xf0,0x46,0x20,0x15,0x50,0xfc,0x04,0xca,0xe4,0x15,0x26,0xfd,0x40,0x22,0x00,0x21,0xa8,0xa5,0x08,0x00,0x35,0x3a,0xad,0x50,0xbc,0x20,0x01,0xb0,0x00,0xcb,0x5d,0xea,0x5f,0x0e,0xaa,0x06,0x1f,0x5f,0xc4,0xc2,0x01,0x15,0x0f,0x1f,0xfe,0xaf,0x55,0xb2,0x9f,0xc8,0x1e,0x36,0x88,0x06,0x03,0x5d,0xaa,0xfd,0x80,0x86,0x17,0x00,0xd8,0x07,0xcf,0xdd,0xf9,0xa8,0xf9,0x43,0xe9,0x3f,0xaa,0xff,0x08,0x02,0x61,0x1f,0xf6,0xae,0x1d,0xb8,0x0e,0x0e,0xac,0x04,0x3e,0xbc,0x06,0xac,0x3c,0x58,0x0f,0xff,0xec,0x3a,0x80,0x04,0xaa,0x20,0xc7,0xc1,0x4f,0xd9,0x9e,0x84,0x38,0x3f,0xa4,0x09,0xda,0x87,0xe7,0x08,0xfb,0x87,0xa2,0xff,0x55,0xa8,0x18,0x0b,0x4e,0x1f,0x30,0x02,0x4a,0x90,0x09,0xef,0x0f,0xc1,0x84,0x60,0xb4,0x16,0xe0,0xf7,0x43,0x8a,0x00,0x28,0xd0,0x7d,0x0c,0x22,0x00,0x7a,0x79,0x78,0x55,0x62,0x10,0x1d,0x58,0x75,0x40,0xc3,0x06,0x60,0xab,0x75,0x1c,0x2b,0x55,0xa0,0xb0,0x4c,0xbe,0xba,0xbf,0xd0,0x79,0x40,}; +const uint8_t _A_Levelup1_128x64_5[] = {0x01,0x00,0x79,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1f,0xff,0xfb,0xcf,0xc0,0xc9,0xf0,0xf1,0x84,0x1e,0xff,0xfe,0x80,0xff,0x3f,0xb7,0xbf,0xe7,0x3c,0x1c,0xdb,0xff,0xfc,0xff,0xfc,0x1b,0x80,0x02,0x73,0xf5,0xf9,0xf8,0xff,0xff,0x8f,0x9f,0xfc,0x0b,0xde,0xe5,0xdd,0xba,0xf3,0xbe,0x3c,0x78,0x08,0xf5,0xe6,0x3a,0xcd,0x56,0xaa,0xc3,0xf0,0xa7,0xe0,0x3f,0xff,0xe1,0xf2,0x5f,0x20,0x15,0x6a,0xad,0x57,0x07,0xf3,0x87,0xf8,0x3f,0xfe,0x11,0x02,0x4d,0xe0,0x1a,0xbd,0x76,0xaf,0x0d,0xff,0x80,0x7c,0x3f,0xbc,0x70,0x7a,0x4f,0xf0,0x41,0xe1,0xaa,0xfb,0x67,0xf0,0x02,0x70,0x9c,0x4c,0x7c,0x33,0xfe,0x3e,0xa8,0x3e,0x31,0xa8,0x78,0x3c,0x89,0xc9,0xd0,0xff,0xd1,0xea,0xb5,0x7a,0xbc,0x56,0x01,0x00,0xfe,0x03,0xd4,0x2c,0x3a,0xf2,0xf0,0xea,0xa5,0x40,0xf1,0x9c,0x1f,0xdb,0x1f,0x67,0x0f,0x94,0xd6,0x01,0x04,0x80,0x18,0x07,0x7f,0xef,0x07,0x94,0x3f,0x64,0x1f,0x2b,0x50,0x7c,0x46,0x25,0xfd,0xef,0xb7,0x47,0x3f,0x0c,0xa8,0x07,0xc8,0xc2,0x30,0x10,0x78,0xfc,0x08,0x09,0x18,0xd4,0x6a,0x90,0x03,0xaa,0x06,0x8c,0x70,0x60,0x47,0xd2,0xff,0xcc,0xfb,0x01,0xd2,0xef,0xd5,0x20,0x37,0xf0,0x78,0xfe,0xc2,0x05,0xc7,0x83,0xfa,0x35,0x46,0x21,0xdd,0x40,0x30,0x10,0xfc,0x63,0xd4,0x5f,0x03,0xef,0x07,0x8d,0xd7,0xab,0x55,0xae,0xdd,0x6a,0xb8,0x58,0x7e,0xff,0xce,0x1d,0x12,0x10,0xfc,0xe0,0xfa,0xcf,0xd6,0xa8,0x02,0x24,0xe1,0x81,0xb7,0x84,0xdc,0x57,0xf9,0x7c,0x02,0xab,0x75,0x00,0x0d,0x56,0x82,0x10,0x10,0x78,0xc3,0xde,0x25,0x06,0x3b,0x0e,0xeb,0x55,0xea,0xfd,0x1b,0x8a,0xff,0x7f,0xbf,0x2c,0xc7,0xe7,0x0e,0x80,0x75,0x2a,0xb7,0x7a,0xbd,0x76,0x8b,0x05,0x80,0x06,0xc6,0xf8,0xb2,0x1b,0x1a,0x58,0x83,0xec,0x6e,0x41,0x70,0xd5,0x0b,0xc2,0x00,0x10,0xf9,0x08,0x04,0x7a,0x5f,0xf8,0x60,0x7c,0xb7,0xe1,0xf1,0xff,0x87,0xca,0x01,0xfd,0x07,0x96,0x26,0x07,0x40,0xfa,0xb1,0x47,0xbf,0x7f,0xa2,0xb0,0x0b,0xf1,0x7f,0x10,0x8f,0x82,0x0f,0x00,0xd6,0x7b,0xcf,0xe3,0xaf,0x0f,0x96,0x03,0xff,0x39,0xff,0x63,0x7f,0xf1,0xf3,0xf9,0x00,0x4a,0x82,0x01,0x1c,0x07,0x7c,0xc4,0x38,0x71,0x88,0xc0,0x75,0x83,0xf2,0x0f,0x9c,0x02,0x0c,0x21,0x17,0x01,0x41,0xea,0x85,0xf2,0x00,0x12,0x84,0xb0,0x0d,0x11,0xff,0xcf,0xa0,0xba,0xcd,0x50,0x00,0x83,0xe7,0x00,0xe0,0x7c,0x57,0xe3,0x78,0x9c,0x55,0x07,0xe7,0x55,0x8a,0xd0,0x02,0x43,0xe0,0xfe,0x7d,0xff,0xfe,0x9b,0xc0,0x7e,0x60,0x13,0x07,0x01,0x5e,0x2a,0xc3,0xd3,0x43,0x0a,0x04,0x42,0x05,0x8c,0xc1,0xc7,0xfe,0x1a,0xef,0x56,0xa9,0x82,0x30,0x30,0xfa,0x08,0x4a,0x1d,0x40,0xaa,0xb0,0x06,0xbb,0x55,0x82,0xd4,0x2c,0xa4,0x21,0x80,0x7c,0x20,0x76,0x83,0x20,0xeb,0xb5,0x5f,0xb0,0x10,0xc2,0xe0,0x1b,0x00,0xe9,0x2c,0x47,0xb1,0x01,0x0b,0x8f,0x56,0xaf,0x5f,0xaa,0xcd,0x6a,0x9d,0xca,0xa3,0x84,0xf5,0x10,0xed,0xc0,0x70,0x75,0x60,0x21,0xf5,0xe0,0x35,0x6c,0x13,0xbf,0x56,0xfe,0xb5,0x72,0xe0,0xd5,0xc0,0x65,0x7f,0xea,0xd1,0x20,0x14,0x0f,0x84,0xff,0x6e,0x7a,0x10,0xe0,0xfe,0x90,0x27,0x6a,0x1f,0x97,0x82,0x7e,0x19,0x20,0x03,0x8f,0x86,0x01,0xe7,0xbf,0xeb,0x43,0xe6,0x00,0x49,0x50,0x38,0x7f,0x9c,0xff,0xfd,0xbc,0x3d,0x13,0x5a,0xa9,0x38,0x78,0xf9,0xce,0xf0,0x71,0x40,0x05,0x1a,0x2f,0x0f,0x7f,0xff,0xf9,0xd8,0x07,0xe2,0x9b,0x50,0x80,0x33,0x47,0xc7,0x00,0xd5,0x87,0x54,0x0c,0x30,0x61,0xf8,0xdf,0xfe,0xc0,0xf1,0x6e,0xa3,0x85,0x0c,0x03,0x1c,0x10,0x0a,0xc8,0x4b,0xeb,0xab,0xfd,0x37,0x4e,0x77,0xfe,}; +const uint8_t _A_Levelup1_128x64_6[] = {0x01,0x00,0x38,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0x5f,0x78,0x37,0x20,0x3f,0xc0,0x7e,0x4f,0xff,0xde,0x3e,0x38,0xae,0xf9,0xf0,0x5c,0xe8,0x7e,0xf8,0xf3,0x3c,0x45,0x83,0xdc,0x1f,0xb8,0x6e,0x23,0x01,0xfd,0x1f,0xdc,0x0a,0x09,0x01,0xfd,0x03,0xaa,0xff,0x01,0x07,0x8f,0xd0,0x1f,0x5b,0xf8,0x00,0x3c,0x7d,0x00,0xfa,0xaf,0x83,0xcb,0xa0,0x0e,0x9f,0xb8,0x3c,0x60,0x50,0x20,0x7d,0xcb,0xc1,0xe5,0xa0,0xdb,0x83,0xe3,0xc6,0x0f,0x4d,0xff,0xdc,0x3f,0x11,0x70,0x79,0x50,0x23,0xe0,0xe7,0xfe,0x83,0xd7,0x7e,0x2f,0x8f,0xe4,0x2e,0x00,0x80,0x1c,0x06,0xf9,0x1b,0x1f,0xcc,0x5c,0x1c,0x1e,0x38,0xfd,0xf6,0x0f,0xbe,0xb3,0x5b,0xfd,0xf2,0x97,0x08,0xff,0xe1,0xf2,0x1e,0xec,0x38,0xfd,0xff,0x12,0x5c,0x84,0x06,0x99,0x20,0xfa,0xff,0x81,0xed,0xfb,0xfd,0xc9,0x6a,0x10,0x0a,0x84,0x80,0x58,0x9e,0xf3,0x7a,0x55,0x66,0x12,0x0b,0x05,0x40,0x1e,0x5f,0x11,0x0b,0x75,0x66,0x12,0x2b,0x15,0x63,0x7a,0x07,0x1f,0x80,0xf4,0xca,0x05,0xd5,0x88,0x48,0xa8,0x55,0x80,0x40,0xdf,0x3e,0x1f,0x30,0x60,0xff,0xb0,0xfe,0x3f,0xf0,0x3d,0x6e,0xf1,0xef,0xc7,0xec,0x40,0x58,0x7e,0x1f,0xbf,0xab,0x11,0x80,0x50,0x2b,0x81,0xf1,0x87,0xff,0x0c,0x49,0x07,0xc1,0xf5,0x63,0xf0,0x0e,0x05,0x7c,0x7e,0x30,0x70,0x71,0x35,0x0a,0x7f,0x02,0xd2,0xe7,0xff,0xfc,0xf9,0x78,0x7c,0x7c,0x7f,0xf8,0xf8,0x44,0xaf,0xb7,0xeb,0x14,0x92,0x9f,0x00,0xe8,0x49,0xf9,0xb3,0xdf,0x01,0x64,0x40,0x42,0x1e,0x1f,0xe5,0xda,0x89,0x30,0x80,0x58,0x22,0x1f,0x58,0xff,0xe2,0xf7,0xfc,0xf0,0x83,0xca,0x01,0x78,0xc2,0x0f,0xca,0x1f,0xfd,0x87,0xff,0xaf,0xbf,0xc1,0x90,0xff,0xe3,0xb0,0x0f,0x84,0x12,0x20,0x5f,0x18,0x07,0xf5,0x56,0x5f,0xcf,0xfe,0xff,0xbf,0x18,0x07,0x94,0x82,0x00,0x01,0x1f,0xe8,0x30,0x7f,0xbe,0xcf,0xf5,0xef,0xfd,0x38,0x83,0x70,0xa0,0xa0,0xf3,0x80,0xfe,0x38,0x56,0xf0,0x90,0xff,0xff,0x31,0x08,0x7c,0x10,0x3e,0x80,0xf1,0xa1,0x9b,0x87,0xef,0xfd,0xf9,0xc0,0x20,0xf1,0x88,0x30,0xf4,0x48,0x23,0x03,0xbf,0x79,0xe0,0x7f,0xe2,0x18,0xfc,0xf8,0x10,0x3f,0x80,0x3d,0x67,0x90,0x18,0x04,0x73,0xf8,0x10,0x1d,0x9c,0x0e,0xe1,0x05,0xe0,0x40,0x0a,0xa3,0x05,0x41,0x8c,0x00,0x04,0x2f,0x21,0xa5,0xc3,0xb2,0x10,0x4c,0x07,0xe6,0x19,0x00,0x84,0xc0,0x32,0x00,0xf1,0x80,0x78,0x3d,0xf8,0xb8,0x0d,0x80,0x1e,0x30,0x78,0x7c,0x02,0x63,0x00,0xc6,0x29,0x87,0xe0,0xb0,0x18,0x5c,0x3a,0x31,0x04,0x2e,0x08,0x08,0x78,0x38,0x0c,0x1e,0xe2,0x01,0xfe,0xf8,0x83,0xc7,0xe1,0x07,0x06,0x0c,0x1a,0x06,0x12,0x1b,0xfe,0x03,0x01,0x0f,0xf7,0x7f,0xfd,0x91,0x71,0xa0,0x83,0xc7,0xf0,0x3a,0x25,0x98,0xf0,0x21,0x69,0x01,0xe0,0x83,0xd0,0x00,0x80,0xf1,0x88,0xf6,0x3f,0x18,0x79,0x78,0x3e,0x14,0x62,0x6e,0x1b,0xc4,0x7e,0x4e,0x0f,0xaf,0x85,0xc7,0xf1,0x3f,0xa1,0x83,0x14,0x00,0x4a,0x31,0xf0,0x40,0xc1,0xe3,0x87,0x07,0xc7,0x20,0x04,0x30,0xee,0x7c,0xbe,0x06,0xb6,0x10,0x02,0x01,0x87,0xe9,0xc3,0x87,0xfe,0x23,0x77,0xc8,0x2c,0x18,0x7e,0xa0,0xf1,0xfd,0xf9,0xe3,0xf7,0x0b,0xdf,0xf0,0xf6,0x40,0xf5,0xfc,0x5c,0x27,0x93,0xc5,0x70,0xff,0xc0,}; +const uint8_t _A_Levelup1_128x64_7[] = {0x01,0x00,0xd0,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x05,0xfd,0x83,0xfb,0xbe,0x20,0xf0,0xff,0x83,0x72,0x01,0xfe,0x07,0xdf,0xf6,0x3f,0xff,0xf8,0x83,0xf3,0xcf,0x03,0xe7,0x40,0xff,0xc0,0xf9,0xfc,0x46,0x61,0x93,0x00,0xfe,0x41,0xa2,0x1c,0x0e,0xf0,0x3e,0xaf,0xb0,0x19,0x06,0x03,0xba,0x0f,0xad,0xfc,0x02,0x81,0x00,0xed,0x83,0xea,0xbe,0x0f,0x2f,0xa8,0x3e,0xa5,0xf0,0x0c,0x04,0x03,0xd4,0x0f,0xdf,0xc7,0xad,0xb5,0x51,0x70,0x78,0xc1,0xfa,0xdb,0xf0,0x84,0xc5,0xff,0xdc,0x08,0x07,0x60,0x3f,0x50,0xb8,0x0c,0x86,0x81,0xb0,0x0f,0xcf,0xef,0x17,0x7c,0x89,0x50,0x37,0x00,0xfa,0xa5,0xe0,0xa1,0x98,0x20,0x7d,0x78,0x28,0xb1,0xd8,0x2e,0x0a,0xa0,0xe3,0x10,0xfc,0x49,0x63,0xf0,0x9c,0x25,0xc2,0x17,0xfa,0x07,0xc6,0x97,0x3d,0x0a,0x82,0x5f,0xc3,0xf3,0xff,0xd2,0xff,0xa1,0x5c,0x0b,0x81,0x3e,0xb4,0x40,0xf1,0x98,0x78,0x37,0xc1,0xf9,0x07,0x94,0x23,0x81,0xbe,0xff,0x03,0xe2,0x85,0xff,0x85,0x41,0xb0,0x00,0xe1,0xfe,0x83,0x56,0x7e,0x0f,0x1b,0xef,0x36,0x03,0x9c,0x17,0xc5,0xff,0xdd,0x82,0xfd,0x4f,0xe0,0x1a,0x3e,0xf0,0xfe,0x70,0x51,0xc8,0x07,0x03,0x80,0x3e,0x9f,0xfc,0x0a,0x17,0x00,0x90,0x70,0x3f,0xbf,0x70,0x7c,0xc1,0x20,0x11,0x0a,0x01,0x34,0x7d,0xe3,0xe5,0x03,0x88,0x3c,0xa1,0x00,0xf2,0xf1,0x87,0xe6,0x03,0x06,0x90,0x03,0xc7,0xf7,0xe7,0x07,0xbc,0x03,0x0d,0x01,0x07,0x90,0x81,0x7f,0x00,0xf3,0xbc,0x10,0x04,0x1e,0x5f,0x10,0x79,0xfc,0x11,0xe2,0x0f,0x10,0x00,0xc2,0x01,0xe3,0x7f,0x50,0x27,0x82,0x7f,0xdc,0x07,0x9c,0x10,0x18,0x84,0x12,0x07,0x8f,0xf0,0x1e,0x70,0x2f,0xec,0xfd,0x22,0x5e,0x00,0x10,0xf0,0x7f,0x82,0xf4,0x80,0xef,0x63,0xe0,0xf1,0xdf,0x94,0x4a,0x0f,0xf0,0x07,0xa4,0x03,0xfb,0xc7,0xff,0xfd,0xe1,0xe2,0x22,0x8f,0xf2,0x2f,0xf0,0x10,0x79,0xfe,0xc7,0xc5,0x71,0xe0,0x28,0x0c,0x1e,0xfc,0xf0,0x58,0xe0,0x4a,0x87,0xbe,0x07,0x1c,0x03,0xeb,0xff,0xdb,0x8f,0x08,0xc4,0x7b,0xf0,0x7b,0x52,0xc1,0x83,0x0f,0xff,0xfc,0xf3,0x7f,0xfa,0x78,0x3d,0x3d,0x3f,0xfa,0x20,0x3c,0x71,0xea,0x31,0xb2,0xff,0xa6,0x60,0xf4,0xc8,0xc7,0xe8,0x7d,0x01,0xe9,0xe1,0x60,0x30,0xc0,0x7a,0x58,0x7c,0x14,0x0f,0x07,0x84,0xc8,0x50,0x5f,0xf4,0x0c,0x1e,0x98,0x18,0xfc,0x82,0x00,0x6e,0x38,0x28,0x35,0x14,0x05,0x00,0x90,0x7c,0x20,0x7f,0xe4,0x80,0xc2,0xd7,0x64,0x0f,0x58,0x87,0xc1,0x64,0x39,0xff,0xfc,0x20,0x1f,0x31,0x8b,0xf6,0x78,0xe0,0x31,0x70,0x7c,0x5a,0x26,0x1f,0x8c,0x7a,0x40,0x41,0xf3,0xf4,0xf0,0x40,0x70,0x04,0xf1,0x97,0x83,0xe3,0xf5,0xe1,0x83,0x98,0x08,}; +const uint8_t _A_Levelup1_128x64_8[] = {0x01,0x00,0xe6,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x00,0xbf,0xb0,0x7f,0x88,0x3c,0x3f,0xe1,0x0f,0x00,0x5c,0x3f,0xc0,0x1f,0xdf,0x8c,0x7c,0x1f,0x97,0xfb,0xf7,0x83,0xf8,0x21,0x10,0x04,0xe7,0xf0,0x30,0x7f,0x98,0x7e,0xed,0xf0,0x08,0x47,0xb0,0x1e,0x7c,0xf8,0x4c,0xcb,0xe6,0x0f,0x38,0xbc,0x02,0x21,0xd0,0x03,0x9e,0x3f,0x93,0x33,0x07,0xa4,0x2e,0x01,0x20,0xdc,0x07,0xcc,0x1e,0xf0,0x50,0x78,0xd1,0x80,0xe7,0x4f,0x84,0xc9,0xbf,0x20,0x62,0xff,0x40,0xa0,0x14,0x0c,0x0f,0xfb,0xde,0x0f,0x2e,0x4c,0x9c,0x1e,0xdc,0x08,0x07,0xf4,0x1e,0x5c,0xfe,0x44,0x1f,0xf0,0x7e,0x38,0x0f,0xfa,0x81,0x10,0xfe,0xf1,0xc1,0xe7,0xcf,0xfe,0x03,0xca,0xfd,0x01,0x80,0xc8,0x64,0x1f,0xa0,0xf9,0xc2,0x79,0xc0,0xf2,0xbf,0xff,0x30,0x17,0xc8,0x95,0x00,0x1e,0x60,0x06,0xdf,0x50,0x30,0x51,0x4a,0x0c,0x11,0x3d,0x3b,0xe9,0x04,0x7e,0x13,0x42,0xfe,0x0e,0x4c,0x00,0xb5,0xfd,0x04,0xce,0x15,0x04,0x83,0x24,0x07,0x9f,0x83,0xce,0x48,0x29,0xff,0x20,0x78,0xd7,0xb4,0x16,0x38,0x94,0x12,0x03,0xf4,0x07,0x8f,0xcf,0x39,0x3c,0x07,0x98,0x7c,0x6e,0x71,0x44,0x00,0xfa,0x01,0xe5,0xc9,0x07,0xb7,0xfe,0x29,0x20,0x07,0x9e,0x0f,0x92,0x2f,0x40,0x79,0xc6,0x30,0x1e,0xb0,0xfa,0x5b,0xda,0xe4,0x0f,0x38,0x3d,0x83,0xd8,0x0f,0x2f,0x18,0x3d,0x64,0x1f,0xfe,0x94,0x02,0x30,0x3f,0x30,0x78,0x9b,0xd2,0x81,0xfe,0x9d,0xc0,0x20,0x80,0xf1,0x87,0xe0,0xbe,0xf2,0x0a,0x40,0xfc,0xf0,0x11,0xc8,0x64,0x02,0x04,0x6f,0x14,0x7c,0x40,0x20,0xb0,0x88,0x01,0xfc,0x81,0xf3,0x02,0x80,0x1f,0xc7,0xf4,0x0f,0xc9,0x80,0x3f,0x30,0x10,0x02,0x00,0xff,0x41,0xf5,0x00,0xc1,0xc0,0xf0,0x1f,0xe0,0x7d,0xdf,0x20,0x14,0x00,0x41,0x43,0xc1,0x03,0x80,0x07,0xa8,0x00,0x54,0x62,0x00,0x1f,0x98,0x08,0x6f,0xe0,0xf7,0xe8,0x02,0x0a,0x1a,0x1f,0x21,0xb1,0x03,0xd3,0xb0,0x0f,0x28,0x30,0x1c,0x8a,0xc4,0x0f,0x4e,0xa0,0x3f,0x85,0xe7,0x06,0xce,0x62,0x01,0xe7,0x4f,0x07,0xc6,0x8b,0x09,0x01,0x07,0x8e,0xfe,0x5e,0x5f,0x70,0x78,0xe0,0xa0,0x61,0xf2,0x07,0xa5,0x80,0x1e,0x98,0x18,0x38,0x3c,0xa2,0xe0,0xf4,0xef,0xef,0xc3,0xee,0x0f,0x4d,0x01,0xe0,0x7f,0xc3,0xf5,0xff,0xc2,0xc1,0xed,0xfc,0x2f,0xaf,0x7e,0x0a,0x0f,0x39,0x00,0x60,0x8f,0xe9,0xf7,0xf8,0xbf,0x44,0x00,0x54,0x0f,0xd0,0x40,0x51,0xeb,0x78,0x80,0x83,0xd3,0xe8,0x1f,0x18,0x72,0xfd,0x33,0xe0,0xe3,0x07,0x8f,0x20,0x1e,0x23,0x22,0x6f,0x95,0x9c,0x1e,0xb3,0x0f,0xff,0xe3,0xf6,0x0c,0x13,0xa0,0xff,0xe3,0x34,0x00,0x7a,0x70,0x20,0x1f,0x78,0x38,0x18,0x78,0x1f,0xf8,0x0c,0x18,0x1e,0xb0,0x0f,0xff,0xa1,0x44,0x40,0x01,0xff,0x40,0x41,0xed,0x00,0xf4,0x7f,0x7b,0xe0,0xf2,0x2e,0x88,0x3e,0x3c,0x61,0xf3,}; +const uint8_t _A_Levelup1_128x64_9[] = {0x01,0x00,0xd6,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x01,0x3d,0xe0,0xff,0x06,0xe4,0x0f,0xf0,0x0f,0xab,0xf8,0x04,0x7f,0x9c,0x7c,0x18,0x7a,0xf3,0xf0,0xf9,0xc0,0x7f,0x2c,0xff,0x0e,0x07,0xb8,0x1f,0x71,0xb8,0x04,0x0f,0xda,0x09,0x3e,0x7c,0x26,0x65,0xf3,0x07,0x9c,0x16,0x01,0x0c,0xfd,0x03,0xcf,0x1f,0xc9,0x99,0x83,0xd2,0x05,0x00,0x88,0x71,0x0e,0x26,0x0f,0x59,0x7d,0xea,0x03,0x00,0x90,0x6f,0x81,0xe7,0x4f,0x84,0xc9,0xbf,0x21,0xf2,0xdf,0xc0,0x20,0x14,0x0a,0x08,0x3d,0x39,0x32,0x70,0x7b,0x60,0x30,0x1f,0xee,0x39,0x3c,0xb9,0x10,0x7f,0xc0,0x3c,0xab,0xf0,0x09,0xfd,0x03,0x21,0xfe,0x80,0x83,0xcf,0x9f,0xfc,0x2b,0x15,0x7f,0x81,0xc0,0x90,0x48,0x3f,0xa1,0xf3,0x84,0xf3,0x81,0xe5,0x7f,0x97,0xc8,0x23,0xd1,0x10,0x78,0xa8,0x66,0x5f,0x90,0xb0,0xc2,0xa4,0x3c,0x20,0x7d,0x54,0x33,0xf0,0x68,0x14,0xe8,0x1f,0x31,0x7e,0x46,0xce,0x09,0x02,0xe3,0x7f,0x87,0xc3,0x83,0xce,0x48,0x29,0xff,0x20,0x79,0x7a,0x2c,0x70,0x5c,0x14,0x07,0xfa,0x0f,0x1f,0x9e,0x72,0x78,0x0f,0x5b,0x9c,0x16,0x81,0x00,0x60,0x88,0x3c,0x79,0x20,0xf6,0xbf,0xc1,0x66,0x00,0xf3,0xc1,0xf2,0x45,0xec,0x0f,0x18,0x67,0x03,0xf6,0x1f,0x4b,0x78,0x18,0x7f,0xf0,0xbe,0x47,0xfe,0x09,0x03,0xf8,0x03,0xcf,0xc6,0x0f,0x5e,0x87,0xff,0x85,0x00,0xfc,0x5f,0x41,0xe8,0x6f,0x38,0x5e,0x42,0x1f,0x3f,0x80,0x7f,0x27,0xdf,0xe8,0x7e,0x0b,0xef,0x20,0xa4,0x0f,0xca,0x17,0x20,0x81,0x41,0x20,0x17,0xfb,0xfa,0x3e,0x21,0x7c,0x08,0x0b,0xc0,0x77,0xe0,0xe8,0x07,0x8c,0x00,0x1e,0x3e,0x0e,0xf8,0x3a,0x3e,0xe0,0xf3,0xfc,0x2f,0xa4,0x1e,0x49,0xd1,0xe7,0x40,0xd7,0xe2,0x00,0x6f,0x18,0x3c,0x70,0x1c,0x18,0x1f,0xfd,0x7e,0x21,0xf9,0x80,0x7f,0xa0,0x28,0xf2,0xff,0xc3,0xc1,0x03,0x80,0x07,0xa8,0x40,0x61,0xeb,0xf1,0xff,0xfc,0xc0,0x42,0x75,0x30,0x79,0x80,0x04,0x1e,0x50,0xd0,0xf9,0x11,0x88,0x1e,0xa2,0xf2,0x83,0x01,0x88,0x8c,0x40,0xf4,0xe0,0x7f,0x01,0xfb,0x30,0x1c,0x14,0x1b,0x39,0x88,0x07,0xc7,0x38,0x1e,0x7a,0x2c,0x24,0x04,0x1e,0xdc,0x01,0xf1,0x03,0xcb,0x05,0x03,0x07,0xb7,0xf0,0x1e,0xb8,0x18,0x38,0x3c,0xa0,0xa0,0xf2,0xfc,0x07,0xe8,0x1e,0x7e,0x0f,0xa8,0xfe,0x41,0xe7,0x00,0xfa,0x17,0xe6,0x04,0x0f,0x3f,0x60,0x3c,0xcf,0xea,0x0f,0xeb,0xfc,0x04,0x1e,0x7d,0x80,0x79,0x43,0x97,0xe8,0x0f,0x91,0x59,0x37,0xcb,0x7e,0xce,0x4d,0x40,0x3c,0x8e,0x65,0xbf,0x07,0x9d,0x00,0x1e,0xd0,0x75,0x39,0x01,0x46,0xbe,0x0f,0x4a,0x40,0x3c,0x80,0x0b,0x2f,0x80,0x48,0x01,0xe5,0x88,0x24,0x08,0x01,0xa2,0xe0,0xf4,0x84,0x13,0x08,0x00,0x80,}; +const uint8_t _A_Levelup1_128x64_10[] = {0x01,0x00,0xde,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x09,0xef,0x06,0xe4,0x0f,0xf0,0x0f,0xcb,0xff,0xf3,0x8f,0xc7,0x07,0xde,0x7e,0x1f,0x38,0x0f,0xe5,0x9f,0xe1,0xc0,0xf7,0x03,0xee,0x37,0x00,0x81,0xff,0x4a,0x27,0xcf,0x84,0xcc,0xbe,0x63,0xd2,0xff,0xc1,0x60,0x10,0xcf,0xd0,0x5c,0xf1,0xfc,0x99,0x98,0x3d,0x20,0x50,0x08,0x87,0x10,0x3e,0x60,0xf5,0x9f,0xdf,0xa0,0x30,0x09,0x06,0xf8,0x1e,0x74,0xf8,0x4c,0x9b,0xf2,0x1f,0x2d,0xfc,0x02,0x01,0x40,0xa0,0xff,0xce,0x25,0x4f,0xe4,0xc9,0xc1,0xed,0x80,0xc0,0x7f,0xb5,0x64,0xf2,0xe4,0x41,0xff,0x04,0x62,0xaf,0xc0,0x27,0xf4,0x0c,0x85,0xfa,0x22,0x62,0x10,0x78,0xf3,0xff,0x80,0xf3,0xe0,0x70,0x24,0x12,0x0f,0xe8,0x7c,0xe1,0x3c,0xe0,0x79,0xcb,0xe4,0x11,0xe8,0x88,0x3c,0x56,0x33,0x2f,0xc8,0x58,0x61,0x52,0x1e,0x12,0xc6,0x3f,0xd2,0xfa,0x86,0x7e,0x0d,0x02,0x9d,0x2b,0xa6,0x2f,0xc8,0xd9,0xc1,0x20,0x5c,0x66,0x08,0xf3,0xf0,0x79,0xc9,0x05,0x3f,0xe4,0x1f,0x18,0xbf,0xa2,0xc7,0x05,0xc1,0x40,0x4b,0xc5,0xf3,0xce,0x4f,0x01,0xeb,0x73,0x82,0xd0,0x20,0x0c,0x11,0x07,0x8f,0x24,0x1e,0xd7,0xf8,0x2c,0xc0,0x1e,0x78,0x3e,0x48,0xbc,0xab,0xff,0x40,0x79,0xc3,0x38,0x1f,0xb0,0xfa,0x5b,0xc0,0xc3,0xfe,0x85,0xf2,0x3f,0xf0,0x48,0x1f,0xc0,0x1e,0x7e,0x30,0x7a,0xf4,0x3f,0xfc,0x28,0x07,0xe0,0x9e,0x60,0xf1,0x37,0x9c,0x2f,0x21,0x0f,0x9f,0xc0,0x3f,0x9f,0xef,0xfc,0x3f,0x05,0xf7,0x90,0x52,0x09,0xe5,0x0b,0x90,0x40,0xa0,0x90,0x0b,0xfa,0x3e,0x61,0x7c,0x08,0x0b,0xc0,0x77,0xe0,0xfa,0x80,0x03,0xc7,0xc1,0xdf,0x07,0xef,0xe1,0x9d,0x00,0xf3,0x4e,0x8f,0x3a,0x06,0x4f,0x10,0x03,0x7d,0xc1,0xe3,0x80,0xe0,0xc0,0xff,0xe6,0xf1,0x0f,0xcc,0x03,0xfd,0x01,0x47,0x91,0xc0,0x41,0x03,0x80,0x07,0xa8,0x40,0x61,0xeb,0xf1,0xff,0xfc,0xc0,0x42,0x76,0x30,0x79,0x80,0x04,0x1e,0x50,0xd0,0xf9,0x11,0x88,0x1e,0xa2,0xf2,0x83,0x01,0x88,0x8c,0x40,0xf4,0xe0,0x7f,0x01,0xfb,0x30,0x1c,0x94,0x1b,0x39,0x88,0x07,0xc7,0x38,0x1e,0x7a,0x2c,0x24,0x04,0x1e,0xdc,0x0f,0xdc,0xfc,0x92,0x20,0xf1,0xc1,0x40,0xc1,0xed,0xfc,0xfd,0x87,0xd3,0x03,0x07,0x07,0x94,0x14,0x1e,0x5f,0x80,0x7a,0x87,0xd0,0x1e,0x7e,0x0f,0xaa,0x20,0x87,0xec,0x0f,0x38,0x07,0xd0,0x1e,0x65,0xf5,0x81,0x03,0xcf,0xd8,0x0f,0x33,0xfa,0x83,0xfa,0xff,0x01,0x07,0x9f,0x60,0x1e,0x50,0xe5,0xfa,0x03,0xe4,0x56,0x46,0x52,0xdf,0xb3,0x93,0x50,0x0f,0x26,0x91,0x6f,0xc1,0xe7,0x40,0x07,0xb4,0x1d,0x4e,0x40,0x51,0xaf,0x83,0xd2,0x90,0x0f,0x20,0x02,0xcb,0xe0,0x12,0x00,0x79,0x62,0x09,0x02,0x00,0x68,0xb8,0x3d,0x21,0x04,0xc2,0x00,0x20,}; +const uint8_t *_A_Levelup1_128x64[] = {_A_Levelup1_128x64_0,_A_Levelup1_128x64_1,_A_Levelup1_128x64_2,_A_Levelup1_128x64_3,_A_Levelup1_128x64_4,_A_Levelup1_128x64_5,_A_Levelup1_128x64_6,_A_Levelup1_128x64_7,_A_Levelup1_128x64_8,_A_Levelup1_128x64_9,_A_Levelup1_128x64_10}; -const uint8_t _I_card_bad2_0[] = {0x01,0x00,0x12,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfe,0x01,0x82,0x04,0x0c,0x4a,0x01,0x70,0x8f,0x01,0x46,0x08,0x0f,0x5e,0x30,0x24,0x60,0x50,0x0c,0x44,0x88,0x1f,0x1a,0xaa,0x64,0xeb,0xaf,0x71,0x84,0x48,0xb1,0x93,0xb8,0x39,0x3d,0x72,0x55,0x2a,0x50,0x04,0x6e,0x12,0x2a,0x96,0x28,0x3e,0x20,0xf4,0xc1,0x03,0xcf,0x01,0x22,0xa1,0x03,0xf0,0x7e,0x21,0xf9,0xc6,0x52,0xea,0x57,0x22,0xf8,0xe3,0x21,0x63,0xf6,0x00,0x1d,0x01,0x3f,0xd3,0x05,0x7f,0x83,0xfc,0x1f,0xe0,0xf5,0xcf,0xfc,0xee,0x77,0xe0,0x5b,0x7e,0x28,0x10,0x18,0x25,0x02,0x7f,0xf9,0x93,0x87,0xde,0x11,0x00,0x07,0x8e,0x82,0xff,0xfc,0xc7,0x83,0xe2,0xb9,0x19,0x83,0xf4,0x01,0xf5,0x78,0xa9,0x69,0x60,0x9f,0x01,0x7d,0xd4,0xb7,0xa0,0xf1,0x27,0xd0,0x3c,0x70,0xa0,0xf1,0x37,0xd0,0xfc,0xc1,0xf6,0x00,0x30,0x7f,0xf0,0x01,0xff,0xff,0x81,0xfc,0x01,0xfb,0xf8,0xe0,0x83,0xf2,0xff,0x4c,0xc3,0x03,0xd8,0x74,0x70,0x15,0xf8,0xe1,0xa1,0x00,0xf6,0x98,0x00,0xca,0x05,0xa0,0x9f,0xc5,0xa1,0x20,0xf6,0x8c,0x00,0xca,0x09,0xd0,0xbb,0xcf,0xb3,0x17,0xb0,0x7d,0x7c,0x3e,0xf3,0xff,0xc0,0x3d,0xee,0x12,0x28,0x10,0x3c,0x7d,0xee,0x01,0xbe,0x83,0xdb,0x11,0x12,0x83,0x2f,0xec,0x1e,0x30,0xa8,0x70,0x3f,0x60,0xd1,0xe0,0xff,0x83,0xf4,0x7f,0xc5,0xf4,0x07,0xd1,0xfd,0x01,0xfe,0x0f,0x99,0xc2,0xfc,0xc1,0xf4,0x0a,0x38,0x0f,0x80,0x08,0x53,0xf0,0x7a,0x82,0x8c,0x12,0xa0,0x0f,0x00,0x78,0x03,0xc0,0x14,}; -const uint8_t *_I_card_bad2[] = {_I_card_bad2_0}; - -const uint8_t _I_card_ok1_0[] = {0x01,0x00,0x19,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x0e,0x54,0xec,0x0e,0x00,0x08,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x03,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x03,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x07,0xcc,0x1f,0xf8,0x0f,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x09,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x09,0x4e,0xf4,0x1e,0x38,0x09,0x15,0x08,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x07,0xa4,0xc3,0x9d,0x18,0xc3,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xea,0x00,0x90,0x78,0x9f,0x84,0x1f,0x7c,0x00,0x7f,0xf7,0xfe,0xe0,0xfe,0x1f,0xef,0x00,0xfe,0x80,0xa5,0x75,0x14,0x06,0x80,0x0f,0x99,0x80,0x0c,0xa0,0x4b,0xf5,0x00,0x24,0x61,0xaa,0x7d,0x06,0xfb,0x83,0xdb,0xe0,0xff,0x70,0x79,0x34,0x06,0x04,0x0f,0x28,0x3f,0xf0,0x1e,0xf8,0x88,0x94,0x18,0x1e,0x40,0x01,0x07,0xc4,0x2a,0x1c,0x0f,0xd8,0x34,0x78,0x3f,0xe0,0xfd,0x1f,0xf1,0x7d,0x41,0xf2,0x7f,0x50,0x7f,0x83,0xe2,0x70,0xbf,0x30,0x7d,0x02,0x8e,0x03,0xe0,0x02,0x14,0xfc,0x1e,0xa0,0xa3,0x04,0xa8,0x03,0xc0,0x1e,0x00,0xf0,0x05,0x00,}; -const uint8_t *_I_card_ok1[] = {_I_card_ok1_0}; - -const uint8_t _I_card_ok2_0[] = {0x01,0x00,0x1e,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x0e,0x54,0xec,0x0e,0x00,0x08,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x03,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x03,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x07,0xcc,0x1f,0xf8,0x0f,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x09,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x09,0x4e,0xf4,0x1e,0x38,0x09,0x15,0x08,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x07,0xa4,0xc3,0x9d,0x18,0xc3,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xea,0x00,0x90,0x78,0x9f,0x84,0x1f,0x7c,0x0e,0xff,0x8c,0x1f,0xd8,0x70,0x7f,0x63,0xc1,0xfb,0xbf,0xcf,0x9f,0xc8,0x14,0xae,0xa2,0x80,0xd0,0x11,0xe8,0x00,0x49,0x80,0x0c,0xa0,0x4b,0xf5,0x00,0x24,0x61,0xaa,0x7d,0x06,0xfb,0x83,0xdb,0xe0,0xff,0x70,0x79,0x34,0x06,0x04,0x0f,0x28,0x3f,0xf0,0x1e,0xf8,0x88,0x94,0x18,0x1e,0x40,0x01,0x07,0xc4,0x2a,0x1c,0x0f,0xd8,0x34,0x78,0x3f,0xe0,0xfd,0x1f,0xf1,0x7d,0x41,0xf2,0x7f,0x50,0x7f,0x83,0xe2,0x70,0xbf,0x30,0x7d,0x02,0x8e,0x03,0xe0,0x02,0x14,0xfc,0x1e,0xa0,0xa3,0x04,0xa8,0x03,0xc0,0x1e,0x00,0xf0,0x05,0x00,}; -const uint8_t *_I_card_ok2[] = {_I_card_ok2_0}; - -const uint8_t _I_card_ok3_0[] = {0x01,0x00,0x22,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x0e,0x54,0xec,0x0e,0x00,0x08,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x03,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x03,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x07,0xcc,0x1f,0xf8,0x0f,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x09,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x09,0x4e,0xf4,0x1e,0x38,0x09,0x15,0x08,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x07,0xa4,0xc3,0x9d,0x18,0xc3,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xe5,0x7d,0x3f,0xd8,0x3c,0x7e,0x77,0xc0,0x7d,0xf0,0x3b,0xf6,0x30,0x7f,0x41,0xef,0xc0,0xfd,0x87,0x93,0xc8,0x1f,0x5b,0xfc,0xf9,0xfc,0x81,0x4a,0xea,0x28,0x0d,0x01,0x1e,0x80,0x04,0x98,0x00,0xca,0x04,0xbf,0x50,0x02,0x46,0x1a,0xa7,0xd0,0x6f,0xb8,0x3d,0xbe,0x0f,0xf7,0x07,0x93,0x40,0x60,0x40,0xf2,0x83,0xff,0x01,0xef,0x88,0x89,0x41,0x81,0xe4,0x00,0x10,0x7c,0x42,0xa1,0xc0,0xfd,0x83,0x47,0x83,0xfe,0x0f,0xd1,0xff,0x17,0xd4,0x1f,0x27,0xf5,0x07,0xf8,0x3e,0x27,0x0b,0xf3,0x07,0xd0,0x28,0xe0,0x3e,0x00,0x21,0x4f,0xc1,0xea,0x0a,0x30,0x4a,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x50,}; -const uint8_t *_I_card_ok3[] = {_I_card_ok3_0}; - -const uint8_t _I_card_ok4_0[] = {0x01,0x00,0x26,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x0e,0x54,0xec,0x0e,0x00,0x08,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x03,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x03,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x07,0xcc,0x1f,0xf8,0x0f,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x09,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x09,0x4e,0xf4,0x1e,0x38,0x09,0x15,0x08,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x07,0x8d,0xcc,0x1e,0x33,0x0e,0x74,0x63,0x0f,0x49,0x2f,0x8e,0x32,0x17,0x07,0x07,0x95,0xc4,0xff,0x60,0xf1,0xf9,0xde,0x01,0xf7,0xc0,0xef,0xd8,0xef,0x80,0xfd,0x83,0xdf,0x81,0xfb,0x0f,0x2f,0x90,0x3e,0xb7,0xf9,0xf3,0xf9,0x02,0x95,0xd4,0x50,0x1a,0x02,0x3d,0x00,0x09,0x30,0x01,0x94,0x09,0x7e,0xa0,0x04,0x8c,0x35,0x4f,0xa0,0xdf,0x70,0x7b,0x7c,0x1f,0xee,0x0f,0x26,0x80,0xc0,0x81,0xe5,0x07,0xfe,0x03,0xdf,0x11,0x12,0x83,0x03,0xc8,0x00,0x20,0xf8,0x85,0x43,0x81,0xfb,0x06,0x8f,0x07,0xfc,0x1f,0xa3,0xfe,0x2f,0xa8,0x3e,0x4f,0xea,0x0f,0xf0,0x7c,0x4e,0x17,0xe6,0x0f,0xa0,0x51,0xc0,0x7c,0x00,0x42,0x9f,0x83,0xd4,0x14,0x60,0x95,0x00,0x78,0x03,0xc0,0x1e,0x00,0xa0,}; -const uint8_t *_I_card_ok4[] = {_I_card_ok4_0}; - -const uint8_t _I_no_databases1_0[] = {0x01,0x00,0x43,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xff,0x11,0x00,0x88,0x00,0x04,0x16,0x34,0x00,0x10,0xc1,0x01,0xf7,0x20,0x07,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x07,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x04,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x01,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x07,0x9c,0x4a,0x0b,0x22,0x07,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x07,0xf8,0x3f,0xc1,0xf9,0x07,0x07,0xbd,0xc2,0x3c,0xaf,0x2a,0x07,0xff,0xf3,0xfc,0x07,0xb6,0x22,0x44,0x0f,0x2d,0x07,0xff,0x1d,0xfb,0x07,0xa6,0x02,0x73,0x08,0x91,0x63,0x27,0x70,0x7e,0x85,0xff,0xf7,0xf7,0x07,0xa5,0x02,0x95,0x70,0x91,0x54,0xb1,0x50,0x4f,0x86,0xff,0xfb,0xef,0x07,0xb6,0x02,0x45,0x42,0x07,0x9f,0xfc,0x1e,0xe3,0xf1,0x0f,0x9f,0x7e,0x3f,0xdf,0x1f,0xad,0x24,0xbe,0x38,0xc8,0x5c,0x1c,0x1e,0x3e,0xfe,0xf1,0xfe,0xc1,0xe3,0xff,0x07,0xe7,0x00,0x5a,0x22,0xf5,0x07,0xc6,0xfc,0x1f,0xa5,0xf7,0x07,0xc6,0xfc,0x1e,0xff,0xe6,0xd1,0x40,0x68,0x17,0xff,0xff,0x9c,0x1e,0xb8,0x08,0x08,0x10,0xa0,0x4b,0xf1,0xff,0x70,0xc1,0xeb,0xc0,0x02,0x1c,0x13,0xa0,0xdf,0x1c,0x00,0x3e,0xfe,0x0f,0xf1,0x83,0x83,0xda,0x11,0x02,0x80,0x42,0x01,0xe5,0xff,0x87,0xdf,0x81,0xeb,0x18,0x81,0xc0,0x23,0x00,0xf3,0x8f,0xdf,0x01,0xeb,0xa8,0x99,0x59,0xe7,0x00,0xf3,0x9f,0xde,0x01,0xeb,0x48,0xa5,0x64,0x6f,0x00,0xf3,0xbf,0x83,0xda,0x11,0x4a,0xf8,0x87,0xd3,0xfe,0x0f,0x88,0x88,0xfd,0x04,0x02,0x0f,0x69,0x95,0x84,0xbe,0x80,0xf7,0x3f,0xb0,0x3f,0xc1,0xf0,0xbf,0x40,0x7c,0xe0,0x01,0x24,0xdf,0x1f,0x00,0x10,0xa7,0xee,0xf5,0x07,0x98,0x25,0x40,0x1e,0x00,0xf0,0x07,0x80,0x28,}; -const uint8_t *_I_no_databases1[] = {_I_no_databases1_0}; - -const uint8_t _I_no_databases2_0[] = {0x01,0x00,0x45,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xff,0x11,0x00,0x88,0x00,0x04,0x16,0x34,0x00,0x10,0xc1,0x01,0xf7,0x20,0x07,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x07,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x04,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x01,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x07,0x9c,0x4a,0x0b,0x22,0x07,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x07,0xf8,0x3f,0xc1,0xf9,0x1f,0xfe,0x03,0xda,0xe1,0x1e,0x57,0x95,0x03,0xff,0xe7,0xf9,0x83,0xdb,0x11,0x22,0x07,0x96,0x83,0xff,0x3b,0xf7,0x03,0xd3,0x01,0x39,0x84,0x48,0xb1,0x93,0xb8,0x3f,0x43,0xff,0xed,0xef,0x83,0xd2,0x81,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc3,0xff,0xf6,0xdf,0x83,0xdb,0x01,0x22,0xa1,0x03,0xcf,0xfc,0x0f,0x71,0xf8,0x87,0xce,0xff,0x1f,0xbf,0x8f,0xd6,0x92,0x5f,0x1c,0x64,0x2e,0x0e,0x0f,0x1f,0x7d,0xf8,0xff,0x60,0xf1,0xff,0x83,0xf3,0x80,0x2d,0x11,0x7a,0x83,0xe0,0x9c,0x20,0xfc,0x2f,0xb8,0x3e,0x37,0xc0,0xf7,0xff,0x36,0x8a,0x02,0xbf,0x1f,0xee,0x7c,0x1e,0xb8,0x08,0x08,0x10,0xa0,0x4b,0xf1,0xfd,0xc3,0xc1,0xeb,0xc0,0x02,0x1c,0x11,0x7e,0x3e,0x78,0x1d,0xf8,0x1f,0x4a,0xf1,0x8f,0xc7,0x2f,0x80,0xf5,0x84,0x40,0xa0,0x10,0x80,0x79,0x7f,0xe7,0xf7,0x80,0x7a,0xc6,0x20,0x70,0x08,0xc0,0x3c,0xef,0xf7,0x00,0x7a,0xea,0x26,0x56,0x79,0xc0,0x3c,0xff,0xf6,0x00,0x7a,0xd2,0x29,0x59,0x1b,0xc0,0x3d,0x2c,0x23,0xf6,0xa5,0x7c,0x43,0xeb,0x63,0x07,0xbc,0x44,0x7e,0x84,0x01,0x07,0xb4,0xca,0xc2,0x5f,0x40,0x7b,0x9f,0xd8,0x1f,0xe0,0xf8,0x5f,0xa0,0x3e,0x70,0x00,0x92,0x6f,0x8f,0x80,0x08,0x53,0xf7,0x7a,0x83,0xcc,0x12,0xa0,0x0f,0x00,0x78,0x03,0xc0,0x14,}; -const uint8_t *_I_no_databases2[] = {_I_no_databases2_0}; - -const uint8_t _I_no_databases3_0[] = {0x01,0x00,0x43,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xff,0x11,0x00,0x88,0x00,0x04,0x16,0x34,0x00,0x10,0xc1,0x01,0xf7,0x20,0x07,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x07,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x04,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x01,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x07,0x9c,0x4a,0x0b,0x22,0x07,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x07,0xf8,0x3f,0xc1,0xfe,0x0a,0x5b,0x84,0x79,0x5e,0x54,0x00,0x7c,0xe2,0x24,0x40,0xf2,0xd0,0x7f,0xe3,0xff,0xc0,0x7a,0x60,0x27,0x30,0x89,0x16,0x32,0x77,0x07,0xe8,0x7f,0xfc,0xff,0x30,0x7a,0x50,0x29,0x57,0x09,0x15,0x4b,0x15,0x04,0xf8,0x7f,0xe7,0x7e,0xe0,0x7b,0x60,0x24,0x54,0x20,0x79,0xfb,0x7b,0xe0,0xf6,0x1f,0x88,0x7d,0x22,0xdb,0xf1,0xfa,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xe3,0xee,0xdf,0x1f,0xef,0xe1,0x7f,0xff,0xdf,0x81,0xf7,0xc0,0xbf,0x80,0x08,0x1f,0x83,0xe1,0x07,0xea,0x78,0x43,0xfe,0x0f,0x6f,0xf2,0xe8,0xa0,0x2b,0xf1,0xff,0x1b,0xd4,0xe0,0x30,0x10,0x21,0x40,0x97,0xe2,0x0f,0x7e,0x00,0x10,0xe0,0x8b,0xf1,0xfe,0xe7,0xc1,0xf6,0x8f,0x1f,0xdc,0x3c,0x1e,0xd0,0x88,0x14,0x02,0x10,0x0f,0x2f,0x3c,0x0e,0xfc,0x0f,0x58,0xc4,0x0e,0x01,0x18,0x07,0x94,0x7e,0x39,0x7c,0x07,0xae,0xa2,0x65,0x67,0x9c,0x03,0xcb,0xff,0x3f,0xbc,0x03,0xd6,0x91,0x4a,0xc8,0xde,0x01,0xe7,0x7f,0xb8,0x0f,0xda,0x95,0xf1,0x0f,0xa7,0xfe,0xc0,0x0f,0x78,0x88,0xfc,0xc0,0x03,0x61,0x07,0xb4,0xca,0xc2,0x5f,0x30,0x00,0xd8,0xcf,0xf8,0x40,0x20,0x7f,0x83,0xd5,0x7e,0x80,0xf9,0xc0,0x02,0x49,0xbe,0x3e,0x00,0x21,0x4f,0xdd,0xea,0x0f,0x30,0x4a,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x50,}; -const uint8_t *_I_no_databases3[] = {_I_no_databases3_0}; - -const uint8_t _I_no_databases4_0[] = {0x01,0x00,0x43,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xff,0x11,0x00,0x88,0x00,0x04,0x16,0x34,0x00,0x10,0xc1,0x01,0xf7,0x20,0x07,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x07,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x04,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x01,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x07,0x9c,0x4a,0x0b,0x22,0x07,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x07,0xf8,0x3f,0xc1,0xfe,0x0a,0x5b,0x84,0x79,0x5e,0x54,0x00,0x7c,0xe2,0x24,0x40,0xf2,0xd0,0x7f,0xe0,0xe0,0xf5,0xc0,0x4e,0x61,0x12,0x2c,0x64,0xee,0x0f,0xd0,0xff,0xfe,0x7f,0x80,0xf4,0xa0,0x52,0xae,0x12,0x2a,0x96,0x2a,0x09,0xf0,0xff,0xe3,0xbf,0x60,0xf6,0xc0,0x48,0xa8,0x40,0xf2,0xbf,0xfe,0xfe,0xe0,0xf6,0x1f,0x88,0x7c,0xf7,0xf1,0xdf,0x78,0xfd,0x69,0x25,0xf1,0xc6,0x42,0xe0,0xe0,0xf1,0xf7,0xfb,0x8f,0xf7,0xf0,0xef,0xff,0xfb,0xc0,0xfb,0xe0,0x77,0xef,0xe0,0x11,0x07,0xe6,0xfc,0x1f,0xdf,0xf0,0xff,0x83,0xdf,0xfc,0xba,0x28,0x0d,0x03,0x7f,0xff,0x37,0xa9,0xc0,0x60,0x20,0x42,0x81,0x68,0x01,0xf1,0xc0,0x02,0x1c,0x13,0xa1,0x7f,0xff,0xf9,0xc1,0xf6,0xbf,0x1f,0xf7,0x0c,0x1e,0xd0,0x88,0x14,0x02,0x10,0x0f,0x2f,0xce,0x00,0x1e,0xd1,0x88,0x1c,0x02,0x30,0x0f,0x28,0x3c,0x1c,0x1e,0xda,0x89,0x95,0x9e,0x70,0x0f,0x2f,0xfc,0x3e,0xfc,0x0f,0x5a,0x45,0x2b,0x23,0x78,0x07,0x9c,0x7e,0xf8,0x3f,0x6a,0x57,0xc4,0x3e,0x93,0xfb,0xc0,0x3d,0xe2,0x23,0xf3,0xff,0xdf,0xc1,0xef,0x32,0xb0,0x97,0xcc,0x00,0x20,0xf6,0x3f,0xb0,0x80,0x81,0xfe,0x0f,0x55,0xfa,0x03,0xe7,0x00,0x09,0x26,0xf8,0xf8,0x00,0x85,0x3f,0x77,0xa8,0x3c,0xc1,0x2a,0x00,0xf0,0x07,0x80,0x3c,0x01,0x40,}; -const uint8_t *_I_no_databases4[] = {_I_no_databases4_0}; - -const uint8_t _I_no_sd1_0[] = {0x01,0x00,0x49,0x01,0x00,0x5e,0x03,0xff,0x07,0x07,0xe5,0xc2,0x01,0x38,0x07,0xe4,0x32,0x01,0xc0,0x07,0xe4,0x0c,0x04,0x5c,0x0f,0xf8,0x00,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x00,0xf2,0x22,0xb5,0x00,0x06,0x50,0x8b,0x06,0x4a,0x49,0x49,0x83,0x03,0xd6,0x40,0x03,0x28,0x80,0x3e,0xa2,0x01,0x33,0x07,0xd4,0x20,0x1f,0xe4,0x33,0x07,0xd4,0x10,0x1e,0x65,0xfa,0x07,0x9e,0x00,0x1f,0x50,0x20,0x7f,0x81,0x0c,0x1f,0xe0,0xfa,0x80,0x80,0x86,0x1e,0x0f,0xde,0x04,0xf0,0x1f,0xb6,0x0b,0xc0,0x3f,0xc1,0xfb,0x70,0xfc,0x40,0x3a,0x00,0xfc,0xec,0x40,0x3d,0x00,0xfb,0xf8,0x7f,0x20,0x1f,0x40,0x7d,0xec,0x35,0xf0,0x0f,0xe7,0x26,0x4d,0xe7,0x0f,0xce,0xf4,0x1e,0x38,0x0d,0xdf,0x68,0x1f,0x1e,0x0a,0xe8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xb0,0x09,0x05,0x1c,0x1e,0x5a,0x61,0x7b,0xc0,0xd3,0xe3,0x30,0x07,0x92,0xff,0x7e,0x19,0x48,0x1f,0x44,0x1e,0xb8,0x00,0x1a,0x03,0xc7,0xf3,0x2f,0x07,0xad,0x00,0x06,0x54,0x88,0x17,0xc3,0xff,0xc0,0x8f,0x83,0xd6,0x40,0x03,0x29,0x24,0x04,0x1e,0x38,0x18,0x78,0x3d,0x62,0x00,0x32,0xc9,0x2f,0xcb,0x1f,0x00,0x07,0xac,0x20,0x06,0x54,0x95,0xf8,0xdf,0xf0,0x18,0x08,0x3f,0x80,0x22,0x70,0x40,0x10,0xc1,0x80,0x43,0xf4,0x07,0x8f,0x02,0x0f,0x10,0xec,0x04,0x08,0x1e,0x38,0x03,0x89,0x7f,0x19,0xe7,0x10,0x90,0x0b,0x08,0x1e,0x37,0x81,0x29,0x03,0xd8,0x98,0x40,0xf1,0x1a,0x98,0x3d,0x2c,0x00,0xf3,0xf2,0x78,0x16,0x24,0x0f,0x5c,0x04,0xff,0xc0,0x3a,0x18,0xc4,0x7c,0x08,0x40,0xf6,0x45,0x8c,0xf8,0xfe,0x5f,0xc0,0x7b,0xd0,0x28,0x10,0x4e,0x04,0x3e,0xc1,0x80,0xff,0x8f,0xdc,0x1e,0x4c,0x81,0x03,0x8c,0xfc,0x1f,0x1c,0x02,0x49,0x40,0x3f,0xce,0xd1,0x07,0xc2,0xc0,0xff,0xc1,0x43,0x07,0xd4,0x08,0x08,0x60,0xff,0xfc,0x03,0xca,0x07,0x80,0xb0,0x02,0x8c,0xda,0x40,0x07,0xb0,0x83,0xfb,0xfc,0x0b,0x30,0x7a,0x00,}; -const uint8_t *_I_no_sd1[] = {_I_no_sd1_0}; - -const uint8_t _I_no_sd2_0[] = {0x01,0x00,0x42,0x01,0x00,0x5e,0x03,0xff,0x07,0x07,0xe5,0xc2,0x01,0x38,0x07,0xe4,0x32,0x01,0xc0,0x07,0xe4,0x0c,0x04,0x5c,0x0f,0xf8,0x00,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x00,0xf2,0x22,0xb5,0x00,0x06,0x50,0x8b,0x06,0x4a,0x49,0x49,0x83,0x03,0xd6,0x40,0x03,0x28,0x80,0x3e,0xa2,0x01,0x33,0x07,0xd4,0x20,0x1f,0xe4,0x33,0x07,0xd4,0x10,0x1e,0x65,0xfa,0x07,0x9e,0x00,0x1f,0x50,0x20,0x7f,0x81,0x0c,0x1f,0xe0,0xfa,0x80,0x80,0x86,0x1e,0x0f,0xde,0x04,0xf0,0x1f,0xb6,0x0b,0xc0,0x3f,0xc1,0xfb,0x70,0xfc,0x40,0x3a,0x00,0xfc,0xec,0x40,0x3d,0x00,0xfb,0xf8,0x7f,0x20,0x1f,0x40,0x7d,0xec,0x35,0xf0,0x0f,0xe7,0x26,0x4d,0xe7,0x0f,0xce,0xf4,0x1e,0x38,0x0d,0xdf,0x68,0x1f,0x1e,0x0a,0xe8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xb0,0x09,0x05,0x1c,0x1e,0x5a,0x61,0x7b,0xc0,0xd3,0xe3,0x30,0x07,0x92,0xff,0x7e,0x19,0x48,0x1f,0x44,0x1e,0xb8,0x00,0x1a,0x03,0xc7,0xf3,0x2f,0x07,0xad,0x00,0x06,0x54,0x88,0x17,0xc3,0xff,0xc0,0x8f,0x83,0xd6,0x40,0x03,0x29,0x24,0x04,0x1e,0x38,0x18,0x78,0x3d,0x62,0x00,0x32,0xc9,0x2f,0xcb,0x1f,0x00,0x07,0xac,0x20,0x06,0x54,0x95,0xf8,0xdf,0xf0,0x18,0x00,0x7a,0xc1,0x00,0x43,0x06,0x01,0x0f,0xd0,0x1e,0x3c,0x00,0x78,0xf8,0x02,0x44,0x0f,0x1c,0x01,0xc4,0xbf,0x8c,0xf4,0x88,0x76,0x00,0x62,0x0f,0x1b,0xc0,0x94,0x81,0xed,0x20,0x1e,0x88,0x3c,0x46,0xe6,0x0f,0x72,0xe8,0xf9,0x3c,0x0b,0x12,0x07,0xb5,0x80,0x1e,0x51,0x88,0xff,0x80,0x7f,0x18,0x09,0xf8,0x2c,0x42,0x23,0xfc,0x07,0xca,0x70,0x67,0xd6,0x0c,0x07,0xfc,0x7f,0x14,0x0a,0x04,0x13,0x81,0x8f,0xff,0xcf,0xc1,0xf6,0xd9,0x1f,0xfb,0xb4,0x41,0xf1,0xc0,0x2d,0x17,0xf8,0x06,0x40,0xf8,0x05,0x14,0x09,0x6a,0x60,0xff,0xfc,0x03,0xc8,0x4e,0x20,0xf4,0x36,0x90,0x01,0xf0,0x16,0x00,0x7e,0xc0,0x2c,0x20,0xf7,}; -const uint8_t *_I_no_sd2[] = {_I_no_sd2_0}; - -const uint8_t _I_no_sd3_0[] = {0x01,0x00,0x41,0x01,0x00,0x5e,0x03,0xff,0x07,0x07,0xe5,0xc2,0x01,0x38,0x07,0xe4,0x32,0x01,0xc0,0x07,0xe4,0x0c,0x04,0x5c,0x0f,0xf8,0x00,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x00,0xf2,0x22,0xb5,0x00,0x06,0x50,0x8b,0x06,0x4a,0x49,0x49,0x83,0x03,0xd6,0x40,0x03,0x28,0x80,0x3e,0xa2,0x01,0x33,0x07,0xd4,0x20,0x1f,0xe4,0x33,0x07,0xd4,0x10,0x1e,0x65,0xfa,0x07,0x9e,0x00,0x1f,0x50,0x20,0x7f,0x81,0x0c,0x1f,0xe0,0xfa,0x80,0x83,0xfc,0x1f,0xe0,0xff,0x2e,0x8c,0xfc,0x1f,0xbe,0x0b,0xc4,0x03,0xa0,0x0f,0xbb,0x06,0xe2,0x01,0xe8,0x07,0xdf,0xc3,0xf9,0x00,0xfa,0x03,0xef,0x61,0xdf,0x80,0x7f,0x39,0x32,0x6f,0x38,0x7e,0x77,0x20,0xf1,0xc0,0x6e,0xfb,0x44,0xf9,0xac,0x83,0xc7,0x29,0xba,0xed,0x83,0xda,0x0b,0x00,0xe0,0x1b,0xc4,0x1e,0x3a,0x61,0x7b,0xc0,0xc0,0x86,0x0f,0x14,0xfd,0xe4,0x08,0x43,0x94,0x81,0xf4,0x41,0xeb,0x80,0x01,0x95,0x22,0x04,0x0f,0x1f,0xcc,0xbc,0x1e,0xb4,0x00,0x91,0x49,0x20,0x3f,0x0f,0xff,0x02,0x3e,0x0f,0x59,0x00,0x48,0xb2,0x50,0x40,0x78,0xe0,0x61,0xe0,0xf5,0x88,0x04,0x8a,0x93,0x02,0x5f,0x8e,0x3e,0x00,0x0f,0x58,0x40,0x8c,0xe1,0x3e,0x8b,0xfe,0x03,0x00,0x0f,0x58,0x20,0x08,0x60,0xd8,0x08,0x27,0xd0,0x1e,0x3c,0x00,0x7b,0xe0,0x0e,0x25,0xfc,0x67,0xc0,0x3c,0x5f,0xa2,0x0f,0x7f,0xc0,0x64,0x81,0xe3,0x1f,0x07,0xc4,0x13,0xec,0x10,0x1f,0x27,0x80,0x4e,0x60,0xf6,0x84,0x40,0xa0,0x1d,0x8f,0xf8,0x90,0x81,0xf0,0x2d,0x1f,0x07,0xc5,0x62,0x60,0xf5,0x8c,0x03,0xce,0x3f,0x70,0x07,0xc7,0x82,0x1e,0x5b,0x15,0x78,0xcf,0x01,0xf1,0x20,0x84,0x60,0x21,0xe0,0xf1,0x2f,0xcc,0x42,0x20,0xd8,0x1a,0x1f,0x02,0x1e,0x0f,0xb0,0x49,0x1b,0xe6,0x21,0xf0,0x05,0x17,0xf8,0xde,0x7f,0x80,0x79,0x40,0xc1,0xe3,0x30,0x05,0x15,0xf5,0x6c,0x8f,0xb5,0x07,0x98,0x78,0xc1,0xff,0x00,}; -const uint8_t *_I_no_sd3[] = {_I_no_sd3_0}; - -const uint8_t _I_no_sd4_0[] = {0x01,0x00,0x45,0x01,0x00,0x5e,0x03,0xff,0x07,0x07,0xe5,0xc2,0x01,0x38,0x07,0xe4,0x32,0x01,0xc0,0x07,0xe4,0x0c,0x04,0x5c,0x0f,0xf8,0x00,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x00,0xf2,0x22,0xb5,0x00,0x06,0x50,0x8b,0x06,0x4a,0x49,0x49,0x83,0x03,0xd6,0x40,0x03,0x28,0x80,0x3e,0xa2,0x01,0x33,0x07,0xd4,0x20,0x1f,0xe4,0x33,0x07,0xd4,0x10,0x1e,0x65,0xfa,0x07,0x9e,0x00,0x1f,0x50,0x20,0x7f,0x81,0x0c,0x1f,0xe0,0xfa,0x80,0x83,0xfc,0x1f,0xe0,0xff,0x2e,0x8c,0xfc,0x1f,0xbe,0x0b,0xc4,0x03,0xa0,0x0f,0xbb,0x06,0xe2,0x01,0xe8,0x07,0xdf,0xc3,0xf9,0x00,0xfa,0x03,0xef,0x61,0xdf,0x80,0x7f,0x39,0x32,0x6f,0x38,0x7e,0x77,0x20,0xf1,0xc0,0x6e,0xfb,0x44,0xf9,0xac,0x83,0xc7,0x29,0xba,0xed,0x83,0xda,0x0b,0x00,0xe0,0x1b,0xc4,0x1e,0x3a,0x61,0x7b,0xc0,0xc0,0x86,0x0f,0x14,0xfd,0xe4,0x08,0x43,0x94,0x81,0xf4,0x41,0xeb,0x80,0x01,0x95,0x22,0x04,0x0f,0x1f,0xcc,0xbc,0x1e,0xb4,0x00,0x91,0x49,0x20,0x3f,0x0f,0xff,0x02,0x3e,0x0f,0x59,0x00,0x48,0xb2,0x50,0x40,0x78,0xe0,0x61,0xe0,0xf5,0x88,0x04,0x8a,0x93,0x02,0x5f,0x8e,0x3e,0x00,0x0f,0x58,0x40,0x8c,0xe1,0x3e,0x8b,0xfe,0x03,0x00,0x0f,0x58,0x20,0x08,0x60,0xd8,0x08,0x27,0xd0,0x1e,0x3c,0x00,0x7b,0xe0,0x0e,0x25,0xfc,0x67,0xc0,0x3c,0x5f,0xa2,0x0f,0x7f,0xc0,0x64,0x81,0xe2,0x17,0x30,0x7a,0xc1,0x3e,0xc1,0x01,0xf2,0x78,0x16,0x26,0x0f,0x68,0x44,0x0a,0x01,0x18,0x8f,0xf8,0x07,0xf0,0x0f,0x11,0x68,0x9f,0xc7,0xf8,0x0f,0x88,0xc0,0x3c,0xac,0x18,0x0f,0xf8,0xfe,0x3c,0x10,0xf2,0xd8,0x83,0x85,0xfa,0x20,0xf7,0x90,0x42,0x30,0x10,0xf8,0x07,0xf8,0x04,0x20,0xf7,0x88,0x44,0x1b,0x03,0x03,0xff,0x17,0x88,0x1f,0x20,0x91,0x8f,0xa5,0x4c,0x1e,0xdf,0x00,0x51,0x1c,0x84,0x00,0x5f,0x80,0x79,0x09,0xc6,0x21,0x30,0x05,0x11,0xb4,0x80,0x0e,0x0f,0xf0,0x7c,0x80,}; -const uint8_t *_I_no_sd4[] = {_I_no_sd4_0}; - -const uint8_t _I_no_sd5_0[] = {0x01,0x00,0x3d,0x01,0x00,0x5e,0x03,0xff,0x07,0x07,0xe5,0xc2,0x01,0x38,0x07,0xe4,0x32,0x01,0xc0,0x07,0xe4,0x0c,0x04,0x5c,0x0f,0xf8,0x00,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x00,0xf2,0x22,0xb5,0x00,0x06,0x50,0x8b,0x06,0x4a,0x49,0x49,0x83,0x03,0xd6,0x40,0x03,0x28,0x80,0x3e,0xa2,0x01,0x33,0x07,0xd4,0x20,0x1f,0xe4,0x33,0x07,0xd4,0x10,0x1e,0x65,0xfa,0x07,0x9e,0x00,0x1f,0x50,0x20,0x7f,0x81,0x0c,0x1f,0xe0,0xfa,0x80,0x83,0xfc,0x1f,0xe0,0xff,0x07,0xf8,0x10,0xfa,0x00,0xfc,0xe0,0x40,0x3d,0x00,0xfc,0xf0,0x40,0x3e,0x80,0xfb,0x98,0x7c,0x20,0x1f,0xce,0x4c,0x9b,0xce,0x0f,0x8f,0x85,0xfc,0x1e,0x38,0x0d,0xdf,0x68,0x1f,0x1e,0x09,0xf8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xa4,0xe1,0x8f,0x83,0xcb,0x4c,0x2f,0x78,0x18,0x10,0xc1,0xe2,0x5f,0xbc,0x81,0x08,0x72,0x90,0x3e,0x88,0x3d,0x70,0x00,0x32,0xa4,0x40,0x81,0xe3,0xf9,0x97,0x83,0xd6,0x80,0x12,0x29,0x24,0x07,0xe1,0xff,0x22,0x08,0x3d,0x64,0x01,0x22,0xc9,0x41,0x01,0xe3,0x81,0x87,0x83,0xd6,0x20,0x12,0x2a,0x4c,0x09,0x7e,0x38,0xf8,0x00,0x3d,0x61,0x02,0x33,0x84,0xfa,0x2f,0xf8,0x0c,0x00,0x3d,0x60,0x80,0x21,0x83,0x60,0x20,0x9f,0x40,0x78,0xf0,0x01,0xef,0x80,0x38,0x97,0xf1,0x9f,0x00,0xf1,0xbc,0x23,0xcc,0x1e,0x9f,0x80,0xc9,0x03,0xc5,0x5a,0x20,0xf7,0x82,0x7d,0x82,0x03,0xe4,0xf0,0x09,0xcc,0x1e,0xd0,0x88,0x14,0x03,0xb1,0xff,0x12,0x10,0x3e,0x05,0xa3,0xe0,0xf8,0xac,0x4c,0x1e,0xb1,0x80,0x79,0xc7,0xee,0x00,0xf8,0xf0,0x43,0xcb,0x62,0xaf,0x19,0xe0,0x3e,0x24,0x10,0x8c,0x04,0x3c,0x1e,0x25,0xf9,0x88,0x44,0x1b,0x03,0x43,0xe0,0x43,0xc1,0xf6,0x09,0x23,0x7c,0xc4,0x3e,0x00,0xa2,0xff,0x1b,0xcf,0xf0,0x0f,0x28,0x18,0x3c,0x66,0x00,0xa2,0xbe,0xad,0x91,0xf6,0xa0,0xf3,0x0f,0x18,0x3f,0xe0,0x00,}; -const uint8_t *_I_no_sd5[] = {_I_no_sd5_0}; - -const uint8_t _I_no_sd6_0[] = {0x01,0x00,0x43,0x01,0x00,0x5e,0x03,0xff,0x07,0x07,0xe5,0xc2,0x01,0x38,0x07,0xe4,0x32,0x01,0xc0,0x07,0xe4,0x0c,0x04,0x5c,0x0f,0xf8,0x00,0x40,0xe4,0x3e,0x40,0x19,0x41,0x3c,0x00,0xf2,0x22,0xb5,0x00,0x06,0x50,0x8b,0x06,0x4a,0x49,0x49,0x83,0x03,0xd6,0x40,0x03,0x28,0x80,0x3e,0xa2,0x01,0x33,0x07,0xd4,0x20,0x1f,0xe4,0x33,0x07,0xd4,0x10,0x1e,0x65,0xfa,0x07,0x9e,0x00,0x1f,0x50,0x20,0x7f,0x81,0x0c,0x1f,0xe0,0xfa,0x80,0x80,0x86,0x1e,0x0f,0xde,0x04,0xf0,0x1f,0xb6,0x0b,0xc0,0x3f,0xc1,0xfb,0x70,0xfc,0x40,0x3a,0x00,0xfc,0xec,0x40,0x3d,0x00,0xfb,0xf8,0x7f,0x20,0x1f,0x40,0x7d,0xec,0x35,0xf0,0x0f,0xe7,0x26,0x4d,0xe7,0x0f,0xce,0xf4,0x1e,0x38,0x0d,0xdf,0x68,0x1f,0x1e,0x0a,0xe8,0x3c,0x72,0x9b,0xae,0xd8,0x3d,0xa0,0xb0,0x09,0x05,0x1c,0x1e,0x5a,0x61,0x7b,0xc0,0xd3,0xe3,0x30,0x07,0x92,0xff,0x7e,0x19,0x48,0x1f,0x44,0x1e,0xb8,0x00,0x1a,0x03,0xc7,0xf3,0x2f,0x07,0xad,0x00,0x06,0x54,0x88,0x17,0xc3,0xff,0xc0,0x8f,0x83,0xd6,0x40,0x03,0x29,0x24,0x04,0x1e,0x38,0x18,0x78,0x3d,0x62,0x00,0x32,0xc9,0x2f,0xcb,0x1f,0x00,0x07,0xac,0x20,0x06,0x54,0x95,0xf8,0xdf,0xf0,0x18,0x00,0x7a,0xc1,0x00,0x43,0x06,0x01,0x0f,0xd0,0x1e,0x3c,0x00,0x7b,0xe0,0x0e,0x25,0xfc,0x67,0xc0,0x3c,0x6f,0x00,0x52,0x07,0xaf,0xe0,0x32,0x40,0xf1,0x8f,0x83,0xe2,0x09,0xf6,0x08,0x0f,0x93,0xc0,0x27,0x30,0x7b,0x42,0x20,0x50,0x0e,0xc7,0xfc,0x48,0x40,0xf8,0x16,0x8f,0x83,0xe2,0xb1,0x30,0x7a,0xc6,0x01,0xe7,0x1f,0xb8,0x03,0xe3,0xc1,0x0f,0x2d,0x8a,0xbc,0x67,0x80,0xf8,0x90,0x42,0x30,0x10,0xf0,0x78,0x97,0xe6,0x21,0x10,0x64,0x0d,0x0f,0x80,0xfd,0x10,0x7d,0x02,0x48,0xdf,0x31,0x0f,0x80,0x28,0xbf,0xc6,0xf3,0xfc,0x03,0xca,0x06,0x0f,0x19,0x80,0x28,0xaf,0xab,0x64,0x7d,0xa8,0x3c,0xc3,0xc6,0x0f,0xf8,0x00,}; -const uint8_t *_I_no_sd6[] = {_I_no_sd6_0}; - -const uint8_t _I_tv1_0[] = {0x01,0x00,0xca,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x66,0x33,0x30,0x50,0x81,0x88,0x1e,0xd0,0x50,0x19,0x0a,0x8a,0x08,0x24,0x21,0x31,0x40,0x38,0x00,0x81,0x2d,0x20,0x08,0x41,0xeb,0x38,0x07,0xc0,0xb4,0x46,0xc4,0x78,0x10,0x79,0x80,0xc8,0x64,0x20,0xf4,0x86,0x02,0xcc,0x1e,0xa6,0x21,0xe8,0x40,0x21,0xe5,0x61,0x82,0x60,0x2f,0xe0,0xf7,0xa8,0x78,0x66,0x07,0x61,0x81,0x58,0x11,0xa3,0x02,0xc0,0x43,0xce,0x47,0x48,0x8f,0x25,0x8a,0x05,0x30,0x80,0x41,0x90,0x64,0x0f,0x43,0xf9,0xc0,0x7f,0x05,0xb1,0x81,0x78,0x27,0xe0,0xf1,0xff,0xff,0xc7,0x02,0xba,0x20,0x30,0xc0,0x7e,0x10,0x3f,0x04,0x9f,0xc1,0x1f,0x22,0x8e,0x10,0x1e,0x56,0x01,0x39,0x02,0xc6,0xc1,0x26,0xf0,0x48,0xc4,0xc3,0x82,0x07,0x94,0x78,0x1e,0x5c,0x08,0x1f,0x02,0x27,0xc0,0xa0,0x8d,0x8a,0x07,0x00,0xf0,0x38,0x8a,0x08,0x55,0x12,0xf8,0xf0,0x11,0xc3,0x10,0x80,0xa3,0x44,0xec,0x41,0x71,0x30,0x8b,0x1c,0x81,0xe7,0xf0,0x9f,0xae,0x48,0x1e,0x20,0x43,0x07,0x96,0x80,0x0a,0x34,0x00,0x51,0xc4,0x16,0x46,0x0f,0xa9,0x07,0xd0,0x1e,0xbf,0x02,0x58,0x83,0xd6,0x18,0x5f,0x10,0x79,0xff,0x20,0xe0,0xf1,0x27,0x9d,0x02,0x09,0x7c,0x63,0x88,0x3c,0xbf,0xd0,0xf0,0x7a,0xe0,0x21,0x06,0xe1,0x16,0x0e,0x0f,0xff,0xfd,0xfb,0xaa,0xc7,0xfe,0xa6,0x10,0x78,0x9b,0xce,0x19,0x9c,0xff,0xa3,0x04,0x1e,0x51,0xd0,0x59,0x70,0x52,0xe2,0xa4,0x1d,0xc0,0x30,0x80,0x03,0x3f,0x0f,0x97,0xe0,0x54,0x22,0xf1,0x45,0x88,0x3d,0x39,0xe0,0xf1,0xc0,0x15,0x87,0xff,0x03,0x26,0x8f,0x81,0xf8,0x64,0x61,0x07,0x8d,0xc0,0x0a,0x3f,0xc0,0xa0,0x8f,0x10,0x00,0x3f,0x30,0x78,0xc3,0x82,0xe7,0x40,0x07,0xb7,0xd2,0x7f,0xf0,0xe0,0x83,0xd7,0xf8,0x0e,0x3b,0xff,0xdf,0xbf,0x0f,0xd3,0x18,0x8c,0x1e,0x3c,0x30,0x79,0xe7,0xfe,0xf1,0xfd,0x85,0xe6,0xfc,0xb3,0x3c,0x06,0x00,0x1e,0x7e,0xf0,0x78,0xd3,0xe9,0x39,0x26,0x38,0x83,0xc6,0x80,0x0f,0x4f,0x9f,0xdf,0x3e,0x05,0x23,0xe8,0x83,0xc4,0x40,0x24,0x63,0xfe,0x03,0xc4,0x0a,0x51,0x80,0x7a,0x07,0xcd,0x84,0x31,0xf1,0x61,0x47,0x01,0xe5,0x10,0x07,0xbc,0x08,0x18,0x31,0xe0,0x10,0xd8,0x01,0xf1,0x04,0x06,0x08,0xfc,0xae,0x0f,0x31,0xf3,0x83,0xd4,0x78,0x3c,0x06,0x99,0x6f,0x01,0xe3,0xc3,0x0b,0x0f,0xe0,0x1e,0x56,0x06,0x18,0xdf,0xc1,0xe3,0x3f,0x83,0x83,0xc7,0x5f,0x32,0xfd,0x83,0xc5,0x6a,0x8f,0x72,0x68,0x8f,0x9c,0x3e,0xae,0x64,0x80,0x4e,0x01,0xe2,0x4f,0x60,0x7a,0xc8,0x01,0xfe,0x2f,0x20,0x7f,0x00,}; -const uint8_t *_I_tv1[] = {_I_tv1_0}; - -const uint8_t _I_tv2_0[] = {0x01,0x00,0xcc,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x45,0x06,0x07,0x98,0x28,0x47,0x44,0x0f,0x58,0x48,0x3c,0xc5,0x45,0x04,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0x0a,0x20,0x7b,0x0b,0x44,0x6c,0x53,0x80,0x7a,0x0b,0x04,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x08,0x9c,0xaf,0xe0,0xf9,0x10,0x88,0x28,0x6c,0x08,0xd1,0x81,0x60,0x21,0xe7,0x23,0x0d,0x88,0x44,0x41,0xe3,0x30,0x41,0x8a,0xdc,0x81,0xea,0x01,0x10,0x50,0xfe,0x00,0xa3,0x02,0xf0,0x4f,0xc1,0xe3,0xff,0x00,0x14,0x3e,0x01,0xfe,0x02,0x0c,0x07,0xe1,0x03,0xf0,0x49,0xfc,0x11,0xf1,0x50,0xc1,0x3c,0x0e,0x61,0x08,0x88,0x88,0x41,0x63,0x20,0x07,0x8c,0xfc,0x4c,0x30,0x68,0xe1,0x70,0x60,0x60,0xf2,0xe0,0x40,0xf8,0x11,0x3e,0x05,0x1c,0x1e,0x31,0xa0,0x60,0xf8,0x0f,0xa6,0x75,0x12,0xf8,0xf0,0x30,0x65,0xc1,0xf2,0x82,0xc6,0xf0,0xad,0x33,0x08,0xae,0x08,0x1e,0x50,0x50,0x30,0xc7,0x81,0xe6,0xa3,0x30,0x79,0x68,0x12,0xc4,0x50,0x14,0xd1,0x01,0xc8,0x1e,0x81,0x72,0x27,0x12,0x28,0x7e,0x80,0xf5,0xf8,0x44,0x60,0x10,0xe0,0xf9,0xc8,0x21,0x85,0xf1,0x07,0x9f,0xf3,0xcf,0xc0,0x84,0xc1,0x81,0xe5,0x40,0x82,0x5f,0x26,0x10,0x10,0x79,0x7f,0xa1,0xf3,0xf8,0x80,0x3c,0xf0,0x10,0x83,0x70,0x8b,0x07,0x3f,0xff,0xfe,0xfd,0xd6,0x24,0xa6,0x10,0x78,0x9b,0xce,0x19,0xbc,0xff,0xa3,0x04,0x1e,0x51,0xd0,0x59,0x70,0x54,0x87,0xf8,0x67,0x9f,0xfe,0x7e,0x1f,0x2f,0xc6,0x0c,0x4a,0x4d,0x41,0x07,0xa7,0x3c,0x12,0x38,0x03,0x18,0xff,0xe0,0xf8,0x05,0xca,0x00,0x07,0xe0,0x0f,0x1b,0x80,0x14,0x7f,0x90,0x10,0x79,0x07,0xd3,0xe6,0x0f,0x18,0x70,0x5c,0xe8,0x00,0xf6,0xfa,0x4f,0xfe,0x1c,0x10,0x7a,0xff,0x01,0xc7,0x7f,0xfb,0xf7,0xe1,0xfa,0x63,0x11,0x83,0xc4,0x3c,0x99,0xff,0xbc,0x7f,0x61,0x79,0xbf,0x2c,0xcf,0x01,0x87,0x07,0x9f,0xbc,0x1e,0x34,0xfa,0x4e,0x4a,0x02,0x0f,0x2e,0x06,0x04,0x9c,0x9f,0x75,0x30,0x80,0x08,0x1e,0x5e,0x03,0x08,0x80,0x0b,0xf8,0x0f,0x10,0x29,0x7e,0x01,0xe5,0x60,0xc0,0x06,0x0d,0x84,0x31,0xf1,0x61,0x7f,0x01,0xe5,0x30,0x07,0xbc,0x08,0x18,0x25,0x02,0xb0,0x03,0xe2,0x08,0x0c,0x1b,0xf8,0x08,0x6e,0x11,0x8c,0x07,0x9c,0x1e,0xb1,0x88,0x07,0x00,0x9e,0x5b,0xc0,0x78,0xf0,0xe1,0xe4,0x81,0x07,0x95,0x81,0x86,0x3f,0xf7,0x78,0xcf,0xe1,0xe0,0xf1,0xd7,0xcc,0xbf,0x60,0xf1,0x4b,0x23,0xdc,0x9c,0xc3,0xe7,0x0f,0xab,0x99,0x20,0x13,0x80,0x78,0x93,0xd8,0x1e,0xb2,0x00,0x7f,0x8b,0xc8,0x1f,0xc0,}; -const uint8_t *_I_tv2[] = {_I_tv2_0}; - -const uint8_t _I_tv3_0[] = {0x01,0x00,0xc1,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x66,0x33,0x30,0x50,0x81,0x88,0x1e,0xd0,0x50,0x19,0x0a,0x8a,0x08,0x24,0x21,0x31,0x40,0x38,0x00,0x81,0x2d,0x20,0x08,0x41,0xeb,0x38,0x07,0xc0,0xb4,0x46,0xc4,0x78,0x10,0x79,0x80,0xc8,0x64,0x20,0xf4,0x86,0x02,0xcc,0x1e,0xa6,0x21,0xe8,0x40,0x21,0xe5,0x61,0x07,0xd5,0x43,0xc3,0x30,0x3b,0x09,0xbc,0xe0,0x58,0x08,0x79,0xc8,0xe9,0x11,0xe4,0xb1,0x03,0xd1,0x04,0xb4,0x83,0xf9,0xa8,0xce,0x05,0xe0,0x9f,0x83,0xc7,0xff,0xff,0xbf,0xae,0x8c,0x0c,0x20,0x01,0x81,0xf8,0x24,0xfe,0x08,0xf9,0x14,0x70,0x80,0xf2,0xb0,0x08,0xce,0x3d,0x60,0x93,0x78,0x24,0x68,0x21,0xc1,0x02,0x8c,0x1e,0x70,0x3e,0x04,0x4f,0x81,0x41,0x07,0x8c,0x0a,0x07,0x00,0xf0,0x0f,0x8c,0xaa,0x25,0xf1,0xe0,0x23,0x86,0x21,0x01,0x46,0x89,0xd8,0x80,0x03,0x30,0x09,0x98,0x3c,0xfe,0x13,0xf5,0xc9,0x40,0x3f,0x10,0x90,0x7a,0xe8,0x00,0xa3,0x40,0x07,0x9c,0x1e,0x0c,0x0f,0xc1,0xe8,0xfd,0x01,0xeb,0xf0,0x25,0x88,0x3c,0xd1,0x23,0xfc,0x2f,0x88,0x3c,0xff,0x90,0x70,0x78,0x93,0xc8,0x04,0x3e,0x0b,0xfb,0x1c,0x41,0xe5,0xfe,0x87,0x83,0xdb,0x81,0xe1,0x04,0x8f,0xc3,0x07,0xff,0xfe,0xfd,0xd5,0x44,0xa6,0x11,0x90,0xce,0x3e,0x01,0x51,0x86,0x67,0x3f,0xe2,0x71,0x07,0x94,0x74,0x1e,0x30,0x8f,0xe0,0x78,0x5a,0x43,0xb8,0x64,0x1f,0xfe,0x7e,0x1f,0x2f,0xc4,0x4e,0x01,0x0e,0x73,0x0f,0xc0,0x1e,0x9c,0xf0,0x79,0x44,0x3c,0x1c,0x08,0x19,0x34,0x7c,0x0a,0x93,0x23,0x08,0x3c,0xdf,0x42,0x0f,0x30,0xfa,0x7c,0xc1,0xe3,0x1e,0x40,0x09,0x3c,0x68,0x00,0xf6,0xfa,0x4f,0xfe,0x13,0x99,0x30,0x9c,0x81,0xe3,0xfc,0x07,0x1d,0xff,0xef,0xdf,0x87,0xfd,0xa7,0xe0,0xf4,0xe1,0x83,0xcf,0x3f,0xf7,0x8f,0xec,0x2f,0x37,0xe0,0x79,0x48,0x30,0x18,0x00,0x79,0xfb,0xc1,0xe3,0x4f,0xa4,0xe6,0x98,0xe2,0x0f,0x1a,0x00,0x3d,0x3e,0x7f,0x7c,0xf8,0x14,0x91,0xc5,0x20,0x10,0x09,0xb8,0xff,0x80,0xf1,0x02,0x94,0x60,0x1e,0x81,0xf3,0x61,0x0c,0x7c,0x58,0x51,0xc0,0x79,0x44,0x01,0xef,0x02,0x06,0x0c,0x78,0x04,0x36,0x00,0x7c,0x41,0x01,0x82,0x3f,0x2b,0x84,0x23,0x01,0xe7,0x07,0xa8,0xf0,0x78,0x0a,0x31,0x80,0x6f,0x01,0xe3,0xc3,0x0b,0x0f,0xe0,0x1e,0x56,0x05,0x68,0xdf,0xc1,0xe3,0x3f,0x83,0x83,0xc7,0x5f,0x32,0xfd,0x83,0xc5,0x6a,0x8f,0x72,0x80,0x0b,0xc4,0x3e,0xae,0x64,0x80,0x4e,0x01,0xe2,0x4f,0x60,0x7a,0xb8,0xc4,0x1f,0xe5,0xf7,0x07,0xc0,}; -const uint8_t *_I_tv3[] = {_I_tv3_0}; - -const uint8_t _I_tv4_0[] = {0x01,0x00,0xc0,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x45,0x06,0x07,0x98,0x28,0x47,0x44,0x0f,0x58,0x48,0x3c,0xc5,0x45,0x04,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0x0a,0x20,0x7b,0x0b,0x44,0x6c,0x53,0x80,0x7a,0x0b,0x04,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x08,0x3f,0x44,0x22,0x0a,0x23,0x61,0x60,0x21,0xe7,0x23,0x0d,0x88,0x44,0x41,0xea,0x82,0x50,0x78,0x80,0x45,0x84,0x90,0x2f,0x04,0xfc,0x1e,0x3f,0xf0,0x01,0x43,0xe0,0x1f,0xe0,0x31,0xc0,0xfc,0x12,0x7f,0x04,0x7c,0x54,0x30,0x4f,0x03,0x98,0x42,0x22,0x00,0x28,0xf4,0x80,0x1e,0x33,0xf1,0x60,0xc1,0xa3,0x87,0x41,0x81,0x83,0xce,0x07,0xc0,0x89,0xf0,0x28,0xe0,0xf1,0x8d,0x03,0x07,0xc0,0x0e,0x33,0xa8,0x97,0xc7,0x81,0x83,0x2e,0x0f,0x94,0x14,0x37,0x80,0x79,0xcc,0x02,0x66,0x0f,0x28,0x28,0xe4,0x97,0xcc,0x0f,0x3d,0x01,0xec,0x8a,0x02,0x9e,0x43,0x68,0x83,0xcc,0x2e,0x44,0xe4,0xf2,0x2e,0x4c,0x1e,0x3f,0x08,0x8c,0x02,0x1c,0x1f,0x39,0xe5,0xf2,0x0d,0x18,0x07,0x9f,0xf3,0xcf,0xc0,0x84,0xc1,0x81,0xe5,0xc2,0x87,0xf3,0x11,0x82,0x0f,0x2f,0xf4,0x3e,0x7f,0x10,0x07,0x9c,0x04,0x42,0x22,0xf1,0xf8,0x67,0xff,0xff,0xdf,0xba,0xa8,0x83,0x23,0x80,0x08,0x8c,0x38,0x9e,0x30,0xcd,0xe7,0xfd,0x18,0x20,0xf2,0x8e,0x83,0xcc,0x8a,0x50,0x2f,0xc3,0x20,0xff,0xf3,0xf0,0xf9,0xe0,0x04,0xa5,0x01,0xf8,0x03,0xd3,0x9e,0x0f,0x31,0x38,0xc1,0xc0,0x84,0x79,0x32,0x30,0x83,0xc6,0xe1,0x01,0xfe,0x7f,0x20,0x21,0x43,0x00,0x1f,0xcc,0x1e,0x30,0xef,0xf3,0xa8,0x60,0x14,0x00,0x7b,0x7d,0x27,0xff,0x0e,0x08,0x9c,0xc1,0xe3,0xfc,0x07,0x1d,0xff,0xef,0xdf,0x87,0xe9,0x8c,0x42,0x0f,0x30,0xf2,0x67,0xfe,0xf1,0xfd,0x85,0xe6,0xfc,0x0f,0x29,0x06,0x03,0x0e,0x0f,0x3f,0x78,0x3c,0x69,0xf4,0x9c,0x92,0x80,0x41,0xe3,0xc0,0xc0,0x93,0x93,0xee,0xa6,0x10,0x01,0x03,0xcb,0xc0,0x96,0x20,0x00,0xff,0x01,0xe2,0x05,0x2f,0xc0,0x3c,0xac,0x09,0x41,0x00,0x13,0x08,0x63,0xe2,0xc2,0xfe,0x03,0xca,0x60,0x0f,0x78,0x10,0x30,0x4a,0x05,0x60,0x07,0xc4,0x10,0x18,0x37,0xf0,0x10,0xdc,0x23,0x18,0x0f,0x38,0x3d,0x63,0x10,0x0e,0x01,0x3c,0xb7,0x80,0xf1,0xe1,0xc3,0xc9,0x02,0x0f,0x2b,0x03,0x0c,0x7f,0xf0,0x38,0x04,0xfe,0x1e,0x0f,0x1d,0x7c,0xcb,0xf6,0x0f,0x14,0xb2,0x3d,0xc9,0xcc,0x3e,0x70,0xfa,0xb9,0x92,0x01,0x38,0x07,0x89,0x3d,0x81,0xeb,0x20,0x07,0xf8,0xbc,0x81,0xfc,}; -const uint8_t *_I_tv4[] = {_I_tv4_0}; - -const uint8_t _I_tv5_0[] = {0x01,0x00,0xcb,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x45,0x06,0x07,0x98,0x28,0x47,0x44,0x0f,0x58,0x48,0x3c,0xc5,0x45,0x04,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0x0a,0x20,0x7b,0x0b,0x44,0x6c,0x53,0x80,0x7a,0x0b,0x04,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x08,0x9c,0xaf,0xe0,0xf9,0x10,0x88,0x28,0x6c,0x08,0xd1,0x81,0x60,0x21,0xe7,0x23,0x0d,0x88,0x44,0x41,0xe3,0x30,0x41,0x8a,0xdc,0x81,0xea,0x01,0x10,0x50,0xfe,0x00,0xa3,0x02,0xf0,0x4f,0xc1,0xe3,0xff,0x00,0x14,0x3e,0x01,0xfe,0x02,0x0c,0x07,0xe1,0x03,0xf0,0x49,0xfc,0x11,0xf1,0x50,0xc1,0x3c,0x0e,0x61,0x61,0x10,0x74,0x63,0xf6,0x09,0x37,0x82,0x46,0x26,0x18,0x34,0x71,0x64,0x90,0x2e,0x04,0x0f,0x81,0x13,0xe0,0x50,0x41,0xe3,0x1a,0x81,0x97,0x04,0xfa,0x67,0x51,0x2f,0x8f,0x00,0x32,0x31,0x0f,0x28,0x2c,0x63,0x0a,0xd3,0x30,0x8a,0xe0,0x81,0xe5,0x05,0x77,0x2c,0x20,0xca,0x25,0xd1,0x07,0x96,0x81,0x2c,0x44,0xe2,0x0b,0x88,0x1c,0x55,0x24,0x0f,0x25,0xd9,0x03,0xce,0x41,0xf4,0x1b,0x10,0x3c,0xbe,0x11,0x18,0x04,0x38,0x1e,0x90,0xc8,0x7c,0x58,0x1e,0x7f,0xcf,0x3f,0x02,0x12,0xa9,0x28,0x05,0x02,0x08,0x19,0x20,0x79,0x7f,0xa1,0xf3,0xf8,0x80,0x3c,0xf0,0x04,0xf3,0xf8,0x60,0xff,0xff,0xdf,0xba,0xc4,0x94,0xc2,0x0f,0x13,0x79,0xc3,0x33,0x9f,0xf8,0x07,0x80,0x1e,0x51,0xd0,0x59,0x70,0x52,0xe2,0xa4,0x1d,0xc3,0x3c,0xff,0xf3,0xf0,0xf9,0x7e,0x05,0x42,0xd7,0x16,0xa0,0x83,0xd3,0x9e,0x0f,0x1c,0x03,0x50,0x7f,0xf0,0x32,0x68,0xf8,0x05,0x04,0x00,0x1f,0x80,0x3c,0x6e,0x00,0x51,0xfe,0x40,0x41,0xe4,0x1f,0x4f,0x98,0x3c,0x61,0xc1,0x73,0xa0,0x03,0xdb,0xe9,0x3f,0xf8,0x70,0x41,0xeb,0xfc,0x07,0x1d,0xff,0xef,0xdf,0x87,0xe9,0x8c,0x46,0x0f,0x1e,0x18,0x3c,0xf3,0xff,0x78,0xfe,0xc2,0xf3,0x7e,0x59,0x9e,0x03,0x00,0x0f,0x3f,0x78,0x3c,0x69,0xf4,0x9c,0x93,0x10,0xa4,0x14,0x00,0x7a,0x7c,0xfe,0xf9,0xf0,0x29,0x1f,0x44,0x1e,0x22,0x01,0x23,0x1f,0xf0,0x1e,0x20,0x52,0x76,0x88,0x3c,0xc3,0xe6,0xc2,0x18,0xf8,0xb0,0xa3,0x80,0xf2,0x88,0x03,0xdd,0xc2,0x51,0xe0,0x10,0xd8,0x01,0xf1,0x04,0x06,0x08,0xfc,0xae,0x10,0x8c,0x07,0x9c,0x1e,0xa3,0xc1,0xe0,0x34,0xcb,0x78,0x0f,0x1e,0x18,0x58,0x7f,0x00,0xf2,0xb0,0x30,0xc6,0xfe,0x0f,0x19,0xfc,0x1c,0x1e,0x3a,0xf9,0x97,0xec,0x1e,0x2b,0x54,0x7b,0x93,0x98,0x7c,0xe1,0xf5,0x73,0x24,0x02,0x70,0x0f,0x12,0x7b,0x03,0xd6,0x40,0x0f,0xf1,0x79,0x03,0xf8,}; -const uint8_t *_I_tv5[] = {_I_tv5_0}; - -const uint8_t _I_tv6_0[] = {0x01,0x00,0xd1,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x45,0x06,0x07,0x98,0x28,0x47,0x44,0x0f,0x58,0x48,0x3c,0xc5,0x45,0x04,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0x0a,0x20,0x7b,0x0b,0x44,0x6c,0x53,0x80,0x7a,0x0b,0x04,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x08,0x9c,0xaf,0xe0,0xf9,0x10,0x88,0x28,0x6c,0x08,0xd1,0x81,0x60,0x21,0xe7,0x23,0x0d,0x88,0x44,0x41,0xe3,0x30,0x41,0x8a,0xdc,0x81,0xea,0x01,0x10,0x50,0xfe,0x00,0xa3,0x02,0xf0,0x4f,0xc1,0xe3,0xff,0x00,0x14,0x3e,0x01,0xfe,0x02,0x0c,0x07,0xe1,0x03,0xf0,0x49,0xfc,0x11,0xf1,0x50,0xc1,0x3c,0x0e,0x61,0x08,0x88,0x88,0x41,0x63,0x20,0x07,0x8c,0xfc,0x4c,0x30,0x68,0xe1,0x70,0x60,0x60,0xf2,0xe0,0x40,0xf8,0x11,0x3e,0x05,0x1c,0x1e,0x31,0xa0,0x60,0xf8,0x0f,0xa6,0x75,0x12,0xf8,0xf0,0x30,0x65,0xc1,0xf2,0x82,0xc6,0xf0,0xad,0x33,0x08,0xae,0x08,0x1e,0x50,0x50,0x30,0xc7,0x81,0xe6,0xa3,0x30,0x79,0x68,0x12,0xc4,0x50,0x14,0xd1,0x01,0xc8,0x1e,0x81,0x72,0x27,0x12,0x28,0x7e,0x9f,0x03,0xe8,0x83,0xcb,0xe1,0x11,0x80,0x43,0x83,0xe7,0x20,0x86,0x43,0xe2,0x60,0xf3,0xfe,0x79,0xf8,0x10,0x98,0x30,0x3c,0xa8,0x02,0xf1,0x3c,0x08,0x3c,0xbf,0xd0,0xf9,0xfc,0x40,0x1e,0x78,0x06,0x39,0xfc,0x33,0xff,0xff,0xef,0xdd,0x62,0x4a,0x61,0x07,0x89,0xbc,0x41,0xe3,0x0c,0xde,0x7f,0xd1,0x82,0x0f,0x28,0xe8,0x80,0xb8,0x30,0x32,0x78,0xc0,0xbf,0x0c,0xf3,0xff,0xcf,0xc3,0xe5,0xf8,0xc1,0x89,0x49,0xa8,0x20,0xf4,0xe7,0x82,0x47,0x00,0x63,0x1f,0xfc,0x1f,0x00,0xb9,0x40,0x00,0xfc,0x01,0xe3,0x70,0x02,0x8f,0xf2,0x02,0x0f,0x20,0xfa,0x7c,0xc1,0xe3,0x0e,0x0b,0x9d,0x00,0x1e,0xdf,0x49,0xff,0xc3,0x82,0x0f,0x5f,0xe0,0x38,0xef,0xff,0x7e,0xfc,0x3f,0x4c,0x62,0x30,0x78,0x87,0x93,0x3f,0xf7,0x8f,0xec,0x2f,0x37,0xe5,0x99,0xe0,0x30,0xe0,0xf3,0xf7,0x83,0xc6,0x9f,0x49,0xc9,0x40,0x41,0xe5,0xc0,0xc0,0x93,0x93,0xee,0xa6,0x10,0x01,0x03,0xcb,0xc0,0x61,0x10,0x01,0x7f,0x01,0xe2,0x05,0x2f,0xc0,0x3c,0xac,0x18,0x00,0xc1,0xb0,0x86,0x3e,0x2c,0x2f,0xe0,0x3c,0xa6,0x00,0xf7,0x81,0x03,0x04,0xa0,0x56,0x00,0x7c,0x3f,0x06,0x01,0x7f,0x01,0x0d,0xc2,0x31,0x80,0xf3,0x83,0xd6,0x31,0x00,0xe0,0x13,0xcb,0x78,0x0f,0x1e,0x1c,0x3c,0x90,0x20,0xf2,0xb0,0x30,0xc7,0xff,0x03,0x80,0x4f,0xe1,0xe0,0xf1,0xd7,0xcc,0xbf,0x60,0xf1,0x4b,0x23,0xdc,0x9c,0xc3,0xe7,0x0f,0xab,0x99,0x20,0x13,0x80,0x78,0x93,0xd8,0x1e,0xb2,0x00,0x7f,0x8b,0xc8,0x1f,0xc0,}; -const uint8_t *_I_tv6[] = {_I_tv6_0}; - -const uint8_t _I_tv7_0[] = {0x01,0x00,0xc1,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x45,0x06,0x07,0x98,0x28,0x47,0x44,0x0f,0x58,0x48,0x3c,0xc5,0x45,0x04,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0x0a,0x20,0x7b,0x0b,0x44,0x6c,0x53,0x80,0x7a,0x0b,0x04,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x08,0x3f,0x44,0x22,0x0a,0x23,0x61,0x60,0x21,0xe7,0x23,0x0d,0x88,0x44,0x41,0xea,0x82,0x50,0x78,0x80,0x45,0x84,0x90,0x2f,0x04,0xfc,0x1e,0x3f,0xf0,0x01,0x43,0xe0,0x1f,0xe0,0x31,0xc0,0xfc,0x12,0x7f,0x04,0x7c,0x54,0x30,0x4f,0x03,0x98,0x58,0x49,0x1e,0xb0,0x49,0xbc,0x12,0x31,0x60,0xc1,0xa3,0x8b,0x24,0x00,0x0c,0x0f,0x81,0x13,0xe0,0x50,0x41,0xe3,0x1a,0x81,0xc0,0x2c,0x00,0xe3,0x3a,0x89,0x7c,0x78,0x01,0x91,0x88,0x79,0x41,0x43,0x18,0x07,0x9c,0xc0,0x26,0x60,0xf2,0x82,0xbb,0x8f,0xf0,0x41,0x14,0x99,0x83,0xcb,0x40,0x7b,0x20,0x60,0xc1,0x2f,0xc8,0x34,0x07,0x98,0x5c,0x81,0xe5,0x80,0x8f,0xfd,0x01,0xeb,0xf0,0x88,0xc0,0x21,0xc2,0xc3,0xf0,0x43,0xcf,0x62,0x0f,0x3f,0xe7,0x9f,0x81,0x09,0x4f,0x0b,0x20,0x90,0xe2,0x10,0x10,0x79,0x7f,0xa1,0xf3,0xf8,0x80,0x3c,0x57,0x04,0x22,0x10,0x20,0xfc,0x30,0x7f,0xff,0xef,0xdd,0x54,0x51,0xf3,0xe0,0x9b,0xd2,0x19,0x9c,0xff,0x8e,0x04,0x1e,0x51,0xd8,0x02,0xcc,0x78,0x09,0x71,0x69,0x0e,0xe1,0x90,0x7f,0xf9,0xf8,0xe4,0x6f,0x1f,0x81,0x50,0xb5,0xc6,0x03,0xf0,0x07,0xa7,0x3c,0x1e,0x38,0x01,0x00,0xb8,0x04,0x9a,0x3e,0x06,0x4a,0x7c,0x01,0xe3,0x70,0x02,0x8f,0xf1,0xae,0x43,0xc3,0x00,0x0f,0xcc,0x1e,0x30,0xe0,0xb9,0xd0,0x01,0xed,0xf4,0x9f,0xfc,0x38,0x20,0xf5,0xfe,0x03,0x8e,0xff,0xf7,0xef,0xc3,0xf4,0xc6,0x21,0x07,0x9f,0x0c,0x1e,0x79,0xff,0xbc,0x7f,0x61,0x79,0x68,0x08,0x00,0x64,0x18,0x0c,0x00,0x3c,0xfd,0xe0,0xf1,0xa7,0xd2,0x72,0x4c,0x41,0x07,0x8d,0x00,0x1e,0x9f,0x3f,0xbe,0x7c,0x0a,0x47,0xd1,0x07,0x88,0x80,0x48,0xc7,0xfc,0x07,0x88,0x14,0xa3,0x00,0xf4,0x0f,0x9b,0x08,0x63,0xe2,0xc2,0x8e,0x03,0xca,0x20,0x0f,0x77,0x08,0xc0,0x23,0xc0,0x21,0xb0,0x03,0xe2,0x08,0x0c,0x11,0xf9,0x5c,0x21,0x18,0x0f,0x38,0x3d,0x47,0x83,0xc0,0x51,0x8c,0x03,0x78,0x0f,0x1e,0x18,0x58,0x7f,0x00,0xf2,0xb0,0x30,0xc6,0xfe,0x0f,0x19,0xfc,0x1c,0x1e,0x3a,0xf9,0x97,0xec,0x1e,0x2b,0x54,0x7b,0x93,0x44,0x7c,0xe1,0xf5,0x73,0x24,0x02,0x70,0x0f,0x12,0x7b,0x03,0xd6,0x40,0x0f,0xf1,0x79,0x03,0xf8,}; -const uint8_t *_I_tv7[] = {_I_tv7_0}; - -const uint8_t _I_tv8_0[] = {0x01,0x00,0xcd,0x01,0x84,0x00,0x86,0x04,0x0b,0x7f,0x84,0x1c,0x1f,0xb0,0xe9,0xc0,0x0c,0x62,0x00,0x21,0x80,0x83,0x9b,0x01,0x01,0xe0,0x03,0xf2,0x80,0x0a,0x39,0x00,0x58,0x41,0x45,0x06,0x07,0x98,0x28,0x47,0x44,0x0f,0x58,0x48,0x3c,0xc5,0x45,0x04,0x12,0x10,0x98,0x81,0xea,0x5a,0x20,0x10,0x83,0xd3,0x80,0x0a,0x20,0x7b,0x0b,0x44,0x6c,0x53,0x80,0x7a,0x0b,0x04,0x64,0x40,0xf4,0x83,0x83,0xe4,0xc4,0x20,0x31,0x3b,0x08,0x3f,0x44,0x22,0x0a,0x23,0x61,0x60,0x21,0xe7,0x23,0x0d,0x88,0x44,0x41,0xea,0x82,0x50,0x78,0x80,0x45,0x84,0x7f,0x08,0x1f,0x82,0x7e,0x0f,0x1f,0xf8,0x00,0xa1,0xf0,0x0f,0xf0,0x14,0xe1,0xde,0x09,0x3f,0x82,0x3e,0x2a,0x18,0x27,0x81,0xcc,0x21,0x11,0x27,0x14,0xc2,0x40,0x0f,0x19,0xf8,0xb0,0x60,0xd1,0xc3,0xa0,0xc0,0xc1,0xe5,0x74,0xe0,0x70,0x22,0x7c,0x0a,0x38,0x3c,0x63,0x40,0xc1,0xf0,0x13,0x8f,0xf9,0x01,0x2f,0x8f,0x03,0x06,0x5c,0x1f,0x28,0x28,0x6f,0x00,0xf3,0xfc,0x0d,0x85,0x12,0x20,0xf2,0x82,0x81,0x86,0x3c,0x0c,0x17,0xc8,0x92,0xc8,0x1e,0x7a,0x03,0xd9,0x06,0x46,0x09,0x7e,0x22,0x0d,0xfc,0x1e,0xaa,0xb2,0x20,0x8c,0x13,0x00,0x1d,0x1c,0x38,0x18,0x41,0xe5,0xf0,0x88,0xc0,0x21,0xc1,0xf1,0x0a,0x0f,0x83,0x1f,0x01,0x09,0x08,0x3c,0xbf,0x9e,0x7e,0x04,0x26,0x0c,0xc8,0x3f,0xc7,0xfd,0x3a,0x20,0xf2,0xff,0x43,0xe7,0xf1,0x00,0x78,0xae,0x09,0xc6,0x7f,0x0c,0xff,0xff,0xfb,0xf7,0x55,0x94,0x7d,0xe4,0x20,0xf4,0x86,0x6f,0x3f,0xe3,0x81,0x07,0x94,0x74,0xc4,0x53,0x07,0x11,0x8d,0x04,0x00,0x73,0xf2,0x48,0xde,0x3f,0x1c,0x31,0x28,0xc0,0x20,0x3f,0x00,0x7a,0x73,0xc1,0x23,0x80,0x83,0xe0,0x3f,0xe0,0x21,0x5c,0xa9,0x18,0x41,0xe3,0x70,0x02,0x8f,0xf9,0x80,0x23,0xc4,0x00,0x0f,0xcc,0x1e,0x30,0xe0,0xb9,0xd0,0x01,0xed,0xf4,0x9f,0xfc,0x38,0x20,0xf5,0xfe,0x03,0x8e,0xff,0xf7,0xef,0xc3,0xf4,0xc6,0x21,0x07,0x98,0x79,0x33,0xff,0x78,0xfe,0xc2,0xf2,0xd0,0x10,0x00,0xc8,0x30,0x18,0x70,0x79,0xfb,0xc1,0xe3,0x4f,0xa4,0xe4,0x9e,0x22,0x0f,0x1e,0x06,0x04,0x9c,0x9f,0x75,0x30,0x80,0x08,0x1e,0x5e,0x03,0x08,0x80,0x0b,0xf8,0x0f,0x10,0x29,0x7e,0x01,0xe5,0x60,0x42,0x08,0x00,0x98,0x43,0x1f,0x16,0x17,0xf0,0x1e,0x53,0x00,0x7b,0xc0,0x81,0x82,0x50,0x2b,0x00,0x3e,0x20,0x80,0xc1,0xbf,0x80,0x86,0xe1,0x18,0xc0,0x79,0xc1,0xeb,0x18,0x80,0x70,0x09,0xe5,0xbc,0x07,0x8f,0x0e,0x1e,0x48,0x10,0x79,0x58,0x18,0x63,0xff,0x81,0xc0,0x27,0xf0,0xf0,0x78,0xeb,0xe6,0x5f,0xb0,0x78,0xa5,0x91,0xee,0x4e,0x61,0xf3,0x87,0xd5,0xcc,0x90,0x09,0xc0,0x3c,0x49,0xec,0x0f,0x59,0x00,0x3f,0xc5,0xe4,0x0f,0xe0,}; -const uint8_t *_I_tv8[] = {_I_tv8_0}; - -const uint8_t _I_url1_0[] = {0x01,0x00,0x33,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x08,0x20,0x3f,0x32,0x80,0xff,0x07,0xee,0x02,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0x0f,0xf0,0x7f,0x83,0xd6,0x0e,0x0f,0x29,0xf0,0x20,0x60,0x30,0x1d,0x40,0x10,0x8e,0x63,0xff,0xfc,0xff,0x01,0xe3,0x47,0x07,0x9c,0x90,0x1e,0x7a,0x0f,0xfe,0x3b,0xf7,0x7f,0xc0,0x6b,0xa9,0x1c,0x7d,0xcc,0xcf,0x49,0xce,0xe0,0xe6,0x60,0x9d,0x0b,0xff,0xef,0xee,0x0f,0x1d,0xe5,0x22,0x53,0x25,0xa4,0xeb,0x2a,0x52,0x2d,0x2c,0x13,0xe1,0xbf,0xfe,0xfb,0xc1,0xe3,0x8f,0x07,0x95,0xe7,0x48,0x0f,0x1d,0xe8,0x3c,0xbf,0xe0,0xf2,0xcf,0x03,0xca,0x12,0x0f,0x2c,0x28,0x3c,0x7b,0xf1,0xfe,0xf8,0x3c,0x7b,0xd7,0x0e,0x3c,0xe6,0x63,0xa5,0xe7,0x72,0x63,0x30,0x30,0x78,0xfb,0xfb,0xc5,0xf1,0x00,0x89,0x64,0x40,0x03,0x42,0x01,0x90,0x3c,0x7f,0xe0,0xf2,0x3f,0x88,0x3d,0xf8,0x02,0xd1,0x00,0x8a,0x7e,0x81,0xe3,0xbf,0x07,0xe9,0x7c,0xc1,0xf9,0xbf,0x07,0xc7,0xe1,0xb4,0x30,0x1a,0x05,0xff,0xff,0xe7,0x07,0xbc,0x18,0x04,0x30,0x25,0xf8,0xff,0xb8,0x60,0xf7,0x81,0x80,0x85,0x7e,0x2d,0xf1,0xc0,0x03,0xef,0xe0,0xff,0x18,0x38,0x3d,0xf8,0x78,0x98,0x40,0x3c,0xbf,0xf0,0xfb,0xf0,0x3d,0xa4,0x74,0xa8,0xc0,0x3c,0xe3,0xf7,0xc0,0x7b,0xca,0xa7,0x00,0xf3,0x9f,0xde,0x01,0xef,0x1a,0xbc,0x03,0xce,0xfe,0x0f,0x80,0xfa,0xff,0xc1,0xf0,0x3f,0x51,0x00,0x97,0xf4,0x1f,0x07,0xf5,0x07,0xf8,0x3e,0x60,0xeb,0xf2,0x07,0xdf,0xf9,0xbe,0x5e,0x00,0x79,0x4f,0xc1,0xed,0xfc,0x05,0x08,0x25,0x80,0x1e,0x00,0xf0,0x07,0x80,0x24,}; -const uint8_t *_I_url1[] = {_I_url1_0}; - -const uint8_t _I_url2_0[] = {0x01,0x00,0x33,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x08,0x20,0x3f,0x32,0x80,0xff,0x07,0xee,0x02,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0x0f,0xf0,0x7f,0x83,0xd6,0x3f,0xfc,0x07,0x8c,0xf8,0x10,0x30,0x18,0x0e,0xa0,0x08,0x47,0x31,0xff,0xf9,0xfe,0x60,0xf1,0xa3,0x83,0xce,0x48,0x0f,0x3d,0x07,0xfe,0x77,0xee,0xbf,0xe0,0x35,0xd4,0x8e,0x3e,0xe6,0x67,0xa4,0xe7,0x70,0x73,0x30,0x4e,0x87,0xff,0xdb,0xdf,0x07,0x8e,0xf2,0x91,0x29,0x92,0xd2,0x75,0x95,0x29,0x16,0x96,0x09,0xf0,0xff,0xfd,0xb7,0xe0,0xf1,0xc7,0x83,0xca,0xf3,0xa4,0x07,0x8e,0xf4,0x1e,0x5f,0xe0,0x79,0x67,0x81,0xe5,0x09,0x07,0x96,0x14,0x1e,0x37,0xf8,0xfd,0xfc,0x1e,0x3d,0xeb,0x87,0x1e,0x73,0x31,0xd2,0xf3,0xb9,0x31,0x98,0x18,0x3c,0x7d,0xf7,0xe2,0xf8,0x80,0x44,0xb2,0x20,0x01,0xa1,0x00,0xc8,0x1e,0x3f,0xf0,0x79,0x1f,0xc4,0x1e,0xfc,0x01,0x68,0x80,0x05,0x3f,0x40,0xf1,0x27,0x08,0x3f,0x0b,0xe6,0x0f,0xcd,0xf0,0x3e,0x3f,0x0d,0xa1,0x80,0xaf,0xc7,0xfb,0x9f,0x07,0xbc,0x18,0x04,0x30,0x25,0xf8,0xfe,0xe1,0xe0,0xf7,0x81,0x80,0x85,0x7e,0x5e,0x78,0x1d,0xf8,0x1f,0x4a,0xf1,0x8f,0xc7,0x2f,0x80,0xf6,0xe1,0xe2,0x61,0x00,0xf2,0xff,0xcf,0xef,0x00,0xf6,0x91,0xd2,0xa3,0x00,0xf3,0xbf,0xdc,0x01,0xef,0x2a,0x9c,0x03,0xcf,0xff,0x60,0x07,0xbc,0x6a,0xf0,0x0f,0x4b,0x08,0x7f,0xac,0x63,0xfd,0x20,0x09,0x7f,0x41,0xf0,0x7f,0x50,0x7f,0x83,0xe6,0x0e,0xbf,0x20,0x7d,0xff,0x9b,0xe5,0xe0,0x07,0x94,0xfc,0x1e,0xdf,0xc0,0x50,0x82,0x58,0x01,0xe0,0x0f,0x00,0x78,0x02,0x40,}; -const uint8_t *_I_url2[] = {_I_url2_0}; - -const uint8_t _I_url3_0[] = {0x01,0x00,0x2e,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x08,0x20,0x3f,0x32,0x80,0xff,0x07,0xee,0x02,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0x0f,0xf0,0x7f,0x83,0xe6,0x7c,0x08,0x18,0x0c,0x07,0x50,0x04,0x23,0x98,0x83,0xd2,0x8e,0x0f,0x39,0x20,0x3c,0xf4,0x1f,0xf8,0xff,0xf2,0xff,0x80,0xd7,0x52,0x38,0xfb,0x99,0x9e,0x93,0x9d,0xc1,0xcc,0xc1,0x3a,0x1f,0xff,0x3f,0xcc,0x1e,0x3b,0xca,0x44,0xa6,0x4b,0x49,0xd6,0x54,0xa4,0x5a,0x58,0x27,0xc3,0xff,0x3b,0xf7,0x03,0xc7,0x1e,0x0f,0x2b,0xce,0x90,0x1e,0x3b,0xd0,0x79,0x7b,0x7b,0xe0,0xf1,0xcf,0x03,0xca,0x12,0x0f,0x2c,0x28,0x3c,0xa2,0xdb,0xf0,0x78,0xf7,0xae,0x1c,0x79,0xcc,0xc7,0x4b,0xce,0xe4,0xc6,0x60,0x60,0xf1,0xf7,0x6f,0x8b,0xe2,0x01,0x12,0xc8,0x80,0x06,0x84,0x03,0x2f,0x85,0xff,0xff,0x7e,0x3f,0x98,0x3d,0xf8,0x17,0xf0,0x01,0x27,0xe8,0x1e,0x23,0xe1,0x07,0xea,0x78,0x43,0xfe,0x0f,0x7f,0xc2,0xe8,0x60,0x2b,0xf1,0xff,0x04,0x04,0x1e,0xd0,0x60,0x10,0xc0,0x97,0xe2,0x0f,0x98,0x18,0x08,0x57,0xe5,0xfd,0xcf,0x83,0xed,0x1e,0x3f,0xb8,0x78,0x3d,0xf8,0x78,0x98,0x40,0x3c,0xbc,0xf0,0x3b,0xf0,0x3d,0xa4,0x74,0xa8,0xc0,0x3c,0xa3,0xf1,0xcb,0xe0,0x3d,0xe5,0x53,0x80,0x79,0x7f,0xe7,0xf7,0x80,0x7b,0xc6,0xaf,0x00,0xf3,0xbf,0xdc,0x03,0xfb,0xff,0xb0,0x0f,0xf0,0x00,0x36,0x12,0xfe,0x00,0x06,0xc6,0x7f,0xc2,0x01,0x03,0xfc,0x1e,0xd0,0x75,0xf9,0x03,0xef,0xfc,0xdf,0x2f,0x00,0x3c,0xa7,0xe0,0xf6,0xfe,0x02,0x84,0x12,0xc0,0x0f,0x00,0x78,0x03,0xc0,0x12,}; -const uint8_t *_I_url3[] = {_I_url3_0}; - -const uint8_t _I_url4_0[] = {0x01,0x00,0x31,0x01,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf8,0x07,0xfc,0x00,0x33,0xf0,0x75,0x60,0x01,0xe5,0x7f,0x07,0xde,0x4e,0x49,0x49,0xb9,0x03,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x08,0x20,0x3f,0x32,0x80,0xff,0x07,0xee,0x02,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0x0f,0xf0,0x7f,0x83,0xe6,0x7c,0x08,0x18,0x0c,0x07,0x50,0x04,0x23,0x98,0x83,0xd2,0x8e,0x0f,0x39,0x20,0x3c,0xf4,0x1f,0xf8,0x38,0x3c,0x70,0x1a,0xea,0x47,0x1f,0x73,0x33,0xd2,0x73,0xb8,0x39,0x98,0x27,0x43,0xff,0xf9,0xfe,0x03,0xc7,0x79,0x48,0x94,0xc9,0x69,0x3a,0xca,0x94,0x8b,0x4b,0x04,0xf8,0x7f,0xf1,0xdf,0xb0,0x78,0xe3,0xc1,0xe5,0x79,0xd2,0x03,0xc7,0x7a,0x0f,0x1b,0xff,0xef,0xee,0x0f,0x1c,0xf0,0x3c,0xa1,0x20,0xf2,0xc2,0x83,0xc7,0x7f,0x1d,0xf7,0x83,0xc7,0xbd,0x70,0xe3,0xce,0x66,0x3a,0x5e,0x77,0x26,0x33,0x03,0x07,0x8f,0xbf,0xdc,0x5f,0x10,0x08,0x96,0x44,0x00,0x34,0x20,0x19,0x7c,0x3b,0xff,0xfe,0xf1,0xfc,0xc1,0xef,0xc0,0xef,0xdf,0xc0,0x22,0x9f,0xa0,0x78,0xef,0xc1,0xfd,0xff,0x0f,0xf8,0x3e,0x3f,0x0b,0xa1,0x80,0xd0,0x37,0xff,0xf3,0x78,0x83,0xda,0x0c,0x02,0x18,0x16,0x80,0x1f,0x50,0x30,0x10,0xaf,0xc6,0xff,0xff,0xf3,0x83,0xed,0x7e,0x3f,0xee,0x18,0x3d,0xf8,0x78,0x98,0x40,0x3c,0xbf,0x38,0x00,0x7b,0xc8,0xe9,0x51,0x80,0x79,0x41,0xe0,0xe0,0xf8,0x95,0x4e,0x01,0xe5,0xff,0x87,0xdf,0x81,0xef,0x1a,0xbc,0x03,0xce,0x3f,0x7c,0x0f,0xec,0xfe,0xf0,0x3f,0xcf,0xfd,0xfc,0x1e,0xe5,0xf5,0x00,0x08,0x3d,0xcf,0xea,0x20,0x20,0x7f,0x83,0xda,0x0e,0xbf,0x20,0x7d,0xff,0x9b,0xe5,0xe0,0x07,0x94,0xfc,0x1e,0xdf,0xc0,0x50,0x82,0x58,0x01,0xe0,0x0f,0x00,0x78,0x02,0x40,}; -const uint8_t *_I_url4[] = {_I_url4_0}; +const uint8_t _A_Levelup2_128x64_0[] = {0x01,0x00,0x34,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0x38,0x1f,0xe0,0x1d,0x97,0xff,0xe7,0x1c,0x1f,0x99,0xf8,0x1c,0xfc,0x1f,0x96,0x7f,0x87,0x03,0xf8,0x0f,0xb8,0xdc,0x22,0x01,0xfb,0x07,0xdc,0x16,0x09,0x00,0xfa,0x03,0xee,0x1d,0x02,0x80,0x7a,0x0b,0xd7,0x31,0x07,0x8f,0x40,0x1f,0x5b,0xfa,0x04,0x06,0x01,0xa0,0x07,0xd5,0x7f,0x00,0x0f,0xe8,0x26,0x06,0x7f,0x40,0x07,0xd4,0xbe,0x05,0x42,0xa0,0x03,0xf2,0x03,0x24,0xcf,0xe0,0x3f,0xc5,0xe9,0x88,0x50,0x72,0x92,0x0c,0x08,0x3e,0x73,0xf1,0xf9,0x0d,0x22,0xf9,0x82,0x07,0xcd,0xbe,0x61,0x10,0x94,0x79,0xa0,0x5f,0xd0,0x7c,0x45,0xe8,0x11,0x09,0x27,0x8c,0x1f,0x50,0xb3,0xf0,0xc5,0x3c,0xe0,0xfb,0x80,0x40,0xb2,0x9f,0xf0,0x7d,0x7a,0xe0,0x10,0xc0,0x7e,0x46,0xe0,0x77,0x00,0x7e,0x42,0xe1,0x98,0x0d,0x2d,0xfc,0x1f,0x71,0x08,0x05,0x3a,0x7f,0x01,0x37,0xd4,0x81,0xfa,0x39,0xf8,0x01,0xfe,0xe0,0x12,0x0a,0x40,0x3e,0xa5,0xef,0xe2,0x98,0x03,0xee,0x01,0x06,0x80,0x10,0x84,0x1f,0x35,0xf8,0x04,0x62,0x00,0x00,0x10,0x7c,0xef,0xe0,0x1e,0x00,0x7e,0x5f,0xc7,0xc3,0x0f,0x07,0xda,0x6c,0x43,0xc4,0x0f,0xb8,0x28,0x3f,0xa1,0xa0,0xfe,0x8a,0x8b,0xfc,0x1f,0xe0,0xfe,0x2f,0xa7,0xe8,0xff,0x30,0x30,0x7f,0x83,0xcf,0xe8,0xaf,0x91,0x7a,0x03,0xff,0xd0,0xdf,0x90,0x7a,0x74,0x1f,0xf2,0xcf,0x10,0x01,0x68,0x01,0xf1,0x17,0x07,0xa5,0x00,0x1f,0x10,0x90,0x7a,0x60,0x3f,0x80,0xd5,0xc7,0xdf,0xe0,0xc0,0xf4,0x80,0x7c,0xc1,0xeb,0x77,0xc0,0x40,0x41,0xe9,0x01,0xe6,0x03,0xd7,0x17,0x7f,0x05,0x08,0x3d,0x26,0x18,0x00,0x7a,0x42,0xc1,0x44,0x0f,0x4e,0x05,0xfc,0x1f,0xa5,0x11,0xff,0x03,0xcc,}; +const uint8_t _A_Levelup2_128x64_1[] = {0x01,0x00,0x17,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x2f,0xf8,0x17,0x59,0xfe,0xf8,0x6b,0x37,0xf9,0xf0,0x32,0x7e,0xc1,0xac,0x02,0x19,0xff,0xfe,0x03,0xfc,0x11,0x5c,0xfe,0x7f,0xfe,0xf1,0x8c,0x2e,0x3d,0xce,0x80,0xe7,0xbe,0xff,0x90,0x7c,0xc3,0xe6,0x18,0x0b,0x0f,0xfb,0xf0,0x61,0x8c,0x7c,0x3e,0x19,0x40,0xc0,0x43,0x6f,0xc1,0xe8,0xbf,0xe3,0xa1,0x52,0x08,0x04,0x0a,0xfe,0x83,0x7f,0xdf,0xf6,0x09,0x05,0x88,0x40,0x30,0x89,0x28,0xfb,0xfb,0xf0,0x10,0x40,0x78,0xca,0x0f,0xee,0x00,0x18,0xfd,0x02,0x05,0x08,0x80,0x44,0x3f,0xc6,0x08,0xbf,0xd2,0x3f,0xc0,0xf2,0xfe,0x7f,0x41,0xef,0xf7,0x90,0x40,0xe1,0xf0,0x09,0x06,0xf1,0x3d,0x3a,0x88,0x04,0x63,0xf1,0xa3,0xfc,0x03,0xe6,0xa1,0x10,0x90,0x41,0x28,0x80,0xf1,0xf3,0xbe,0x5a,0xff,0xb2,0x88,0x50,0x3f,0x54,0x80,0x78,0xb0,0xda,0xfb,0xff,0xd8,0x42,0x30,0x50,0x5a,0x8e,0xe2,0x1f,0xfc,0xf7,0x84,0x17,0xf9,0x68,0x84,0x40,0xbc,0x79,0x2f,0xe7,0xdc,0xdf,0x17,0x88,0x46,0x07,0xc5,0xa3,0xfe,0x3c,0x9e,0xff,0x38,0xfc,0x41,0xf0,0x3e,0x5d,0x2f,0xe0,0x1e,0xf2,0x78,0x04,0xe2,0x19,0x80,0xfe,0xe9,0x78,0x1f,0x00,0x7b,0x61,0xf4,0x31,0xc7,0xf8,0xff,0x64,0xb0,0x9f,0xe7,0xff,0xbe,0x10,0x58,0x1b,0xf8,0x81,0xe3,0x01,0xff,0x6f,0xf7,0xe0,0xf5,0xd1,0xc1,0x30,0x18,0x1f,0xec,0x4e,0x13,0x8f,0xfb,0x83,0xda,0x1f,0xe4,0x80,0x65,0xbf,0x71,0x2c,0x0f,0x9f,0xe7,0xdf,0x39,0x1d,0xee,0xfd,0x9f,0x8a,0x40,0xfc,0x17,0xf8,0x4f,0x27,0xff,0xfb,0xf7,0xb8,0x8e,0x7f,0xfc,0x9f,0x43,0x21,0x90,0x0f,0x82,0x08,0x59,0xaf,0xff,0xcf,0xc3,0xa2,0x10,0x0c,0x04,0x1a,0x53,0xe0,0x07,0xa9,0x10,0x60,0x10,0xa9,0x04,0x02,0x01,0x01,0x80,0x83,0xda,0xff,0x1f,0xd0,0x42,0xa8,0x00,0xf1,0x80,0x6a,0x51,0xe3,0xf3,0x08,0x26,0x7a,0x03,0x12,0xc0,0x40,0x44,0x04,0x8f,0x1f,0x39,0xfd,0xa2,0x50,0x08,0x30,0x7c,0xbf,0xdf,0xfe,0x79,0xfd,0xa4,0x50,0x0b,0xc0,0x7c,0x81,0xee,0x96,0x1a,0x10,0xf8,0x83,0xe2,0x2f,0x1f,0x7f,0xec,0x1e,0x7c,0xf8,0x5e,0x08,0x1e,0x70,0x11,0xf0,0xa3,0xd0,0xfc,0x3a,0x38,0x11,0x38,0x83,0xe3,0xf7,0xf1,0xab,0x8d,0x4a,0x2d,0xf1,0x81,0x40,0x81,0xe5,0xc1,0xff,0xfc,0x45,0xc8,0x04,0x1d,0x38,0x38,0xe0,0x1c,0x99,0xff,0xe0,0xbc,0xbf,0x38,0x7c,0x0c,0x1e,0x74,0x28,0x79,0x80,0x49,0xc9,0xc3,0x97,0x83,0xd2,0x15,0x06,0x0f,0x2c,0xde,0x0f,0x87,0x17,0xa4,0x12,0x04,0x1f,0x1f,0x78,0x3c,0xa9,0x70,0xed,0x00,0x3d,0x34,0x92,0x0c,0xf6,0xfc,0xc0,0x78,0xb8,0xe5,0x00,0x1e,0x90,0x88,0x05,0x9f,0x3e,0x2f,0x38,0x5e,0x0e,0x44,0x0f,0x49,0x84,0xab,0x33,0xce,0x07,0xa4,0x72,0x30,0x0f,0x4e,0x04,0x03,0x0c,0x60,0x48,0xbf,0x82,0x0e,0x0f,0x48,0x07,0xff,0x02,0x0f,0x50,0x48,0x83,0xd6,0x01,0x80,0x07,0x89,0x40,0xa5,0xe0,0xf6,0x61,0x8d,0x01,0x22,0x80,0xfa,0xb3,0x03,0xce,0x82,0x0f,0x89,0x07,0x00,0xfe,0x78,0x10,0x7c,0xf8,0x3f,0x22,0x02,0x81,0x82,0x04,0x1e,0xd9,0x0a,0x17,0xf0,0x3e,0x40,}; +const uint8_t _A_Levelup2_128x64_2[] = {0x01,0x00,0xed,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x3f,0xe4,0x1f,0xdf,0x40,0x43,0xf3,0xc0,0xa9,0x7f,0xfb,0x03,0xdf,0x66,0x05,0x4d,0xff,0xbc,0x1e,0xf3,0xbf,0xf0,0x14,0xe3,0xf7,0x8f,0xf7,0xc4,0x1e,0xb1,0x3f,0xe0,0x14,0xe1,0xf9,0x02,0x0b,0xc5,0xc1,0xeb,0xcc,0xff,0x03,0xda,0x1e,0x0f,0x48,0x3f,0xbf,0xfd,0xf8,0x07,0xad,0xfc,0x1e,0x57,0xff,0xf4,0x0f,0xe7,0xff,0x07,0xaf,0x8e,0xff,0xf8,0xed,0xc7,0xee,0x1f,0xc8,0x18,0x34,0x41,0xeb,0xc3,0x9f,0xfc,0x3f,0x70,0xfe,0x07,0xfe,0x01,0x9c,0x0b,0x88,0x88,0x41,0xe7,0x1f,0xc8,0x5f,0xe0,0x7c,0x08,0x7c,0x03,0xf9,0x7f,0x9e,0x07,0xd3,0x8f,0x17,0x80,0x5e,0xde,0xe5,0x0a,0xff,0x4f,0xe3,0xc0,0xf4,0xc7,0xcf,0xe0,0x11,0x32,0x68,0x84,0x07,0xf7,0x3f,0x4b,0xa7,0xe2,0x7f,0x7f,0x82,0x70,0x20,0xb9,0xdd,0x54,0x08,0x3e,0x21,0xe4,0xfc,0x4d,0xff,0x10,0xe9,0x86,0x22,0xc0,0x1f,0x1b,0xf8,0xb8,0x58,0x47,0xfe,0x99,0xda,0x31,0xd0,0xcc,0x46,0x03,0x53,0x82,0xbd,0xe7,0x83,0xe9,0x3f,0x99,0xf0,0x20,0x90,0x28,0x24,0x06,0x05,0x80,0xbf,0xe3,0x2f,0xeb,0xe5,0x07,0x8c,0x04,0x02,0x3a,0x4e,0x07,0xbf,0x00,0xa6,0x25,0xf1,0xe0,0x30,0x10,0x00,0x78,0xc2,0x30,0x13,0xc0,0x79,0x00,0x0e,0xfd,0x80,0xa0,0x03,0xcb,0x21,0x0a,0x08,0x88,0x39,0x19,0x83,0x00,0x07,0x8c,0x0a,0x05,0x10,0x30,0x0f,0x03,0x7e,0x0f,0x3c,0xe7,0xbe,0x03,0x20,0x07,0x96,0x82,0x05,0x00,0x90,0x23,0xd2,0x33,0xff,0x07,0xa0,0x0c,0x41,0xe7,0xc7,0x07,0x8c,0x6b,0x9d,0x01,0x15,0x88,0x3c,0x68,0x1a,0x88,0x54,0x00,0x18,0x38,0xb0,0x10,0x9e,0x04,0x1e,0xa1,0xf1,0xc7,0x7f,0xfc,0x7f,0xd0,0x78,0xc1,0xe0,0x18,0x00,0xc8,0xa0,0x07,0x01,0xaa,0x85,0x36,0x47,0xce,0x3f,0x28,0x69,0x20,0x71,0x10,0x70,0x78,0xe3,0xc2,0xc3,0xff,0x07,0x18,0x00,0x60,0x38,0x0a,0x54,0x23,0xff,0x87,0xc8,0x68,0xa1,0x5f,0x80,0x7a,0x8c,0x06,0x49,0x90,0x80,0xd3,0x24,0x01,0x61,0xfc,0xfe,0xc1,0xeb,0x8a,0x92,0x54,0x20,0x15,0x09,0x06,0xa7,0xc0,0xeb,0x20,0x71,0x5f,0xe1,0xf0,0x0a,0xa4,0xc2,0x41,0x60,0xa8,0x40,0x7e,0x1e,0xff,0xe8,0x3c,0xa1,0xff,0xf8,0xf4,0xa3,0xa9,0x30,0x91,0x58,0xab,0x1a,0x9f,0x87,0x1e,0xff,0xde,0xc7,0x8b,0x47,0xd2,0x1f,0x1e,0xa4,0x42,0x45,0x42,0xac,0x07,0xc7,0x8f,0x3f,0xff,0x61,0xff,0xff,0x7e,0xfc,0x1f,0x40,0x0f,0x41,0xf8,0xf9,0xdf,0xa3,0xe3,0x7f,0x98,0x7c,0x62,0x2e,0x21,0xae,0x40,0x78,0x00,0xc2,0x4f,0x91,0x40,0x43,0xe3,0x1f,0x75,0x8d,0x7f,0x53,0x80,0xf1,0xbb,0xd0,0x00,0x30,0x0d,0x26,0x7f,0xff,0xcf,0x97,0xc0,0x60,0x1f,0x00,0x50,0x82,0x07,0xff,0xf3,0xfe,0xe0,0x64,0x94,0xf8,0x07,0x42,0x4f,0xa9,0x81,0x7f,0x3e,0xe0,0xf2,0xfe,0x78,0x3d,0xf0,0x1a,0x24,0xc2,0x01,0x60,0x88,0x07,0xc7,0xfc,0x0f,0x10,0xe8,0xa4,0xca,0x01,0x84,0x1f,0x94,0x3f,0x52,0xdf,0x10,0xf0,0xf9,0xfe,0x3f,0xfe,0x3c,0xf2,0x01,0x04,0x88,0x17,0xc5,0xe4,0x30,0x02,0x20,0xf7,0xfc,0xff,0x9f,0xfc,0x0a,0x31,0xa0,0x82,0x48,0x20,0x00,0x11,0xd4,0xe0,0xb3,0xfc,0x7f,0x3f,0xcf,0xf9,0xff,0x90,0xc0,0x03,0xe2,0x0f,0x36,0xf8,0xc3,0xf8,0x3e,0x7b,0xc0,0xf4,0x6f,0xf0,0x00,0xfa,0xe0,0x61,0x50,0x7f,0x05,0xde,0x38,0x7e,0x38,0x04,0x18,0x7a,0x24,0x11,0x81,0x81,0xc7,0xc1,0x13,0xc0,0x03,0x87,0x9f,0x80,0xd5,0x03,0xd3,0x07,0x0a,0x85,0x7c,0x20,0x3e,0x00,0x78,0xed,0xc2,0xe3,0x05,0xe0,0x40,0x23,0x00,0x41,0x41,0x8f,0x81,0x44,0x2b,0x21,0xa5,0x6a,0x31,0x50,0x4c,0x07,0xe6,0x19,0x00,0xc4,0xea,0xb2,0x41,0x91,0xfc,0x07,0xc7,0x15,0x01,0xb0,0x03,0xc6,0x0e,0xe4,0x19,0x8c,0x03,0x18,0x0f,0x1d,0xc7,0xef,0xff,0x08,0x87,0x46,0x20,0x86,0xc1,0x01,0x0f,0x07,0x01,0x83,0x81,0x4a,0xb9,0x06,0xe1,0x84,0x7c,0x20,0xe0,0xc1,0x83,0x17,0x46,0x03,0x7f,0xc0,0x18,0x48,0x5e,0x25,0x91,0x47,0x88,0xdc,0x40,0x82,0x00,0x1a,0x06,0x88,0xc2,0x20,0xf6,0x00,0x21,0xd4,0x4b,0xe2,0x0f,0x15,0x79,0x83,0xd7,0x41,0xaa,0x85,0x2f,0x87,0xfe,0xa9,0x10,0x7b,0x82,0x4b,0xfc,0xbf,0x11,0x29,0x00,0x1b,0x21,0xaa,0x95,0x03,0x87,0xfd,0x94,0x07,0xc4,0x20,0x3e,0x5f,0xff,0xc4,0x2e,0x02,0x0d,0x50,0x30,0xe9,0x07,0xe3,0xf6,0xff,0xfe,0x61,0x70,0x61,0xfa,0x83,0xc5,0xc2,0x4a,0xf2,0x81,0x9e,0xc4,0x1e,0xbf,0x8d,0x46,0xab,0x14,0x0f,0x20,}; +const uint8_t _A_Levelup2_128x64_3[] = {0x01,0x00,0x2d,0x03,0x8f,0xc0,0xb8,0x1f,0xfb,0xfd,0xe2,0x7f,0xf8,0x02,0x0f,0xff,0xff,0x03,0xff,0x00,0xc6,0xff,0x36,0xe0,0x47,0xfd,0xff,0x08,0xff,0xf3,0xff,0x3f,0x05,0x8f,0xf0,0x1e,0x5f,0xf8,0xfe,0x02,0xfb,0xff,0xf8,0x43,0xff,0x99,0xfd,0xf8,0x44,0x81,0xe7,0x17,0x88,0x7d,0x37,0xe0,0xf2,0x87,0xe7,0xff,0xe0,0x11,0xfe,0x83,0xca,0x1f,0x20,0xf8,0x0f,0x46,0x0f,0xfe,0x83,0xf6,0xff,0xfc,0xf0,0xfa,0x47,0xec,0x1e,0x08,0xf8,0x3c,0xa0,0x7c,0x3f,0xff,0x9c,0x1e,0x93,0xf8,0x06,0x02,0x1f,0xf8,0x2c,0x8c,0x07,0xc1,0xff,0xfd,0x83,0xdb,0xc1,0x07,0xfc,0x40,0x6f,0xda,0x0d,0x47,0xff,0xf2,0x0f,0x4b,0xf8,0x7c,0x60,0xda,0x88,0x0c,0x72,0x01,0xb0,0xff,0xe0,0x01,0xe9,0xff,0x80,0x68,0x21,0xff,0xa9,0x06,0x02,0x01,0xf2,0xbf,0x40,0x12,0x44,0x1f,0x2b,0x82,0xa1,0x7d,0x11,0xf8,0x05,0xf8,0x1e,0x74,0x7f,0x80,0xc0,0x75,0x50,0xa8,0x04,0x83,0xf0,0x0f,0x1b,0xe1,0x48,0x6f,0xfb,0x78,0x38,0x3c,0x40,0x09,0xfc,0x81,0x83,0xcb,0xfb,0xbf,0xbf,0xcb,0xbe,0x1a,0x8d,0x56,0xaa,0x55,0x80,0x85,0x18,0xc4,0x5e,0xb3,0xce,0x00,0x7d,0x7b,0x80,0x21,0xdf,0xcf,0xef,0xee,0x72,0x2f,0x8e,0xaa,0x01,0xa8,0xd1,0x62,0xa7,0xfa,0x0c,0x06,0x7d,0x82,0x33,0x8f,0x3d,0xfe,0x04,0x18,0x15,0x68,0xc0,0x1e,0xa2,0x02,0x1f,0x0f,0xff,0xbf,0x3f,0xe3,0xcf,0xc7,0x63,0xca,0xd7,0xe7,0xf5,0x58,0xa8,0x3e,0xa3,0x80,0x8e,0x29,0xfe,0x3c,0x2e,0x30,0x0b,0x87,0x76,0xea,0x73,0x11,0x10,0xd8,0x01,0xe5,0xcf,0x9f,0xcf,0xf5,0x50,0x2d,0x61,0x80,0x75,0x38,0xa2,0x28,0xda,0x09,0x63,0x9f,0x1f,0x0c,0xf8,0x3e,0x35,0x6a,0xad,0x54,0x3a,0x20,0x01,0xba,0x7f,0xf7,0xf9,0xff,0xbc,0xfe,0x7c,0x9c,0x1d,0x5e,0xbb,0x57,0xa6,0x85,0x68,0xb5,0x5b,0x8d,0xff,0x7f,0xde,0x0f,0x18,0x60,0xe8,0x43,0xc3,0x55,0x86,0x87,0xcb,0x31,0xfd,0xff,0xf9,0xfc,0xe4,0xe1,0xd4,0x72,0xb5,0x41,0xf1,0xcd,0x42,0x88,0x63,0xe4,0xff,0xfe,0x7c,0xff,0x18,0x38,0x5c,0x68,0x15,0x5a,0xbd,0x5e,0x2a,0x1f,0x2f,0x87,0xcf,0xf3,0x27,0xfc,0x41,0xe5,0x4b,0xe2,0x00,0x16,0x29,0x86,0x3f,0x0f,0x8e,0xe2,0x07,0xfc,0x87,0x85,0xc6,0xc0,0x1f,0x29,0xa8,0x7c,0xbc,0x13,0x9f,0x74,0x0f,0xd1,0x0f,0x0d,0x0e,0xc8,0x3c,0x56,0xa2,0xf0,0xc0,0xbf,0x19,0x8f,0xfc,0x07,0xf9,0x06,0x0b,0x8d,0x40,0x3e,0x55,0x50,0xf9,0x7e,0x38,0x5f,0xf8,0x00,0x04,0x47,0xc6,0x80,0x10,0x21,0x42,0xaf,0x1d,0x09,0xfe,0x00,0x1e,0x20,0x01,0xec,0x07,0x46,0xab,0xdf,0x03,0x94,0xf3,0x85,0x0f,0x07,0x90,0x7c,0x7d,0x5a,0xaf,0xfe,0xbf,0x74,0x1f,0x19,0x54,0xf3,0xd0,0xb5,0x1e,0x1a,0xdc,0xfa,0xb5,0x5a,0xed,0xd6,0x02,0x1f,0x2f,0x00,0x0c,0x78,0xf0,0x1d,0x03,0x78,0x7f,0x5a,0xa0,0x08,0xea,0x47,0xe3,0x38,0xa0,0x40,0x25,0x1e,0x34,0xf9,0x55,0x2e,0xa0,0x01,0xaa,0x87,0xc8,0x00,0x7f,0xa8,0x06,0x8e,0x15,0xfc,0x1e,0x0f,0xab,0xf4,0x1f,0x20,0x71,0x42,0xbf,0x1e,0x70,0xc0,0xf5,0x2a,0xb7,0x7a,0xbd,0x74,0x3e,0xdf,0x8f,0xfe,0x0e,0x54,0x1f,0x59,0x54,0xaa,0x01,0x08,0xc0,0x28,0xc7,0xfe,0x63,0x10,0xf8,0x80,0x04,0x3f,0x08,0x81,0xd5,0x7f,0x37,0xe1,0xf1,0xff,0xea,0x70,0x41,0xf1,0x90,0x6a,0x20,0x5f,0xeb,0xf8,0x4c,0x7e,0x9d,0xff,0xff,0x7e,0xfe,0x1f,0x6d,0xf5,0xff,0x51,0x2a,0xd6,0x7b,0xcf,0xe3,0xaf,0xd4,0xe0,0x03,0xe2,0xa3,0x18,0x17,0xf2,0xf6,0x7f,0x3a,0xa9,0xfe,0x09,0xe3,0xa8,0x85,0x6b,0x07,0xe5,0xaf,0x80,0xe0,0x35,0x40,0x11,0x0f,0x97,0xfc,0x30,0x35,0x42,0xf9,0x07,0xde,0xfd,0x0f,0x0f,0x93,0xf0,0xb5,0x58,0x10,0xe9,0x07,0xca,0x7d,0x1f,0x1f,0xec,0xf2,0x7c,0x57,0x10,0xfa,0x6a,0x71,0x40,0x53,0x80,0x4e,0x03,0xe5,0x56,0x1f,0x9a,0x98,0x40,0x0c,0xb7,0x1d,0x77,0xab,0x54,0xc1,0x1d,0x5e,0x88,0x40,0x48,0x21,0xf0,0x4c,0x02,0x23,0x55,0xea,0xaf,0x86,0xab,0x05,0x80,0x58,0x03,0xa7,0xf4,0xb4,0x6a,0xb1,0x5a,0xed,0x57,0xec,0x04,0x38,0xbd,0x16,0xc8,0x3e,0x30,0xa8,0x07,0xf3,0xb1,0x01,0xb0,0x07,0xc6,0xaf,0x5f,0xaa,0xcd,0x60,0x1d,0xc4,0xfa,0x6a,0x21,0xdb,0x80,0xe0,0xea,0xc0,0x43,0xeb,0xc0,0x6a,0xc3,0xe3,0xa0,0x85,0x7f,0xab,0x3f,0x5a,0xb9,0x70,0x6a,0xe0,0x32,0xbf,0xf5,0x43,0xe7,0xff,0xdb,0x85,0x44,0x38,0x3f,0xa3,0xd9,0xda,0xa1,0x50,0xa2,0x00,0xcf,0x6a,0x67,0xc3,0x00,0x28,0x7c,0xf8,0x1a,0xf0,0xf9,0x80,0x12,0x55,0x28,0x94,0x2f,0xc7,0xc7,0x6b,0x0f,0x41,0x84,0x40,0x03,0x80,0xf0,0xf7,0xc3,0x8a,0x00,0x2c,0xd0,0x84,0x75,0x5c,0x2f,0x8e,0x7c,0x3f,0x10,0xd1,0xf1,0xfc,0x20,0x27,0x62,0x00,0x18,0x18,0x74,0xca,0x91,0x1f,0x8f,0xe1,0xba,0xae,0x18,0xfe,0x28,0x44,0xbe,0xba,0xbf,0xd6,0xa3,0x55,0xa2,0x0f,0x8f,0xf0,}; +const uint8_t _A_Levelup2_128x64_4[] = {0x01,0x00,0x90,0x02,0xff,0x80,0x3c,0x01,0xf1,0xff,0xe0,0x3f,0x7d,0xff,0xd1,0x0f,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x2d,0xff,0xee,0x0f,0xef,0x47,0xff,0xfc,0x06,0x2d,0xf8,0x3d,0xe0,0x3e,0x49,0x3f,0xc0,0xfc,0x7f,0x8f,0xfc,0xed,0x02,0x37,0xff,0xc5,0xbe,0x01,0xf0,0xaf,0xe0,0xc1,0xe7,0xe0,0xff,0xc0,0xc2,0xe3,0x1f,0xf8,0x4f,0xe0,0x17,0x0b,0xf5,0x81,0x34,0x40,0xf1,0xb8,0xc1,0x38,0x1f,0xd8,0x3f,0xe2,0x73,0x00,0xf7,0xc7,0xe4,0x02,0xb1,0xff,0xcf,0xf0,0x02,0x81,0xc0,0x77,0xe0,0x37,0xf8,0x47,0x82,0xff,0x0e,0x6e,0x1c,0x1d,0xc4,0x3e,0x08,0x0c,0x0b,0x80,0x2e,0x1f,0x00,0x08,0x60,0x06,0x02,0xc3,0xc0,0x41,0xe4,0x09,0x12,0x70,0xd8,0x23,0xf8,0x08,0x78,0x3c,0x7e,0xf0,0x78,0x1c,0x03,0x81,0x07,0xff,0x40,0xc0,0xa5,0x19,0x10,0x8a,0x00,0xc6,0x05,0xc4,0xd7,0xc7,0xc0,0x82,0x00,0x13,0xf1,0xa4,0xc6,0x9e,0x08,0x3b,0xf8,0x3c,0xcb,0xa4,0x02,0x13,0x90,0xc1,0xa0,0x1a,0xcd,0x56,0xa8,0x84,0x50,0x0f,0x67,0xff,0xe7,0xf1,0xf9,0xfb,0x3f,0x30,0xfa,0x80,0xd8,0xa0,0x71,0x40,0x78,0xff,0x39,0xfe,0x7b,0xff,0x9f,0x89,0xff,0x85,0xc0,0x35,0x7a,0xed,0x58,0x90,0x45,0xe5,0x87,0x1f,0x94,0x02,0x9f,0x08,0xca,0x01,0x8a,0x9f,0x15,0x07,0x8d,0xe3,0x80,0x0f,0x30,0xc8,0xf0,0x35,0x41,0xf1,0x8d,0x14,0x13,0x9f,0xfb,0x07,0x8c,0x02,0x21,0xd0,0x0b,0x15,0x7e,0x2a,0x51,0x1b,0x07,0xfb,0xcd,0xff,0xe1,0x9f,0x8b,0x40,0x5e,0x1d,0x54,0xa8,0x3c,0x53,0xc9,0xce,0x43,0xff,0x01,0x44,0x93,0xc4,0x5a,0xc5,0x55,0xa8,0x40,0x77,0xd1,0xe8,0x07,0xdd,0xa4,0x20,0xf1,0xd8,0x07,0xca,0xd4,0x1f,0x28,0xf3,0x80,0x6f,0xf3,0x05,0x78,0xc1,0x14,0xe7,0x7f,0xaa,0xd5,0x60,0x30,0x48,0x06,0x02,0x3f,0xfe,0xfe,0x90,0x07,0x51,0xaa,0x40,0x0e,0xa8,0xbe,0x66,0x91,0xe3,0x86,0x45,0x3c,0x3f,0x96,0x39,0xd5,0x2a,0xa1,0x04,0xf7,0xfe,0xc4,0xa3,0xe8,0xd5,0x7f,0xf5,0xfb,0xa0,0xfa,0x16,0x87,0xc7,0x6f,0x80,0x55,0x3f,0xa1,0xf3,0x1f,0x8b,0xc9,0x38,0x70,0x30,0x20,0xeb,0x3f,0x5a,0xa0,0x08,0xb8,0x0c,0x1e,0x58,0x10,0x18,0xd0,0x03,0xef,0x54,0x09,0xab,0x9c,0x77,0x5a,0xaf,0x57,0xe8,0x16,0xd1,0xfb,0x85,0xc2,0x00,0x1f,0x50,0x80,0xd5,0x22,0x20,0xf1,0xff,0x7e,0x3f,0x01,0xfb,0xec,0x7f,0xef,0x12,0x00,0x78,0x87,0xce,0x2b,0x04,0x82,0xc5,0x03,0xc4,0x08,0x1f,0x1c,0x07,0xf9,0xbf,0x0f,0x8b,0x60,0x43,0xe9,0x5b,0x4f,0x90,0x7d,0x6a,0x35,0x58,0x28,0x04,0x59,0xe3,0xbe,0xbf,0x83,0xc7,0x59,0xef,0x3f,0x8e,0xbc,0x3e,0xbf,0xf8,0xf8,0x04,0x43,0xeb,0x55,0xa2,0xd0,0x6a,0xb1,0x58,0x07,0xee,0x13,0x97,0x07,0x8e,0xb0,0x7e,0x41,0xf5,0xe0,0x7f,0xe1,0xb1,0xf8,0x7a,0xfd,0xc3,0xe3,0x05,0xb0,0x43,0xf8,0x17,0xf6,0xf8,0xeb,0x35,0x40,0x02,0x0f,0xa4,0xc2,0x09,0xe0,0x8c,0x40,0x2a,0xa1,0xf8,0x09,0x95,0xc8,0x2a,0x41,0xf9,0x00,0x0c,0x40,0x04,0x35,0x14,0xa1,0x00,0x06,0xa7,0x55,0xaa,0x17,0x84,0x00,0x36,0x00,0x19,0x6b,0xbd,0x5a,0xa6,0x08,0xc0,0xc3,0xeb,0xf8,0x98,0x40,0x22,0xa1,0xe3,0xff,0xd5,0xea,0xb6,0x53,0xf9,0x03,0xc6,0xd1,0x00,0xc0,0x6b,0xb5,0x5f,0xb0,0x10,0xc2,0xe0,0x1b,0x00,0xf9,0xfb,0xbf,0x35,0x1f,0x28,0x7d,0x27,0xf5,0x5f,0xe1,0x00,0x4c,0x23,0xfe,0xd5,0xc3,0xb7,0x01,0xc1,0xd5,0x80,0x87,0xd7,0x80,0xd5,0x87,0x8b,0x01,0xff,0xfd,0x87,0x50,0x00,0x95,0x44,0x18,0xf8,0x29,0xfb,0x33,0xd0,0x87,0x07,0xf4,0x81,0x3b,0x50,0xfc,0xe1,0x1f,0x70,0xf4,0x5f,0xea,0xb5,0x03,0x01,0x69,0xc3,0xe6,0x00,0x49,0x52,0x01,0x3d,0xe1,0xf8,0x30,0x8c,0x16,0x82,0xdc,0x1e,0x68,0x71,0x40,0x05,0x1a,0x0f,0xa1,0x84,0x40,0x0f,0x4f,0x2f,0x0a,0xac,0x42,0x03,0xab,0x0e,0xa8,0x18,0x60,0xcc,0x15,0x6e,0xa3,0x85,0x6a,0xb4,0x16,0x09,0x97,0xd7,0x57,0xfa,0x0f,0x28,}; +const uint8_t _A_Levelup2_128x64_5[] = {0x01,0x00,0x9c,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1f,0xff,0xfb,0xcf,0xff,0xf0,0x3f,0xc0,0x18,0x7e,0x1e,0x30,0x83,0xdf,0xef,0xd0,0x0e,0x27,0xf6,0xf7,0xfc,0xe7,0x83,0x9b,0x7f,0xff,0x8f,0xff,0xa4,0x63,0x1c,0xe3,0xea,0xf3,0xd1,0xc0,0x20,0xe7,0xc6,0x84,0x2f,0x5b,0x97,0xfe,0xef,0xca,0xf8,0xf1,0xe0,0x20,0xd6,0xff,0x4c,0x7d,0x9a,0xad,0xd5,0x87,0xe1,0x4f,0xc0,0x7f,0xff,0xc3,0xe4,0xbe,0x40,0x2e,0xd5,0x5b,0xae,0x0f,0xe7,0x0f,0xf0,0x7f,0xfc,0x22,0x04,0x9b,0xc0,0x35,0x7a,0xad,0x56,0x1b,0xff,0x00,0xf8,0x7f,0x78,0xe0,0xf4,0x9f,0xe0,0xaa,0xa0,0x01,0xd6,0xcf,0xe0,0x04,0xe1,0x38,0x98,0xf8,0x67,0xfc,0x70,0xf0,0xea,0xa3,0x50,0xf0,0x79,0x13,0x93,0xa1,0xff,0xa3,0xd5,0xc3,0xe3,0x17,0x80,0x40,0x3f,0x80,0xf5,0x0b,0x0e,0xbf,0x56,0x02,0x19,0x70,0x3c,0x67,0x07,0xf6,0xc7,0xd9,0xee,0xa5,0xf1,0x9a,0xc0,0x20,0x90,0x03,0x00,0xef,0xfd,0xe0,0xf2,0x87,0xec,0x37,0x5a,0xaf,0x55,0xa8,0x3e,0x23,0x12,0xfe,0xf7,0xdb,0xa3,0x9f,0x86,0x74,0x2b,0xb5,0x5e,0xa8,0x08,0x60,0x20,0xf1,0xf8,0x10,0x12,0x11,0xa8,0xd7,0x17,0xc7,0x56,0x0d,0x18,0xe0,0xc0,0x8f,0xa5,0xff,0x89,0xf6,0x0b,0xe5,0xdf,0xaa,0x40,0x6f,0xe0,0xf1,0xfd,0xb7,0x0e,0x07,0xe8,0xd5,0x7f,0xb5,0x7b,0xa8,0x06,0x02,0x1f,0x8c,0xf1,0xb0,0x47,0xc7,0xef,0x07,0x8f,0xd7,0xaf,0x57,0xaf,0xdf,0xea,0xb8,0x58,0x7e,0xff,0xce,0x1d,0x12,0x10,0xfc,0xe0,0x7e,0xcf,0xd6,0xab,0xf5,0xba,0x27,0x0c,0x0d,0xbc,0x26,0xe2,0xbf,0xcb,0xe0,0x15,0x5b,0xed,0x5f,0xef,0x55,0xa0,0x84,0x04,0x1e,0x30,0xf7,0x89,0x41,0x8e,0xc2,0x7f,0x2f,0xd1,0xb8,0xaf,0xf7,0xfb,0xf2,0xcc,0x7e,0x70,0xe8,0x07,0x52,0xab,0x57,0xab,0xd7,0x68,0xb0,0x58,0x00,0x6c,0x6f,0x8b,0x21,0xb1,0xa5,0x88,0x3e,0xc6,0xe4,0x17,0x0d,0x53,0xaa,0x1f,0x51,0x00,0x8f,0x4b,0xff,0x0c,0x0f,0x96,0xfc,0x3e,0x3f,0xf0,0xf9,0x40,0x3f,0xa0,0xf2,0xc4,0xc0,0xe8,0x1f,0x5e,0xef,0xff,0xbf,0x7d,0xa2,0xb0,0x0b,0xf1,0x7f,0x10,0x8f,0x82,0x0f,0x00,0xd7,0x7f,0xf5,0x7f,0xed,0x7c,0x0c,0x3c,0x38,0x0f,0xfc,0xe7,0xfd,0x8d,0xff,0xc7,0xcf,0xe2,0xff,0x2a,0xa8,0x7c,0x68,0x38,0x0e,0xf9,0x88,0x70,0xe3,0x11,0x80,0xeb,0xf7,0xfa,0xbf,0x76,0xbc,0x4c,0x20,0x01,0x83,0x08,0x45,0xc0,0x50,0x76,0xe8,0x80,0x11,0x42,0x58,0x06,0x88,0xff,0xe7,0xd0,0x5d,0x5b,0xf8,0x40,0x02,0x77,0x10,0x01,0x70,0x3e,0x2b,0xf1,0xbc,0x4e,0x2b,0xb7,0x5a,0xbd,0xdd,0x06,0x31,0x5a,0x00,0x7c,0x7c,0x1f,0xcf,0xbf,0xff,0xd3,0x78,0xdd,0x87,0x8b,0xd4,0x1f,0x48,0x04,0xc1,0xc0,0x57,0x81,0xd0,0xa7,0xc6,0xab,0x05,0xa0,0x18,0x44,0x20,0x58,0xcc,0x1c,0x7f,0xe1,0xab,0xf5,0x6b,0x84,0x42,0x1f,0x51,0x09,0x43,0xa8,0x17,0x51,0xe0,0x90,0x86,0x0b,0x50,0xb2,0x90,0x86,0x01,0xf0,0x81,0xda,0x0c,0x82,0x5f,0x1f,0xfe,0xbf,0x54,0xf6,0x1d,0x80,0x74,0x96,0x23,0xd8,0x80,0x85,0xc7,0xab,0x57,0xaf,0xd5,0x66,0xb5,0x4e,0xe5,0x51,0xc2,0x7a,0x88,0x76,0xe0,0x78,0x3a,0xbd,0x77,0xab,0xdc,0x26,0x16,0x09,0xdf,0xab,0x7f,0x52,0xd8,0x97,0xce,0xab,0x7f,0xea,0xd1,0x20,0x14,0x0f,0x84,0xff,0x6e,0x7b,0x11,0xf8,0xfe,0x80,0x83,0xae,0xd5,0x5a,0x87,0xe5,0xe0,0x9f,0xd5,0xdb,0x43,0x5d,0x5e,0x11,0x88,0x40,0xe2,0x3e,0x18,0x07,0x9e,0xff,0xad,0x5e,0x18,0x00,0x83,0xe3,0x2a,0x07,0x0f,0xf3,0x9f,0xff,0xb7,0x85,0xc4,0xb8,0x21,0xf2,0x13,0x8c,0xd6,0xaa,0x4e,0x1e,0x3e,0x73,0x9d,0xba,0x10,0x37,0xaa,0x34,0x5e,0x1e,0xff,0xff,0xf3,0xb0,0x1e,0x88,0x7d,0x7a,0xb4,0xda,0x84,0x01,0x9a,0x3e,0x38,0x02,0x68,0x40,0x0d,0x07,0x1f,0x8d,0xff,0xec,0x0f,0x1a,0xb0,0x7d,0xaa,0xb0,0x33,0x00,0xc7,0x04,0x02,0xb2,0x10,0xf3,0x7e,0x9b,0xa7,0x3b,0xff,0x00,}; +const uint8_t _A_Levelup2_128x64_6[] = {0x01,0x00,0x54,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0x5f,0x78,0x37,0x20,0x3f,0xc0,0x7e,0x4f,0xff,0xde,0x3e,0x38,0xae,0xf9,0xf0,0x1c,0xe0,0x7e,0xf8,0xf3,0x3f,0xfd,0x9f,0xdc,0x1f,0xbe,0x6c,0x03,0x31,0xfd,0x1f,0xdc,0xca,0x01,0x60,0xfd,0x03,0xaa,0xff,0x09,0x80,0x60,0x3e,0x80,0xfa,0xdf,0xc1,0x20,0x10,0x0f,0x48,0x3e,0xab,0xf0,0x20,0x78,0xf4,0x81,0xd3,0xf7,0x07,0xfc,0xbf,0x03,0xff,0x87,0xe9,0x36,0xe0,0xf8,0xf1,0xcb,0xec,0x30,0x09,0x86,0x93,0x7f,0xf7,0x0f,0xc6,0x5e,0x21,0x00,0xa0,0x52,0x23,0xe0,0xe7,0xfe,0x83,0xc6,0x10,0x6f,0x1a,0x46,0xfc,0x5f,0x1f,0xcc,0x59,0xbc,0xb1,0x3b,0xe4,0x6c,0x03,0xc6,0x0e,0x0f,0x1c,0x7e,0xfb,0x07,0xdf,0x59,0xad,0xfe,0xf9,0x4b,0x84,0x7f,0xb0,0x79,0x0f,0x76,0x1c,0x7e,0xff,0x8d,0x2e,0x5e,0x07,0x4e,0x97,0xfd,0x7f,0xc0,0xf6,0xfd,0xfe,0xec,0xb5,0x88,0x17,0x4a,0x60,0x2c,0x4f,0x79,0xbd,0x2a,0xb3,0x88,0x17,0x8a,0xa0,0x0f,0x2f,0x88,0x85,0xaa,0xb3,0x08,0x15,0x8a,0xa1,0xbd,0x03,0x8f,0xc0,0x7a,0x65,0x02,0xea,0xc4,0x20,0x54,0x2a,0xc0,0x20,0x6f,0x9f,0x0f,0x98,0x30,0x7f,0xd8,0x7f,0x1f,0xf8,0x1e,0xb7,0x78,0xf7,0xe3,0xf6,0x20,0x2c,0x3f,0x0f,0xdf,0xd5,0x88,0x83,0xc6,0xb8,0x1f,0x18,0x7f,0xf0,0xc4,0x90,0x7c,0x1d,0x56,0x3f,0x02,0xe1,0x55,0xc7,0xe3,0x07,0x07,0x13,0x50,0xa7,0xf0,0x2d,0x2e,0x63,0xff,0xcf,0x94,0x07,0xc7,0xc7,0xff,0x8f,0x84,0x4a,0xfb,0x7e,0xb1,0x49,0xab,0xf0,0x1e,0xa4,0x9f,0x97,0x3d,0xf0,0x16,0x44,0x04,0x21,0xe1,0xfe,0x5d,0xa8,0xb3,0x08,0x0d,0x92,0x21,0xf5,0x8f,0xfe,0x2f,0x7f,0xcf,0x08,0x3c,0xa0,0x17,0x8c,0x2c,0x7e,0x03,0xc4,0x87,0xfd,0x61,0xff,0xeb,0xef,0xf0,0x64,0x3f,0xf8,0xec,0x02,0xe1,0x05,0x88,0x40,0x68,0x90,0x0f,0xaa,0xac,0xbf,0x9f,0xfd,0xff,0x7e,0x30,0x0f,0x18,0x4c,0x82,0x05,0x22,0xc0,0x7d,0x01,0x83,0xfd,0xf6,0x7f,0xaf,0x7f,0xe9,0xc4,0x1a,0x84,0x0f,0x48,0x27,0xe3,0x85,0x6f,0x09,0x0f,0xff,0xf3,0x10,0x87,0xc1,0x22,0x20,0xf2,0xa0,0x03,0xc6,0x86,0x6e,0x1f,0xbf,0xf7,0xe7,0x00,0x83,0xc6,0x22,0x34,0x08,0x14,0x48,0x1e,0x37,0xef,0x3c,0x0f,0xfc,0x43,0x1f,0x9f,0x02,0x07,0xf0,0x90,0x83,0x04,0x44,0x30,0x49,0xe4,0x06,0x01,0x1c,0xfe,0x04,0x07,0x67,0x03,0xb8,0x48,0x78,0x10,0x48,0xc8,0x3c,0x60,0x16,0x08,0x00,0x08,0x5e,0x43,0x4b,0x87,0x64,0x24,0x38,0x0f,0xec,0x36,0x41,0x0c,0x80,0x64,0x01,0xe3,0x00,0xf0,0x7b,0xf1,0x70,0x1b,0x04,0x47,0x01,0x07,0x87,0xd0,0x26,0x90,0x0c,0x64,0xc2,0x01,0xf0,0x58,0x0c,0x2e,0x1c,0x4f,0x18,0x04,0x06,0x09,0x40,0xe2,0x60,0x30,0x7b,0x88,0x07,0xfb,0xe2,0x0f,0x1f,0x84,0x1c,0x1e,0x30,0x68,0x19,0x48,0x6f,0xf8,0x0c,0x04,0x3f,0xdd,0xff,0xf6,0x45,0xe4,0x10,0x08,0x4c,0x03,0xf1,0x00,0x47,0x8c,0x82,0x81,0xc0,0x85,0xa4,0x07,0x82,0x0f,0x40,0x00,0x83,0xd2,0x23,0xd8,0xfc,0x61,0xe5,0xe0,0xf1,0x85,0x03,0xd4,0x10,0x26,0xe1,0xbc,0x47,0xe4,0xe0,0xf6,0x81,0x03,0xcb,0xe1,0x71,0xfc,0x4f,0xe8,0x71,0x00,0x7b,0x50,0x01,0x03,0xe0,0x81,0x83,0xc7,0x0f,0x08,0x07,0xb6,0x03,0x90,0x05,0x18,0x77,0x3e,0x5f,0x03,0x83,0x83,0xda,0x01,0xf7,0xe1,0xc3,0xff,0x11,0xbb,0xe4,0x16,0x0c,0x0f,0x7f,0xdf,0x9e,0x3f,0x70,0xbd,0xff,0x0f,0x64,0x0f,0x5f,0xc5,0xc2,0x79,0x3c,0x57,0x0f,0xfc,}; +const uint8_t _A_Levelup2_128x64_7[] = {0x01,0x00,0xf7,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x05,0xfd,0x83,0xfb,0xbe,0x20,0xf0,0xff,0x83,0x72,0x01,0xfe,0x07,0xdf,0xf6,0x3f,0xff,0xf8,0x83,0xf3,0xcf,0xf8,0xe7,0xc0,0xff,0xc0,0xf9,0xfc,0x46,0x60,0xd3,0x00,0xfe,0x41,0xa0,0x3c,0x0e,0xf0,0x3e,0xaf,0xb8,0x18,0x06,0x03,0xba,0x0f,0xad,0xfd,0x06,0x01,0x00,0xed,0x9e,0xee,0x80,0x0f,0x1f,0xa8,0x3e,0xb5,0xf2,0x00,0x78,0xfa,0x81,0xfb,0xf8,0xf5,0xb6,0xab,0x2e,0x0f,0x18,0x3f,0x5b,0x7e,0x10,0x9c,0xbf,0xfb,0x01,0x00,0xec,0x07,0xeb,0x17,0x01,0xa0,0xc0,0x76,0x01,0xf9,0x07,0x8d,0xf2,0x45,0x02,0x07,0xdd,0x2f,0x05,0x14,0x82,0x68,0x01,0xf3,0xe0,0xa2,0xe0,0xe1,0xb0,0x4b,0x03,0x8c,0x43,0xf1,0x25,0xa1,0xc2,0x61,0x16,0x08,0x5f,0xe8,0x1f,0x1a,0x59,0xe4,0x2b,0x11,0x6f,0x0f,0xcf,0xff,0x4b,0x24,0x85,0x5a,0x2e,0x04,0xfa,0xd1,0x03,0xc6,0x31,0xa0,0xdf,0x07,0xe7,0x44,0x2f,0x18,0x67,0x03,0x7d,0xfe,0x07,0xc5,0x0a,0x87,0x0a,0x89,0x60,0x01,0xc3,0xfd,0x06,0xac,0xff,0xff,0x46,0xc1,0xf3,0x64,0xf9,0xc1,0x7c,0x5f,0xfd,0xd8,0x6f,0x14,0xfe,0x51,0xa3,0xef,0x0f,0xe7,0x15,0x1c,0x80,0x7a,0x38,0x03,0xe9,0xff,0xc2,0xa1,0x70,0x09,0x47,0x03,0xfb,0xf7,0x07,0xc4,0x4a,0x09,0x00,0x8c,0x50,0x09,0xa3,0xef,0x1f,0x28,0x1c,0x41,0xe5,0x08,0x07,0x97,0x8c,0x3f,0x30,0x18,0x34,0x80,0x1e,0x3f,0xbf,0x38,0x3d,0xe0,0x18,0x68,0x08,0x3c,0x84,0x0b,0xf8,0x18,0x89,0x38,0x6f,0x10,0x08,0x80,0x3c,0xbe,0x20,0xf3,0xf8,0x4f,0xf7,0xf0,0x68,0x00,0x00,0x61,0x00,0xf1,0xbf,0xa8,0x13,0xc1,0x3f,0xce,0x40,0x81,0xe5,0x04,0x06,0x21,0x04,0x81,0xe3,0xbc,0x2f,0x08,0x00,0x60,0x5f,0x99,0xfa,0x44,0xbc,0x00,0x21,0xe0,0xff,0x37,0xf1,0x80,0x79,0x40,0x76,0xf1,0xf0,0x78,0xef,0xca,0x25,0x07,0xf8,0x6f,0xec,0x00,0xf2,0x80,0x7a,0x78,0xff,0xff,0xbc,0x3c,0x44,0x51,0xfe,0x46,0xff,0x81,0x01,0x07,0x98,0xf8,0xae,0x3c,0x05,0x01,0xef,0xe8,0x05,0x03,0x07,0x8f,0x3c,0x16,0x38,0x12,0xa1,0xef,0x81,0xed,0xb7,0x1e,0x11,0x88,0xc3,0xeb,0xed,0xff,0xd2,0xc1,0x83,0x0f,0xff,0xfc,0xf3,0x7f,0xfa,0x7c,0x84,0x7e,0x60,0xf1,0xa2,0x03,0xc7,0x1e,0xa3,0x1b,0x2f,0xfa,0x66,0x0f,0x4c,0xac,0x7e,0x87,0xd0,0x1e,0x9e,0x16,0x03,0x0c,0xd0,0x9b,0xce,0xc7,0xe0,0xa0,0x78,0x3c,0x3f,0xb0,0x78,0xc1,0x7f,0xd0,0x3c,0x88,0x3c,0xf0,0x71,0xf9,0x04,0x00,0xdc,0x70,0x58,0x44,0x02,0xa2,0x0f,0x38,0x1c,0x22,0x41,0xf0,0x81,0xff,0x92,0x03,0x0b,0x07,0x8d,0x28,0x1e,0x70,0x18,0x44,0x43,0xe0,0xb2,0x1c,0xff,0xfe,0x10,0x0f,0x19,0x50,0x3d,0x22,0x11,0x08,0xc5,0xfb,0x3c,0x70,0x18,0xbb,0x74,0x64,0xc0,0xf5,0xb4,0x4c,0x3f,0x18,0xf4,0x80,0x83,0xca,0x2c,0x0f,0x49,0x07,0xd3,0xc1,0x01,0xc0,0x13,0xc6,0x5e,0x9c,0x10,0x7a,0xd0,0x3f,0x5e,0x18,0x39,0x80,0x80,}; +const uint8_t _A_Levelup2_128x64_8[] = {0x01,0x00,0x02,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x00,0xbf,0xb0,0x7f,0x88,0x3c,0x3f,0xe1,0x0f,0x00,0x5c,0x3f,0xc0,0x1f,0xdf,0x8c,0x7c,0x1f,0x97,0xf8,0x77,0xf3,0xf8,0x21,0x10,0x04,0xe7,0xe0,0x30,0x2f,0x98,0x7e,0xed,0xf0,0x18,0x0f,0xb0,0x1e,0x7c,0xf8,0x4c,0xcb,0xe6,0x0f,0x38,0xb8,0x3c,0x7a,0x00,0x73,0xc7,0xf2,0x66,0x60,0xf4,0x85,0xe0,0x60,0x1a,0x00,0xf9,0x83,0xde,0x0b,0x82,0x80,0x50,0x00,0xe7,0x4f,0x84,0xc9,0xbf,0x20,0x62,0xff,0x40,0xa8,0x50,0x0f,0xc7,0xfb,0xde,0x0f,0x2e,0x4c,0x9c,0x1e,0xf0,0x6f,0xe8,0x3c,0xb9,0xfc,0x88,0x3f,0xe0,0xfc,0x70,0x1f,0xf4,0x02,0x03,0xfd,0xe3,0x83,0xcf,0x9f,0xfc,0x07,0x95,0xf8,0xbc,0x25,0x01,0xfd,0x07,0xce,0x13,0xce,0x07,0x95,0xff,0xf9,0x80,0xbe,0x0c,0x04,0x1e,0x60,0x06,0xdf,0x50,0x30,0x52,0x48,0x04,0x11,0x3d,0x3b,0xe9,0x06,0x0e,0x53,0x00,0x60,0x88,0x3e,0x2b,0xfa,0x0a,0x14,0x68,0xc0,0x29,0x01,0xe7,0xe0,0xf3,0x92,0x0a,0x7f,0xc8,0x1e,0x35,0xed,0x04,0xf0,0x1e,0x30,0x1f,0xa0,0x3c,0x7e,0x79,0xc9,0xe0,0x3c,0xc3,0xe3,0x24,0x85,0x70,0x20,0x1e,0x80,0x79,0x72,0x41,0xf1,0x30,0x80,0x83,0xcb,0x07,0xc9,0x17,0xa7,0x7c,0x5e,0x30,0xaf,0xc6,0x0b,0xd6,0x1f,0x4b,0x7b,0x5c,0x81,0xe3,0xc2,0x85,0x43,0xac,0xbe,0xc0,0x79,0x78,0xc1,0xeb,0x20,0x81,0xe2,0xe0,0x31,0xa1,0xf9,0x83,0xc4,0xde,0x94,0x1f,0x15,0xed,0x1e,0x20,0xf1,0x87,0xe0,0xbe,0xf2,0x0a,0x41,0x3c,0xf0,0x31,0xc8,0x64,0x02,0x04,0x6f,0x14,0x7c,0x40,0xa0,0xb0,0x83,0xf9,0x83,0xe2,0x09,0x02,0x80,0x1f,0xc7,0xf4,0x0f,0x98,0x40,0x3c,0x66,0x00,0xfb,0x88,0x60,0x20,0x04,0x01,0xfe,0x83,0xe6,0x41,0x00,0xc1,0xc0,0xf0,0x1f,0xe0,0x7d,0xdf,0x20,0x14,0x00,0x41,0x43,0xe0,0x10,0x0c,0x00,0x18,0xad,0xe0,0xf1,0x00,0x0e,0x80,0x10,0x5f,0x30,0x10,0xdf,0xc0,0xc5,0x97,0x8c,0x03,0xcb,0xa0,0x08,0x28,0x68,0x7c,0x86,0xc5,0x17,0x83,0x83,0xcb,0x30,0x0f,0x28,0x30,0x1c,0x8a,0xc5,0x17,0x37,0x08,0x00,0x6e,0x80,0xfa,0x82,0x01,0xcb,0x20,0x28,0x28,0x36,0x73,0x10,0x0f,0x45,0x68,0x83,0xdb,0x45,0x84,0x80,0x83,0xc7,0x7f,0x17,0x4e,0x09,0x7c,0x81,0xe9,0x82,0x81,0x87,0xcd,0x78,0x20,0xf7,0xc0,0xc1,0xc1,0xe7,0x40,0x80,0x83,0xcb,0xbd,0xbf,0x0f,0xc5,0x00,0xc0,0x41,0xf2,0xff,0x0f,0xd7,0xff,0x1b,0x07,0xb7,0xf0,0xbe,0xbd,0xf9,0x28,0x3c,0xfc,0x01,0x82,0x3f,0xa7,0xdf,0xe3,0x22,0x07,0x9f,0x03,0xf4,0x10,0x14,0x7a,0xde,0x24,0x20,0xf4,0xfa,0x07,0xc6,0x1c,0xbf,0x4c,0xfc,0x82,0x40,0x5f,0x2e,0x07,0x20,0x1e,0x23,0x22,0x6f,0x95,0x9c,0x1e,0xb3,0x0f,0xff,0xe3,0xf6,0x0c,0x13,0xa0,0xff,0xe3,0x20,0xf5,0x4a,0x0f,0xdd,0xce,0x5c,0x0f,0xfc,0x06,0x0d,0x40,0xc8,0x11,0xca,0x81,0x00,0xff,0xfa,0x1c,0x44,0x00,0x1f,0xf4,0x24,0x1e,0xd0,0x4f,0x47,0xf7,0xbe,0x0f,0x28,0x0c,0x22,0x81,0x50,0x07,0xa4,0x0b,0xd1,0xe3,0x0f,0x98,}; +const uint8_t _A_Levelup2_128x64_9[] = {0x01,0x00,0xfb,0x01,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x01,0x3d,0xe0,0xff,0x06,0xe4,0x07,0xe0,0x0f,0xab,0xff,0xfe,0x7f,0xfe,0xe7,0xe0,0xc3,0xd7,0xdf,0x80,0xce,0x03,0xf9,0x67,0x80,0x71,0xbd,0xc0,0xfb,0xad,0xc0,0x20,0x3e,0xd0,0x49,0xf3,0xe1,0x33,0x2f,0x98,0x3c,0xe8,0xb8,0x08,0x07,0xe8,0x1e,0x78,0xfe,0x4c,0xcc,0x1e,0x98,0x2a,0x04,0x03,0x88,0x71,0x30,0x7a,0xcb,0xef,0x58,0x10,0x78,0xee,0x01,0xe7,0x4f,0x84,0xc9,0xbf,0x21,0xf2,0xdf,0xe0,0x24,0x10,0x0a,0x30,0x3d,0x39,0x32,0x70,0x7a,0x40,0x24,0x30,0x0c,0x0f,0xfb,0x8e,0x4f,0x2e,0x44,0x1f,0xf0,0x0f,0x2a,0xfc,0x02,0x7f,0x80,0xc0,0x7f,0xa0,0x20,0xf3,0xe7,0xff,0x0a,0xc5,0x5f,0xe0,0x00,0x06,0x01,0xfd,0x0f,0x9c,0x27,0x9c,0x0f,0x2b,0xfc,0xbe,0x41,0x1e,0x90,0xc0,0x7f,0xaa,0x19,0x97,0xe4,0x2c,0x31,0x28,0x17,0x08,0x1f,0x5d,0x0e,0x04,0x3a,0x05,0x3a,0x07,0xcc,0x5e,0x91,0xa1,0x86,0x41,0x38,0xdf,0xe1,0xf0,0xe0,0xf3,0x92,0x0a,0x7f,0xc8,0x1e,0x52,0x88,0xf4,0x17,0x08,0x40,0x10,0x78,0xfc,0xf3,0x93,0xc0,0x7a,0xc4,0xa0,0xb4,0x86,0x09,0x03,0xc7,0x92,0x0f,0x8f,0xc0,0x3c,0xf0,0x7c,0x91,0x7c,0x43,0x38,0x3f,0xb0,0xfa,0x5b,0xc0,0xc3,0xff,0x9d,0x93,0xc6,0x09,0x7f,0xf9,0x03,0xcf,0xc6,0x0f,0x4a,0x5f,0x43,0xe1,0xc2,0xc0,0x7f,0x2f,0xa0,0xf4,0x37,0x9e,0x2f,0x21,0x0d,0x9f,0xc0,0x3f,0xf3,0xef,0xf4,0x3f,0x05,0xf7,0x90,0x52,0x07,0xe5,0x0b,0x90,0xc0,0xa0,0x90,0x0b,0xfd,0xfd,0x1f,0x10,0xbe,0x14,0x06,0x01,0x80,0xdf,0x83,0xa0,0x1e,0x30,0x40,0x78,0xf8,0x3b,0xe0,0xe8,0xfb,0xc2,0xe1,0x00,0xf1,0xfc,0x2f,0xa4,0x1e,0x54,0x08,0x07,0x3a,0x06,0xbf,0x10,0x03,0x78,0xc1,0xe3,0x80,0xe0,0xc0,0xff,0xeb,0xf1,0x0f,0xbc,0x34,0xba,0x3f,0xe8,0x0f,0xc1,0x10,0x50,0xf8,0x01,0x5c,0x41,0xe5,0x12,0x81,0x01,0xc4,0xf8,0x2b,0xf1,0xff,0xfc,0xc0,0x42,0x75,0x39,0x11,0x38,0x40,0x04,0x0f,0x28,0x68,0x7c,0x88,0xc5,0xc2,0x07,0x1c,0x00,0x5e,0x50,0x60,0x31,0x11,0x8a,0x05,0x03,0x03,0x97,0x03,0xf8,0x0f,0x98,0x60,0x1c,0xa6,0x03,0x82,0x83,0x67,0x31,0x00,0xf4,0x98,0x03,0xcb,0x9c,0x0f,0x3d,0x16,0x12,0x02,0x0f,0x3e,0x00,0xb8,0x87,0xc4,0x0f,0x2c,0x14,0x0c,0x1e,0x70,0x02,0x00,0xff,0x01,0xeb,0x81,0x83,0x83,0xd2,0x1c,0xbf,0x10,0xfe,0x44,0x9b,0xe3,0xf5,0x1f,0xd0,0x3c,0xa0,0x1f,0x42,0xfc,0xce,0xa0,0x10,0x90,0x78,0xfb,0x01,0xe6,0x7f,0x5a,0x30,0x3f,0x6f,0xf8,0x18,0x04,0x14,0x0e,0x3d,0x80,0x79,0x15,0x85,0x7e,0x77,0xf8,0x0e,0x05,0xe0,0x20,0xf4,0x15,0x93,0x7c,0xb7,0xf0,0x0c,0x13,0xc0,0xb5,0x00,0xf2,0x39,0x96,0xfc,0x1e,0x74,0x40,0x7b,0x41,0xd4,0xe4,0x05,0x1a,0xf8,0x3c,0x60,0x20,0x81,0xa4,0x03,0xc8,0x00,0xb2,0xf8,0x04,0xa0,0x1e,0x58,0x82,0x40,0x80,0x1a,0x2e,0x2b,0x13,0x39,0x42,0x09,0x84,0x00,0x40,}; +const uint8_t _A_Levelup2_128x64_10[] = {0x01,0x00,0x06,0x02,0xff,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x1e,0x00,0xf0,0x07,0x80,0x3c,0x01,0xe0,0x0f,0x00,0x78,0x03,0xc0,0x09,0xef,0x06,0xe4,0x07,0xe0,0x0f,0xc9,0xff,0xfb,0x9f,0xc7,0x07,0xdf,0x7e,0x03,0x38,0x0f,0xe5,0x9e,0x01,0xc6,0xf7,0x03,0xee,0xb7,0x00,0x80,0xff,0x4a,0x27,0xcf,0x84,0xcc,0xbe,0x60,0x51,0xbf,0xff,0xe8,0xb8,0x08,0x07,0xe8,0x2e,0x78,0xfe,0x4c,0xcc,0x1e,0x98,0x2a,0x04,0x03,0x88,0x1f,0x30,0x7a,0xcf,0xef,0xd8,0x10,0x78,0xee,0x01,0xe7,0x4f,0x84,0xc9,0xbf,0x21,0xf2,0xdf,0xe0,0x24,0x10,0x0a,0x37,0xfc,0xe2,0x54,0xfe,0x4c,0x9c,0x1e,0x90,0x09,0x0c,0x03,0x03,0xfe,0xd5,0x93,0xcb,0x91,0x07,0xfc,0x11,0x8a,0xbf,0x00,0x9f,0xe0,0x30,0x17,0xe8,0x89,0x88,0x41,0xe3,0xcf,0xfe,0x03,0xcf,0x80,0x00,0x18,0x07,0xf4,0x3e,0x70,0x9e,0x70,0x3c,0xe5,0xf2,0x08,0xf4,0x85,0x00,0x2b,0x19,0x97,0xe4,0x2c,0x31,0x28,0x17,0x09,0x63,0x1f,0xe9,0x7f,0x43,0x81,0x0e,0x81,0x4e,0x95,0xd3,0x17,0xa4,0x68,0x61,0x90,0x46,0x09,0x73,0xf0,0x79,0xc9,0x05,0x3f,0xe4,0x1f,0x18,0xbc,0xa2,0x3d,0x05,0xc2,0x30,0x4b,0x9f,0xf3,0xce,0x4f,0x01,0xeb,0x12,0x82,0xd2,0x18,0x24,0x0f,0x1e,0x48,0x3e,0x3f,0x00,0xf3,0xc1,0xf2,0x45,0xe5,0x5f,0xfa,0x0b,0xce,0x19,0xc1,0xfd,0x87,0xd2,0xde,0x06,0x1f,0xf4,0xec,0x9e,0x30,0x4b,0xff,0xc8,0x1e,0x7e,0x30,0x7a,0x52,0xfa,0x1f,0x0e,0x16,0x03,0xf8,0x4f,0x30,0x78,0x9b,0xcf,0x17,0x90,0x86,0xcf,0xe0,0x01,0x61,0xff,0xc3,0xf0,0x5f,0x79,0x05,0x20,0x9e,0x50,0xb9,0x0c,0x0a,0x09,0x00,0xbf,0xa3,0xe6,0x17,0xc2,0x80,0xc0,0x30,0x1b,0xf0,0x7d,0x41,0x01,0xe3,0xe0,0xef,0x83,0xea,0x10,0x0f,0x1f,0xc3,0x3a,0x01,0xe7,0x40,0x80,0x73,0xa0,0x64,0xf1,0x00,0x37,0xdc,0x1e,0x38,0x0e,0x0c,0x0f,0xfe,0x6f,0x10,0x03,0xc3,0x4b,0xa3,0xfe,0x80,0xfc,0x11,0x02,0x70,0x18,0x01,0x5c,0x41,0xe5,0x12,0x81,0x01,0xc7,0xfd,0x0f,0x5f,0x8f,0xff,0xe6,0x02,0x13,0xb1,0xc8,0x89,0xc2,0x00,0x20,0x79,0x43,0x43,0xe4,0x46,0x2e,0x10,0x38,0xe0,0x02,0xf2,0x83,0x01,0x88,0x8c,0x50,0x28,0x18,0x1c,0xb8,0x1f,0xc0,0x7c,0xc3,0x00,0xe5,0x30,0x1c,0x94,0x1b,0x39,0x88,0x07,0xa4,0xc0,0x1e,0x5c,0xe0,0x79,0xe8,0xb0,0x90,0x10,0x79,0xf0,0x05,0xc5,0xfb,0x9f,0x92,0x44,0x1e,0x38,0x28,0x18,0x3c,0xe0,0x04,0x01,0xfe,0x7e,0xc3,0xe9,0x81,0x83,0x83,0xd2,0x1c,0xbf,0x10,0x7a,0x87,0xda,0x24,0xdf,0x1f,0xaa,0x20,0x87,0xee,0x0f,0x28,0x07,0xd0,0x1e,0x65,0xf5,0x9d,0x40,0x21,0x20,0xf1,0xf6,0x03,0xcc,0xfe,0xb4,0x60,0x7e,0xdf,0xf0,0x30,0x08,0x28,0x1c,0x7b,0x00,0xf2,0x2b,0x0a,0xfc,0xef,0xf0,0x1c,0x0b,0xc0,0x41,0xe8,0x2b,0x23,0x29,0x6f,0xe0,0x18,0x27,0x81,0x6a,0x01,0xe4,0xd2,0x2d,0xf8,0x3c,0xe8,0x80,0xf6,0x83,0xa9,0xc8,0x0a,0x35,0xf0,0x78,0xc0,0x41,0x03,0x48,0x07,0x90,0x01,0x65,0xf0,0x09,0x40,0x3c,0xb1,0x04,0x81,0x00,0x34,0x5c,0x56,0x26,0x72,0x84,0x13,0x08,0x00,0x80,}; +const uint8_t *_A_Levelup2_128x64[] = {_A_Levelup2_128x64_0,_A_Levelup2_128x64_1,_A_Levelup2_128x64_2,_A_Levelup2_128x64_3,_A_Levelup2_128x64_4,_A_Levelup2_128x64_5,_A_Levelup2_128x64_6,_A_Levelup2_128x64_7,_A_Levelup2_128x64_8,_A_Levelup2_128x64_9,_A_Levelup2_128x64_10}; const uint8_t _I_125_10px_0[] = {0x00,0xE0,0x00,0x00,0x01,0x0E,0x02,0x31,0x02,0x45,0x02,0x91,0x00,0xAA,0x00,0x92,0x00,0x44,0x00,0x38,0x00,}; const uint8_t *_I_125_10px[] = {_I_125_10px_0}; @@ -675,34 +617,8 @@ const uint8_t *_I_iButtonKey_49x44[] = {_I_iButtonKey_49x44_0}; const Icon I_Certification1_103x23 = {.width=103,.height=23,.frame_count=1,.frame_rate=0,.frames=_I_Certification1_103x23}; const Icon I_Certification2_119x30 = {.width=119,.height=30,.frame_count=1,.frame_rate=0,.frames=_I_Certification2_119x30}; -const Icon I_card_bad1 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_card_bad1}; -const Icon I_card_bad2 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_card_bad2}; -const Icon I_card_ok1 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_card_ok1}; -const Icon I_card_ok2 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_card_ok2}; -const Icon I_card_ok3 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_card_ok3}; -const Icon I_card_ok4 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_card_ok4}; -const Icon I_no_databases1 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_no_databases1}; -const Icon I_no_databases2 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_no_databases2}; -const Icon I_no_databases3 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_no_databases3}; -const Icon I_no_databases4 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_no_databases4}; -const Icon I_no_sd1 = {.width=128,.height=49,.frame_count=1,.frame_rate=0,.frames=_I_no_sd1}; -const Icon I_no_sd2 = {.width=128,.height=49,.frame_count=1,.frame_rate=0,.frames=_I_no_sd2}; -const Icon I_no_sd3 = {.width=128,.height=49,.frame_count=1,.frame_rate=0,.frames=_I_no_sd3}; -const Icon I_no_sd4 = {.width=128,.height=49,.frame_count=1,.frame_rate=0,.frames=_I_no_sd4}; -const Icon I_no_sd5 = {.width=128,.height=49,.frame_count=1,.frame_rate=0,.frames=_I_no_sd5}; -const Icon I_no_sd6 = {.width=128,.height=49,.frame_count=1,.frame_rate=0,.frames=_I_no_sd6}; -const Icon I_tv1 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv1}; -const Icon I_tv2 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv2}; -const Icon I_tv3 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv3}; -const Icon I_tv4 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv4}; -const Icon I_tv5 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv5}; -const Icon I_tv6 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv6}; -const Icon I_tv7 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv7}; -const Icon I_tv8 = {.width=128,.height=47,.frame_count=1,.frame_rate=0,.frames=_I_tv8}; -const Icon I_url1 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_url1}; -const Icon I_url2 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_url2}; -const Icon I_url3 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_url3}; -const Icon I_url4 = {.width=128,.height=51,.frame_count=1,.frame_rate=0,.frames=_I_url4}; +const Icon A_Levelup1_128x64 = {.width=128,.height=64,.frame_count=11,.frame_rate=2,.frames=_A_Levelup1_128x64}; +const Icon A_Levelup2_128x64 = {.width=128,.height=64,.frame_count=11,.frame_rate=2,.frames=_A_Levelup2_128x64}; const Icon I_125_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_125_10px}; const Icon I_Nfc_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_Nfc_10px}; const Icon I_ble_10px = {.width=10,.height=10,.frame_count=1,.frame_rate=0,.frames=_I_ble_10px}; diff --git a/assets/compiled/assets_icons.h b/assets/compiled/assets_icons.h index c52821afc..a8351f975 100644 --- a/assets/compiled/assets_icons.h +++ b/assets/compiled/assets_icons.h @@ -3,34 +3,8 @@ extern const Icon I_Certification1_103x23; extern const Icon I_Certification2_119x30; -extern const Icon I_card_bad1; -extern const Icon I_card_bad2; -extern const Icon I_card_ok1; -extern const Icon I_card_ok2; -extern const Icon I_card_ok3; -extern const Icon I_card_ok4; -extern const Icon I_no_databases1; -extern const Icon I_no_databases2; -extern const Icon I_no_databases3; -extern const Icon I_no_databases4; -extern const Icon I_no_sd1; -extern const Icon I_no_sd2; -extern const Icon I_no_sd3; -extern const Icon I_no_sd4; -extern const Icon I_no_sd5; -extern const Icon I_no_sd6; -extern const Icon I_tv1; -extern const Icon I_tv2; -extern const Icon I_tv3; -extern const Icon I_tv4; -extern const Icon I_tv5; -extern const Icon I_tv6; -extern const Icon I_tv7; -extern const Icon I_tv8; -extern const Icon I_url1; -extern const Icon I_url2; -extern const Icon I_url3; -extern const Icon I_url4; +extern const Icon A_Levelup1_128x64; +extern const Icon A_Levelup2_128x64; extern const Icon I_125_10px; extern const Icon I_Nfc_10px; extern const Icon I_ble_10px; diff --git a/assets/dolphin/ReadMe.md b/assets/dolphin/ReadMe.md new file mode 100644 index 000000000..f69592550 --- /dev/null +++ b/assets/dolphin/ReadMe.md @@ -0,0 +1,81 @@ +# Dolphin assets + +Dolphin assets are split into 3 parts: + +- essential - Essential animations that are used for blocking system notifications. They are packed to `assets_dolphin_essential.[h,c]`. +- internal - Internal animations that are used for idle dolphin animation. Converted to `assets_dolphin_internal.[h,c]`. +- external - External animations that are used for idle dolphin animation. Packed to resource folder and placed on SD card. + +# Files + +- `manifest.txt` - contains animations enumeration that is used for random animation selection. Starting point for Dolphin. +- `meta.txt` - contains data that describes how animation is drawn. +- `frame_X.bm` - Flipper Compressed Bitmap. + +## File manifest.txt + +Flipper Format File with ordered keys. + +Header: + +``` +Filetype: Flipper Animation Manifest +Version: 1 +``` + +- `Name` - name of animation. Must be exact animation directory name. +- `Min butthurt`, `Max butthurt` - range of dolphin's butthurt for this animation. +- `Min level`, `Max level` - range of dolphin's level for this animation. If 0, this animation doesn't participate in random idle animation selection and can only be selected by exact name. +- `Weight` - chance of this animation to be choosen at random animation selection. + +Some animations can be excluded from participation in random animation selection, such as `L1_NoSd_128x49`. + +## File meta.txt + +Flipper Format File with ordered keys. + +Header: + +``` +Filetype: Flipper Animation +Version: 1 +``` + +- `Width` - animation width in px (<= 128) +- `Height` - animation height in px (<= 64) +- `Passive frames` - number of bitmap frames for passive animation state +- `Active frames` - number of bitmap frames for active animation state (can be 0) +- `Frames order` - order of bitmap frames where first N frames are passive and following M are active. Each X number in order refers to bitmap frame, with name frame\_X.bm. This file must exist. Any X number can be repeated to refer same frame in animation. +- `Active cycles` - cycles to repeat of N active frames for full active period. E.g. if frames for active cycles are 6 and 7, and active cycles is 3, so full active period plays 6 7 6 7 6 7. Full period of passive + active period are called *total period*. +- `Frame rate` - number of frames to play for 1 second. +- `Duration` - total amount of seconds to play 1 animation. +- `Active cooldown` - amount of seconds (after passive mode) to pass before entering next active mode. + +- `Bubble slots` - amount of bubble sequences. +- Any bubble sequence plays whole sequence during active mode. There can be many bubble sequences and bubbles inside it. Bubbles in 1 bubble sequence have to reside in 1 slot. Bubbles order in 1 bubble sequence is determined by occurance in file. As soon as frame index goes out of EndFrame index of bubble - next animation bubble is choosen. There can also be free of bubbles frames between 2 bubbles. + +- `Slot` - number to unite bubbles for same sequence. +- `X`, `Y` - are coordinates of left top corner of bubble. +- `Text` - text in bubble. New line is `\n` +- `AlignH` - horizontal place of bubble corner (Left, Center, Right) +- `AlignV` - vertical place of bubble corner (Top, Center, Bottom) +- `StartFrame`, `EndFrame` - frame index range inside whole period to show bubble. + +### Understanding of frame indexes + +For example we have + +``` +Passive frames: 6 +Active frames: 2 +Frames order: 0 1 2 3 4 5 6 7 +Active cycles: 4 +``` + +Then we have indexes + +``` + passive(6) active (2 * 4) +Real frames order: 0 1 2 3 4 5 6 7 6 7 6 7 6 7 +Frames indexes: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 +``` diff --git a/assets/dolphin/animations/recording/frame_0.png b/assets/dolphin/animations/recording/frame_0.png deleted file mode 100644 index 8a91feb69..000000000 Binary files a/assets/dolphin/animations/recording/frame_0.png and /dev/null differ diff --git a/assets/dolphin/animations/recording/frame_10.png b/assets/dolphin/animations/recording/frame_10.png deleted file mode 100644 index ab1f58b8a..000000000 Binary files a/assets/dolphin/animations/recording/frame_10.png and /dev/null differ diff --git a/assets/dolphin/animations/recording/frame_11.png b/assets/dolphin/animations/recording/frame_11.png deleted file mode 100644 index aa900eba5..000000000 Binary files a/assets/dolphin/animations/recording/frame_11.png and /dev/null differ diff --git a/assets/dolphin/animations/recording/frame_3.png b/assets/dolphin/animations/recording/frame_3.png deleted file mode 100644 index 282188f7e..000000000 Binary files a/assets/dolphin/animations/recording/frame_3.png and /dev/null differ diff --git a/assets/dolphin/animations/recording/frame_4.png b/assets/dolphin/animations/recording/frame_4.png deleted file mode 100644 index 2c4ab7c93..000000000 Binary files a/assets/dolphin/animations/recording/frame_4.png and /dev/null differ diff --git a/assets/dolphin/animations/recording/frame_5.png b/assets/dolphin/animations/recording/frame_5.png deleted file mode 100644 index d79345983..000000000 Binary files a/assets/dolphin/animations/recording/frame_5.png and /dev/null differ diff --git a/assets/dolphin/animations/recording/frame_9.png b/assets/dolphin/animations/recording/frame_9.png deleted file mode 100644 index becd0fd40..000000000 Binary files a/assets/dolphin/animations/recording/frame_9.png and /dev/null differ diff --git a/assets/dolphin/blocking/L0_NewMail_128x51/frame_0.png b/assets/dolphin/blocking/L0_NewMail_128x51/frame_0.png new file mode 100644 index 000000000..5f7f5fa42 Binary files /dev/null and b/assets/dolphin/blocking/L0_NewMail_128x51/frame_0.png differ diff --git a/assets/dolphin/blocking/L0_NewMail_128x51/frame_1.png b/assets/dolphin/blocking/L0_NewMail_128x51/frame_1.png new file mode 100644 index 000000000..db9bf227b Binary files /dev/null and b/assets/dolphin/blocking/L0_NewMail_128x51/frame_1.png differ diff --git a/assets/dolphin/blocking/L0_NewMail_128x51/frame_2.png b/assets/dolphin/blocking/L0_NewMail_128x51/frame_2.png new file mode 100644 index 000000000..5394851f5 Binary files /dev/null and b/assets/dolphin/blocking/L0_NewMail_128x51/frame_2.png differ diff --git a/assets/dolphin/blocking/L0_NewMail_128x51/frame_3.png b/assets/dolphin/blocking/L0_NewMail_128x51/frame_3.png new file mode 100644 index 000000000..d16966fb4 Binary files /dev/null and b/assets/dolphin/blocking/L0_NewMail_128x51/frame_3.png differ diff --git a/assets/dolphin/blocking/L0_NewMail_128x51/meta.txt b/assets/dolphin/blocking/L0_NewMail_128x51/meta.txt new file mode 100644 index 000000000..82c9abe1c --- /dev/null +++ b/assets/dolphin/blocking/L0_NewMail_128x51/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 51 +Passive frames: 6 +Active frames: 0 +Frames order: 0 1 2 3 2 1 +Active cycles: 0 +Frame rate: 2 +Duration: 0 +Active cooldown: 0 + +Bubble slots: 0 \ No newline at end of file diff --git a/assets/icons/Animations/no_databases1.png b/assets/dolphin/blocking/L0_NoDb_128x51/frame_0.png similarity index 100% rename from assets/icons/Animations/no_databases1.png rename to assets/dolphin/blocking/L0_NoDb_128x51/frame_0.png diff --git a/assets/icons/Animations/no_databases2.png b/assets/dolphin/blocking/L0_NoDb_128x51/frame_1.png similarity index 100% rename from assets/icons/Animations/no_databases2.png rename to assets/dolphin/blocking/L0_NoDb_128x51/frame_1.png diff --git a/assets/icons/Animations/no_databases3.png b/assets/dolphin/blocking/L0_NoDb_128x51/frame_2.png similarity index 100% rename from assets/icons/Animations/no_databases3.png rename to assets/dolphin/blocking/L0_NoDb_128x51/frame_2.png diff --git a/assets/icons/Animations/no_databases4.png b/assets/dolphin/blocking/L0_NoDb_128x51/frame_3.png similarity index 100% rename from assets/icons/Animations/no_databases4.png rename to assets/dolphin/blocking/L0_NoDb_128x51/frame_3.png diff --git a/assets/dolphin/blocking/L0_NoDb_128x51/meta.txt b/assets/dolphin/blocking/L0_NoDb_128x51/meta.txt new file mode 100644 index 000000000..2c8d9871c --- /dev/null +++ b/assets/dolphin/blocking/L0_NoDb_128x51/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 51 +Passive frames: 4 +Active frames: 0 +Frames order: 0 1 2 3 +Active cycles: 0 +Frame rate: 2 +Duration: 0 +Active cooldown: 0 + +Bubble slots: 0 diff --git a/assets/icons/Animations/card_bad1.png b/assets/dolphin/blocking/L0_SdBad_128x51/frame_0.png similarity index 100% rename from assets/icons/Animations/card_bad1.png rename to assets/dolphin/blocking/L0_SdBad_128x51/frame_0.png diff --git a/assets/icons/Animations/card_bad2.png b/assets/dolphin/blocking/L0_SdBad_128x51/frame_1.png similarity index 100% rename from assets/icons/Animations/card_bad2.png rename to assets/dolphin/blocking/L0_SdBad_128x51/frame_1.png diff --git a/assets/dolphin/blocking/L0_SdBad_128x51/meta.txt b/assets/dolphin/blocking/L0_SdBad_128x51/meta.txt new file mode 100644 index 000000000..3248d17a7 --- /dev/null +++ b/assets/dolphin/blocking/L0_SdBad_128x51/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 51 +Passive frames: 2 +Active frames: 0 +Frames order: 0 1 +Active cycles: 0 +Frame rate: 2 +Duration: 0 +Active cooldown: 0 + +Bubble slots: 0 diff --git a/assets/icons/Animations/card_ok1.png b/assets/dolphin/blocking/L0_SdOk_128x51/frame_0.png similarity index 100% rename from assets/icons/Animations/card_ok1.png rename to assets/dolphin/blocking/L0_SdOk_128x51/frame_0.png diff --git a/assets/icons/Animations/card_ok2.png b/assets/dolphin/blocking/L0_SdOk_128x51/frame_1.png similarity index 100% rename from assets/icons/Animations/card_ok2.png rename to assets/dolphin/blocking/L0_SdOk_128x51/frame_1.png diff --git a/assets/icons/Animations/card_ok3.png b/assets/dolphin/blocking/L0_SdOk_128x51/frame_2.png similarity index 100% rename from assets/icons/Animations/card_ok3.png rename to assets/dolphin/blocking/L0_SdOk_128x51/frame_2.png diff --git a/assets/icons/Animations/card_ok4.png b/assets/dolphin/blocking/L0_SdOk_128x51/frame_3.png similarity index 100% rename from assets/icons/Animations/card_ok4.png rename to assets/dolphin/blocking/L0_SdOk_128x51/frame_3.png diff --git a/assets/dolphin/blocking/L0_SdOk_128x51/meta.txt b/assets/dolphin/blocking/L0_SdOk_128x51/meta.txt new file mode 100644 index 000000000..2c8d9871c --- /dev/null +++ b/assets/dolphin/blocking/L0_SdOk_128x51/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 51 +Passive frames: 4 +Active frames: 0 +Frames order: 0 1 2 3 +Active cycles: 0 +Frame rate: 2 +Duration: 0 +Active cooldown: 0 + +Bubble slots: 0 diff --git a/assets/icons/Animations/url1.png b/assets/dolphin/blocking/L0_Url_128x51/frame_0.png similarity index 100% rename from assets/icons/Animations/url1.png rename to assets/dolphin/blocking/L0_Url_128x51/frame_0.png diff --git a/assets/icons/Animations/url2.png b/assets/dolphin/blocking/L0_Url_128x51/frame_1.png similarity index 100% rename from assets/icons/Animations/url2.png rename to assets/dolphin/blocking/L0_Url_128x51/frame_1.png diff --git a/assets/icons/Animations/url3.png b/assets/dolphin/blocking/L0_Url_128x51/frame_2.png similarity index 100% rename from assets/icons/Animations/url3.png rename to assets/dolphin/blocking/L0_Url_128x51/frame_2.png diff --git a/assets/icons/Animations/url4.png b/assets/dolphin/blocking/L0_Url_128x51/frame_3.png similarity index 100% rename from assets/icons/Animations/url4.png rename to assets/dolphin/blocking/L0_Url_128x51/frame_3.png diff --git a/assets/dolphin/blocking/L0_Url_128x51/meta.txt b/assets/dolphin/blocking/L0_Url_128x51/meta.txt new file mode 100644 index 000000000..2c8d9871c --- /dev/null +++ b/assets/dolphin/blocking/L0_Url_128x51/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 51 +Passive frames: 4 +Active frames: 0 +Frames order: 0 1 2 3 +Active cycles: 0 +Frame rate: 2 +Duration: 0 +Active cooldown: 0 + +Bubble slots: 0 diff --git a/assets/dolphin/blocking/manifest.txt b/assets/dolphin/blocking/manifest.txt new file mode 100644 index 000000000..b646b9ecb --- /dev/null +++ b/assets/dolphin/blocking/manifest.txt @@ -0,0 +1,42 @@ +Filetype: Flipper Animation Manifest +Version: 1 + +# Animation 1 +Name: L0_NoDb_128x51 +Min butthurt: 0 +Max butthurt: 0 +Min level: 0 +Max level: 0 +Weight: 0 + +# Animation 2 +Name: L0_SdBad_128x51 +Min butthurt: 0 +Max butthurt: 0 +Min level: 0 +Max level: 0 +Weight: 0 + +# Animation 3 +Name: L0_SdOk_128x51 +Min butthurt: 0 +Max butthurt: 0 +Min level: 0 +Max level: 0 +Weight: 0 + +# Animation 4 +Name: L0_Url_128x51 +Min butthurt: 0 +Max butthurt: 0 +Min level: 0 +Max level: 0 +Weight: 0 + +# Animation 5 +Name: L0_NewMail_128x51 +Min butthurt: 0 +Max butthurt: 0 +Min level: 0 +Max level: 0 +Weight: 0 diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_0.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_0.png new file mode 100644 index 000000000..396ec251a Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_0.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_1.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_1.png new file mode 100644 index 000000000..2a497f85a Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_1.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_10.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_10.png new file mode 100644 index 000000000..d33f1e416 Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_10.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_11.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_11.png new file mode 100644 index 000000000..e5ee82f70 Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_11.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_12.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_12.png new file mode 100644 index 000000000..f3059dde7 Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_12.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_13.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_13.png new file mode 100644 index 000000000..5d1ff45be Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_13.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_14.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_14.png new file mode 100644 index 000000000..d46f62e89 Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_14.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_15.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_15.png new file mode 100644 index 000000000..ec11dbd03 Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_15.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_16.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_16.png new file mode 100644 index 000000000..720e95f9e Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_16.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_17.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_17.png new file mode 100644 index 000000000..7debe764f Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_17.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_18.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_18.png new file mode 100644 index 000000000..d3674a02b Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_18.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_2.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_2.png new file mode 100644 index 000000000..ba4435157 Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_2.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_3.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_3.png new file mode 100644 index 000000000..c0ee41623 Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_3.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_4.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_4.png new file mode 100644 index 000000000..ecda81274 Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_4.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_5.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_5.png new file mode 100644 index 000000000..e8662b2eb Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_5.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_6.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_6.png new file mode 100644 index 000000000..29cadd14e Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_6.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_7.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_7.png new file mode 100644 index 000000000..18e793b58 Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_7.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_8.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_8.png new file mode 100644 index 000000000..34b2e4001 Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_8.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_9.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_9.png new file mode 100644 index 000000000..d192f2e34 Binary files /dev/null and b/assets/dolphin/external/L1_Furippa1_128x64/frame_9.png differ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/meta.txt b/assets/dolphin/external/L1_Furippa1_128x64/meta.txt new file mode 100644 index 000000000..c21027e49 --- /dev/null +++ b/assets/dolphin/external/L1_Furippa1_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 11 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 diff --git a/assets/dolphin/animations/laptop/frame_0.png b/assets/dolphin/external/L1_Laptop_128x51/frame_0.png similarity index 100% rename from assets/dolphin/animations/laptop/frame_0.png rename to assets/dolphin/external/L1_Laptop_128x51/frame_0.png diff --git a/assets/dolphin/animations/laptop/frame_1.png b/assets/dolphin/external/L1_Laptop_128x51/frame_1.png similarity index 100% rename from assets/dolphin/animations/laptop/frame_1.png rename to assets/dolphin/external/L1_Laptop_128x51/frame_1.png diff --git a/assets/dolphin/animations/laptop/frame_2.png b/assets/dolphin/external/L1_Laptop_128x51/frame_2.png similarity index 100% rename from assets/dolphin/animations/laptop/frame_2.png rename to assets/dolphin/external/L1_Laptop_128x51/frame_2.png diff --git a/assets/dolphin/animations/laptop/frame_3.png b/assets/dolphin/external/L1_Laptop_128x51/frame_3.png similarity index 100% rename from assets/dolphin/animations/laptop/frame_3.png rename to assets/dolphin/external/L1_Laptop_128x51/frame_3.png diff --git a/assets/dolphin/animations/laptop/frame_4.png b/assets/dolphin/external/L1_Laptop_128x51/frame_4.png similarity index 100% rename from assets/dolphin/animations/laptop/frame_4.png rename to assets/dolphin/external/L1_Laptop_128x51/frame_4.png diff --git a/assets/dolphin/animations/laptop/frame_5.png b/assets/dolphin/external/L1_Laptop_128x51/frame_5.png similarity index 100% rename from assets/dolphin/animations/laptop/frame_5.png rename to assets/dolphin/external/L1_Laptop_128x51/frame_5.png diff --git a/assets/dolphin/animations/laptop/frame_6.png b/assets/dolphin/external/L1_Laptop_128x51/frame_6.png similarity index 100% rename from assets/dolphin/animations/laptop/frame_6.png rename to assets/dolphin/external/L1_Laptop_128x51/frame_6.png diff --git a/assets/dolphin/animations/laptop/frame_7.png b/assets/dolphin/external/L1_Laptop_128x51/frame_7.png similarity index 100% rename from assets/dolphin/animations/laptop/frame_7.png rename to assets/dolphin/external/L1_Laptop_128x51/frame_7.png diff --git a/assets/dolphin/animations/laptop/meta.txt b/assets/dolphin/external/L1_Laptop_128x51/meta.txt similarity index 80% rename from assets/dolphin/animations/laptop/meta.txt rename to assets/dolphin/external/L1_Laptop_128x51/meta.txt index 56d1e5b95..90cdc5ce9 100644 --- a/assets/dolphin/animations/laptop/meta.txt +++ b/assets/dolphin/external/L1_Laptop_128x51/meta.txt @@ -6,10 +6,10 @@ Height: 51 Passive frames: 6 Active frames: 2 Frames order: 0 1 2 3 4 5 6 7 -Active cycles: 3 +Active cycles: 4 Frame rate: 2 Duration: 3600 -Active cooldown: 5 +Active cooldown: 7 Bubble slots: 1 @@ -20,7 +20,7 @@ Text: I have to rest AlignH: Left AlignV: Bottom StartFrame: 7 -EndFrame: 9 +EndFrame: 10 Slot: 0 X: 60 @@ -28,5 +28,5 @@ Y: 23 Text: but not today AlignH: Left AlignV: Bottom -StartFrame: 10 -EndFrame: 12 \ No newline at end of file +StartFrame: 11 +EndFrame: 13 diff --git a/assets/dolphin/external/L1_Recording_128x51/frame_0.png b/assets/dolphin/external/L1_Recording_128x51/frame_0.png new file mode 100644 index 000000000..ed0f030b8 Binary files /dev/null and b/assets/dolphin/external/L1_Recording_128x51/frame_0.png differ diff --git a/assets/dolphin/animations/recording/frame_1.png b/assets/dolphin/external/L1_Recording_128x51/frame_1.png similarity index 71% rename from assets/dolphin/animations/recording/frame_1.png rename to assets/dolphin/external/L1_Recording_128x51/frame_1.png index c4bac1947..f3b3f8a97 100644 Binary files a/assets/dolphin/animations/recording/frame_1.png and b/assets/dolphin/external/L1_Recording_128x51/frame_1.png differ diff --git a/assets/dolphin/external/L1_Recording_128x51/frame_10.png b/assets/dolphin/external/L1_Recording_128x51/frame_10.png new file mode 100644 index 000000000..a474c2147 Binary files /dev/null and b/assets/dolphin/external/L1_Recording_128x51/frame_10.png differ diff --git a/assets/dolphin/external/L1_Recording_128x51/frame_11.png b/assets/dolphin/external/L1_Recording_128x51/frame_11.png new file mode 100644 index 000000000..cf654afb2 Binary files /dev/null and b/assets/dolphin/external/L1_Recording_128x51/frame_11.png differ diff --git a/assets/dolphin/animations/recording/frame_2.png b/assets/dolphin/external/L1_Recording_128x51/frame_2.png similarity index 82% rename from assets/dolphin/animations/recording/frame_2.png rename to assets/dolphin/external/L1_Recording_128x51/frame_2.png index f14fc60c7..f61e59efd 100644 Binary files a/assets/dolphin/animations/recording/frame_2.png and b/assets/dolphin/external/L1_Recording_128x51/frame_2.png differ diff --git a/assets/dolphin/external/L1_Recording_128x51/frame_3.png b/assets/dolphin/external/L1_Recording_128x51/frame_3.png new file mode 100644 index 000000000..87e297b2a Binary files /dev/null and b/assets/dolphin/external/L1_Recording_128x51/frame_3.png differ diff --git a/assets/dolphin/external/L1_Recording_128x51/frame_4.png b/assets/dolphin/external/L1_Recording_128x51/frame_4.png new file mode 100644 index 000000000..62428a405 Binary files /dev/null and b/assets/dolphin/external/L1_Recording_128x51/frame_4.png differ diff --git a/assets/dolphin/external/L1_Recording_128x51/frame_5.png b/assets/dolphin/external/L1_Recording_128x51/frame_5.png new file mode 100644 index 000000000..93953024a Binary files /dev/null and b/assets/dolphin/external/L1_Recording_128x51/frame_5.png differ diff --git a/assets/dolphin/animations/recording/frame_6.png b/assets/dolphin/external/L1_Recording_128x51/frame_6.png similarity index 83% rename from assets/dolphin/animations/recording/frame_6.png rename to assets/dolphin/external/L1_Recording_128x51/frame_6.png index ea73c361f..942f082b8 100644 Binary files a/assets/dolphin/animations/recording/frame_6.png and b/assets/dolphin/external/L1_Recording_128x51/frame_6.png differ diff --git a/assets/dolphin/animations/recording/frame_7.png b/assets/dolphin/external/L1_Recording_128x51/frame_7.png similarity index 84% rename from assets/dolphin/animations/recording/frame_7.png rename to assets/dolphin/external/L1_Recording_128x51/frame_7.png index 23c31d54b..84ce00d23 100644 Binary files a/assets/dolphin/animations/recording/frame_7.png and b/assets/dolphin/external/L1_Recording_128x51/frame_7.png differ diff --git a/assets/dolphin/animations/recording/frame_8.png b/assets/dolphin/external/L1_Recording_128x51/frame_8.png similarity index 85% rename from assets/dolphin/animations/recording/frame_8.png rename to assets/dolphin/external/L1_Recording_128x51/frame_8.png index 63e29fb64..f6f45552b 100644 Binary files a/assets/dolphin/animations/recording/frame_8.png and b/assets/dolphin/external/L1_Recording_128x51/frame_8.png differ diff --git a/assets/dolphin/external/L1_Recording_128x51/frame_9.png b/assets/dolphin/external/L1_Recording_128x51/frame_9.png new file mode 100644 index 000000000..dcd3aa0b9 Binary files /dev/null and b/assets/dolphin/external/L1_Recording_128x51/frame_9.png differ diff --git a/assets/resources/dolphin/animations/recording/meta.txt b/assets/dolphin/external/L1_Recording_128x51/meta.txt similarity index 84% rename from assets/resources/dolphin/animations/recording/meta.txt rename to assets/dolphin/external/L1_Recording_128x51/meta.txt index bb9a0ca44..de37d5b2e 100644 --- a/assets/resources/dolphin/animations/recording/meta.txt +++ b/assets/dolphin/external/L1_Recording_128x51/meta.txt @@ -6,9 +6,9 @@ Height: 51 Passive frames: 6 Active frames: 6 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 -Active cycles: 2 +Active cycles: 1 Frame rate: 2 Duration: 3600 Active cooldown: 5 -Bubble slots: 0 \ No newline at end of file +Bubble slots: 0 diff --git a/assets/dolphin/animations/sleep/frame_0.png b/assets/dolphin/external/L1_Sleep_128x64/frame_0.png similarity index 100% rename from assets/dolphin/animations/sleep/frame_0.png rename to assets/dolphin/external/L1_Sleep_128x64/frame_0.png diff --git a/assets/dolphin/animations/sleep/frame_1.png b/assets/dolphin/external/L1_Sleep_128x64/frame_1.png similarity index 100% rename from assets/dolphin/animations/sleep/frame_1.png rename to assets/dolphin/external/L1_Sleep_128x64/frame_1.png diff --git a/assets/dolphin/animations/sleep/frame_2.png b/assets/dolphin/external/L1_Sleep_128x64/frame_2.png similarity index 100% rename from assets/dolphin/animations/sleep/frame_2.png rename to assets/dolphin/external/L1_Sleep_128x64/frame_2.png diff --git a/assets/dolphin/animations/sleep/frame_3.png b/assets/dolphin/external/L1_Sleep_128x64/frame_3.png similarity index 100% rename from assets/dolphin/animations/sleep/frame_3.png rename to assets/dolphin/external/L1_Sleep_128x64/frame_3.png diff --git a/assets/dolphin/animations/sleep/meta.txt b/assets/dolphin/external/L1_Sleep_128x64/meta.txt similarity index 100% rename from assets/dolphin/animations/sleep/meta.txt rename to assets/dolphin/external/L1_Sleep_128x64/meta.txt diff --git a/assets/dolphin/animations/waves/frame_0.png b/assets/dolphin/external/L1_Waves_128x50/frame_0.png similarity index 100% rename from assets/dolphin/animations/waves/frame_0.png rename to assets/dolphin/external/L1_Waves_128x50/frame_0.png diff --git a/assets/dolphin/animations/waves/frame_1.png b/assets/dolphin/external/L1_Waves_128x50/frame_1.png similarity index 100% rename from assets/dolphin/animations/waves/frame_1.png rename to assets/dolphin/external/L1_Waves_128x50/frame_1.png diff --git a/assets/dolphin/animations/waves/frame_2.png b/assets/dolphin/external/L1_Waves_128x50/frame_2.png similarity index 100% rename from assets/dolphin/animations/waves/frame_2.png rename to assets/dolphin/external/L1_Waves_128x50/frame_2.png diff --git a/assets/dolphin/animations/waves/frame_3.png b/assets/dolphin/external/L1_Waves_128x50/frame_3.png similarity index 100% rename from assets/dolphin/animations/waves/frame_3.png rename to assets/dolphin/external/L1_Waves_128x50/frame_3.png diff --git a/assets/dolphin/animations/waves/meta.txt b/assets/dolphin/external/L1_Waves_128x50/meta.txt similarity index 100% rename from assets/dolphin/animations/waves/meta.txt rename to assets/dolphin/external/L1_Waves_128x50/meta.txt diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_0.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_0.png new file mode 100644 index 000000000..43b26283e Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_0.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_1.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_1.png new file mode 100644 index 000000000..fecba5ad5 Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_1.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_10.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_10.png new file mode 100644 index 000000000..3c15e7ccf Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_10.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_11.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_11.png new file mode 100644 index 000000000..0f293281f Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_11.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_12.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_12.png new file mode 100644 index 000000000..733962d3a Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_12.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_13.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_13.png new file mode 100644 index 000000000..4b7ed184f Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_13.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_14.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_14.png new file mode 100644 index 000000000..1efff0f21 Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_14.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_15.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_15.png new file mode 100644 index 000000000..f2d76409d Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_15.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_16.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_16.png new file mode 100644 index 000000000..125fb98fa Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_16.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_17.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_17.png new file mode 100644 index 000000000..3a4a5f5a1 Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_17.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_18.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_18.png new file mode 100644 index 000000000..13dd34859 Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_18.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_2.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_2.png new file mode 100644 index 000000000..ef3150fd8 Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_2.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_3.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_3.png new file mode 100644 index 000000000..537ab523e Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_3.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_4.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_4.png new file mode 100644 index 000000000..873570126 Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_4.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_5.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_5.png new file mode 100644 index 000000000..dbbeb1fe1 Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_5.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_6.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_6.png new file mode 100644 index 000000000..d18085027 Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_6.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_7.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_7.png new file mode 100644 index 000000000..24f9333fe Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_7.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_8.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_8.png new file mode 100644 index 000000000..30b97cdf5 Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_8.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_9.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_9.png new file mode 100644 index 000000000..7ceead056 Binary files /dev/null and b/assets/dolphin/external/L2_Furippa2_128x64/frame_9.png differ diff --git a/assets/dolphin/external/L2_Furippa2_128x64/meta.txt b/assets/dolphin/external/L2_Furippa2_128x64/meta.txt new file mode 100644 index 000000000..c21027e49 --- /dev/null +++ b/assets/dolphin/external/L2_Furippa2_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 11 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_0.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_0.png new file mode 100644 index 000000000..3b82285e6 Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_0.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_1.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_1.png new file mode 100644 index 000000000..7af08829b Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_1.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_10.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_10.png new file mode 100644 index 000000000..0ef6d471d Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_10.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_11.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_11.png new file mode 100644 index 000000000..e6f397eb8 Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_11.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_12.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_12.png new file mode 100644 index 000000000..9221fb156 Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_12.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_13.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_13.png new file mode 100644 index 000000000..e43b1edb8 Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_13.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_14.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_14.png new file mode 100644 index 000000000..64da8d8f9 Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_14.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_15.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_15.png new file mode 100644 index 000000000..96b196696 Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_15.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_16.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_16.png new file mode 100644 index 000000000..620dbca29 Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_16.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_17.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_17.png new file mode 100644 index 000000000..49aa979d7 Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_17.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_18.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_18.png new file mode 100644 index 000000000..7739e294a Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_18.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_2.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_2.png new file mode 100644 index 000000000..c36e54b2f Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_2.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_3.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_3.png new file mode 100644 index 000000000..dce96b74c Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_3.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_4.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_4.png new file mode 100644 index 000000000..2c096689a Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_4.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_5.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_5.png new file mode 100644 index 000000000..792719974 Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_5.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_6.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_6.png new file mode 100644 index 000000000..689e7dd79 Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_6.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_7.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_7.png new file mode 100644 index 000000000..7b468ab83 Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_7.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_8.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_8.png new file mode 100644 index 000000000..e9246c0b7 Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_8.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_9.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_9.png new file mode 100644 index 000000000..c2e164c51 Binary files /dev/null and b/assets/dolphin/external/L3_Furippa3_128x64/frame_9.png differ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/meta.txt b/assets/dolphin/external/L3_Furippa3_128x64/meta.txt new file mode 100644 index 000000000..c21027e49 --- /dev/null +++ b/assets/dolphin/external/L3_Furippa3_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 11 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 diff --git a/assets/dolphin/external/manifest.txt b/assets/dolphin/external/manifest.txt new file mode 100644 index 000000000..d5a8e2a19 --- /dev/null +++ b/assets/dolphin/external/manifest.txt @@ -0,0 +1,58 @@ +Filetype: Flipper Animation Manifest +Version: 1 + +# Animation 1 +Name: L1_Waves_128x50 +Min butthurt: 0 +Max butthurt: 5 +Min level: 1 +Max level: 3 +Weight: 3 + +# Animation 2 +Name: L1_Laptop_128x51 +Min butthurt: 0 +Max butthurt: 9 +Min level: 1 +Max level: 3 +Weight: 3 + +# Animation 3 +Name: L1_Sleep_128x64 +Min butthurt: 0 +Max butthurt: 10 +Min level: 1 +Max level: 3 +Weight: 3 + +# Animation 4 +Name: L1_Recording_128x51 +Min butthurt: 0 +Max butthurt: 8 +Min level: 1 +Max level: 1 +Weight: 3 + +# Animation 5 +Name: L1_Furippa1_128x64 +Min butthurt: 0 +Max butthurt: 6 +Min level: 1 +Max level: 1 +Weight: 3 + +# Animation 6 +Name: L2_Furippa2_128x64 +Min butthurt: 0 +Max butthurt: 6 +Min level: 2 +Max level: 2 +Weight: 3 + +# Animation 7 +Name: L3_Furippa3_128x64 +Min butthurt: 0 +Max butthurt: 6 +Min level: 3 +Max level: 3 +Weight: 3 diff --git a/assets/dolphin/internal/L1_BadBattery_128x47/frame_0.png b/assets/dolphin/internal/L1_BadBattery_128x47/frame_0.png new file mode 100644 index 000000000..7d3f3dcdf Binary files /dev/null and b/assets/dolphin/internal/L1_BadBattery_128x47/frame_0.png differ diff --git a/assets/dolphin/internal/L1_BadBattery_128x47/frame_1.png b/assets/dolphin/internal/L1_BadBattery_128x47/frame_1.png new file mode 100644 index 000000000..98c2979cf Binary files /dev/null and b/assets/dolphin/internal/L1_BadBattery_128x47/frame_1.png differ diff --git a/assets/dolphin/internal/L1_BadBattery_128x47/meta.txt b/assets/dolphin/internal/L1_BadBattery_128x47/meta.txt new file mode 100644 index 000000000..ab19e10d9 --- /dev/null +++ b/assets/dolphin/internal/L1_BadBattery_128x47/meta.txt @@ -0,0 +1,23 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 47 +Passive frames: 2 +Active frames: 0 +Frames order: 0 1 +Active cycles: 0 +Frame rate: 2 +Duration: 3600 +Active cooldown: 0 + +Bubble slots: 1 + +Slot: 0 +X: 4 +Y: 21 +Text: I feel so sick!\nI'm dying... +AlignH: Right +AlignV: Center +StartFrame: 0 +EndFrame: 1 diff --git a/assets/icons/Animations/no_sd1.png b/assets/dolphin/internal/L1_NoSd_128x49/frame_0.png similarity index 100% rename from assets/icons/Animations/no_sd1.png rename to assets/dolphin/internal/L1_NoSd_128x49/frame_0.png diff --git a/assets/icons/Animations/no_sd2.png b/assets/dolphin/internal/L1_NoSd_128x49/frame_1.png similarity index 100% rename from assets/icons/Animations/no_sd2.png rename to assets/dolphin/internal/L1_NoSd_128x49/frame_1.png diff --git a/assets/icons/Animations/no_sd3.png b/assets/dolphin/internal/L1_NoSd_128x49/frame_2.png similarity index 100% rename from assets/icons/Animations/no_sd3.png rename to assets/dolphin/internal/L1_NoSd_128x49/frame_2.png diff --git a/assets/icons/Animations/no_sd4.png b/assets/dolphin/internal/L1_NoSd_128x49/frame_3.png similarity index 100% rename from assets/icons/Animations/no_sd4.png rename to assets/dolphin/internal/L1_NoSd_128x49/frame_3.png diff --git a/assets/icons/Animations/no_sd5.png b/assets/dolphin/internal/L1_NoSd_128x49/frame_4.png similarity index 100% rename from assets/icons/Animations/no_sd5.png rename to assets/dolphin/internal/L1_NoSd_128x49/frame_4.png diff --git a/assets/icons/Animations/no_sd6.png b/assets/dolphin/internal/L1_NoSd_128x49/frame_5.png similarity index 100% rename from assets/icons/Animations/no_sd6.png rename to assets/dolphin/internal/L1_NoSd_128x49/frame_5.png diff --git a/assets/dolphin/internal/L1_NoSd_128x49/meta.txt b/assets/dolphin/internal/L1_NoSd_128x49/meta.txt new file mode 100644 index 000000000..08b1f9d9d --- /dev/null +++ b/assets/dolphin/internal/L1_NoSd_128x49/meta.txt @@ -0,0 +1,23 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 49 +Passive frames: 10 +Active frames: 0 +Frames order: 0 1 0 1 0 2 3 4 3 5 +Active cycles: 0 +Frame rate: 2 +Duration: 3600 +Active cooldown: 0 + +Bubble slots: 1 + +Slot: 0 +X: 40 +Y: 18 +Text: Need an\nSD card +AlignH: Right +AlignV: Bottom +StartFrame: 0 +EndFrame: 9 diff --git a/assets/icons/Animations/tv1.png b/assets/dolphin/internal/L1_Tv_128x47/frame_0.png similarity index 100% rename from assets/icons/Animations/tv1.png rename to assets/dolphin/internal/L1_Tv_128x47/frame_0.png diff --git a/assets/icons/Animations/tv2.png b/assets/dolphin/internal/L1_Tv_128x47/frame_1.png similarity index 100% rename from assets/icons/Animations/tv2.png rename to assets/dolphin/internal/L1_Tv_128x47/frame_1.png diff --git a/assets/icons/Animations/tv3.png b/assets/dolphin/internal/L1_Tv_128x47/frame_2.png similarity index 100% rename from assets/icons/Animations/tv3.png rename to assets/dolphin/internal/L1_Tv_128x47/frame_2.png diff --git a/assets/icons/Animations/tv4.png b/assets/dolphin/internal/L1_Tv_128x47/frame_3.png similarity index 100% rename from assets/icons/Animations/tv4.png rename to assets/dolphin/internal/L1_Tv_128x47/frame_3.png diff --git a/assets/icons/Animations/tv5.png b/assets/dolphin/internal/L1_Tv_128x47/frame_4.png similarity index 100% rename from assets/icons/Animations/tv5.png rename to assets/dolphin/internal/L1_Tv_128x47/frame_4.png diff --git a/assets/icons/Animations/tv6.png b/assets/dolphin/internal/L1_Tv_128x47/frame_5.png similarity index 100% rename from assets/icons/Animations/tv6.png rename to assets/dolphin/internal/L1_Tv_128x47/frame_5.png diff --git a/assets/icons/Animations/tv7.png b/assets/dolphin/internal/L1_Tv_128x47/frame_6.png similarity index 100% rename from assets/icons/Animations/tv7.png rename to assets/dolphin/internal/L1_Tv_128x47/frame_6.png diff --git a/assets/icons/Animations/tv8.png b/assets/dolphin/internal/L1_Tv_128x47/frame_7.png similarity index 100% rename from assets/icons/Animations/tv8.png rename to assets/dolphin/internal/L1_Tv_128x47/frame_7.png diff --git a/assets/dolphin/internal/L1_Tv_128x47/meta.txt b/assets/dolphin/internal/L1_Tv_128x47/meta.txt new file mode 100644 index 000000000..93f598e8c --- /dev/null +++ b/assets/dolphin/internal/L1_Tv_128x47/meta.txt @@ -0,0 +1,32 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 47 +Passive frames: 6 +Active frames: 2 +Frames order: 0 1 2 3 4 5 6 7 +Active cycles: 2 +Frame rate: 2 +Duration: 3600 +Active cooldown: 5 + +Bubble slots: 2 + +Slot: 0 +X: 1 +Y: 23 +Text: Take the red pill +AlignH: Right +AlignV: Bottom +StartFrame: 7 +EndFrame: 9 + +Slot: 1 +X: 1 +Y: 23 +Text: I can joke better +AlignH: Right +AlignV: Bottom +StartFrame: 7 +EndFrame: 9 diff --git a/assets/dolphin/animations/manifest.txt b/assets/dolphin/internal/manifest.txt similarity index 55% rename from assets/dolphin/animations/manifest.txt rename to assets/dolphin/internal/manifest.txt index 85d5b45de..8ae579de6 100644 --- a/assets/dolphin/animations/manifest.txt +++ b/assets/dolphin/internal/manifest.txt @@ -2,33 +2,26 @@ Filetype: Flipper Animation Manifest Version: 1 # Animation 1 -Name: waves +Name: L1_Tv_128x47 Min butthurt: 0 -Max butthurt: 5 +Max butthurt: 14 Min level: 1 Max level: 3 Weight: 3 # Animation 2 -Name: laptop +Name: L1_BadBattery_128x47 Min butthurt: 0 -Max butthurt: 9 +Max butthurt: 14 Min level: 1 Max level: 3 Weight: 3 # Animation 3 -Name: sleep +Name: L1_NoSd_128x49 Min butthurt: 0 -Max butthurt: 10 +Max butthurt: 14 Min level: 1 Max level: 3 -Weight: 3 +Weight: 6 -# Animation 4 -Name: recording -Min butthurt: 0 -Max butthurt: 8 -Min level: 1 -Max level: 1 -Weight: 3 \ No newline at end of file diff --git a/assets/icons/Animations/Levelup1_128x64/frame_00.png b/assets/icons/Animations/Levelup1_128x64/frame_00.png new file mode 100644 index 000000000..bf97f8d6e Binary files /dev/null and b/assets/icons/Animations/Levelup1_128x64/frame_00.png differ diff --git a/assets/icons/Animations/Levelup1_128x64/frame_01.png b/assets/icons/Animations/Levelup1_128x64/frame_01.png new file mode 100644 index 000000000..39c910d3a Binary files /dev/null and b/assets/icons/Animations/Levelup1_128x64/frame_01.png differ diff --git a/assets/icons/Animations/Levelup1_128x64/frame_02.png b/assets/icons/Animations/Levelup1_128x64/frame_02.png new file mode 100644 index 000000000..4975adf86 Binary files /dev/null and b/assets/icons/Animations/Levelup1_128x64/frame_02.png differ diff --git a/assets/icons/Animations/Levelup1_128x64/frame_03.png b/assets/icons/Animations/Levelup1_128x64/frame_03.png new file mode 100644 index 000000000..5a05529c5 Binary files /dev/null and b/assets/icons/Animations/Levelup1_128x64/frame_03.png differ diff --git a/assets/icons/Animations/Levelup1_128x64/frame_04.png b/assets/icons/Animations/Levelup1_128x64/frame_04.png new file mode 100644 index 000000000..e6c88df92 Binary files /dev/null and b/assets/icons/Animations/Levelup1_128x64/frame_04.png differ diff --git a/assets/icons/Animations/Levelup1_128x64/frame_05.png b/assets/icons/Animations/Levelup1_128x64/frame_05.png new file mode 100644 index 000000000..e7bae4d6c Binary files /dev/null and b/assets/icons/Animations/Levelup1_128x64/frame_05.png differ diff --git a/assets/icons/Animations/Levelup1_128x64/frame_06.png b/assets/icons/Animations/Levelup1_128x64/frame_06.png new file mode 100644 index 000000000..489bce368 Binary files /dev/null and b/assets/icons/Animations/Levelup1_128x64/frame_06.png differ diff --git a/assets/icons/Animations/Levelup1_128x64/frame_07.png b/assets/icons/Animations/Levelup1_128x64/frame_07.png new file mode 100644 index 000000000..32e864e98 Binary files /dev/null and b/assets/icons/Animations/Levelup1_128x64/frame_07.png differ diff --git a/assets/icons/Animations/Levelup1_128x64/frame_08.png b/assets/icons/Animations/Levelup1_128x64/frame_08.png new file mode 100644 index 000000000..c692f4895 Binary files /dev/null and b/assets/icons/Animations/Levelup1_128x64/frame_08.png differ diff --git a/assets/icons/Animations/Levelup1_128x64/frame_09.png b/assets/icons/Animations/Levelup1_128x64/frame_09.png new file mode 100644 index 000000000..fb1c8bb90 Binary files /dev/null and b/assets/icons/Animations/Levelup1_128x64/frame_09.png differ diff --git a/assets/icons/Animations/Levelup1_128x64/frame_10.png b/assets/icons/Animations/Levelup1_128x64/frame_10.png new file mode 100644 index 000000000..3b0205a48 Binary files /dev/null and b/assets/icons/Animations/Levelup1_128x64/frame_10.png differ diff --git a/assets/icons/Animations/Levelup1_128x64/frame_rate b/assets/icons/Animations/Levelup1_128x64/frame_rate new file mode 100644 index 000000000..0cfbf0888 --- /dev/null +++ b/assets/icons/Animations/Levelup1_128x64/frame_rate @@ -0,0 +1 @@ +2 diff --git a/assets/icons/Animations/Levelup2_128x64/frame_00.png b/assets/icons/Animations/Levelup2_128x64/frame_00.png new file mode 100644 index 000000000..77b531076 Binary files /dev/null and b/assets/icons/Animations/Levelup2_128x64/frame_00.png differ diff --git a/assets/icons/Animations/Levelup2_128x64/frame_01.png b/assets/icons/Animations/Levelup2_128x64/frame_01.png new file mode 100644 index 000000000..b53437265 Binary files /dev/null and b/assets/icons/Animations/Levelup2_128x64/frame_01.png differ diff --git a/assets/icons/Animations/Levelup2_128x64/frame_02.png b/assets/icons/Animations/Levelup2_128x64/frame_02.png new file mode 100644 index 000000000..9623af7d8 Binary files /dev/null and b/assets/icons/Animations/Levelup2_128x64/frame_02.png differ diff --git a/assets/icons/Animations/Levelup2_128x64/frame_03.png b/assets/icons/Animations/Levelup2_128x64/frame_03.png new file mode 100644 index 000000000..f18269019 Binary files /dev/null and b/assets/icons/Animations/Levelup2_128x64/frame_03.png differ diff --git a/assets/icons/Animations/Levelup2_128x64/frame_04.png b/assets/icons/Animations/Levelup2_128x64/frame_04.png new file mode 100644 index 000000000..677a3367e Binary files /dev/null and b/assets/icons/Animations/Levelup2_128x64/frame_04.png differ diff --git a/assets/icons/Animations/Levelup2_128x64/frame_05.png b/assets/icons/Animations/Levelup2_128x64/frame_05.png new file mode 100644 index 000000000..fb58fed1e Binary files /dev/null and b/assets/icons/Animations/Levelup2_128x64/frame_05.png differ diff --git a/assets/icons/Animations/Levelup2_128x64/frame_06.png b/assets/icons/Animations/Levelup2_128x64/frame_06.png new file mode 100644 index 000000000..b2cbd699b Binary files /dev/null and b/assets/icons/Animations/Levelup2_128x64/frame_06.png differ diff --git a/assets/icons/Animations/Levelup2_128x64/frame_07.png b/assets/icons/Animations/Levelup2_128x64/frame_07.png new file mode 100644 index 000000000..4f3dfc8c4 Binary files /dev/null and b/assets/icons/Animations/Levelup2_128x64/frame_07.png differ diff --git a/assets/icons/Animations/Levelup2_128x64/frame_08.png b/assets/icons/Animations/Levelup2_128x64/frame_08.png new file mode 100644 index 000000000..3a5a28805 Binary files /dev/null and b/assets/icons/Animations/Levelup2_128x64/frame_08.png differ diff --git a/assets/icons/Animations/Levelup2_128x64/frame_09.png b/assets/icons/Animations/Levelup2_128x64/frame_09.png new file mode 100644 index 000000000..76267a2a8 Binary files /dev/null and b/assets/icons/Animations/Levelup2_128x64/frame_09.png differ diff --git a/assets/icons/Animations/Levelup2_128x64/frame_10.png b/assets/icons/Animations/Levelup2_128x64/frame_10.png new file mode 100644 index 000000000..bda1bf44c Binary files /dev/null and b/assets/icons/Animations/Levelup2_128x64/frame_10.png differ diff --git a/assets/icons/Animations/Levelup2_128x64/frame_rate b/assets/icons/Animations/Levelup2_128x64/frame_rate new file mode 100644 index 000000000..0cfbf0888 --- /dev/null +++ b/assets/icons/Animations/Levelup2_128x64/frame_rate @@ -0,0 +1 @@ +2 diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_0.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_0.bm new file mode 100644 index 000000000..8558f0f5b Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_0.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_1.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_1.bm new file mode 100644 index 000000000..ac7a126ea Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_1.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_10.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_10.bm new file mode 100644 index 000000000..c5312e5e5 Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_10.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_11.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_11.bm new file mode 100644 index 000000000..c91ed2fd2 Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_11.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_12.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_12.bm new file mode 100644 index 000000000..392905a55 Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_12.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_13.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_13.bm new file mode 100644 index 000000000..aa5353e98 Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_13.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_14.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_14.bm new file mode 100644 index 000000000..837c6c71d Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_14.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_15.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_15.bm new file mode 100644 index 000000000..4cb6e5332 Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_15.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_16.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_16.bm new file mode 100644 index 000000000..ce3ccdece Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_16.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_17.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_17.bm new file mode 100644 index 000000000..02af0bcf3 Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_17.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_18.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_18.bm new file mode 100644 index 000000000..72620a7c9 Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_18.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_2.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_2.bm new file mode 100644 index 000000000..94357802f Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_2.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_3.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_3.bm new file mode 100644 index 000000000..b0d0e6914 Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_3.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_4.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_4.bm new file mode 100644 index 000000000..3413e5072 Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_4.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_5.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_5.bm new file mode 100644 index 000000000..fd83dd1c6 Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_5.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_6.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_6.bm new file mode 100644 index 000000000..8c946d184 Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_6.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_7.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_7.bm new file mode 100644 index 000000000..8558f0f5b Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_7.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_8.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_8.bm new file mode 100644 index 000000000..a57e4bac7 Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_8.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_9.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_9.bm new file mode 100644 index 000000000..114b26391 Binary files /dev/null and b/assets/resources/dolphin/L1_Furippa1_128x64/frame_9.bm differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/meta.txt b/assets/resources/dolphin/L1_Furippa1_128x64/meta.txt new file mode 100644 index 000000000..c21027e49 --- /dev/null +++ b/assets/resources/dolphin/L1_Furippa1_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 11 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 diff --git a/assets/resources/dolphin/animations/laptop/frame_0.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_0.bm similarity index 100% rename from assets/resources/dolphin/animations/laptop/frame_0.bm rename to assets/resources/dolphin/L1_Laptop_128x51/frame_0.bm diff --git a/assets/resources/dolphin/animations/laptop/frame_1.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_1.bm similarity index 100% rename from assets/resources/dolphin/animations/laptop/frame_1.bm rename to assets/resources/dolphin/L1_Laptop_128x51/frame_1.bm diff --git a/assets/resources/dolphin/animations/laptop/frame_2.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_2.bm similarity index 100% rename from assets/resources/dolphin/animations/laptop/frame_2.bm rename to assets/resources/dolphin/L1_Laptop_128x51/frame_2.bm diff --git a/assets/resources/dolphin/animations/laptop/frame_3.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_3.bm similarity index 100% rename from assets/resources/dolphin/animations/laptop/frame_3.bm rename to assets/resources/dolphin/L1_Laptop_128x51/frame_3.bm diff --git a/assets/resources/dolphin/animations/laptop/frame_4.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_4.bm similarity index 100% rename from assets/resources/dolphin/animations/laptop/frame_4.bm rename to assets/resources/dolphin/L1_Laptop_128x51/frame_4.bm diff --git a/assets/resources/dolphin/animations/laptop/frame_5.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_5.bm similarity index 100% rename from assets/resources/dolphin/animations/laptop/frame_5.bm rename to assets/resources/dolphin/L1_Laptop_128x51/frame_5.bm diff --git a/assets/resources/dolphin/animations/laptop/frame_6.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_6.bm similarity index 100% rename from assets/resources/dolphin/animations/laptop/frame_6.bm rename to assets/resources/dolphin/L1_Laptop_128x51/frame_6.bm diff --git a/assets/resources/dolphin/animations/laptop/frame_7.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_7.bm similarity index 100% rename from assets/resources/dolphin/animations/laptop/frame_7.bm rename to assets/resources/dolphin/L1_Laptop_128x51/frame_7.bm diff --git a/assets/resources/dolphin/animations/laptop/meta.txt b/assets/resources/dolphin/L1_Laptop_128x51/meta.txt similarity index 80% rename from assets/resources/dolphin/animations/laptop/meta.txt rename to assets/resources/dolphin/L1_Laptop_128x51/meta.txt index 56d1e5b95..90cdc5ce9 100644 --- a/assets/resources/dolphin/animations/laptop/meta.txt +++ b/assets/resources/dolphin/L1_Laptop_128x51/meta.txt @@ -6,10 +6,10 @@ Height: 51 Passive frames: 6 Active frames: 2 Frames order: 0 1 2 3 4 5 6 7 -Active cycles: 3 +Active cycles: 4 Frame rate: 2 Duration: 3600 -Active cooldown: 5 +Active cooldown: 7 Bubble slots: 1 @@ -20,7 +20,7 @@ Text: I have to rest AlignH: Left AlignV: Bottom StartFrame: 7 -EndFrame: 9 +EndFrame: 10 Slot: 0 X: 60 @@ -28,5 +28,5 @@ Y: 23 Text: but not today AlignH: Left AlignV: Bottom -StartFrame: 10 -EndFrame: 12 \ No newline at end of file +StartFrame: 11 +EndFrame: 13 diff --git a/assets/resources/dolphin/animations/recording/frame_0.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_0.bm similarity index 100% rename from assets/resources/dolphin/animations/recording/frame_0.bm rename to assets/resources/dolphin/L1_Recording_128x51/frame_0.bm diff --git a/assets/resources/dolphin/animations/recording/frame_1.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_1.bm similarity index 100% rename from assets/resources/dolphin/animations/recording/frame_1.bm rename to assets/resources/dolphin/L1_Recording_128x51/frame_1.bm diff --git a/assets/resources/dolphin/animations/recording/frame_10.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_10.bm similarity index 50% rename from assets/resources/dolphin/animations/recording/frame_10.bm rename to assets/resources/dolphin/L1_Recording_128x51/frame_10.bm index 356eeb1c5..7684384fd 100644 Binary files a/assets/resources/dolphin/animations/recording/frame_10.bm and b/assets/resources/dolphin/L1_Recording_128x51/frame_10.bm differ diff --git a/assets/resources/dolphin/animations/recording/frame_11.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_11.bm similarity index 58% rename from assets/resources/dolphin/animations/recording/frame_11.bm rename to assets/resources/dolphin/L1_Recording_128x51/frame_11.bm index 804dca320..478c1e8b5 100644 Binary files a/assets/resources/dolphin/animations/recording/frame_11.bm and b/assets/resources/dolphin/L1_Recording_128x51/frame_11.bm differ diff --git a/assets/resources/dolphin/animations/recording/frame_2.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_2.bm similarity index 100% rename from assets/resources/dolphin/animations/recording/frame_2.bm rename to assets/resources/dolphin/L1_Recording_128x51/frame_2.bm diff --git a/assets/resources/dolphin/animations/recording/frame_3.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_3.bm similarity index 58% rename from assets/resources/dolphin/animations/recording/frame_3.bm rename to assets/resources/dolphin/L1_Recording_128x51/frame_3.bm index 4ecea3387..eb4b3644b 100644 Binary files a/assets/resources/dolphin/animations/recording/frame_3.bm and b/assets/resources/dolphin/L1_Recording_128x51/frame_3.bm differ diff --git a/assets/resources/dolphin/animations/recording/frame_4.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_4.bm similarity index 58% rename from assets/resources/dolphin/animations/recording/frame_4.bm rename to assets/resources/dolphin/L1_Recording_128x51/frame_4.bm index 241cf66be..e0db66ffe 100644 Binary files a/assets/resources/dolphin/animations/recording/frame_4.bm and b/assets/resources/dolphin/L1_Recording_128x51/frame_4.bm differ diff --git a/assets/resources/dolphin/animations/recording/frame_5.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_5.bm similarity index 59% rename from assets/resources/dolphin/animations/recording/frame_5.bm rename to assets/resources/dolphin/L1_Recording_128x51/frame_5.bm index 876d6e373..9265ef6d6 100644 Binary files a/assets/resources/dolphin/animations/recording/frame_5.bm and b/assets/resources/dolphin/L1_Recording_128x51/frame_5.bm differ diff --git a/assets/resources/dolphin/animations/recording/frame_6.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_6.bm similarity index 100% rename from assets/resources/dolphin/animations/recording/frame_6.bm rename to assets/resources/dolphin/L1_Recording_128x51/frame_6.bm diff --git a/assets/resources/dolphin/animations/recording/frame_7.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_7.bm similarity index 100% rename from assets/resources/dolphin/animations/recording/frame_7.bm rename to assets/resources/dolphin/L1_Recording_128x51/frame_7.bm diff --git a/assets/resources/dolphin/animations/recording/frame_8.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_8.bm similarity index 100% rename from assets/resources/dolphin/animations/recording/frame_8.bm rename to assets/resources/dolphin/L1_Recording_128x51/frame_8.bm diff --git a/assets/resources/dolphin/L1_Recording_128x51/frame_9.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_9.bm new file mode 100644 index 000000000..65b723203 Binary files /dev/null and b/assets/resources/dolphin/L1_Recording_128x51/frame_9.bm differ diff --git a/assets/dolphin/animations/recording/meta.txt b/assets/resources/dolphin/L1_Recording_128x51/meta.txt similarity index 84% rename from assets/dolphin/animations/recording/meta.txt rename to assets/resources/dolphin/L1_Recording_128x51/meta.txt index bb9a0ca44..de37d5b2e 100644 --- a/assets/dolphin/animations/recording/meta.txt +++ b/assets/resources/dolphin/L1_Recording_128x51/meta.txt @@ -6,9 +6,9 @@ Height: 51 Passive frames: 6 Active frames: 6 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 -Active cycles: 2 +Active cycles: 1 Frame rate: 2 Duration: 3600 Active cooldown: 5 -Bubble slots: 0 \ No newline at end of file +Bubble slots: 0 diff --git a/assets/resources/dolphin/animations/sleep/frame_0.bm b/assets/resources/dolphin/L1_Sleep_128x64/frame_0.bm similarity index 100% rename from assets/resources/dolphin/animations/sleep/frame_0.bm rename to assets/resources/dolphin/L1_Sleep_128x64/frame_0.bm diff --git a/assets/resources/dolphin/animations/sleep/frame_1.bm b/assets/resources/dolphin/L1_Sleep_128x64/frame_1.bm similarity index 100% rename from assets/resources/dolphin/animations/sleep/frame_1.bm rename to assets/resources/dolphin/L1_Sleep_128x64/frame_1.bm diff --git a/assets/resources/dolphin/animations/sleep/frame_2.bm b/assets/resources/dolphin/L1_Sleep_128x64/frame_2.bm similarity index 100% rename from assets/resources/dolphin/animations/sleep/frame_2.bm rename to assets/resources/dolphin/L1_Sleep_128x64/frame_2.bm diff --git a/assets/resources/dolphin/animations/sleep/frame_3.bm b/assets/resources/dolphin/L1_Sleep_128x64/frame_3.bm similarity index 100% rename from assets/resources/dolphin/animations/sleep/frame_3.bm rename to assets/resources/dolphin/L1_Sleep_128x64/frame_3.bm diff --git a/assets/resources/dolphin/animations/sleep/meta.txt b/assets/resources/dolphin/L1_Sleep_128x64/meta.txt similarity index 97% rename from assets/resources/dolphin/animations/sleep/meta.txt rename to assets/resources/dolphin/L1_Sleep_128x64/meta.txt index 7960b0653..ffd845e8c 100644 --- a/assets/resources/dolphin/animations/sleep/meta.txt +++ b/assets/resources/dolphin/L1_Sleep_128x64/meta.txt @@ -38,4 +38,4 @@ Text: Just a dream... AlignH: Left AlignV: Bottom StartFrame: 6 -EndFrame: 9 \ No newline at end of file +EndFrame: 9 diff --git a/assets/resources/dolphin/animations/waves/frame_0.bm b/assets/resources/dolphin/L1_Waves_128x50/frame_0.bm similarity index 100% rename from assets/resources/dolphin/animations/waves/frame_0.bm rename to assets/resources/dolphin/L1_Waves_128x50/frame_0.bm diff --git a/assets/resources/dolphin/animations/waves/frame_1.bm b/assets/resources/dolphin/L1_Waves_128x50/frame_1.bm similarity index 100% rename from assets/resources/dolphin/animations/waves/frame_1.bm rename to assets/resources/dolphin/L1_Waves_128x50/frame_1.bm diff --git a/assets/resources/dolphin/animations/waves/frame_2.bm b/assets/resources/dolphin/L1_Waves_128x50/frame_2.bm similarity index 100% rename from assets/resources/dolphin/animations/waves/frame_2.bm rename to assets/resources/dolphin/L1_Waves_128x50/frame_2.bm diff --git a/assets/resources/dolphin/animations/waves/frame_3.bm b/assets/resources/dolphin/L1_Waves_128x50/frame_3.bm similarity index 100% rename from assets/resources/dolphin/animations/waves/frame_3.bm rename to assets/resources/dolphin/L1_Waves_128x50/frame_3.bm diff --git a/assets/resources/dolphin/animations/waves/meta.txt b/assets/resources/dolphin/L1_Waves_128x50/meta.txt similarity index 98% rename from assets/resources/dolphin/animations/waves/meta.txt rename to assets/resources/dolphin/L1_Waves_128x50/meta.txt index c2f63b4c7..376447af7 100644 --- a/assets/resources/dolphin/animations/waves/meta.txt +++ b/assets/resources/dolphin/L1_Waves_128x50/meta.txt @@ -47,4 +47,4 @@ Text: swim all day AlignH: Right AlignV: Bottom StartFrame: 6 -EndFrame: 9 \ No newline at end of file +EndFrame: 9 diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_0.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_0.bm new file mode 100644 index 000000000..7e83e14a5 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_0.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_1.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_1.bm new file mode 100644 index 000000000..f149f01e9 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_1.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_10.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_10.bm new file mode 100644 index 000000000..c5312e5e5 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_10.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_11.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_11.bm new file mode 100644 index 000000000..c91ed2fd2 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_11.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_12.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_12.bm new file mode 100644 index 000000000..392905a55 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_12.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_13.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_13.bm new file mode 100644 index 000000000..aa5353e98 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_13.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_14.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_14.bm new file mode 100644 index 000000000..837c6c71d Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_14.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_15.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_15.bm new file mode 100644 index 000000000..0000a8863 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_15.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_16.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_16.bm new file mode 100644 index 000000000..46a96ff46 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_16.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_17.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_17.bm new file mode 100644 index 000000000..edccc7396 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_17.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_18.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_18.bm new file mode 100644 index 000000000..84f60c81e Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_18.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_2.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_2.bm new file mode 100644 index 000000000..ade67d101 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_2.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_3.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_3.bm new file mode 100644 index 000000000..d05e8ae2b Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_3.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_4.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_4.bm new file mode 100644 index 000000000..5aef12762 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_4.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_5.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_5.bm new file mode 100644 index 000000000..3be1790d7 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_5.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_6.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_6.bm new file mode 100644 index 000000000..c457e7877 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_6.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_7.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_7.bm new file mode 100644 index 000000000..7e83e14a5 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_7.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_8.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_8.bm new file mode 100644 index 000000000..b7b871d13 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_8.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_9.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_9.bm new file mode 100644 index 000000000..269e5b1d8 Binary files /dev/null and b/assets/resources/dolphin/L2_Furippa2_128x64/frame_9.bm differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/meta.txt b/assets/resources/dolphin/L2_Furippa2_128x64/meta.txt new file mode 100644 index 000000000..c21027e49 --- /dev/null +++ b/assets/resources/dolphin/L2_Furippa2_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 11 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_0.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_0.bm new file mode 100644 index 000000000..07a63d642 Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_0.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_1.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_1.bm new file mode 100644 index 000000000..6d118f28a Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_1.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_10.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_10.bm new file mode 100644 index 000000000..8010501d0 Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_10.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_11.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_11.bm new file mode 100644 index 000000000..4d650bff0 Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_11.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_12.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_12.bm new file mode 100644 index 000000000..392905a55 Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_12.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_13.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_13.bm new file mode 100644 index 000000000..aa5353e98 Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_13.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_14.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_14.bm new file mode 100644 index 000000000..837c6c71d Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_14.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_15.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_15.bm new file mode 100644 index 000000000..9ff56a5b6 Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_15.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_16.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_16.bm new file mode 100644 index 000000000..34cc0b512 Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_16.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_17.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_17.bm new file mode 100644 index 000000000..80cb06fd3 Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_17.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_18.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_18.bm new file mode 100644 index 000000000..719a80f0e Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_18.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_2.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_2.bm new file mode 100644 index 000000000..c01485850 Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_2.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_3.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_3.bm new file mode 100644 index 000000000..f70c33cad Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_3.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_4.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_4.bm new file mode 100644 index 000000000..3fee74b77 Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_4.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_5.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_5.bm new file mode 100644 index 000000000..e363bf7d5 Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_5.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_6.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_6.bm new file mode 100644 index 000000000..f46aabadf Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_6.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_7.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_7.bm new file mode 100644 index 000000000..07a63d642 Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_7.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_8.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_8.bm new file mode 100644 index 000000000..f8bae3a62 Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_8.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_9.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_9.bm new file mode 100644 index 000000000..6b5810dc9 Binary files /dev/null and b/assets/resources/dolphin/L3_Furippa3_128x64/frame_9.bm differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/meta.txt b/assets/resources/dolphin/L3_Furippa3_128x64/meta.txt new file mode 100644 index 000000000..c21027e49 --- /dev/null +++ b/assets/resources/dolphin/L3_Furippa3_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 11 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +Active cycles: 1 +Frame rate: 2 +Duration: 3600 +Active cooldown: 7 + +Bubble slots: 0 diff --git a/assets/resources/dolphin/animations/manifest.txt b/assets/resources/dolphin/animations/manifest.txt deleted file mode 100644 index 85d5b45de..000000000 --- a/assets/resources/dolphin/animations/manifest.txt +++ /dev/null @@ -1,34 +0,0 @@ -Filetype: Flipper Animation Manifest -Version: 1 - -# Animation 1 -Name: waves -Min butthurt: 0 -Max butthurt: 5 -Min level: 1 -Max level: 3 -Weight: 3 - -# Animation 2 -Name: laptop -Min butthurt: 0 -Max butthurt: 9 -Min level: 1 -Max level: 3 -Weight: 3 - -# Animation 3 -Name: sleep -Min butthurt: 0 -Max butthurt: 10 -Min level: 1 -Max level: 3 -Weight: 3 - -# Animation 4 -Name: recording -Min butthurt: 0 -Max butthurt: 8 -Min level: 1 -Max level: 1 -Weight: 3 \ No newline at end of file diff --git a/assets/resources/dolphin/animations/recording/frame_9.bm b/assets/resources/dolphin/animations/recording/frame_9.bm deleted file mode 100644 index 315d585f7..000000000 Binary files a/assets/resources/dolphin/animations/recording/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin/manifest.txt b/assets/resources/dolphin/manifest.txt new file mode 100644 index 000000000..8be65c11e --- /dev/null +++ b/assets/resources/dolphin/manifest.txt @@ -0,0 +1,51 @@ +Filetype: Flipper Animation Manifest +Version: 1 + +Name: L1_Waves_128x50 +Min butthurt: 0 +Max butthurt: 5 +Min level: 1 +Max level: 3 +Weight: 3 + +Name: L1_Laptop_128x51 +Min butthurt: 0 +Max butthurt: 9 +Min level: 1 +Max level: 3 +Weight: 3 + +Name: L1_Sleep_128x64 +Min butthurt: 0 +Max butthurt: 10 +Min level: 1 +Max level: 3 +Weight: 3 + +Name: L1_Recording_128x51 +Min butthurt: 0 +Max butthurt: 8 +Min level: 1 +Max level: 1 +Weight: 3 + +Name: L1_Furippa1_128x64 +Min butthurt: 0 +Max butthurt: 6 +Min level: 1 +Max level: 1 +Weight: 3 + +Name: L2_Furippa2_128x64 +Min butthurt: 0 +Max butthurt: 6 +Min level: 2 +Max level: 2 +Weight: 3 + +Name: L3_Furippa3_128x64 +Min butthurt: 0 +Max butthurt: 6 +Min level: 3 +Max level: 3 +Weight: 3 diff --git a/core/furi/dangerous_defines.h b/core/furi/dangerous_defines.h index 7f302d143..b477710ac 100644 --- a/core/furi/dangerous_defines.h +++ b/core/furi/dangerous_defines.h @@ -20,6 +20,12 @@ *tmp_x = y; \ *tmp_x; \ }) +#define FURI_CONST_ASSIGN_PTR(x, y) \ + ({ \ + void** tmp_x = (void**)&x; \ + *tmp_x = y; \ + *tmp_x; \ + }) #define FURI_CONST_ASSIGN(x, y) \ _Generic((x), signed char \ : FURI_CONST_ASSIGN_(signed char, x, y), unsigned char \ diff --git a/documentation/KeyCombo.md b/documentation/KeyCombo.md new file mode 100644 index 000000000..359fd5b9b --- /dev/null +++ b/documentation/KeyCombo.md @@ -0,0 +1,134 @@ +# Key Combos + +There are times when your flipper feels blue and don't respond to your commands. +In that case you may find this guide useful. + + +## Basic Combos + + +### Hardware Reset + +- Press `LEFT` and `BACK` and hold for couple seconds +- Release `LEFT` and `BACK` + +This combo performs hardware reset by pulling MCU reset line down. +Main components involved: Keys -> DD8(NC7SZ32M5X, OR-gate) -> DD1(STM32WB55, MCU) + +There is 1 case when it's not working: + +- MCU debug block is active and holding reset line from inside. + + +### Hardware Power Reset + +- Disconnect USB and any external power supplies +- Disconnect USB once again +- Make sure that you've disconnected USB and any external power supplies +- Press `BACK` and hold for 30 seconds (Only will work with USB Disconnected) +- If you have not disconnected USB, then disconnect USB and repeat previous step +- Release `BACK` key + +This combo performs reset by switching SYS power line off and then on. +Main components involved: Keys -> DD6(bq25896, charger) + +There is 1 case when it's not working: + +- Power supply is connected to USB or 5V_ext + + +### Software DFU + +- Press `LEFT` on boot to enter DFU with flipper boot-loader + +There is 1 case when it's not working: + +- Flipper Boot-loader is damaged or absent + + +### Hardware DFU + +- Press `OK` on boot to enter DFU with ST boot-loader + +There is 1 case when it's not working: + +- Option Bytes are damaged or set to ignore `OK` key + + +## DFU Combos + + +### Hardware Reset + Software DFU + +- Press `LEFT` and `BACK` and hold for couple seconds +- Release `BACK` +- Device will enter DFU with indication (Blue LED + DFU Screen) +- Release `LEFT` + +This combo performs hardware reset by pulling MCU reset line down. +Then `LEFT` key indicates to boot-loader that DFU mode requested. + +There are 2 cases when it's not working: + +- MCU debug block is active and holding reset line from inside +- Flipper Boot-loader is damaged or absent + + +### Hardware Reset + Hardware DFU + +- Press `LEFT` and `BACK` and `OK` and hold for couple seconds +- Release `BACK` and `LEFT` +- Device will enter DFU without indication + +This combo performs hardware reset by pulling MCU reset line down. +Then `OK` key forces MCU to load internal boot-loader. + +There are 2 cases when it's not working: + +- MCU debug block is active and holding reset line from inside +- Option Bytes are damaged or set to ignore `OK` key + + +### Hardware Power Reset + Software DFU + +- Disconnect USB and any external power supplies +- Press `BACK` and `LEFT` for 30 seconds +- Release `BACK` +- Device will enter DFU with indication (Blue LED + DFU Screen) +- Release `LEFT` +- Plug USB + +This combo performs reset by switching SYS power line off and then on. +Then `LEFT` key indicates to boot-loader that DFU mode requested. + +There are 2 cases when it's not working: + +- Power supply is connected to USB or 5V_ext +- Flipper Boot-loader is damaged or absent + + +### Hardware Power Reset + Hardware DFU + +- Disconnect USB and any external power supplies +- Press `BACK` and `OK` and hold for 30 seconds +- Release `BACK` and `OK` +- Device will enter DFU without indication +- Plug USB + +This combo performs reset by switching SYS power line off and then on. +Then `OK` key forces MCU to load internal boot-loader. + +There are 2 cases when it's not working: + +- Power supply is connected to USB or 5V_ext +- Option Bytes are damaged or set to ignore `OK` key + +# Alternative ways to recover your device + +If none of the described methods were useful: + +- Ensure battery charged +- Disconnect battery and connect again (Requires disassembly) +- Try to Flash device with ST-Link or other programmer that support SWD + +If you still here and your device is not working: it's not software issue. diff --git a/scripts/assets.py b/scripts/assets.py index bdacb8eb7..34d4c1adb 100755 --- a/scripts/assets.py +++ b/scripts/assets.py @@ -1,5 +1,7 @@ #!/usr/bin/env python3 +from flipper.app import App + import logging import argparse import subprocess @@ -25,16 +27,14 @@ ICONS_TEMPLATE_C_DATA = "const uint8_t *{name}[] = {data};\n" ICONS_TEMPLATE_C_ICONS = "const Icon {name} = {{.width={width},.height={height},.frame_count={frame_count},.frame_rate={frame_rate},.frames=_{name}}};\n" -class Main: - def __init__(self): +class Main(App): + def init(self): # command args - self.parser = argparse.ArgumentParser() - self.parser.add_argument("-d", "--debug", action="store_true", help="Debug") self.subparsers = self.parser.add_subparsers(help="sub-command help") self.parser_icons = self.subparsers.add_parser( "icons", help="Process icons and build icon registry" ) - self.parser_icons.add_argument("source_directory", help="Source directory") + self.parser_icons.add_argument("input_directory", help="Source directory") self.parser_icons.add_argument("output_directory", help="Output directory") self.parser_icons.set_defaults(func=self.icons) @@ -56,30 +56,49 @@ class Main: "dolphin", help="Assemble dolphin resources" ) self.parser_dolphin.add_argument( - "dolphin_sources", help="Doplhin sources directory" + "-s", + "--symbol-name", + help="Symbol and file name in dolphin output directory", + default=None, ) self.parser_dolphin.add_argument( - "dolphin_output", help="Doplhin output directory" + "input_directory", help="Dolphin source directory" + ) + self.parser_dolphin.add_argument( + "output_directory", help="Dolphin output directory" ) self.parser_dolphin.set_defaults(func=self.dolphin) - # logging - self.logger = logging.getLogger() + def _icon2header(self, file): + output = subprocess.check_output(["convert", file, "xbm:-"]) + assert output + f = io.StringIO(output.decode().strip()) + width = int(f.readline().strip().split(" ")[2]) + height = int(f.readline().strip().split(" ")[2]) + data = f.read().strip().replace("\n", "").replace(" ", "").split("=")[1][:-1] + data_bin_str = data[1:-1].replace(",", " ").replace("0x", "") + data_bin = bytearray.fromhex(data_bin_str) + # Encode icon data with LZSS + data_encoded_str = subprocess.check_output( + ["heatshrink", "-e", "-w8", "-l4"], input=data_bin + ) + assert data_encoded_str + data_enc = bytearray(data_encoded_str) + data_enc = bytearray([len(data_enc) & 0xFF, len(data_enc) >> 8]) + data_enc + # Use encoded data only if its lenght less than original, including header + if len(data_enc) < len(data_bin) + 1: + data = ( + "{0x01,0x00," + + "".join("0x{:02x},".format(byte) for byte in data_enc) + + "}" + ) + else: + data = "{0x00," + data[1:] + return width, height, data - def __call__(self): - self.args = self.parser.parse_args() - if "func" not in self.args: - self.parser.error("Choose something to do") - # configure log output - self.log_level = logging.DEBUG if self.args.debug else logging.INFO - self.logger.setLevel(self.log_level) - self.handler = logging.StreamHandler(sys.stdout) - self.handler.setLevel(self.log_level) - self.formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s") - self.handler.setFormatter(self.formatter) - self.logger.addHandler(self.handler) - # execute requested function - self.args.func() + def _iconIsSupported(self, filename): + extension = filename.lower().split(".")[-1] + return extension in ICONS_SUPPORTED_FORMATS def icons(self): self.logger.debug(f"Converting icons") @@ -87,7 +106,7 @@ class Main: icons_c.write(ICONS_TEMPLATE_C_HEADER) icons = [] # Traverse icons tree, append image data to source file - for dirpath, dirnames, filenames in os.walk(self.args.source_directory): + for dirpath, dirnames, filenames in os.walk(self.args.input_directory): self.logger.debug(f"Processing directory {dirpath}") dirnames.sort() filenames.sort() @@ -105,10 +124,10 @@ class Main: if filename == "frame_rate": frame_rate = int(open(fullfilename, "r").read().strip()) continue - elif not self.iconIsSupported(filename): + elif not self._iconIsSupported(filename): continue self.logger.debug(f"Processing animation frame {filename}") - temp_width, temp_height, data = self.icon2header(fullfilename) + temp_width, temp_height, data = self._icon2header(fullfilename) if width is None: width = temp_width if height is None: @@ -133,14 +152,14 @@ class Main: else: # process icons for filename in filenames: - if not self.iconIsSupported(filename): + if not self._iconIsSupported(filename): continue self.logger.debug(f"Processing icon {filename}") icon_name = "I_" + "_".join(filename.split(".")[:-1]).replace( "-", "_" ) fullfilename = os.path.join(dirpath, filename) - width, height, data = self.icon2header(fullfilename) + width, height, data = self._icon2header(fullfilename) frame_name = f"_{icon_name}_0" icons_c.write( ICONS_TEMPLATE_C_FRAME.format(name=frame_name, data=data) @@ -172,37 +191,7 @@ class Main: for name, width, height, frame_rate, frame_count in icons: icons_h.write(ICONS_TEMPLATE_H_ICON_NAME.format(name=name)) self.logger.debug(f"Done") - - def icon2header(self, file): - output = subprocess.check_output(["convert", file, "xbm:-"]) - assert output - f = io.StringIO(output.decode().strip()) - width = int(f.readline().strip().split(" ")[2]) - height = int(f.readline().strip().split(" ")[2]) - data = f.read().strip().replace("\n", "").replace(" ", "").split("=")[1][:-1] - data_bin_str = data[1:-1].replace(",", " ").replace("0x", "") - data_bin = bytearray.fromhex(data_bin_str) - # Encode icon data with LZSS - data_encoded_str = subprocess.check_output( - ["heatshrink", "-e", "-w8", "-l4"], input=data_bin - ) - assert data_encoded_str - data_enc = bytearray(data_encoded_str) - data_enc = bytearray([len(data_enc) & 0xFF, len(data_enc) >> 8]) + data_enc - # Use encoded data only if its lenght less than original, including header - if len(data_enc) < len(data_bin) + 1: - data = ( - "{0x01,0x00," - + "".join("0x{:02x},".format(byte) for byte in data_enc) - + "}" - ) - else: - data = "{0x00," + data[1:] - return width, height, data - - def iconIsSupported(self, filename): - extension = filename.lower().split(".")[-1] - return extension in ICONS_SUPPORTED_FORMATS + return 0 def manifest(self): from flipper.assets.manifest import Manifest @@ -233,17 +222,33 @@ class Main: self.logger.info(f"Only in new: {record}") self.logger.info(f"Complete") + return 0 + def copro(self): from flipper.assets.copro import Copro + self.logger.info(f"Bundling coprocessor binaries") copro = Copro(self.args.mcu) + self.logger.info(f"Loading CUBE info") copro.loadCubeInfo(self.args.cube_dir) + self.logger.info(f"Bundling") copro.bundle(self.args.output_dir) + self.logger.info(f"Complete") + + return 0 def dolphin(self): - from flipper.assets.dolphin import pack_dolphin + from flipper.assets.dolphin import Dolphin - pack_dolphin(self.args.dolphin_sources, self.args.dolphin_output) + self.logger.info(f"Processing Dolphin sources") + dolphin = Dolphin() + self.logger.info(f"Loading data") + dolphin.load(self.args.input_directory) + self.logger.info(f"Packing") + dolphin.pack(self.args.output_directory, self.args.symbol_name) + self.logger.info(f"Complete") + + return 0 if __name__ == "__main__": diff --git a/scripts/flipper/assets/dolphin.py b/scripts/flipper/assets/dolphin.py index 076bbb15c..51a3cc61d 100644 --- a/scripts/flipper/assets/dolphin.py +++ b/scripts/flipper/assets/dolphin.py @@ -3,53 +3,361 @@ import logging import os import sys import shutil +from collections import Counter +from flipper.utils.fff import * +from flipper.utils.templite import * from .icon import * -def _pack_animation(pair: set): - source, destination = pair - image = file2image(source) - image.write(destination) +def _convert_image_to_bm(pair: set): + source_filename, destination_filename = pair + image = file2image(source_filename) + image.write(destination_filename) -def pack_animations(source: str, destination: str): - assert os.path.exists(source) - # Create list for processing - to_pack = [] - dirpath, dirnames = next(os.walk(source))[:2] - dirnames.sort() - for dirname in dirnames: - current_directory = os.path.join(dirpath, dirname) - # Ensure destination folder - destination_directory = os.path.join(destination, dirname) - os.makedirs(destination_directory, exist_ok=True) - # Find all files - filenames = next(os.walk(current_directory))[2] - filenames.sort() - for filename in filenames: - if is_file_an_icon(filename): - source_filename = os.path.join(current_directory, filename) - destination_filename = os.path.join( - destination_directory, os.path.splitext(filename)[0] + ".bm" +def _convert_image(source_filename: str): + image = file2image(source_filename) + return image.data + + +class DolphinBubbleAnimation: + + FILE_TYPE = "Flipper Animation" + FILE_VERSION = 1 + + def __init__( + self, + name: str, + min_butthurt: int, + max_butthurt: int, + min_level: int, + max_level: int, + weight: int, + ): + # Manifest + self.name = name + self.min_butthurt = min_butthurt + self.max_butthurt = max_butthurt + self.min_level = min_level + self.max_level = max_level + self.weight = weight + # Meta and data + self.meta = {} + self.frames = [] + self.bubbles = [] + self.bubble_slots = None + # Logging + self.logger = logging.getLogger("DolphinBubbleAnimation") + + def load(self, animation_directory: str): + if not os.path.isdir(animation_directory): + raise Exception(f"Animation folder doesn't exists: { animation_directory }") + + meta_filename = os.path.join(animation_directory, "meta.txt") + if not os.path.isfile(meta_filename): + raise Exception(f"Animation meta file doesn't exists: { meta_filename }") + + self.logger.info(f"Loading meta from {meta_filename}") + file = FlipperFormatFile() + file.load(meta_filename) + + # Check file header + filetype, version = file.getHeader() + assert filetype == self.FILE_TYPE + assert version == self.FILE_VERSION + + max_frame_number = None + unique_frames = None + total_frames_count = None + + try: + # Main meta + self.meta["Width"] = file.readKeyInt("Width") + self.meta["Height"] = file.readKeyInt("Height") + self.meta["Passive frames"] = file.readKeyInt("Passive frames") + self.meta["Active frames"] = file.readKeyInt("Active frames") + self.meta["Frames order"] = file.readKeyIntArray("Frames order") + self.meta["Active cycles"] = file.readKeyInt("Active cycles") + self.meta["Frame rate"] = file.readKeyInt("Frame rate") + self.meta["Duration"] = file.readKeyInt("Duration") + self.meta["Active cooldown"] = file.readKeyInt("Active cooldown") + self.bubble_slots = file.readKeyInt("Bubble slots") + + # Sanity Check + assert self.meta["Width"] > 0 and self.meta["Width"] <= 128 + assert self.meta["Height"] > 0 and self.meta["Height"] <= 128 + assert self.meta["Passive frames"] > 0 + assert self.meta["Active frames"] >= 0 + assert self.meta["Frames order"] + if self.meta["Active frames"] > 0: + assert self.meta["Active cooldown"] > 0 + assert self.meta["Active cycles"] > 0 + else: + assert self.meta["Active cooldown"] == 0 + assert self.meta["Active cycles"] == 0 + assert self.meta["Frame rate"] > 0 + assert self.meta["Duration"] >= 0 + + # Frames sanity check + max_frame_number = max(self.meta["Frames order"]) + ordered_frames_count = len(self.meta["Frames order"]) + for i in range(max_frame_number + 1): + frame_filename = os.path.join(animation_directory, f"frame_{i}.png") + assert os.path.isfile(frame_filename) + self.frames.append(frame_filename) + # Sanity check + unique_frames = set(self.meta["Frames order"]) + unique_frames_count = len(unique_frames) + if unique_frames_count != max_frame_number + 1: + self.logger.warning(f"Not all frames were used in {self.name}") + total_frames_count = self.meta["Passive frames"] + ( + self.meta["Active frames"] * self.meta["Active cycles"] + ) + + # Extra checks + assert self.meta["Passive frames"] <= total_frames_count + assert self.meta["Active frames"] <= total_frames_count + assert ( + self.meta["Passive frames"] + self.meta["Active frames"] + == ordered_frames_count + ) + except EOFError as e: + raise Exception("Invalid meta file: too short") + except AssertionError as e: + self.logger.exception(e) + self.logger.error(f"Animation {self.name} got incorrect meta") + raise Exception("Meta file is invalid: incorrect data") + + # Bubbles + while True: + try: + # Bubble data + bubble = {} + bubble["Slot"] = file.readKeyInt("Slot") + bubble["X"] = file.readKeyInt("X") + bubble["Y"] = file.readKeyInt("Y") + bubble["Text"] = file.readKey("Text") + bubble["AlignH"] = file.readKey("AlignH") + bubble["AlignV"] = file.readKey("AlignV") + bubble["StartFrame"] = file.readKeyInt("StartFrame") + bubble["EndFrame"] = file.readKeyInt("EndFrame") + + # Sanity check + assert bubble["Slot"] <= self.bubble_slots + assert bubble["X"] >= 0 and bubble["X"] < 128 + assert bubble["Y"] >= 0 and bubble["Y"] < 128 + assert len(bubble["Text"]) > 0 + assert bubble["AlignH"] in ["Left", "Center", "Right"] + assert bubble["AlignV"] in ["Bottom", "Center", "Top"] + assert bubble["StartFrame"] < total_frames_count + assert bubble["EndFrame"] < total_frames_count + assert bubble["EndFrame"] >= bubble["StartFrame"] + + # Store bubble + self.bubbles.append(bubble) + except AssertionError as e: + self.logger.exception(e) + self.logger.error( + f"Animation {self.name} bubble slot {bubble_slot} got incorrect data: {bubble}" ) - to_pack.append((source_filename, destination_filename)) - elif filename == "meta.txt": - source_filename = os.path.join(current_directory, filename) - destination_filename = os.path.join(destination_directory, filename) - shutil.copyfile(source_filename, destination_filename) + raise Exception("Meta file is invalid: incorrect bubble data") + except EOFError: + break - # Process images in parallel - pool = multiprocessing.Pool() - pool.map(_pack_animation, to_pack) + def prepare(self): + bubbles_in_slots = Counter([bubble["Slot"] for bubble in self.bubbles]) - shutil.copyfile( - os.path.join(source, "manifest.txt"), os.path.join(destination, "manifest.txt") + last_slot = -1 + bubble_index = 0 + for bubble in self.bubbles: + slot = bubble["Slot"] + if slot == last_slot: + bubble_index += 1 + else: + last_slot = slot + bubble_index = 0 + bubble["_BubbleIndex"] = bubble_index + + bubbles_in_slots[slot] -= 1 + if bubbles_in_slots[slot] != 0: + bubble["_NextBubbleIndex"] = bubble_index + 1 + + def save(self, output_directory: str): + animation_directory = os.path.join(output_directory, self.name) + os.makedirs(animation_directory, exist_ok=True) + meta_filename = os.path.join(animation_directory, "meta.txt") + + file = FlipperFormatFile() + file.setHeader(self.FILE_TYPE, self.FILE_VERSION) + file.writeEmptyLine() + + # Write meta data + file.writeKey("Width", self.meta["Width"]) + file.writeKey("Height", self.meta["Height"]) + file.writeKey("Passive frames", self.meta["Passive frames"]) + file.writeKey("Active frames", self.meta["Active frames"]) + file.writeKey("Frames order", self.meta["Frames order"]) + file.writeKey("Active cycles", self.meta["Active cycles"]) + file.writeKey("Frame rate", self.meta["Frame rate"]) + file.writeKey("Duration", self.meta["Duration"]) + file.writeKey("Active cooldown", self.meta["Active cooldown"]) + file.writeEmptyLine() + + file.writeKey("Bubble slots", self.bubble_slots) + file.writeEmptyLine() + + # Write bubble data + for bubble in self.bubbles: + file.writeKey("Slot", bubble["Slot"]) + file.writeKey("X", bubble["X"]) + file.writeKey("Y", bubble["Y"]) + file.writeKey("Text", bubble["Text"]) + file.writeKey("AlignH", bubble["AlignH"]) + file.writeKey("AlignV", bubble["AlignV"]) + file.writeKey("StartFrame", bubble["StartFrame"]) + file.writeKey("EndFrame", bubble["EndFrame"]) + file.writeEmptyLine() + + file.save(meta_filename) + + to_pack = [] + for index, frame in enumerate(self.frames): + to_pack.append( + (frame, os.path.join(animation_directory, f"frame_{index}.bm")) + ) + + pool = multiprocessing.Pool() + pool.map(_convert_image_to_bm, to_pack) + + def process(self): + pool = multiprocessing.Pool() + self.frames = pool.map(_convert_image, self.frames) + + +class DolphinManifest: + + FILE_TYPE = "Flipper Animation Manifest" + FILE_VERSION = 1 + + TEMPLATE_DIRECTORY = os.path.join( + os.path.dirname(os.path.realpath(__file__)), "templates" ) + TEMPLATE_H = os.path.join(TEMPLATE_DIRECTORY, "dolphin.h.tmpl") + TEMPLATE_C = os.path.join(TEMPLATE_DIRECTORY, "dolphin.c.tmpl") + + def __init__(self): + self.animations = [] + self.logger = logging.getLogger("DolphinManifest") + + def load(self, source_directory: str): + manifest_filename = os.path.join(source_directory, "manifest.txt") + + file = FlipperFormatFile() + file.load(manifest_filename) + + # Check file header + filetype, version = file.getHeader() + assert filetype == self.FILE_TYPE + assert version == self.FILE_VERSION + + # Load animation data + while True: + try: + # Read animation spcification + name = file.readKey("Name") + min_butthurt = file.readKeyInt("Min butthurt") + max_butthurt = file.readKeyInt("Max butthurt") + min_level = file.readKeyInt("Min level") + max_level = file.readKeyInt("Max level") + weight = file.readKeyInt("Weight") + + assert len(name) > 0 + assert min_butthurt >= 0 + assert max_butthurt >= 0 and max_butthurt >= min_butthurt + assert min_level >= 0 + assert max_level >= 0 and max_level >= min_level + assert weight >= 0 + + # Initialize animation + animation = DolphinBubbleAnimation( + name, min_butthurt, max_butthurt, min_level, max_level, weight + ) + + # Load Animation meta and frames + animation.load(os.path.join(source_directory, name)) + + # Add to array + self.animations.append(animation) + except EOFError: + break + + def _renderTemplate(self, template_filename: str, output_filename: str, **kwargs): + template = Templite(filename=template_filename) + output = template.render(**kwargs) + open(output_filename, "w").write(output) + + def save2code(self, output_directory: str, symbol_name: str): + # Process frames + for animation in self.animations: + animation.process() + + # Prepare substitution data + for animation in self.animations: + animation.prepare() + + # Render Header + self._renderTemplate( + self.TEMPLATE_H, + os.path.join(output_directory, f"assets_{symbol_name}.h"), + animations=self.animations, + symbol_name=symbol_name, + ) + # Render Source + self._renderTemplate( + self.TEMPLATE_C, + os.path.join(output_directory, f"assets_{symbol_name}.c"), + animations=self.animations, + symbol_name=symbol_name, + ) + + def save2folder(self, output_directory: str): + manifest_filename = os.path.join(output_directory, "manifest.txt") + file = FlipperFormatFile() + file.setHeader(self.FILE_TYPE, self.FILE_VERSION) + file.writeEmptyLine() + + for animation in self.animations: + file.writeKey("Name", animation.name) + file.writeKey("Min butthurt", animation.min_butthurt) + file.writeKey("Max butthurt", animation.max_butthurt) + file.writeKey("Min level", animation.min_level) + file.writeKey("Max level", animation.max_level) + file.writeKey("Weight", animation.weight) + file.writeEmptyLine() + + animation.save(output_directory) + + file.save(manifest_filename) + + def save(self, output_directory: str, symbol_name: str): + os.makedirs(output_directory, exist_ok=True) + if symbol_name: + self.save2code(output_directory, symbol_name) + else: + self.save2folder(output_directory) -def pack_dolphin(source_directory: str, destination_directory: str): - pack_animations( - os.path.join(source_directory, "animations"), - os.path.join(destination_directory, "animations"), - ) +class Dolphin: + def __init__(self): + self.manifest = DolphinManifest() + self.logger = logging.getLogger("Dolphin") + + def load(self, source_directory: str): + assert os.path.isdir(source_directory) + # Load Manifest + self.logger.info(f"Loading directory {source_directory}") + self.manifest.load(source_directory) + + def pack(self, output_directory: str, symbol_name: str = None): + self.manifest.save(output_directory, symbol_name) diff --git a/scripts/flipper/assets/templates/dolphin.c.tmpl b/scripts/flipper/assets/templates/dolphin.c.tmpl new file mode 100644 index 000000000..d085678d3 --- /dev/null +++ b/scripts/flipper/assets/templates/dolphin.c.tmpl @@ -0,0 +1,92 @@ +#include +#include +#include +#include + +{% for animation in animations: %} +{% for frame_number, frame in enumerate(animation.frames): %} +const uint8_t _A_{{ animation.name }}_{{ frame_number }}[] = { + {{ "%s" % ",".join("0x%x" % i for i in frame)}} +}; +{% :endfor %} + +const uint8_t *_A_{{animation.name}}[] = { +{% for frame_number, frame in enumerate(animation.frames): %} + _A_{{ animation.name }}_{{ frame_number }}, +{% :endfor %} +}; + +{% if animation.bubble_slots > 0: %} +{% for bubble in animation.bubbles: %} +const FrameBubble {{ animation.name }}_bubble_{{ bubble["Slot"] }}_{{ bubble["_BubbleIndex"] }}; +{% :endfor %} + +const FrameBubble* const {{animation.name}}_bubble_sequences[] = { +{% for i in range(animation.bubble_slots): %} + &{{animation.name}}_bubble_{{i}}_0, +{% :endfor %} +}; + +{% for bubble in animation.bubbles: %} +{% + if "_NextBubbleIndex" in bubble: + next_bubble = f'&{animation.name}_bubble_{bubble["Slot"]}_{bubble["_NextBubbleIndex"]}' + else: + next_bubble = "NULL" +%} +const FrameBubble {{animation.name}}_bubble_{{bubble["Slot"]}}_{{bubble["_BubbleIndex"]}} = { + .bubble = { + .x = {{bubble["X"]}}, + .y = {{bubble["Y"]}}, + .text = "{{bubble["Text"]}}", + .align_h = Align{{bubble["AlignH"]}}, + .align_v = Align{{bubble["AlignV"]}}, + }, + .start_frame = {{bubble["StartFrame"]}}, + .end_frame = {{bubble["EndFrame"]}}, + .next_bubble = {{next_bubble}}, +}; +{% :endfor %} +{% :endif %} + +const BubbleAnimation BA_{{animation.name}} = { + .icon_animation = { + .width = {{ animation.meta['Width'] }}, + .height = {{ animation.meta['Height'] }}, + .frame_count = {{ "%d" % len(animation.frames) }}, + .frame_rate = {{ animation.meta['Frame rate'] }}, + .frames = _A_{{ animation.name }} + }, + .frame_order = { {{ "%s" % ", ".join(str(i) for i in animation.meta['Frames order']) }} }, + .passive_frames = {{ animation.meta['Passive frames'] }}, + .active_frames = {{ animation.meta['Active frames'] }}, + .active_cooldown = {{ animation.meta['Active cooldown'] }}, + .active_cycles = {{ animation.meta['Active cycles'] }}, + .duration = {{ animation.meta['Duration'] }}, +{% if animation.bubble_slots > 0: %} + .frame_bubble_sequences = {{ animation.name }}_bubble_sequences, + .frame_bubble_sequences_count = COUNT_OF({{ animation.name }}_bubble_sequences), +{% :else: %} + .frame_bubble_sequences = NULL, + .frame_bubble_sequences_count = 0, +{% :endif %} +}; +{% :endfor %} + +const StorageAnimation {{symbol_name}}[] = { +{% for animation in animations: %} + { + .animation = &BA_{{animation.name}}, + .manifest_info = { + .name = "{{animation.name}}", + .min_butthurt = {{animation.min_butthurt}}, + .max_butthurt = {{animation.max_butthurt}}, + .min_level = {{animation.min_level}}, + .max_level = {{animation.max_level}}, + .weight = {{animation.weight}}, + } + }, +{% :endfor %} +}; + +const size_t {{symbol_name}}_size = COUNT_OF({{symbol_name}}); diff --git a/scripts/flipper/assets/templates/dolphin.h.tmpl b/scripts/flipper/assets/templates/dolphin.h.tmpl new file mode 100644 index 000000000..405af1873 --- /dev/null +++ b/scripts/flipper/assets/templates/dolphin.h.tmpl @@ -0,0 +1,7 @@ +#pragma once + +#include +#include + +extern const StorageAnimation {{ symbol_name }}[]; +extern const size_t {{ symbol_name }}_size; diff --git a/scripts/flipper/utils/fff.py b/scripts/flipper/utils/fff.py new file mode 100644 index 000000000..e44d34308 --- /dev/null +++ b/scripts/flipper/utils/fff.py @@ -0,0 +1,103 @@ +import logging + + +class FlipperFormatFile: + def __init__(self): + # Storage + self.lines = [] + self.cursor = 0 + # Logger + self.logger = logging.getLogger("FlipperFormatFile") + + def _resetCursor(self): + self.cursor = 0 + + def nextLine(self): + line = None + while self.cursor < len(self.lines): + temp_line = self.lines[self.cursor].strip() + self.cursor += 1 + if len(temp_line) > 0 and not temp_line.startswith("#"): + line = temp_line + break + if line is None: + raise EOFError() + return line + + def readKeyValue(self): + line = self.nextLine() + data = line.split(":", 1) + if len(data) != 2: + self.logger.error(f"Incorrectly formated line {self.cursor}: `{line}`") + raise Exception("Unexpected line: not `key:value`") + return data[0].strip(), data[1].strip() + + def readKey(self, key: str): + k, v = self.readKeyValue() + if k != key: + raise KeyError(f"Unexpected key {k} != {key}") + return v + + def readKeyInt(self, key: str): + value = self.readKey(key) + return int(value) if value else None + + def readKeyIntArray(self, key: str): + value = self.readKey(key) + return [int(i) for i in value.split(" ")] if value else None + + def readKeyFloat(self, key: str): + value = self.readKey(key) + return float(value) if value else None + + def writeLine(self, line: str): + self.lines.insert(self.cursor, line) + self.cursor += 1 + + def writeKey(self, key: str, value): + if isinstance(value, (str, int, float)): + pass + elif isinstance(value, (list, set)): + value = " ".join(map(str, value)) + else: + raise Exception("Unknown value type") + self.writeLine(f"{key}: {value}") + + def writeEmptyLine(self): + self.writeLine("") + + def writeComment(self, text: str): + self.writeLine(f"# {text}") + + def getHeader(self): + if self.cursor != 0 and len(self.lines) == 0: + raise Exception("Can't read header data: cursor not at 0 or file is empty") + + # Read Filetype + key, value = self.readKeyValue() + if key != "Filetype": + raise Exception("Invalid Header: missing `Filetype`") + filetype = value + + # Read Version + key, value = self.readKeyValue() + if key != "Version": + raise Exception("Invalid Header: missing `Version`") + version = int(value) + + return filetype, version + + def setHeader(self, filetype: str, version: int): + if self.cursor != 0 and len(self.lines) != 0: + raise Exception("Can't set header data: file is not empty") + + self.writeKey("Filetype", filetype) + self.writeKey("Version", version) + + def load(self, filename: str): + file = open(filename, "r") + self.lines = file.readlines() + + def save(self, filename: str): + file = open(filename, "w") + file.write("\n".join(self.lines)) diff --git a/scripts/flipper/utils/templite.py b/scripts/flipper/utils/templite.py new file mode 100644 index 000000000..8af57d7f8 --- /dev/null +++ b/scripts/flipper/utils/templite.py @@ -0,0 +1,196 @@ +# Templite++ +# A light-weight, fully functional, general purpose templating engine +# Proudly made of shit and sticks. Strictly not for production use. +# Extremly unsafe and difficult to debug. +# +# Copyright (c) 2022 Flipper Devices +# Author: Aleksandr Kutuzov +# +# Copyright (c) 2009 joonis new media +# Author: Thimo Kraemer +# +# Based on Templite by Tomer Filiba +# http://code.activestate.com/recipes/496702/ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. + + +from enum import Enum + +import sys +import os + + +class TempliteCompiler: + class State(Enum): + TEXT = 1 + CONTROL = 2 + VARIABLE = 3 + + def __init__(self, source: str, encoding: str): + self.blocks = [f"# -*- coding: {encoding} -*-"] + self.block = "" + self.source = source + self.cursor = 0 + self.offset = 0 + + def processText(self): + self.block = self.block.replace("\\", "\\\\").replace('"', '\\"') + self.block = "\t" * self.offset + f'write("""{self.block}""")' + self.blocks.append(self.block) + self.block = "" + + def getLine(self): + return self.source[: self.cursor].count("\n") + 1 + + def controlIsEnding(self): + block_stripped = self.block.lstrip() + if block_stripped.startswith(":"): + if not self.offset: + raise SyntaxError( + f"Line: {self.getLine()}, no statement to terminate: `{block_stripped}`" + ) + self.offset -= 1 + self.block = block_stripped[1:] + if not self.block.endswith(":"): + return True + return False + + def processControl(self): + self.block = self.block.rstrip() + + if self.controlIsEnding(): + self.block = "" + return + + lines = self.block.splitlines() + margin = min(len(l) - len(l.lstrip()) for l in lines if l.strip()) + self.block = "\n".join("\t" * self.offset + l[margin:] for l in lines) + self.blocks.append(self.block) + if self.block.endswith(":"): + self.offset += 1 + self.block = "" + + def processVariable(self): + self.block = self.block.strip() + self.block = "\t" * self.offset + f"write({self.block})" + self.blocks.append(self.block) + self.block = "" + + def compile(self): + state = self.State.TEXT + + # Process template source + while self.cursor < len(self.source): + # Process plain text till first token occurance + if state == self.State.TEXT: + if self.source[self.cursor :].startswith("{%"): + state = self.State.CONTROL + self.cursor += 1 + elif self.source[self.cursor :].startswith("{{"): + state = self.State.VARIABLE + self.cursor += 1 + else: + self.block += self.source[self.cursor] + # Commit self.block if token was found + if state != self.State.TEXT: + self.processText() + elif state == self.State.CONTROL: + if self.source[self.cursor :].startswith("%}"): + self.cursor += 1 + state = self.State.TEXT + self.processControl() + else: + self.block += self.source[self.cursor] + elif state == self.State.VARIABLE: + if self.source[self.cursor :].startswith("}}"): + self.cursor += 1 + state = self.State.TEXT + self.processVariable() + else: + self.block += self.source[self.cursor] + else: + raise Exception("Unknown State") + + self.cursor += 1 + + if state != self.State.TEXT: + raise Exception("Last self.block was not closed") + + if self.block: + self.processText() + + return "\n".join(self.blocks) + + +class Templite: + cache = {} + + def __init__(self, text=None, filename=None, encoding="utf-8", caching=False): + """Loads a template from string or file.""" + if filename: + filename = os.path.abspath(filename) + mtime = os.path.getmtime(filename) + self.file = key = filename + elif text is not None: + self.file = mtime = None + key = hash(text) + else: + raise ValueError("either text or filename required") + # set attributes + self.encoding = encoding + self.caching = caching + # check cache + cache = self.cache + if caching and key in cache and cache[key][0] == mtime: + self._code = cache[key][1] + return + # read file + if filename: + with open(filename) as fh: + text = fh.read() + # Compile template to executable + code = TempliteCompiler(text, self.encoding).compile() + self._code = compile(code, self.file or "", "exec") + # Cache for future use + if caching: + cache[key] = (mtime, self._code) + + def render(self, **namespace): + """Renders the template according to the given namespace.""" + stack = [] + namespace["__file__"] = self.file + # add write method + def write(*args): + for value in args: + stack.append(str(value)) + + namespace["write"] = write + # add include method + def include(file): + if not os.path.isabs(file): + if self.file: + base = os.path.dirname(self.file) + else: + base = os.path.dirname(sys.argv[0]) + file = os.path.join(base, file) + t = Templite(None, file, self.encoding, self.delimiters, self.caching) + stack.append(t.render(**namespace)) + + namespace["include"] = include + # execute template code + exec(self._code, namespace) + return "".join(stack)