spice-space-commit Mailing List for Spice Space (Page 3)
Brought to you by:
ykamay
You can subscribe to this list here.
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(25) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2010 |
Jan
(81) |
Feb
(6) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Yaniv K. <yk...@re...> - 2010-01-06 17:05:47
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: master commit 81945d89710d9b03d829ebd4f040b0e8f3f2b507 Author: Yaniv Kamay <yk...@re...> Date: Wed Jan 6 19:03:25 2010 +0200 server: add new vd interface QTerm2Interface diff --git a/server/reds.c b/server/reds.c index 2bb707b..8a2700c 100644 --- a/server/reds.c +++ b/server/reds.c @@ -378,6 +378,21 @@ void (*log_proc)(CoreInterface *core, LogLevel level, const char* component, } \ } +static int args_is_empty(const VDICmdArg* args) +{ + return !args || args[0].descriptor.type == ARG_TYPE_INVALID; +} + +const int args_is_string(const VDICmdArg* args) +{ + return !args_is_empty(args) && args->descriptor.type == ARG_TYPE_STRING; +} + +const int args_is_int(const VDICmdArg* args) +{ + return !args_is_empty(args) && args->descriptor.type == ARG_TYPE_INT; +} + static ChannelSecurityOptions *find_channel_security(int id) { ChannelSecurityOptions *now = channels_security; @@ -505,6 +520,16 @@ static void reds_do_disable_ticketing(void) core->term_printf(core, "Ticketing is now disabled.\n"); } +static void reds_do_disable_ticketing_2(const VDICmdArg* args) +{ + if (!args_is_empty(args)) { + red_printf("invalid args"); + return; + } + + reds_do_disable_ticketing(); +} + static char *base64decode(const char *input, int length) { BIO *b64; @@ -629,6 +654,16 @@ static void do_reset_statistics() } } +static void do_reset_statistics_2(const VDICmdArg* args) +{ + if (!args_is_empty(args)) { + red_printf("invalid args"); + return; + } + + do_reset_statistics(); +} + void insert_stat_node(StatNodeRef parent, StatNodeRef ref) { StatNode *node = &reds->stat->nodes[ref]; @@ -1153,6 +1188,31 @@ static void do_ping_client(const char *opt, int has_interval, int interval) } } +static void do_ping_client_2(const VDICmdArg* args) +{ + if (args_is_empty(args)) { + do_ping_client(NULL, FALSE, 0); + return; + } + + if (!args_is_string(args)) { + red_printf("invalid args"); + return; + } + + if (args_is_empty(&args[1])) { + do_ping_client(args[0].string_val, FALSE, 0); + return; + } + + if (!args_is_int(&args[1])) { + red_printf("invalid args"); + return; + } + + do_ping_client(args[0].string_val, TRUE, args[1].int_val); +} + static void ping_timer_cb() { if (!reds->peer) { @@ -3440,6 +3500,26 @@ error: free(local_args); } +static void reds_do_set_ticket_2(const VDICmdArg *args) +{ + const char *arg2 = NULL; + + if (!args_is_string(args)) { + red_printf("invalid args"); + return; + } + + if (!args_is_empty(&args[1])) { + if (!args_is_string(&args[1])) { + red_printf("invalid args"); + return; + } + arg2 = args[1].string_val; + } + + reds_do_set_ticket(args[0].string_val, arg2); +} + static void reds_do_set_ticket64(const char *password64, const char *args) { char *password; @@ -3459,6 +3539,26 @@ static void reds_do_set_ticket64(const char *password64, const char *args) free(password); } +static void reds_do_set_ticket64_2(const VDICmdArg *args) +{ + const char *arg2 = NULL; + + if (!args_is_string(args)) { + red_printf("invalid args"); + return; + } + + if (!args_is_empty(&args[1])) { + if (!args_is_string(&args[1])) { + red_printf("invalid args"); + return; + } + arg2 = args[1].string_val; + } + + reds_do_set_ticket64(args[0].string_val, arg2); +} + static void reds_do_info_spice() { core->term_printf(core, "spice info:"); @@ -3554,6 +3654,16 @@ static void reds_do_set_image_compression(const char *val) set_image_compression(real_val); } +static void reds_do_set_image_compression_2(const VDICmdArg *args) +{ + if (!args_is_string(args)) { + red_printf("invalid args"); + return; + } + + reds_do_set_image_compression(args[0].string_val); +} + static int reds_get_streaming_video(const char *val) { if (strcmp(val, "on") == 0) { @@ -3584,6 +3694,16 @@ static void reds_do_set_streaming_video(const char *val) red_dispatcher_on_sv_change(); } +static void reds_do_set_streaming_video_2(const VDICmdArg *args) +{ + if (!args_is_string(args)) { + red_printf("invalid args"); + return; + } + + reds_do_set_streaming_video(args[0].string_val); +} + static void reds_do_set_agent_mouse(const char *val) { int new_val; @@ -3602,6 +3722,16 @@ static void reds_do_set_agent_mouse(const char *val) reds_update_mouse_mode(); } +static void reds_do_set_agent_mouse_2(const VDICmdArg *args) +{ + if (!args_is_string(args)) { + red_printf("invalid args"); + return; + } + + reds_do_set_agent_mouse(args[0].string_val); +} + static void reds_do_set_playback_compression(const char *val) { int on; @@ -3616,6 +3746,16 @@ static void reds_do_set_playback_compression(const char *val) snd_set_playback_compression(on); } +static void reds_do_set_playback_compression_2(const VDICmdArg *args) +{ + if (!args_is_string(args)) { + red_printf("invalid args"); + return; + } + + reds_do_set_playback_compression(args[0].string_val); +} + static OptionsMap _spice_options[] = { {"port", SPICE_OPTION_PORT}, {"sport", SPICE_OPTION_SPORT}, @@ -4625,7 +4765,7 @@ static void add_monitor_action_commands(QTermInterface *mon) mon->add_action_command_handler(mon, "spice", "set_ticket64", "ss?", reds_do_set_ticket64, "<password> [expiration=<seconds>]" - " [,connected=keep|disconnect|fail]", + "[,connected=keep|disconnect|fail]", "set the spice connection ticket"); mon->add_action_command_handler(mon, "spice", "disable_ticketing", "", reds_do_disable_ticketing, @@ -4647,6 +4787,74 @@ static void add_monitor_action_commands(QTermInterface *mon) #endif } +static void add_monitor_action_commands_2(QTerm2Interface *mon) +{ + VDIArgDescriptor s[] = { + { "arg1", ARG_TYPE_STRING, FALSE}, + { NULL, 0, 0}, + }; + + VDIArgDescriptor empty[] = { + { NULL, 0, 0} + }; + + VDIArgDescriptor s_s_o[] = { + { "arg1", ARG_TYPE_STRING, FALSE}, + { "arg2", ARG_TYPE_STRING, TRUE}, + { NULL, 0, 0} + }; + + VDIArgDescriptor s_o_i_o[] = { + { "arg1", ARG_TYPE_STRING, TRUE}, + { "arg2", ARG_TYPE_INT, TRUE}, + { NULL, 0, 0} + }; + + mon->add_action_command_handler(mon, "spice", "set_image_compression", s, + reds_do_set_image_compression_2, + "<[on|auto_glz|auto_lz|quic|glz|lz|off]>", + ""); + + mon->add_action_command_handler(mon, "spice", "set_streaming_video", s, + reds_do_set_streaming_video_2, + "<on|filter|all|off>", + ""); + + mon->add_action_command_handler(mon, "spice", "set_playback_compression", s, + reds_do_set_playback_compression_2, + "<on|off>", + ""); + + mon->add_action_command_handler(mon, "spice", "set_ticket", s_s_o, + reds_do_set_ticket_2, + "<password> [expiration=<seconds>]" + "[,connected=keep|disconnect|fail]", + "set the spice connection ticket"); + mon->add_action_command_handler(mon, "spice", "set_ticket64", s_s_o, + reds_do_set_ticket64_2, + "<password> [expiration=<seconds>]" + "[,connected=keep|disconnect|fail]", + "set the spice connection ticket"); + mon->add_action_command_handler(mon, "spice", "disable_ticketing", empty, + reds_do_disable_ticketing_2, + "", + "entirely disables OTP"); + mon->add_action_command_handler(mon, "spice", "set_agent_mouse", s, + reds_do_set_agent_mouse_2, + "<on|off>", + ""); +#ifdef RED_STATISTICS + mon->add_action_command_handler(mon, "spice", "reset_stat", empty, + do_reset_statistics_2, + "", + "reset spice statistics"); + mon->add_action_command_handler(mon, "spice", "ping_client", s_o_i_o, + do_ping_client_2, + "[on [interval]|off]", + "ping spice client to measure roundtrip"); +#endif +} + static void add_monitor_info_commands(QTermInterface *mon) { mon->add_info_command_handler(mon, "spice", "state", @@ -4665,6 +4873,24 @@ static void add_monitor_info_commands(QTermInterface *mon) #endif } +static void add_monitor_info_commands_2(QTerm2Interface *mon) +{ + mon->add_info_command_handler(mon, "spice", "state", + reds_do_info_spice, + "show spice state"); + mon->add_info_command_handler(mon, "spice", "ticket", + reds_do_info_ticket, + "show ticket"); +#ifdef RED_STATISTICS + mon->add_info_command_handler(mon, "spice", "stat", + do_info_statistics, + "show spice statistics"); + mon->add_info_command_handler(mon, "spice", "rtt_client", + do_info_rtt_client, + "show rtt to spice client"); +#endif +} + static void attach_to_red_agent(VDIPortInterface *interface) { VDIPortState *state = &reds->agent_state; @@ -4763,6 +4989,20 @@ static void interface_change_notifier(void *opaque, VDInterface *interface, } add_monitor_action_commands((QTermInterface *)interface); add_monitor_info_commands((QTermInterface *)interface); + } else if (strcmp(interface->type, VD_INTERFACE_QTERM2) == 0) { + static int was_here = FALSE; + red_printf("VD_INTERFACE_QTERM2"); + if (was_here) { + return; + } + was_here = TRUE; + if (interface->major_version != VD_INTERFACE_QTERM2_MAJOR || + interface->minor_version < VD_INTERFACE_QTERM2_MINOR) { + red_printf("unsuported qterm interface"); + return; + } + add_monitor_action_commands_2((QTerm2Interface *)interface); + add_monitor_info_commands_2((QTerm2Interface *)interface); } else if (strcmp(interface->type, VD_INTERFACE_TABLET) == 0) { red_printf("VD_INTERFACE_TABLET"); if (tablet) { diff --git a/server/vd_interface.h b/server/vd_interface.h index 7b91d11..89016db 100644 --- a/server/vd_interface.h +++ b/server/vd_interface.h @@ -268,6 +268,56 @@ struct QTermInterface { void (*remove_info_command_handler)(QTermInterface *term, VDObjectRef obj); }; +#define VD_INTERFACE_QTERM2 "qemu_terminal_2" +#define VD_INTERFACE_QTERM2_MAJOR 1 +#define VD_INTERFACE_QTERM2_MINOR 0 +typedef struct QTerm2Interface QTerm2Interface; + +enum VDIArgType{ + ARG_TYPE_INVALID, + ARG_TYPE_INT, + ARG_TYPE_STRING, +}; + +typedef struct VDIArgDescriptor { + char* name; + int type; + int optional; +} VDIArgDescriptor; + +typedef struct VDICmdArg { + VDIArgDescriptor descriptor; + union { + uint64_t int_val; + const char *string_val; + }; +} VDICmdArg; + +typedef void (*VDICmdHandler)(const VDICmdArg* args); +typedef void (*VDIInfoCmdHandler)(void); + +struct QTerm2Interface { + VDInterface base; + + VDObjectRef (*add_action_command_handler)(QTerm2Interface *term, + const char *module_name, + const char *command_name, + const VDIArgDescriptor *args_type, + VDICmdHandler handler, + const char *params_text, + const char *help_text); + + void (*remove_action_command_handler)(QTerm2Interface *term, VDObjectRef obj); + + VDObjectRef (*add_info_command_handler)(QTerm2Interface *term, + const char *module_name, + const char *command_name, + VDIInfoCmdHandler handler, + const char *help_text); + + void (*remove_info_command_handler)(QTerm2Interface *term, VDObjectRef obj); +}; + #define VD_INTERFACE_PLAYBACK "playback" #define VD_INTERFACE_PLAYBACK_MAJOR 1 #define VD_INTERFACE_PLAYBACK_MINOR 1 |
From: Yaniv K. <yk...@re...> - 2010-01-06 15:26:34
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: master commit 6dd05455fbc2a9b1a121edd42d7c4fcf418dc5b9 Author: Arnon Gilboa <ag...@re...> Date: Wed Jan 6 10:28:51 2010 +0200 spice: add missing break diff --git a/client/windows/platform.cpp b/client/windows/platform.cpp index 3400811..97c6dfc 100644 --- a/client/windows/platform.cpp +++ b/client/windows/platform.cpp @@ -66,6 +66,7 @@ static LRESULT CALLBACK PlatformWinProc(HWND hWnd, UINT message, WPARAM wParam, } else { LOG_WARN("received WM_TIMER not inside a modal loop"); } + break; case WM_ACTIVATEAPP: if (wParam) { event_listener->on_app_activated(); |
From: Yaniv K. <yk...@re...> - 2010-01-06 15:23:56
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 185fe4777c3f1ad7e81fe0239dc60d6f79d89bbd Author: Arnon Gilboa <ag...@re...> Date: Wed Jan 6 10:28:51 2010 +0200 spice: add missing break diff --git a/client/windows/platform.cpp b/client/windows/platform.cpp index 8aba5d1..f8465c2 100644 --- a/client/windows/platform.cpp +++ b/client/windows/platform.cpp @@ -70,6 +70,7 @@ static LRESULT CALLBACK PlatformWinProc(HWND hWnd, UINT message, WPARAM wParam, } else { LOG_WARN("received WM_TIMER not inside a modal loop"); } + break; case WM_ACTIVATEAPP: if (wParam) { event_listener->on_app_activated(); |
From: Yaniv K. <yk...@re...> - 2010-01-06 14:06:57
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit e38a61900711169d66b1fa7e117b04d49106a1da Author: Yonit Halperin <yha...@re...> Date: Wed Dec 30 16:07:14 2009 +0200 server,client: server authentication for secured channels. #527411 #549673. 3 available mechanisms: by public key, by host name, and by certificate subject name. In the former method, chain of trust verification is not performed. The CA certificate files are looked for under <spice-config-dir>/spice_truststore.pem windows <spice-config-dir>=%APPDATA%\spicec\ linux <spice-config-dir>=$HOME/.spicec diff --git a/client/application.cpp b/client/application.cpp index c253ccc..3566adb 100644 --- a/client/application.cpp +++ b/client/application.cpp @@ -49,6 +49,8 @@ #define STICKY_KEY_PIXMAP ALT_IMAGE_RES_ID #define STICKY_KEY_TIMEOUT 750 +#define CA_FILE_NAME "spice_truststore.pem" + #ifdef CAIRO_CANVAS_CACH_IS_SHARED mutex_t cairo_surface_user_data_mutex; #endif @@ -1596,6 +1598,11 @@ bool Application::process_cmd_line(int argc, char** argv) _peer_con_opt[RED_CHANNEL_PLAYBACK] = RedPeer::ConnectionOptions::CON_OP_INVALID; _peer_con_opt[RED_CHANNEL_RECORD] = RedPeer::ConnectionOptions::CON_OP_INVALID; + _host_auth_opt.type_flags = RedPeer::HostAuthOptions::HOST_AUTH_OP_NAME; + + Platform::get_spice_config_dir(_host_auth_opt.CA_file); + _host_auth_opt.CA_file += CA_FILE_NAME; + parser.begin(argc, argv); char* val; @@ -1614,12 +1621,11 @@ bool Application::process_cmd_line(int argc, char** argv) break; } case SPICE_OPT_SPORT: { - if ((port = str_to_port(val)) == -1) { + if ((sport = str_to_port(val)) == -1) { std::cout << "invalid secure port " << val << "\n"; _exit_code = SPICEC_ERROR_CODE_INVALID_ARG; return false; } - sport = port; break; } case SPICE_OPT_FULL_SCREEN: diff --git a/client/application.h b/client/application.h index 38fd30e..3c0297f 100644 --- a/client/application.h +++ b/client/application.h @@ -155,6 +155,7 @@ public: void external_show(); void connect(); const PeerConnectionOptMap& get_con_opt_map() {return _peer_con_opt;} + const RedPeer::HostAuthOptions& get_host_auth_opt() { return _host_auth_opt;} uint32_t get_mouse_mode(); const std::vector<int>& get_canvas_types() { return _canvas_types;} @@ -223,6 +224,7 @@ private: private: RedClient _client; PeerConnectionOptMap _peer_con_opt; + RedPeer::HostAuthOptions _host_auth_opt; std::vector<bool> _enabled_channels; std::vector<RedScreen*> _screens; RedScreen* _main_screen; diff --git a/client/platform.h b/client/platform.h index ff89181..f0ffc0d 100644 --- a/client/platform.h +++ b/client/platform.h @@ -47,6 +47,8 @@ public: static void send_quit_request(); + static void get_spice_config_dir(std::string& path); + enum ThreadPriority { PRIORITY_INVALID, PRIORITY_TIME_CRITICAL, diff --git a/client/red_channel.cpp b/client/red_channel.cpp index 0afe3ce..153055d 100644 --- a/client/red_channel.cpp +++ b/client/red_channel.cpp @@ -89,6 +89,8 @@ void RedChannelBase::link(uint32_t connection_id, const std::string& password) header.major_version); } + _remote_minor = header.minor_version; + AutoArray<uint8_t> reply_buf(new uint8_t[header.size]); recive(reply_buf.get(), header.size); @@ -155,11 +157,11 @@ void RedChannelBase::link(uint32_t connection_id, const std::string& password) } void RedChannelBase::connect(const ConnectionOptions& options, uint32_t connection_id, - uint32_t ip, std::string password) + const char* host, std::string password) { if (options.allow_unsecure()) { try { - RedPeer::connect_unsecure(ip, options.unsecure_port); + RedPeer::connect_unsecure(host, options.unsecure_port); link(connection_id, password); return; } catch (...) { @@ -170,16 +172,10 @@ void RedChannelBase::connect(const ConnectionOptions& options, uint32_t connecti } } ASSERT(options.allow_secure()); - RedPeer::connect_secure(options, ip); + RedPeer::connect_secure(options, host); link(connection_id, password); } -void RedChannelBase::connect(const ConnectionOptions& options, uint32_t connection_id, - const char* host, std::string password) -{ - connect(options, connection_id, host_by_name(host), password); -} - void RedChannelBase::set_capability(ChannelCaps& caps, uint32_t cap) { uint32_t word_index = cap / 32; @@ -399,7 +395,8 @@ void RedChannel::run() set_state(CONNECTING_STATE); ConnectionOptions con_options(_client.get_connection_options(get_type()), _client.get_port(), - _client.get_sport()); + _client.get_sport(), + _client.get_host_auth_options()); RedChannelBase::connect(con_options, _client.get_connection_id(), _client.get_host(), _client.get_password()); on_connect(); diff --git a/client/red_channel.h b/client/red_channel.h index c2f94bd..996aaf6 100644 --- a/client/red_channel.h +++ b/client/red_channel.h @@ -55,14 +55,14 @@ public: uint8_t get_type() { return _type;} uint8_t get_id() { return _id;} - void connect(const ConnectionOptions& options, uint32_t connection_id, uint32_t ip, - std::string password); void connect(const ConnectionOptions& options, uint32_t connection_id, const char *host, std::string password); const ChannelCaps& get_common_caps() { return _common_caps;} const ChannelCaps& get_caps() {return _caps;} + uint32_t get_peer_minor() { return _remote_minor;} + protected: void set_common_capability(uint32_t cap); void set_capability(uint32_t cap); @@ -83,6 +83,8 @@ private: ChannelCaps _remote_common_caps; ChannelCaps _remote_caps; + + uint32_t _remote_minor; }; class SendTrigger: public EventSources::Trigger { diff --git a/client/red_client.cpp b/client/red_client.cpp index cf4562b..df88e7a 100644 --- a/client/red_client.cpp +++ b/client/red_client.cpp @@ -23,6 +23,16 @@ #include "utils.h" #include "debug.h" +#ifdef __GNUC__ +typedef struct __attribute__ ((__packed__)) OldRedMigrationBegin { +#else +typedef struct __declspec(align(1)) OldRedMigrationBegin { +#endif + uint16_t port; + uint16_t sport; + char host[0]; +} OldRedMigrationBegin; + Migrate::Migrate(RedClient& client) : _client (client) , _running (false) @@ -114,18 +124,19 @@ void Migrate::connect_one(MigChannel& channel, const RedPeer::ConnectionOptions& void Migrate::run() { uint32_t connection_id; + RedPeer::ConnectionOptions::Type conn_type; DBG(0, ""); try { - RedPeer::ConnectionOptions con_opt(_client.get_connection_options(RED_CHANNEL_MAIN), - _port, _port); + conn_type = _client.get_connection_options(RED_CHANNEL_MAIN); + RedPeer::ConnectionOptions con_opt(conn_type, _port, _sport, _auth_options); MigChannels::iterator iter = _channels.begin(); connection_id = _client.get_connection_id(); connect_one(**iter, con_opt, connection_id); + for (++iter; iter != _channels.end(); ++iter) { - con_opt = RedPeer::ConnectionOptions( - _client.get_connection_options((*iter)->get_type()), - _port, _sport); + conn_type = _client.get_connection_options((*iter)->get_type()); + con_opt = RedPeer::ConnectionOptions(conn_type, _port, _sport, _auth_options); connect_one(**iter, con_opt, connection_id); } _connected = true; @@ -157,9 +168,24 @@ void Migrate::start(const RedMigrationBegin* migrate) { DBG(0, ""); abort(); - _host.assign(migrate->host); - _port = migrate->port ? migrate->port : -1; - _sport = migrate->sport ? migrate->sport : -1; + if ((RED_VERSION_MAJOR == 1) && (_client.get_peer_minor() < 1)) { + LOG_INFO("server minor version incompatible for destination authentication" + "(missing dest pubkey in RedMigrationBegin)"); + OldRedMigrationBegin* old_migrate = (OldRedMigrationBegin*)migrate; + _host.assign(old_migrate->host); + _port = old_migrate->port ? old_migrate->port : -1; + _sport = old_migrate->sport ? old_migrate->sport : -1;; + _auth_options = _client.get_host_auth_options(); + } else { + _host.assign(((char*)migrate) + migrate->host_offset); + _port = migrate->port ? migrate->port : -1; + _sport = migrate->sport ? migrate->sport : -1; + _auth_options.type_flags = RedPeer::HostAuthOptions::HOST_AUTH_OP_PUBKEY; + _auth_options.host_pubkey.assign(((uint8_t*)migrate)+ migrate->pub_key_offset, + ((uint8_t*)migrate)+ migrate->pub_key_offset + + migrate->pub_key_size); + } + _password = _client._password; Lock lock(_lock); _running = true; @@ -382,6 +408,8 @@ void RedClient::connect() for (; iter != end; iter++) { _con_opt_map[(*iter).first] = (*iter).second; } + + _host_auth_opt = _application.get_host_auth_opt(); RedChannel::connect(); } diff --git a/client/red_client.h b/client/red_client.h index 04c800c..d97128e 100644 --- a/client/red_client.h +++ b/client/red_client.h @@ -76,6 +76,7 @@ private: std::string _host; int _port; int _sport; + RedPeer::HostAuthOptions _auth_options; Thread* _thread; Mutex _lock; Condition _cond; @@ -148,6 +149,7 @@ public: Application& get_application() { return _application;} bool is_auto_display_res() { return _auto_display_res;} RedPeer::ConnectionOptions::Type get_connection_options(uint32_t channel_type); + RedPeer::HostAuthOptions& get_host_auth_options() { return _host_auth_opt;} void get_sync_info(uint8_t channel_type, uint8_t channel_id, SyncInfo& info); void wait_for_channels(int wait_list_size, RedWaitForChannel* wait_list); PixmapCache& get_pixmap_cache() {return _pixmap_cache;} @@ -215,6 +217,7 @@ private: AutoRef<AgentTimer> _agent_timer; PeerConnectionOptMap _con_opt_map; + RedPeer::HostAuthOptions _host_auth_opt; Migrate _migrate; Mutex _channels_lock; typedef std::list<ChannelFactory*> Factorys; diff --git a/client/red_peer.cpp b/client/red_peer.cpp index d086872..a1dca53 100644 --- a/client/red_peer.cpp +++ b/client/red_peer.cpp @@ -32,6 +32,8 @@ #define SOCKET_ERROR -1 #define closesocket(sock) ::close(sock) #endif +#include <openssl/x509.h> +#include <openssl/x509v3.h> #include "red.h" #include "red_peer.h" #include "utils.h" @@ -64,10 +66,18 @@ int inet_aton(const char *ip, struct in_addr *in_addr) #define sock_err_message(err) strerror(err) #endif +typedef struct SslVerifyCbData { + RedPeer::HostAuthOptions info; + const char* host_name; + bool all_preverify_ok; +} SslVerifyCbData; + static void ssl_error() { + unsigned long last_error = ERR_peek_last_error(); + ERR_print_errors_fp(stderr); - THROW_ERR(SPICEC_ERROR_CODE_SSL_ERROR, "SSL Error"); + THROW_ERR(SPICEC_ERROR_CODE_SSL_ERROR, "SSL Error:", ERR_error_string(last_error, NULL)); } RedPeer::RedPeer() @@ -122,13 +132,15 @@ uint32_t RedPeer::host_by_name(const char* host) return ntohl(return_value); } -void RedPeer::connect_unsecure(uint32_t ip, int port) +void RedPeer::connect_unsecure(const char* host, int port) { struct sockaddr_in addr; int no_delay; - + uint32_t ip; ASSERT(_ctx == NULL && _ssl == NULL && _peer == INVALID_SOCKET); try { + ip = host_by_name(host); + addr.sin_port = htons(port); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(ip); @@ -162,15 +174,349 @@ void RedPeer::connect_unsecure(uint32_t ip, int port) } } -void RedPeer::connect_unsecure(const char* host, int port) +bool RedPeer::verify_pubkey(X509* cert, const HostAuthOptions::PublicKey& key) +{ + EVP_PKEY* cert_pubkey = NULL; + EVP_PKEY* orig_pubkey = NULL; + BIO* bio = NULL; + uint8_t* c_key = NULL; + int ret = 0; + + if (key.empty()) { + return false; + } + + ASSERT(cert); + + try { + cert_pubkey = X509_get_pubkey(cert); + if (!cert_pubkey) { + THROW("reading public key from certificate failed"); + } + + c_key = new uint8_t[key.size()]; + memcpy(c_key, &key[0], key.size()); + + bio = BIO_new_mem_buf((void*)c_key, key.size()); + if (!bio) { + THROW("creating BIO failed"); + } + + orig_pubkey = d2i_PUBKEY_bio(bio, NULL); + if (!orig_pubkey) { + THROW("reading pubkey from bio failed"); + } + + ret = EVP_PKEY_cmp(orig_pubkey, cert_pubkey); + + BIO_free(bio); + EVP_PKEY_free(orig_pubkey); + EVP_PKEY_free(cert_pubkey); + delete []c_key; + if (ret == 1) { + DBG(0, "public keys match"); + return true; + } else if (ret == 0) { + DBG(0, "public keys mismatch"); + return false; + } else { + DBG(0, "public keys types mismatch"); + return false; + } + } catch (Exception& e) { + LOG_WARN("%s", e.what()); + + if (bio) { + BIO_free(bio); + } + + if (orig_pubkey) { + EVP_PKEY_free(orig_pubkey); + } + + if (cert_pubkey) { + EVP_PKEY_free(cert_pubkey); + } + delete []c_key; + return false; + } +} + +/* From gnutls: compare host_name against certificate, taking account of wildcards. + * return true on success or false on error. + * + * note: cert_name_size is required as X509 certs can contain embedded NULs in + * the strings such as CN or subjectAltName + */ +bool RedPeer::x509_cert_host_name_compare(const char *cert_name, int cert_name_size, + const char *host_name) +{ + /* find the first different character */ + for (; *cert_name && *host_name && (toupper(*cert_name) == toupper(*host_name)); + cert_name++, host_name++, cert_name_size--); + + /* the strings are the same */ + if (cert_name_size == 0 && *host_name == '\0') + return true; + + if (*cert_name == '*') + { + /* a wildcard certificate */ + cert_name++; + cert_name_size--; + + while (true) + { + /* Use a recursive call to allow multiple wildcards */ + if (RedPeer::x509_cert_host_name_compare(cert_name, cert_name_size, host_name)) { + return true; + } + + /* wildcards are only allowed to match a single domain + component or component fragment */ + if (*host_name == '\0' || *host_name == '.') + break; + host_name++; + } + + return false; + } + + return false; +} + +/* + * From gnutls_x509_crt_check_hostname - compares the hostname with certificate's hostname + * + * This function will check if the given certificate's subject matches + * the hostname. This is a basic implementation of the matching + * described in RFC2818 (HTTPS), which takes into account wildcards, + * and the DNSName/IPAddress subject alternative name PKIX extension. + * + */ +bool RedPeer::verify_host_name(X509* cert, const char* host_name) +{ + GENERAL_NAMES* subject_alt_names; + bool found_dns_name = false; + struct in_addr addr; + int addr_len = 0; + bool cn_match = false; + + ASSERT(cert); + + // only IpV4 supported + if (inet_aton(host_name, &addr)) { + addr_len = sizeof(struct in_addr); + } + + /* try matching against: + * 1) a DNS name or IP address as an alternative name (subjectAltName) extension + * in the certificate + * 2) the common name (CN) in the certificate + * + * either of these may be of the form: *.domain.tld + * + * only try (2) if there is no subjectAltName extension of + * type dNSName + */ + + + subject_alt_names = (GENERAL_NAMES*)X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL); + + if (subject_alt_names) { + int num_alts = sk_GENERAL_NAME_num(subject_alt_names); + for (int i = 0; i < num_alts; i++) { + const GENERAL_NAME* name = sk_GENERAL_NAME_value(subject_alt_names, i); + if (name->type == GEN_DNS) { + found_dns_name = true; + if (RedPeer::x509_cert_host_name_compare((char *)ASN1_STRING_data(name->d.dNSName), + ASN1_STRING_length(name->d.dNSName), + host_name)) { + DBG(0, "alt name match=%s", ASN1_STRING_data(name->d.dNSName)); + GENERAL_NAMES_free(subject_alt_names); + return true; + } + } else if (name->type == GEN_IPADD) { + int alt_ip_len = ASN1_STRING_length(name->d.iPAddress); + found_dns_name = true; + if ((addr_len == alt_ip_len)&& + !memcmp(ASN1_STRING_data(name->d.iPAddress), &addr, addr_len)) { + DBG(0, "alt name IP match=%s", + inet_ntoa(*((struct in_addr*)ASN1_STRING_data(name->d.dNSName)))); + GENERAL_NAMES_free(subject_alt_names); + return true; + } + } + } + GENERAL_NAMES_free(subject_alt_names); + } + + if (found_dns_name) + { + DBG(0, "SubjectAltName mismatch"); + return false; + } + + /* extracting commonNames */ + X509_NAME* subject = X509_get_subject_name(cert); + if (subject) { + int pos = -1; + X509_NAME_ENTRY* cn_entry; + ASN1_STRING* cn_asn1; + + while ((pos = X509_NAME_get_index_by_NID(subject, NID_commonName, pos)) != -1) { + cn_entry = X509_NAME_get_entry(subject, pos); + if (!cn_entry) { + continue; + } + cn_asn1 = X509_NAME_ENTRY_get_data(cn_entry); + if (!cn_asn1) { + continue; + } + + if (RedPeer::x509_cert_host_name_compare((char*)ASN1_STRING_data(cn_asn1), + ASN1_STRING_length(cn_asn1), + host_name)) { + DBG(0, "common name match=%s", (char*)ASN1_STRING_data(cn_asn1)); + cn_match = true; + break; + } + } + } + + if (!cn_match) { + DBG(0, "common name mismatch"); + } + return cn_match; + +} + +bool RedPeer::verify_subject(X509* cert, const HostAuthOptions::CertFieldValueList& subject) { - connect_unsecure(host_by_name(host), port); + X509_NAME* cert_subject = NULL; + HostAuthOptions::CertFieldValueList::const_iterator subject_iter; + X509_NAME* in_subject; + int ret; + + ASSERT(cert); + + cert_subject = X509_get_subject_name(cert); + if (!cert_subject) { + LOG_WARN("reading certificate subject failed"); + return false; + } + + if (X509_NAME_entry_count(cert_subject) != subject.size()) { + DBG(0, "subject mismatch: #entries cert=%d, input=%d", + X509_NAME_entry_count(cert_subject), subject.size()); + return false; + } + + in_subject = X509_NAME_new(); + if (!in_subject) { + LOG_WARN("failed to allocate X509_NAME"); + return false; + } + + for (subject_iter = subject.begin(); subject_iter != subject.end(); subject_iter++) { + if (!X509_NAME_add_entry_by_txt(in_subject, + subject_iter->first.c_str(), + MBSTRING_UTF8, + (const unsigned char*)subject_iter->second.c_str(), + subject_iter->second.length(), -1, 0)) { + LOG_WARN("failed to add entry %s=%s to X509_NAME", + subject_iter->first.c_str(), subject_iter->second.c_str()); + X509_NAME_free(in_subject); + return false; + } + } + + ret = X509_NAME_cmp(cert_subject, in_subject); + X509_NAME_free(in_subject); + + if (ret == 0) { + DBG(0, "subjects match"); + return true; + } else { + DBG(0, "subjects mismatch"); + return false; + } +} + +int RedPeer::ssl_verify_callback(int preverify_ok, X509_STORE_CTX *ctx) +{ + int depth; + SSL *ssl; + X509* cert; + SslVerifyCbData* verify_data; + int auth_flags; + + depth = X509_STORE_CTX_get_error_depth(ctx); + + ssl = (SSL*)X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()); + if (!ssl) { + LOG_WARN("failed to get ssl connection"); + return 0; + } + + verify_data = (SslVerifyCbData*)SSL_get_app_data(ssl); + auth_flags = verify_data->info.type_flags; + + if (depth > 0) { + // if certificate verification failed, we can still authorize the server + // if its public key matches the one we hold in the peer_connect_options. + if (!preverify_ok) { + DBG(0, "openssl verify failed at depth=%d", depth); + verify_data->all_preverify_ok = false; + if (auth_flags & HostAuthOptions::HOST_AUTH_OP_PUBKEY) { + return 1; + } else { + return 0; + } + } else { + return preverify_ok; + } + } + + /* depth == 0 */ + cert = X509_STORE_CTX_get_current_cert(ctx); + if (!cert) { + LOG_WARN("failed to get server certificate"); + return 0; + } + + if (auth_flags & HostAuthOptions::HOST_AUTH_OP_PUBKEY) { + if (verify_pubkey(cert, verify_data->info.host_pubkey)) { + return 1; + } + } + + if (!verify_data->all_preverify_ok || !preverify_ok) { + return 0; + } + + if (auth_flags & HostAuthOptions::HOST_AUTH_OP_NAME) { + if (verify_host_name(cert, verify_data->host_name)) { + return 1; + } + } + + if (auth_flags & HostAuthOptions::HOST_AUTH_OP_SUBJECT) { + if (verify_subject(cert, verify_data->info.host_subject)) { + return 1; + } + } + return 0; } -// todo: use SSL_CTX_set_cipher_list, SSL_CTX_load_verify_location etc. -void RedPeer::connect_secure(const ConnectionOptions& options, uint32_t ip) +// todo: use SSL_CTX_set_cipher_list, etc. +void RedPeer::connect_secure(const ConnectionOptions& options, const char* host) { - connect_unsecure(ip, options.secure_port); + int return_code; + int auth_flags; + SslVerifyCbData auth_data; + + connect_unsecure(host, options.secure_port); ASSERT(_ctx == NULL && _ssl == NULL && _peer != INVALID_SOCKET); try { @@ -179,12 +525,39 @@ void RedPeer::connect_secure(const ConnectionOptions& options, uint32_t ip) #else SSL_METHOD *ssl_method = TLSv1_method(); #endif + auth_data.info = options.host_auth; + auth_data.host_name = host; + auth_data.all_preverify_ok = true; _ctx = SSL_CTX_new(ssl_method); if (_ctx == NULL) { ssl_error(); } + auth_flags = auth_data.info.type_flags; + if ((auth_flags & RedPeer::HostAuthOptions::HOST_AUTH_OP_NAME) || + (auth_flags & RedPeer::HostAuthOptions::HOST_AUTH_OP_SUBJECT)) { + std::string CA_file = auth_data.info.CA_file; + ASSERT(!CA_file.empty()); + + return_code = SSL_CTX_load_verify_locations(_ctx, CA_file.c_str(), NULL); + if (return_code != 1) { + if (auth_flags & RedPeer::HostAuthOptions::HOST_AUTH_OP_PUBKEY) { + LOG_WARN("SSL_CTX_load_verify_locations failed, CA_file=%s. " + "only pubkey authentication is active", CA_file.c_str()); + auth_data.info.type_flags = RedPeer::HostAuthOptions::HOST_AUTH_OP_PUBKEY; + } + else { + LOG_WARN("SSL_CTX_load_verify_locations failed CA_file=%s", CA_file.c_str()); + ssl_error(); + } + } + } + + if (auth_flags) { + SSL_CTX_set_verify(_ctx, SSL_VERIFY_PEER, ssl_verify_callback); + } + _ssl = SSL_new(_ctx); if (!_ssl) { THROW("create ssl failed"); @@ -196,10 +569,13 @@ void RedPeer::connect_secure(const ConnectionOptions& options, uint32_t ip) } SSL_set_bio(_ssl, sbio, sbio); + SSL_set_app_data(_ssl, &auth_data); - int return_code = SSL_connect(_ssl); + return_code = SSL_connect(_ssl); if (return_code <= 0) { - SSL_get_error(_ssl, return_code); + int ssl_error_code = SSL_get_error(_ssl, return_code); + LOG_WARN("failed to connect w/SSL, ssl_error %s", + ERR_error_string(ssl_error_code, NULL)); ssl_error(); } } catch (...) { @@ -209,11 +585,6 @@ void RedPeer::connect_secure(const ConnectionOptions& options, uint32_t ip) } } -void RedPeer::connect_secure(const ConnectionOptions& options, const char* host) -{ - connect_secure(options, host_by_name(host)); -} - void RedPeer::shutdown() { if (_peer != INVALID_SOCKET) { diff --git a/client/red_peer.h b/client/red_peer.h index f78405b..761aed1 100644 --- a/client/red_peer.h +++ b/client/red_peer.h @@ -42,6 +42,30 @@ public: class OutMessage; class DisconnectedException {}; + class HostAuthOptions { + public: + + enum Type { + HOST_AUTH_OP_PUBKEY = 1, + HOST_AUTH_OP_NAME = (1 << 1), + HOST_AUTH_OP_SUBJECT = (1 << 2), + }; + + typedef std::vector<uint8_t> PublicKey; + typedef std::pair<std::string, std::string> CertFieldValuePair; + typedef std::list<CertFieldValuePair> CertFieldValueList; + + HostAuthOptions() : type_flags(0) {} + + public: + + int type_flags; + + PublicKey host_pubkey; + CertFieldValueList host_subject; + std::string CA_file; + }; + class ConnectionOptions { public: @@ -52,10 +76,12 @@ public: CON_OP_BOTH, }; - ConnectionOptions(Type in_type, int in_port, int in_sport) + ConnectionOptions(Type in_type, int in_port, int in_sport, + const HostAuthOptions& in_host_auth) : type (in_type) , unsecure_port (in_port) , secure_port (in_sport) + , host_auth (in_host_auth) { } @@ -75,12 +101,10 @@ public: Type type; int unsecure_port; int secure_port; + HostAuthOptions host_auth; // for secure connection }; - void connect_unsecure(uint32_t ip, int port); void connect_unsecure(const char* host, int port); - - void connect_secure(const ConnectionOptions& options, uint32_t ip); void connect_secure(const ConnectionOptions& options, const char* host); void disconnect(); @@ -100,6 +124,15 @@ protected: virtual void on_event() {} virtual int get_socket() { return _peer;} + static bool x509_cert_host_name_compare(const char *cert_name, int cert_name_size, + const char *host_name); + + static bool verify_pubkey(X509* cert, const HostAuthOptions::PublicKey& key); + static bool verify_host_name(X509* cert, const char* host_name); + static bool verify_subject(X509* cert, const HostAuthOptions::CertFieldValueList& subject); + + static int ssl_verify_callback(int preverify_ok, X509_STORE_CTX *ctx); + private: void shutdown(); void cleanup(); diff --git a/client/windows/platform.cpp b/client/windows/platform.cpp index 2988827..8aba5d1 100644 --- a/client/windows/platform.cpp +++ b/client/windows/platform.cpp @@ -17,6 +17,8 @@ #include "common.h" +#include <shlobj.h> + #include "platform.h" #include "win_platform.h" #include "utils.h" @@ -28,6 +30,8 @@ #include "cursor.h" #include "named_pipe.h" +#define SPICE_CONFIG_DIR "spicec\\" + int gdi_handlers = 0; extern HINSTANCE instance; @@ -427,6 +431,21 @@ bool Platform::is_monitors_pos_valid() return true; } +void Platform::get_spice_config_dir(std::string& path) +{ + char app_data_path[MAX_PATH]; + HRESULT res = SHGetFolderPathA(NULL, CSIDL_APPDATA, NULL, 0, app_data_path); + if (res != S_OK) { + throw Exception("get user app data dir failed"); + } + + path = app_data_path; + if (strcmp((app_data_path + strlen(app_data_path) - 2), "\\") != 0) { + path += "\\"; + } + path += SPICE_CONFIG_DIR; +} + void Platform::init() { create_message_wind(); diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp index a1c08ca..cff2289 100644 --- a/client/x11/platform.cpp +++ b/client/x11/platform.cpp @@ -64,6 +64,8 @@ #define USE_XRANDR_1_2 #endif +#define SPICE_CONFIG_DIR ".spicec/" + static Display* x_display = NULL; static bool x_shm_avail = false; static XVisualInfo **vinfo = NULL; @@ -1895,6 +1897,18 @@ bool Platform::is_monitors_pos_valid() return (ScreenCount(x_display) == 1); } +void Platform::get_spice_config_dir(std::string& path) +{ + char* home_dir = getenv("HOME"); + if (!home_dir) { + throw Exception("get home dir failed"); + } + + path = home_dir; + path += "/"; + path += SPICE_CONFIG_DIR; +} + static void root_win_proc(XEvent& event) { #ifdef USE_XRANDR_1_2 diff --git a/common/red.h b/common/red.h index 4b0a364..cead066 100644 --- a/common/red.h +++ b/common/red.h @@ -46,7 +46,7 @@ #define RED_MAGIC (*(uint32_t*)"REDQ") #define RED_VERSION_MAJOR 1 -#define RED_VERSION_MINOR 0 +#define RED_VERSION_MINOR 1 // Encryption & Ticketing Parameters #define RED_MAX_PASSWORD_LENGTH 60 @@ -208,10 +208,27 @@ typedef struct ATTR_PACKED RedMultiMediaTime { uint32_t time; } RedMultiMediaTime; +enum { + RED_PUBKEY_TYPE_INVALID, + RED_PUBKEY_TYPE_RSA, + RED_PUBKEY_TYPE_RSA2, + RED_PUBKEY_TYPE_DSA, + RED_PUBKEY_TYPE_DSA1, + RED_PUBKEY_TYPE_DSA2, + RED_PUBKEY_TYPE_DSA3, + RED_PUBKEY_TYPE_DSA4, + RED_PUBKEY_TYPE_DH, + RED_PUBKEY_TYPE_EC, +}; + typedef struct ATTR_PACKED RedMigrationBegin { uint16_t port; uint16_t sport; - char host[0]; + uint32_t host_offset; + uint32_t host_size; + uint16_t pub_key_type; + uint32_t pub_key_offset; + uint32_t pub_key_size; } RedMigrationBegin; enum { diff --git a/server/reds.c b/server/reds.c index 38a6538..ddf1fe4 100644 --- a/server/reds.c +++ b/server/reds.c @@ -60,9 +60,10 @@ static VDIPortInterface *vdagent = NULL; #define MIGRATION_NOTIFY_SPICE_KEY "spice_mig_ext" -#define REDS_MIG_VERSION 1 +#define REDS_MIG_VERSION 3 #define REDS_MIG_CONTINUE 1 #define REDS_MIG_ABORT 2 +#define REDS_MIG_DIFF_VERSION 3 #define REDS_AGENT_WINDOW_SIZE 10 #define REDS_TOKENS_TO_SEND 5 @@ -276,6 +277,7 @@ typedef struct RedsState { uint32_t ping_id; uint32_t net_test_id; int net_test_stage; + int peer_minor_version; } RedsState; uint64_t bitrate_per_sec = ~0; @@ -2846,6 +2848,8 @@ static void reds_handle_read_header_done(void *opaque) return; } + reds->peer_minor_version = header->minor_version; + if (header->size < sizeof(RedLinkMess)) { reds_send_link_error(link, RED_ERR_INVALID_DATA); red_printf("bad size %u", header->size); @@ -4033,12 +4037,20 @@ typedef struct RedsMigSpice { char *host; int port; int sport; + uint16_t cert_pub_key_type; + uint32_t cert_pub_key_len; + uint8_t* cert_pub_key; } RedsMigSpice; typedef struct RedsMigSpiceMessage { uint32_t link_id; } RedsMigSpiceMessage; +typedef struct RedsMigCertPubKeyInfo { + uint16_t type; + uint32_t len; +} RedsMigCertPubKeyInfo; + static int reds_mig_actual_read(RedsMigSpice *s) { for (;;) { @@ -4147,7 +4159,9 @@ static void reds_mig_continue(RedsMigSpice *s) red_printf(""); core->set_file_handlers(core, s->fd, NULL, NULL, NULL); host_len = strlen(s->host) + 1; - if (!(item = new_simple_out_item(RED_MIGRATE_BEGIN, sizeof(RedMigrationBegin) + host_len))) { + item = new_simple_out_item(RED_MIGRATE_BEGIN, + sizeof(RedMigrationBegin) + host_len + s->cert_pub_key_len); + if (!(item)) { red_printf("alloc item failed"); reds_disconnect(); return; @@ -4155,7 +4169,13 @@ static void reds_mig_continue(RedsMigSpice *s) migrate = (RedMigrationBegin *)item->data; migrate->port = s->port; migrate->sport = s->sport; - memcpy(migrate->host, s->host, host_len); + migrate->host_offset = sizeof(RedMigrationBegin); + migrate->host_size = host_len; + migrate->pub_key_type = s->cert_pub_key_type; + migrate->pub_key_offset = sizeof(RedMigrationBegin) + host_len; + migrate->pub_key_size = s->cert_pub_key_len; + memcpy((uint8_t*)(migrate) + migrate->host_offset , s->host, host_len); + memcpy((uint8_t*)(migrate) + migrate->pub_key_offset, s->cert_pub_key, s->cert_pub_key_len); reds_push_pipe_item(&item->base); free(s->local_args); @@ -4220,6 +4240,68 @@ static void reds_mig_send_ticket(RedsMigSpice *s) BIO_free(bio_key); } +static void reds_mig_receive_cert_public_key(RedsMigSpice *s) +{ + s->cert_pub_key = malloc(s->cert_pub_key_len); + if (!s->cert_pub_key) { + red_printf("alloc failed"); + reds_mig_failed(s); + return; + } + + memcpy(s->cert_pub_key, s->read.buf, s->cert_pub_key_len); + + s->read.size = RED_TICKET_PUBKEY_BYTES; + s->read.end_pos = 0; + s->read.handle_data = reds_mig_send_ticket; + + core->set_file_handlers(core, s->fd, reds_mig_read, NULL, s); +} + +static void reds_mig_receive_cert_public_key_info(RedsMigSpice *s) +{ + RedsMigCertPubKeyInfo* pubkey_info = (RedsMigCertPubKeyInfo*)s->read.buf; + s->cert_pub_key_type = pubkey_info->type; + s->cert_pub_key_len = pubkey_info->len; + + if (s->cert_pub_key_len > RECIVE_BUF_SIZE) { + red_printf("certificate public key length exceeds buffer size"); + reds_mig_failed(s); + return; + } + + if (s->cert_pub_key_len) { + s->read.size = s->cert_pub_key_len; + s->read.end_pos = 0; + s->read.handle_data = reds_mig_receive_cert_public_key; + } else { + s->cert_pub_key = NULL; + s->read.size = RED_TICKET_PUBKEY_BYTES; + s->read.end_pos = 0; + s->read.handle_data = reds_mig_send_ticket; + } + + core->set_file_handlers(core, s->fd, reds_mig_read, NULL, s); +} + +static void reds_mig_handle_send_abort_done(RedsMigSpice *s) +{ + reds_mig_failed(s); +} + +static void reds_mig_receive_version(RedsMigSpice *s) +{ + uint32_t* dest_version; + uint32_t resault; + dest_version = (uint32_t*)s->read.buf; + resault = REDS_MIG_ABORT; + memcpy(s->write.buf, &resault, sizeof(resault)); + s->write.length = sizeof(resault); + s->write.now = s->write.buf; + s->write.handle_done = reds_mig_handle_send_abort_done; + core->set_file_handlers(core, s->fd, reds_mig_write, reds_mig_write, s); +} + static void reds_mig_control(RedsMigSpice *spice_migration) { uint32_t *control; @@ -4229,9 +4311,9 @@ static void reds_mig_control(RedsMigSpice *spice_migration) switch (*control) { case REDS_MIG_CONTINUE: - spice_migration->read.size = RED_TICKET_PUBKEY_BYTES; + spice_migration->read.size = sizeof(RedsMigCertPubKeyInfo); spice_migration->read.end_pos = 0; - spice_migration->read.handle_data = reds_mig_send_ticket; + spice_migration->read.handle_data = reds_mig_receive_cert_public_key_info; core->set_file_handlers(core, spice_migration->fd, reds_mig_read, NULL, spice_migration); @@ -4240,6 +4322,15 @@ static void reds_mig_control(RedsMigSpice *spice_migration) red_printf("abort"); reds_mig_failed(spice_migration); break; + case REDS_MIG_DIFF_VERSION: + red_printf("different versions"); + spice_migration->read.size = sizeof(uint32_t); + spice_migration->read.end_pos = 0; + spice_migration->read.handle_data = reds_mig_receive_version; + + core->set_file_handlers(core, spice_migration->fd, reds_mig_read, + NULL, spice_migration); + break; default: red_printf("invalid control"); reds_mig_failed(spice_migration); @@ -4281,6 +4372,12 @@ static void reds_mig_started(void *opaque, const char *in_args) goto error; } + if ((RED_VERSION_MAJOR == 1) && (reds->peer_minor_version < 1)) { + red_printf("minor version mismatch client %u server %u", + reds->peer_minor_version, RED_VERSION_MINOR); + goto error; + } + spice_migration = (RedsMigSpice *)malloc(sizeof(RedsMigSpice)); if (!spice_migration) { red_printf("Could not allocate memory for spice migration structure"); @@ -4483,6 +4580,85 @@ static void reds_mig_write_all(int fd, void *buf, int len, const char *name) } } +static void reds_mig_send_cert_public_key(int fd) +{ + FILE* cert_file; + X509* x509; + EVP_PKEY* pub_key; + unsigned char* pp = NULL; + int length; + BIO* mem_bio; + RedsMigCertPubKeyInfo pub_key_info_msg; + + if (spice_secure_port == -1) { + pub_key_info_msg.type = RED_PUBKEY_TYPE_INVALID; + pub_key_info_msg.len = 0; + reds_mig_write_all(fd, &pub_key_info_msg, sizeof(pub_key_info_msg), "cert public key info"); + return; + } + + cert_file = fopen(ssl_parameters.certs_file, "r"); + if (!cert_file) { + red_error("opening certificate failed"); + } + + x509 = PEM_read_X509_AUX(cert_file, NULL, NULL, NULL); + if (!x509) { + red_error("reading x509 cert failed"); + } + pub_key = X509_get_pubkey(x509); + if (!pub_key) { + red_error("reading public key failed"); + } + + mem_bio = BIO_new(BIO_s_mem()); + i2d_PUBKEY_bio(mem_bio, pub_key); + if (BIO_flush(mem_bio) != 1) { + red_error("bio flush failed"); + } + length = BIO_get_mem_data(mem_bio, &pp); + + switch(pub_key->type) { + case EVP_PKEY_RSA: + pub_key_info_msg.type = RED_PUBKEY_TYPE_RSA; + break; + case EVP_PKEY_RSA2: + pub_key_info_msg.type = RED_PUBKEY_TYPE_RSA2; + break; + case EVP_PKEY_DSA: + pub_key_info_msg.type = RED_PUBKEY_TYPE_DSA; + break; + case EVP_PKEY_DSA1: + pub_key_info_msg.type = RED_PUBKEY_TYPE_DSA1; + break; + case EVP_PKEY_DSA2: + pub_key_info_msg.type = RED_PUBKEY_TYPE_DSA2; + break; + case EVP_PKEY_DSA3: + pub_key_info_msg.type = RED_PUBKEY_TYPE_DSA3; + break; + case EVP_PKEY_DSA4: + pub_key_info_msg.type = RED_PUBKEY_TYPE_DSA4; + break; + case EVP_PKEY_DH: + pub_key_info_msg.type = RED_PUBKEY_TYPE_DH; + break; + case EVP_PKEY_EC: + pub_key_info_msg.type = RED_PUBKEY_TYPE_EC; + break; + default: + red_error("invalid public key type"); + } + pub_key_info_msg.len = length; + reds_mig_write_all(fd, &pub_key_info_msg, sizeof(pub_key_info_msg), "cert public key info"); + reds_mig_write_all(fd, pp, length, "cert public key"); + + BIO_free(mem_bio); + fclose(cert_file); + EVP_PKEY_free(pub_key); + X509_free(x509); +} + static void reds_mig_recv(void *opaque, int fd) { uint32_t ack_message = *(uint32_t *)"ack_"; @@ -4497,16 +4673,36 @@ static void reds_mig_recv(void *opaque, int fd) BUF_MEM *buff; reds_mig_read_all(fd, &version, sizeof(version), "version"); - - if (version != REDS_MIG_VERSION) { + // starting from version 3, if the version of the src is bigger + // than ours, we send our version to the src. + if (version < REDS_MIG_VERSION) { resault = REDS_MIG_ABORT; reds_mig_write_all(fd, &resault, sizeof(resault), "resault"); mig->notifier_done(mig, reds->mig_notifier); return; + } else if (version > REDS_MIG_VERSION) { + uint32_t src_resault; + uint32_t self_version = REDS_MIG_VERSION; + resault = REDS_MIG_DIFF_VERSION; + reds_mig_write_all(fd, &resault, sizeof(resault), "resault"); + reds_mig_write_all(fd, &self_version, sizeof(self_version), "dest-version"); + reds_mig_read_all(fd, &src_resault, sizeof(src_resault), "src resault"); + + if (src_resault == REDS_MIG_ABORT) { + red_printf("abort (response to REDS_MIG_DIFF_VERSION)"); + mig->notifier_done(mig, reds->mig_notifier); + return; + } else if (src_resault != REDS_MIG_CONTINUE) { + red_printf("invalid response to REDS_MIG_DIFF_VERSION"); + mig->notifier_done(mig, reds->mig_notifier); + return; + } + } else { + resault = REDS_MIG_CONTINUE; + reds_mig_write_all(fd, &resault, sizeof(resault), "resault"); } - resault = REDS_MIG_CONTINUE; - reds_mig_write_all(fd, &resault, sizeof(resault), "resault"); + reds_mig_send_cert_public_key(fd); ticketing_info.bn = BN_new(); if (!ticketing_info.bn) { |
From: Yaniv K. <yk...@re...> - 2010-01-05 18:59:19
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 54a8e5027093baa1c847b43f2fb08bea93e0ed67 Author: Izik Eidus <ie...@re...> Date: Tue Jan 5 19:40:08 2010 +0200 spice:stable server: add calls to red_pipe_clear_device_resources() needed in case we are detaching Signed-off-by: Izik Eidus <ie...@re...> diff --git a/server/red_worker.c b/server/red_worker.c index 1a0deb4..015f184 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -1233,6 +1233,40 @@ static void release_upgrade_item(RedWorker* worker, UpgradeItem *item) } } +static void red_pipe_clear_device_resources(RedChannel *channel) +{ + Ring *ring; + PipeItem *item; + + ASSERT(channel); + ring = &channel->pipe; + item = (PipeItem *) ring; + while ((item = (PipeItem *)ring_next(ring, (RingItem *)item))) { + PipeItem *tmp_item = item; + + switch (item->type) { + case PIPE_ITEM_TYPE_DRAW: + item = (PipeItem *)ring_prev(ring, (RingItem *)item); + ring_remove(&tmp_item->link); + release_drawable(channel->worker, CONTAINEROF(tmp_item, Drawable, pipe_item)); + channel->pipe_size--; + break; + case PIPE_ITEM_TYPE_CURSOR: + item = (PipeItem *)ring_prev(ring, (RingItem *)item); + ring_remove(&tmp_item->link); + red_release_cursor(channel->worker, (CursorItem *)tmp_item); + channel->pipe_size--; + break; + case PIPE_ITEM_TYPE_UPGRADE: + item = (PipeItem *)ring_prev(ring, (RingItem *)item); + ring_remove(&tmp_item->link); + release_upgrade_item(channel->worker, (UpgradeItem *)tmp_item); + channel->pipe_size--; + break; + } + } +} + static void red_pipe_clear(RedChannel *channel) { PipeItem *item; @@ -8136,6 +8170,12 @@ static void handle_dev_input(EventListener *listener, uint32_t events) red_printf("detach"); red_display_clear_glz_drawables(worker->display_channel); red_current_clear(worker); + if (worker->display_channel) { + red_pipe_clear_device_resources(&worker->display_channel->base); + } + if (worker->cursor_channel) { + red_pipe_clear_device_resources(&worker->cursor_channel->base); + } #ifdef STREAM_TRACE red_reset_stream_trace(worker); #endif |
From: Yaniv K. <yk...@re...> - 2010-01-05 17:38:48
|
repository: /home/tlv/ykamay/open_spice_upload/qxl branch: master commit cafa66fd483ccb53039353fe635000c6e156e719 Author: Izik Eidus <ie...@re...> Date: Tue Jan 5 17:06:37 2010 +0200 spice: qxl driver: add modified murmur hash 2a Signed-off-by: Izik Eidus <ie...@re...> diff --git a/win/display/lookup3.c b/win/display/lookup3.c deleted file mode 100644 index cef7b84..0000000 --- a/win/display/lookup3.c +++ /dev/null @@ -1,18 +0,0 @@ -/* - Copyright (C) 2009 Red Hat, Inc. - - 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, see <http://www.gnu.org/licenses/>. -*/ - -#include "..\common\lookup3.c" diff --git a/win/display/res.c b/win/display/res.c index c2b3a4f..cea01c6 100644 --- a/win/display/res.c +++ b/win/display/res.c @@ -21,7 +21,7 @@ #include "utils.h" #include "mspace.h" #include "quic.h" -#include "lookup3.h" +#include "murmur_hash2a.h" #if (WINVER < 0x0501) #define WAIT_FOR_EVENT(pdev, event, timeout) (pdev)->WaitForEvent(event, timeout) @@ -1226,32 +1226,36 @@ static _inline UINT32 GetHash(UINT8 *src, INT32 width, INT32 height, UINT8 forma int row; if (color_trans && color_trans->flXlate == XO_TABLE) { - hash_value = hashlittle(color_trans->pulXlate, - sizeof(*color_trans->pulXlate) * color_trans->cEntries, hash_value); - } - for (row = 0; row < height; row++) { -#ifdef ADAPTIVE_HASH - if (format == BITMAP_FMT_32BIT) { - for (i = 0; i < line_size; i += 4) { - hash_value = hashlittle(row_buf + i, 3, hash_value); - } - } else { - if (format == BITMAP_FMT_4BIT_BE && (width & 0x1)) { - last_byte = row_buf[line_size - 1] & 0xF0; - } else if (format == BITMAP_FMT_1BIT_BE && (reminder = width & 0x7)) { - last_byte = row_buf[line_size - 1] & ~((1 << (8 - reminder)) - 1); - } - if (last_byte) { - hash_value = hashlittle(row_buf, line_size - 1, hash_value); - hash_value = hashlittle(&last_byte, 1, hash_value); + hash_value = murmurhash2a(color_trans->pulXlate, + sizeof(*color_trans->pulXlate) * color_trans->cEntries, + hash_value); + } + + if (format == BITMAP_FMT_32BIT && stride == line_size) { + hash_value = murmurhash2ajump3((UINT32 *)row_buf, width * height, hash_value); + } else { + for (row = 0; row < height; row++) { + #ifdef ADAPTIVE_HASH + if (format == BITMAP_FMT_32BIT) { + hash_value = murmurhash2ajump3((UINT32 *)row_buf, width, hash_value); } else { - hash_value = hashlittle(row_buf, line_size, hash_value); + if (format == BITMAP_FMT_4BIT_BE && (width & 0x1)) { + last_byte = row_buf[line_size - 1] & 0xF0; + } else if (format == BITMAP_FMT_1BIT_BE && (reminder = width & 0x7)) { + last_byte = row_buf[line_size - 1] & ~((1 << (8 - reminder)) - 1); + } + if (last_byte) { + hash_value = murmurhash2a(row_buf, line_size - 1, hash_value); + hash_value = murmurhash2a(&last_byte, 1, hash_value); + } else { + hash_value = murmurhash2a(row_buf, line_size, hash_value); + } } + #else + hash_value = murmurhash2a(row_buf, line_size, hash_value); + #endif + row_buf += stride; } -#else - hash_value = hashlittle(row_buf, line_size, hash_value); -#endif - row_buf += stride; } return hash_value; } diff --git a/win/display/sources b/win/display/sources index f6c339b..ee5a74a 100644 --- a/win/display/sources +++ b/win/display/sources @@ -29,6 +29,5 @@ SOURCES=driver.c \ brush.c \ mspace.c \ quic.c \ - lookup3.c \ driver.rc diff --git a/win/include/murmur_hash2a.h b/win/include/murmur_hash2a.h new file mode 100644 index 0000000..fa327cb --- /dev/null +++ b/win/include/murmur_hash2a.h @@ -0,0 +1,148 @@ +/* + Copyright (C) 2009 Red Hat, Inc. + + 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, see <http://www.gnu.org/licenses/>. +*/ + +//Some modifications by Red Hat any bug is probably our fault + +//----------------------------------------------------------------------------- +// MurmurHash2A, by Austin Appleby + +// This is a variant of MurmurHash2 modified to use the Merkle-Damgard +// construction. Bulk speed should be identical to Murmur2, small-key speed +// will be 10%-20% slower due to the added overhead at the end of the hash. + +// This variant fixes a minor issue where null keys were more likely to +// collide with each other than expected, and also makes the algorithm +// more amenable to incremental implementations. All other caveats from +// MurmurHash2 still apply. + +#ifndef __MURMUR_HASH2A_H +#define __MURMUR_HASH2A_H + +#include <windef.h> +#include "os_dep.h" + +typedef UINT32 uint32_t; +typedef UINT16 uint16_t; +typedef UINT8 uint8_t; + +#define mmix(h,k) { k *= m; k ^= k >> r; k *= m; h *= m; h ^= k; } + +_inline uint32_t MurmurHash2A(const void * key, uint32_t len, uint32_t seed ) +{ + const uint32_t m = 0x5bd1e995; + const uint32_t r = 24; + uint32_t l = len; + uint32_t t = 0; + + const uint8_t * data = (const uint8_t *)key; + + uint32_t h = seed; + + while (len >= 4) { + uint32_t k = *(uint32_t*)data; + + mmix(h,k); + + data += 4; + len -= 4; + } + + switch (len) { + case 3: t ^= data[2] << 16; + case 2: t ^= data[1] << 8; + case 1: t ^= data[0]; + }; + + mmix(h,t); + mmix(h,l); + + h ^= h >> 13; + h *= m; + h ^= h >> 15; + + return h; +} + +_inline uint32_t MurmurHash2AJump3(const uint32_t * key, uint32_t len, uint32_t seed ) +{ + uint32_t m = 0x5bd1e995; + uint32_t r = 24; + uint32_t l = len << 2; + + const uint8_t * data = (const uint8_t *)key; + + uint32_t h = seed; + + while (len >= 4) { + uint32_t k = *(uint32_t*)data; + uint32_t tmp; + + data += 4; + tmp = *(uint32_t *)data; + k = k << 8; + k |= (uint8_t)tmp; + mmix(h,k); + + k = tmp << 8; + k = k & 0xffff0000; + data += 4; + tmp = *(uint32_t *)data; + k |= (uint16_t)(tmp >> 8); + mmix(h,k); + + data += 4; + k = *(uint32_t *)data; + k = k << 8; + k |= (uint8_t)tmp; + mmix(h,k); + + data += 4; + len -= 4; + } + + while (len >= 1) { + uint32_t k = *(uint32_t*)data; + + k = k << 8; + mmix(h,k); + + data += 4; + len--; + } + + h *= m; + mmix(h,l); + + h ^= h >> 13; + h *= m; + h ^= h >> 15; + + return h; +} + + +_inline uint32_t murmurhash2a(const void *key, size_t length, uint32_t initval) +{ + return MurmurHash2A(key, length, initval); +} + +_inline uint32_t murmurhash2ajump3(const uint32_t *key, size_t length, uint32_t initval) +{ + return MurmurHash2AJump3(key, length, initval); +} +#endif + |
From: Yaniv K. <yk...@re...> - 2010-01-04 19:19:09
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 68fa759dc468d23881b9b2521f644e4b4fb5f0c4 Author: Yaniv Kamay <yk...@re...> Date: Mon Jan 4 21:13:03 2010 +0200 client: use spice icon instead-of solidice icon diff --git a/client/windows/redc.rc b/client/windows/redc.rc index 2af4ac9..904de20 100644 --- a/client/windows/redc.rc +++ b/client/windows/redc.rc @@ -102,7 +102,7 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -RED_ICON_RES_ID ICON "solideice.ico" +RED_ICON_RES_ID ICON "spice.ico" #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/client/windows/redc.vcproj b/client/windows/redc.vcproj index 3b4b524..d0858be 100644 --- a/client/windows/redc.vcproj +++ b/client/windows/redc.vcproj @@ -583,7 +583,7 @@ > </File> <File - RelativePath=".\solideice.ico" + RelativePath=".\spice.ico" > </File> <File diff --git a/client/windows/solideice.ico b/client/windows/solideice.ico deleted file mode 100644 index 9187fb7..0000000 Binary files a/client/windows/solideice.ico and /dev/null differ diff --git a/client/windows/spice.ico b/client/windows/spice.ico new file mode 100644 index 0000000..ae9200c Binary files /dev/null and b/client/windows/spice.ico differ diff --git a/client/x11/images/red_icon.c b/client/x11/images/red_icon.c index 824eab8..ce1a7d4 100644 --- a/client/x11/images/red_icon.c +++ b/client/x11/images/red_icon.c @@ -1,190 +1,275 @@ static const struct { - uint32_t width; - uint32_t height; - uint8_t pixmap[4096]; - uint8_t mask[128]; + uint32_t width; + uint32_t height; + uint8_t pixmap[4096]; + uint8_t mask[128]; } _red_icon = { 32, 32, { - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0xf9,0xf9,0xf9,0x2e,0xfc,0xfc,0xfc,0xa7,0xff,0xfb,0xef,0xf8,0xf5,0xf5,0xf5,0xae,0xce,0xce,0xce,0x3e, - 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0xf5,0xf5,0xf5,0x19,0xfd,0xfd,0xfd,0x87,0xfe,0xfa,0xee,0xea,0xff,0xe3,0x9a,0xff,0xff,0xcd,0x5b,0xff, - 0xff,0xe3,0xa8,0xff,0xfc,0xf7,0xea,0xef,0xea,0xea,0xea,0x95,0xb7,0xb7,0xb7,0x27,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x0d,0xfd,0xfd,0xfd,0x69,0xfe,0xfc,0xf6,0xd7,0xff,0xee,0xbc,0xff,0xff,0xd9,0x6d,0xff, - 0xff,0xcb,0x42,0xff,0xff,0xc2,0x3d,0xff,0xff,0xc5,0x55,0xff,0xff,0xd3,0x73,0xff,0xff,0xec,0xbf,0xff,0xf8,0xf5,0xef,0xdf, - 0xe6,0xe6,0xe6,0x78,0xa6,0xa6,0xa6,0x17,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0xfc,0x4b,0xfc,0xfc,0xfc,0xc0,0xff,0xf6,0xd6,0xff,0xff,0xe4,0x89,0xff, - 0xff,0xd6,0x58,0xff,0xff,0xd1,0x53,0xff,0xff,0xce,0x4f,0xff,0xff,0xc2,0x43,0xff,0xff,0xc0,0x55,0xff,0xff,0xc5,0x55,0xff, - 0xff,0xc9,0x59,0xff,0xff,0xd9,0x85,0xff,0xff,0xf1,0xd0,0xff,0xf5,0xf5,0xf5,0xc9,0xdd,0xdd,0xdd,0x5a,0x00,0x00,0x00,0x08, - 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0xfa,0xfa,0x33,0xfc,0xfc,0xfc,0xa4,0xff,0xfb,0xe6,0xfa,0xff,0xee,0xa5,0xff, - 0xff,0xe1,0x6e,0xff,0xff,0xda,0x5e,0xff,0xff,0xd7,0x5d,0xff,0xff,0xd2,0x59,0xff,0xff,0xce,0x4e,0xff,0xff,0xbe,0x3f,0xff, - 0xff,0xb7,0x4b,0xff,0xff,0xbe,0x52,0xff,0xff,0xc2,0x56,0xff,0xff,0xc6,0x54,0xff,0xff,0xce,0x62,0xff,0xff,0xe0,0x99,0xff, - 0xfe,0xf5,0xe0,0xf9,0xf1,0xf1,0xf1,0xb1,0xcf,0xcf,0xcf,0x40,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0xf5,0xf5,0x1a,0xfd,0xfd,0xfd,0x85,0xfe,0xfd,0xf3,0xea,0xff,0xf6,0xbe,0xff, - 0xff,0xec,0x85,0xff,0xff,0xe4,0x6e,0xff,0xff,0xe0,0x6b,0xff,0xff,0xdc,0x67,0xff,0xff,0xd6,0x5e,0xff,0xff,0xd1,0x57,0xff, - 0xff,0xcd,0x4d,0xff,0xff,0xbb,0x39,0xff,0xff,0xaf,0x40,0xff,0xff,0xb6,0x49,0xff,0xff,0xbb,0x4f,0xff,0xff,0xc1,0x55,0xff, - 0xff,0xc5,0x58,0xff,0xff,0xc9,0x58,0xff,0xff,0xd3,0x6f,0xff,0xff,0xe7,0xac,0xff,0xfc,0xf8,0xeb,0xf0,0xeb,0xeb,0xeb,0x98, - 0xbc,0xbc,0xbc,0x2a,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x0e,0xfd,0xfd,0xfd,0x68,0xfe,0xfe,0xf8,0xdd,0xff,0xfc,0xd1,0xff, - 0xff,0xf6,0x9b,0xff,0xff,0xee,0x7e,0xff,0xff,0xe9,0x78,0xff,0xff,0xe5,0x75,0xff,0xff,0xdf,0x6d,0xff,0xff,0xdb,0x65,0xff, - 0xff,0xd6,0x5d,0xff,0xff,0xd1,0x55,0xff,0xff,0xcc,0x47,0xff,0xff,0xb6,0x31,0xff,0xff,0xa2,0x2e,0xff,0xff,0xac,0x3c,0xff, - 0xff,0xb4,0x44,0xff,0xff,0xb9,0x4c,0xff,0xff,0xbf,0x52,0xff,0xff,0xc3,0x58,0xff,0xff,0xc8,0x59,0xff,0xff,0xcc,0x5b,0xff, - 0xff,0xd8,0x7b,0xff,0xff,0xec,0xc0,0xff,0xf9,0xf7,0xf1,0xe1,0xe3,0xe3,0xe3,0x77,0xaa,0xaa,0xaa,0x18,0x00,0x00,0x00,0x03, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,0xfe,0xb6,0xff,0xff,0xf0,0xff, - 0xff,0xfe,0xb0,0xff,0xff,0xf8,0x8b,0xff,0xff,0xf3,0x87,0xff,0xff,0xee,0x83,0xff,0xff,0xe9,0x7c,0xff,0xff,0xe4,0x73,0xff, - 0xff,0xde,0x6c,0xff,0xff,0xda,0x63,0xff,0xff,0xd4,0x56,0xff,0xff,0xce,0x4d,0xff,0xff,0xd8,0x79,0xff,0xff,0xe8,0xbd,0xff, - 0xff,0xca,0x8f,0xff,0xff,0xa9,0x3d,0xff,0xff,0xa6,0x30,0xff,0xff,0xaf,0x3f,0xff,0xff,0xb7,0x48,0xff,0xff,0xbb,0x4f,0xff, - 0xff,0xc1,0x55,0xff,0xff,0xc6,0x5b,0xff,0xff,0xca,0x5c,0xff,0xff,0xcd,0x5c,0xff,0xff,0xdd,0x87,0xff,0xff,0xf6,0xe1,0xff, - 0xf0,0xf0,0xf0,0xb9,0xe1,0xe1,0xe1,0x5f,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0xfb,0xed,0xfe,0xf9,0xf7,0xd9,0xf9,0xff,0xff,0xff,0xd3,0xff,0xff,0xfe,0xa2,0xff,0xff,0xf3,0x84,0xff,0xff,0xed,0x7f,0xff, - 0xff,0xe8,0x7a,0xff,0xff,0xe3,0x73,0xff,0xff,0xdd,0x67,0xff,0xff,0xd7,0x5b,0xff,0xff,0xda,0x73,0xff,0xff,0xeb,0xbb,0xff, - 0xff,0xfe,0xed,0xff,0xff,0xff,0xe4,0xff,0xff,0xff,0xeb,0xff,0xff,0xec,0xd4,0xff,0xff,0xc1,0x77,0xff,0xff,0xa8,0x37,0xff, - 0xff,0xaa,0x36,0xff,0xff,0xb3,0x44,0xff,0xff,0xba,0x4c,0xff,0xff,0xbd,0x4e,0xff,0xff,0xc0,0x4e,0xff,0xff,0xce,0x6e,0xff, - 0xff,0xe9,0xb7,0xff,0xea,0xf9,0xed,0xff,0xf3,0xf9,0xf7,0xee,0xdf,0xdf,0xdf,0x9e,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x06, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0xcc,0xfa,0xf1,0xce,0x2f,0xef,0xff,0xdf,0x7e,0xfa,0xff,0xfa,0xea,0xf3,0xff, - 0xff,0xff,0xc3,0xff,0xff,0xf4,0x8a,0xff,0xff,0xe6,0x71,0xff,0xff,0xe0,0x67,0xff,0xff,0xdf,0x72,0xff,0xff,0xea,0xaf,0xff, - 0xff,0xfa,0xe9,0xff,0xff,0xff,0xe6,0xff,0xff,0xff,0xcb,0xff,0xff,0xff,0xc5,0xff,0xff,0xff,0xc6,0xff,0xff,0xff,0xd9,0xff, - 0xff,0xff,0xf0,0xff,0xff,0xe1,0xbf,0xff,0xff,0xb8,0x60,0xff,0xff,0xa7,0x33,0xff,0xff,0xaa,0x33,0xff,0xff,0xb9,0x4f,0xff, - 0xff,0xda,0x9f,0xff,0xf6,0xf6,0xe7,0xff,0xb6,0xf8,0xe7,0xff,0x72,0xed,0xc0,0xff,0xe0,0xf3,0xeb,0xe9,0xd2,0xd2,0xd2,0xa0, - 0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0xd2,0xfa,0xf1,0xc4,0x14,0xeb,0xff, - 0xb9,0x00,0xe7,0xff,0xc5,0x2e,0xef,0xff,0xe5,0xa2,0xfc,0xff,0xfc,0xf4,0xea,0xff,0xff,0xfa,0xa8,0xff,0xff,0xed,0xa0,0xff, - 0xff,0xf9,0xde,0xff,0xff,0xff,0xec,0xff,0xff,0xff,0xd1,0xff,0xff,0xff,0xc5,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xc9,0xff, - 0xff,0xff,0xc9,0xff,0xff,0xff,0xc5,0xff,0xff,0xff,0xc9,0xff,0xff,0xff,0xe4,0xff,0xff,0xf9,0xe8,0xff,0xff,0xd5,0xa2,0xff, - 0xff,0xc7,0x7f,0xff,0xfd,0xef,0xda,0xff,0xca,0xfb,0xf1,0xff,0x7d,0xf0,0xca,0xff,0x55,0xe9,0xb1,0xff,0x5a,0xe9,0xb4,0xff, - 0xe2,0xf3,0xed,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0xf2,0xd2,0xfa,0xf1,0xc2,0x1b,0xe9,0xff,0xb9,0x00,0xe6,0xff,0xb5,0x00,0xe5,0xff,0xb5,0x00,0xe5,0xff,0xc7,0x48,0xf1,0xff, - 0xeb,0xc1,0xf8,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xee,0xff,0xff,0xff,0xc6,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff, - 0xff,0xff,0xca,0xff,0xff,0xff,0xc9,0xff,0xff,0xff,0xc9,0xff,0xff,0xff,0xc9,0xff,0xff,0xff,0xc6,0xff,0xff,0xff,0xc2,0xff, - 0xff,0xff,0xdc,0xff,0xff,0xff,0xff,0xff,0xe8,0xfc,0xf8,0xff,0x93,0xf4,0xd6,0xff,0x5b,0xe9,0xb5,0xff,0x58,0xe9,0xb3,0xff, - 0x60,0xea,0xb7,0xff,0x61,0xea,0xb7,0xff,0xe2,0xf3,0xed,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0xd2,0xfa,0xf1,0xbd,0x1b,0xe7,0xff,0xb3,0x00,0xe4,0xff,0xb5,0x07,0xe4,0xff, - 0xb2,0x04,0xe3,0xff,0xa7,0x00,0xe0,0xff,0xbe,0x3c,0xea,0xff,0xfe,0xfb,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xf1,0xff, - 0xff,0xff,0xd7,0xff,0xff,0xfe,0xc4,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xca,0xff,0xff,0xff,0xc9,0xff,0xff,0xff,0xc5,0xff, - 0xff,0xff,0xcf,0xff,0xff,0xff,0xe9,0xff,0xff,0xfd,0xec,0xff,0xff,0xfc,0xdd,0xff,0xbd,0xf7,0xe2,0xff,0x51,0xe7,0xaf,0xff, - 0x5d,0xe9,0xb5,0xff,0x62,0xea,0xb7,0xff,0x60,0xea,0xb7,0xff,0x61,0xea,0xb7,0xff,0xe2,0xf3,0xed,0xe9,0xd1,0xd1,0xd1,0xa1, - 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0xd3,0xf9,0xf1,0xb9,0x1c,0xe5,0xff, - 0xae,0x00,0xe2,0xff,0xb0,0x07,0xe2,0xff,0xae,0x07,0xe2,0xff,0xa7,0x00,0xe0,0xff,0xba,0x3b,0xe6,0xff,0xfd,0xf9,0xfe,0xff, - 0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xfc,0xff,0xff,0xff,0xeb,0xff,0xff,0xfe,0xc9,0xff,0xff,0xfd,0xba,0xff, - 0xff,0xfd,0xc2,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xf6,0xff,0xff,0xfc,0xea,0xff,0xff,0xf9,0xc5,0xff,0xff,0xfa,0xc2,0xff, - 0xbd,0xf5,0xe0,0xff,0x53,0xe7,0xae,0xff,0x5d,0xe8,0xb4,0xff,0x61,0xea,0xb7,0xff,0x60,0xea,0xb7,0xff,0x61,0xea,0xb7,0xff, - 0xe2,0xf3,0xed,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0xf0,0xd3,0xf9,0xf1,0xb4,0x1c,0xe3,0xff,0xaa,0x00,0xe0,0xff,0xab,0x07,0xe0,0xff,0xa9,0x07,0xe0,0xff,0xa2,0x00,0xdd,0xff, - 0xb6,0x3d,0xe4,0xff,0xfd,0xfa,0xff,0xff,0xff,0xff,0xfc,0xff,0xff,0xfe,0xf6,0xff,0xff,0xfd,0xf0,0xff,0xff,0xfd,0xf2,0xff, - 0xff,0xfe,0xf2,0xff,0xff,0xfe,0xdf,0xff,0xff,0xfe,0xec,0xff,0xff,0xfd,0xfa,0xff,0xff,0xfb,0xe6,0xff,0xff,0xf9,0xcf,0xff, - 0xff,0xf8,0xbc,0xff,0xff,0xf9,0xc1,0xff,0xba,0xf5,0xde,0xff,0x49,0xe3,0xa5,0xff,0x55,0xe6,0xac,0xff,0x5d,0xe9,0xb3,0xff, - 0x5f,0xea,0xb6,0xff,0x61,0xea,0xb7,0xff,0xe2,0xf3,0xed,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0xd3,0xf8,0xf1,0xb0,0x1d,0xe2,0xff,0xa5,0x01,0xde,0xff,0xa6,0x08,0xde,0xff, - 0xa4,0x08,0xde,0xff,0x9e,0x00,0xdb,0xff,0xb3,0x3d,0xe3,0xff,0xfd,0xfa,0xfb,0xff,0xff,0xff,0xf1,0xff,0xff,0xfc,0xe9,0xff, - 0xff,0xfc,0xe2,0xff,0xff,0xfb,0xd9,0xff,0xff,0xfa,0xd7,0xff,0xff,0xfe,0xf5,0xff,0xff,0xff,0xfe,0xff,0xff,0xfc,0xeb,0xff, - 0xff,0xfb,0xda,0xff,0xff,0xf9,0xcb,0xff,0xff,0xf7,0xb7,0xff,0xff,0xf9,0xbd,0xff,0xb8,0xf4,0xdb,0xff,0x41,0xe1,0x9e,0xff, - 0x4c,0xe4,0xa5,0xff,0x54,0xe7,0xab,0xff,0x5a,0xe8,0xb1,0xff,0x5f,0xe9,0xb6,0xff,0xe3,0xf3,0xed,0xe9,0xd1,0xd1,0xd1,0xa1, - 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xd3,0xf8,0xf1,0xac,0x1d,0xe0,0xff, - 0xa0,0x01,0xdc,0xff,0xa1,0x09,0xdc,0xff,0xa0,0x09,0xdc,0xff,0x99,0x00,0xd9,0xff,0xaf,0x3d,0xe3,0xff,0xfd,0xfa,0xf6,0xff, - 0xff,0xff,0xe4,0xff,0xff,0xfb,0xdd,0xff,0xff,0xfb,0xd5,0xff,0xff,0xfa,0xce,0xff,0xff,0xf9,0xc5,0xff,0xff,0xfc,0xe8,0xff, - 0xff,0xfe,0xfa,0xff,0xff,0xfc,0xe6,0xff,0xff,0xfa,0xd5,0xff,0xff,0xf8,0xc6,0xff,0xff,0xf6,0xb2,0xff,0xff,0xf9,0xb9,0xff, - 0xb4,0xf3,0xd8,0xff,0x39,0xdf,0x97,0xff,0x43,0xe2,0x9e,0xff,0x4b,0xe4,0xa4,0xff,0x50,0xe5,0xa9,0xff,0x57,0xe7,0xae,0xff, - 0xe2,0xf3,0xec,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0xed,0xd3,0xf8,0xf1,0xa7,0x1e,0xde,0xff,0x9b,0x02,0xda,0xff,0x9c,0x09,0xda,0xff,0x9b,0x0a,0xda,0xff,0x93,0x00,0xd7,0xff, - 0xaa,0x3d,0xe2,0xff,0xfd,0xfb,0xf0,0xff,0xff,0xfe,0xd7,0xff,0xff,0xfa,0xd0,0xff,0xff,0xf9,0xca,0xff,0xff,0xf8,0xc1,0xff, - 0xff,0xf7,0xb9,0xff,0xff,0xfc,0xe3,0xff,0xff,0xfe,0xf6,0xff,0xff,0xfb,0xdf,0xff,0xff,0xfa,0xcf,0xff,0xff,0xf8,0xc0,0xff, - 0xff,0xf6,0xaa,0xff,0xff,0xf8,0xb1,0xff,0xb3,0xf2,0xd7,0xff,0x31,0xdd,0x90,0xff,0x3b,0xde,0x97,0xff,0x43,0xe2,0x9d,0xff, - 0x48,0xe3,0xa1,0xff,0x4f,0xe4,0xa7,0xff,0xe1,0xf3,0xeb,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0xd3,0xf7,0xf1,0xa3,0x1f,0xdc,0xff,0x96,0x03,0xd7,0xff,0x98,0x0a,0xd8,0xff, - 0x95,0x0a,0xd7,0xff,0x8a,0x00,0xd3,0xff,0xa6,0x3d,0xe0,0xff,0xfe,0xfe,0xf4,0xff,0xff,0xff,0xd0,0xff,0xff,0xf8,0xbf,0xff, - 0xff,0xf8,0xbb,0xff,0xff,0xf7,0xb5,0xff,0xff,0xf6,0xad,0xff,0xff,0xfb,0xde,0xff,0xff,0xfd,0xf2,0xff,0xff,0xfa,0xda,0xff, - 0xff,0xf9,0xca,0xff,0xff,0xf6,0xb7,0xff,0xff,0xf5,0xa7,0xff,0xff,0xfb,0xca,0xff,0xae,0xf0,0xd3,0xff,0x26,0xd9,0x85,0xff, - 0x33,0xdd,0x90,0xff,0x3b,0xdf,0x96,0xff,0x40,0xe0,0x9b,0xff,0x47,0xe2,0xa1,0xff,0xe0,0xf2,0xeb,0xe9,0xd1,0xd1,0xd1,0xa1, - 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0xd4,0xf7,0xf1,0x9f,0x20,0xda,0xff, - 0x91,0x03,0xd5,0xff,0x8e,0x05,0xd4,0xff,0x8e,0x06,0xd4,0xff,0xa3,0x1e,0xdc,0xff,0xc9,0x4c,0xea,0xff,0xe9,0xa6,0xf7,0xff, - 0xfa,0xec,0xf4,0xff,0xff,0xff,0xd3,0xff,0xff,0xfa,0xaf,0xff,0xff,0xf4,0xa2,0xff,0xff,0xf4,0xa0,0xff,0xff,0xfb,0xda,0xff, - 0xff,0xfc,0xf0,0xff,0xff,0xf9,0xd2,0xff,0xff,0xf8,0xc1,0xff,0xff,0xfa,0xc5,0xff,0xfe,0xfc,0xe2,0xff,0xbf,0xf7,0xe4,0xff, - 0x57,0xe5,0xac,0xff,0x23,0xd8,0x83,0xff,0x2b,0xd9,0x86,0xff,0x32,0xdd,0x8e,0xff,0x38,0xde,0x94,0xff,0x3f,0xe0,0x99,0xff, - 0xde,0xf2,0xe9,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0xeb,0xd4,0xf7,0xf1,0x97,0x1d,0xd7,0xff,0x85,0x00,0xd1,0xff,0x9c,0x19,0xda,0xff,0xc7,0x4b,0xea,0xff,0xe2,0x69,0xf4,0xff, - 0xe2,0x67,0xf4,0xff,0xd7,0x55,0xf0,0xff,0xdc,0x70,0xf5,0xff,0xed,0xbb,0xfb,0xff,0xfd,0xf6,0xe7,0xff,0xff,0xff,0xb3,0xff, - 0xff,0xf4,0x8d,0xff,0xff,0xf9,0xd0,0xff,0xff,0xfc,0xea,0xff,0xff,0xf9,0xd2,0xff,0xff,0xfc,0xe4,0xff,0xd8,0xfb,0xec,0xff, - 0x7f,0xf1,0xd1,0xff,0x38,0xe7,0xad,0xff,0x32,0xe6,0xa7,0xff,0x38,0xe4,0xa3,0xff,0x2f,0xdd,0x91,0xff,0x2a,0xd8,0x86,0xff, - 0x2d,0xda,0x88,0xff,0x35,0xdd,0x92,0xff,0xde,0xf2,0xe8,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0xd2,0xf7,0xf8,0x9c,0x22,0xda,0xff,0xbd,0x3d,0xe6,0xff,0xea,0x73,0xf7,0xff, - 0xf1,0x7b,0xfa,0xff,0xea,0x73,0xf6,0xff,0xe3,0x6c,0xf5,0xff,0xe0,0x67,0xf3,0xff,0xdb,0x5c,0xf2,0xff,0xd8,0x58,0xf1,0xff, - 0xdf,0x82,0xf8,0xff,0xf2,0xcd,0xf7,0xff,0xff,0xfb,0xce,0xff,0xff,0xfd,0xdd,0xff,0xff,0xfe,0xf5,0xff,0xe9,0xfd,0xf0,0xff, - 0x9a,0xf5,0xde,0xff,0x4d,0xed,0xbf,0xff,0x37,0xe9,0xb1,0xff,0x3e,0xe9,0xb2,0xff,0x40,0xe9,0xaf,0xff,0x3d,0xe8,0xac,0xff, - 0x3b,0xe7,0xaa,0xff,0x36,0xe2,0x9f,0xff,0x2b,0xdb,0x8c,0xff,0x24,0xd8,0x84,0xff,0xdb,0xf2,0xe8,0xed,0xd4,0xd4,0xd4,0xa5, - 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xe9,0xf8,0xd7,0xee,0xa1,0xf8,0xff, - 0xfd,0x88,0xfe,0xff,0xfa,0x82,0xfd,0xff,0xf2,0x7d,0xfa,0xff,0xee,0x79,0xf8,0xff,0xeb,0x74,0xf7,0xff,0xe6,0x6f,0xf6,0xff, - 0xe3,0x6b,0xf5,0xff,0xe0,0x65,0xf3,0xff,0xd9,0x58,0xf1,0xff,0xd7,0x5a,0xf2,0xff,0xe6,0x94,0xfb,0xff,0xf9,0xf5,0xfe,0xff, - 0xb5,0xfd,0xea,0xff,0x5e,0xf3,0xcd,0xff,0x3f,0xee,0xbf,0xff,0x41,0xee,0xbc,0xff,0x45,0xed,0xbb,0xff,0x44,0xec,0xb9,0xff, - 0x42,0xeb,0xb5,0xff,0x40,0xea,0xb1,0xff,0x3d,0xe8,0xae,0xff,0x36,0xe7,0xaa,0xff,0x33,0xe5,0xa5,0xff,0x6a,0xe8,0xb3,0xff, - 0xe1,0xec,0xe7,0xdb,0xbf,0xbf,0xbf,0x8c,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0xbb,0xbc,0xbb,0x2a,0xe6,0xe6,0xe4,0xab,0xfd,0xd9,0xfd,0xfd,0xfc,0xa0,0xfe,0xff,0xf8,0x80,0xfc,0xff,0xf4,0x7d,0xfa,0xff, - 0xf2,0x7b,0xf9,0xff,0xed,0x77,0xf8,0xff,0xe9,0x72,0xf7,0xff,0xe6,0x6e,0xf5,0xff,0xe2,0x6a,0xf4,0xff,0xdb,0x5c,0xf2,0xff, - 0xe1,0x62,0xf3,0xff,0xe6,0xe5,0xf9,0xff,0x60,0xfb,0xd2,0xff,0x43,0xf1,0xc7,0xff,0x4c,0xf1,0xc7,0xff,0x4a,0xf0,0xc4,0xff, - 0x49,0xef,0xc0,0xff,0x47,0xee,0xbe,0xff,0x44,0xed,0xba,0xff,0x3d,0xeb,0xb5,0xff,0x36,0xe9,0xaf,0xff,0x5d,0xed,0xbd,0xff, - 0xb7,0xf6,0xe0,0xff,0xd9,0xdb,0xdb,0xc1,0x6b,0x6b,0x6b,0x5f,0x2a,0x2a,0x2a,0x37,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x06, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x14,0xaf,0xb4,0xaf,0x64,0xe9,0xe6,0xe9,0xce, - 0xfe,0xca,0xff,0xff,0xfc,0x97,0xfe,0xff,0xf7,0x7e,0xfc,0xff,0xf3,0x7c,0xfa,0xff,0xef,0x7a,0xf9,0xff,0xec,0x76,0xf7,0xff, - 0xe8,0x71,0xf6,0xff,0xe2,0x67,0xf5,0xff,0xe9,0x6f,0xf6,0xff,0xe5,0xe7,0xf9,0xff,0x66,0xfc,0xd8,0xff,0x4b,0xf4,0xcf,0xff, - 0x4f,0xf3,0xcd,0xff,0x4d,0xf2,0xca,0xff,0x4c,0xf1,0xc6,0xff,0x46,0xef,0xc2,0xff,0x3e,0xee,0xbd,0xff,0x53,0xef,0xc2,0xff, - 0xa3,0xf6,0xdd,0xff,0xe2,0xeb,0xe8,0xdf,0xa5,0x9f,0xa1,0x83,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x17, - 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04, - 0x00,0x00,0x00,0x0d,0x4e,0x4f,0x4e,0x29,0xc2,0xc7,0xc1,0x8a,0xf4,0xe8,0xf3,0xe6,0xfe,0xbb,0xff,0xff,0xfb,0x8b,0xfd,0xff, - 0xf5,0x7b,0xfb,0xff,0xf3,0x7b,0xf9,0xff,0xef,0x79,0xf8,0xff,0xe9,0x6f,0xf7,0xff,0xef,0x77,0xf8,0xff,0xe7,0xe9,0xf9,0xff, - 0x69,0xfe,0xde,0xff,0x4e,0xf6,0xd5,0xff,0x53,0xf5,0xd3,0xff,0x4d,0xf4,0xcf,0xff,0x44,0xf2,0xc9,0xff,0x50,0xf3,0xca,0xff, - 0x92,0xf7,0xdd,0xff,0xdb,0xf4,0xee,0xf4,0xcb,0xc5,0xc7,0xa8,0x4a,0x49,0x49,0x53,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x1f, - 0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x12,0x85,0x88,0x85,0x42, - 0xd6,0xdb,0xd6,0xab,0xf9,0xe3,0xf9,0xf5,0xfe,0xaf,0xff,0xff,0xfa,0x84,0xfd,0xff,0xf5,0x7b,0xfb,0xff,0xf0,0x77,0xf9,0xff, - 0xf5,0x7f,0xf9,0xff,0xe8,0xea,0xfa,0xff,0x6d,0xff,0xe3,0xff,0x52,0xf9,0xdb,0xff,0x4d,0xf7,0xd6,0xff,0x4e,0xf6,0xd3,0xff, - 0x83,0xfa,0xe0,0xff,0xd4,0xfc,0xf3,0xff,0xe1,0xdd,0xdf,0xc9,0x82,0x7e,0x7f,0x6e,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x26, - 0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x17,0xa8,0xac,0xa7,0x62,0xe5,0xe7,0xe5,0xcb,0xfe,0xdc,0xfe,0xff, - 0xfd,0x9e,0xff,0xff,0xf7,0x78,0xfc,0xff,0xfa,0x80,0xfb,0xff,0xe9,0xeb,0xfb,0xff,0x69,0xff,0xe7,0xff,0x49,0xfa,0xdf,0xff, - 0x75,0xfb,0xe4,0xff,0xc6,0xfe,0xf4,0xff,0xed,0xec,0xec,0xe5,0xac,0xa6,0xa8,0x90,0x20,0x1f,0x1f,0x44,0x00,0x00,0x00,0x2d, - 0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0d, - 0x41,0x43,0x41,0x25,0xc1,0xc6,0xc0,0x84,0xf0,0xeb,0xef,0xe6,0xfe,0xc8,0xff,0xff,0xff,0x98,0xfe,0xff,0xe5,0xec,0xfc,0xff, - 0x7d,0xff,0xee,0xff,0xad,0xff,0xf4,0xff,0xef,0xf7,0xf6,0xf7,0xcd,0xc5,0xc6,0xb3,0x58,0x57,0x57,0x5a,0x00,0x00,0x00,0x33, - 0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x11,0x7e,0x80,0x7d,0x3f,0xd2,0xd5,0xd1,0xaa, - 0xfc,0xef,0xfc,0xfd,0xf4,0xf9,0xfd,0xff,0xeb,0xfd,0xfb,0xff,0xe2,0xdc,0xdd,0xd4,0x8a,0x86,0x86,0x77,0x00,0x00,0x00,0x39, - 0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, - 0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x16,0xa5,0xa7,0xa4,0x60,0xdc,0xdb,0xd9,0xba,0xb6,0xb2,0xb1,0x97,0x29,0x29,0x29,0x47, - 0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x2d,0x2d,0x2d,0x10,0x9b,0x9b,0x9a,0x40, - 0x58,0x57,0x56,0x3a,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xd3,0xd3,0xd3,0x00,0x1a,0x1a,0x1a,0x07,0x1a,0x1a,0x1a,0x49, + 0x1a,0x1a,0x1a,0x98,0x1f,0x1f,0x1f,0xc2,0x2d,0x2d,0x2d,0xdd,0x34,0x34,0x34,0xf4, + 0x3c,0x3c,0x3c,0xf5,0x45,0x45,0x45,0xe0,0x4f,0x4f,0x4f,0xcc,0x5b,0x5b,0x5b,0xac, + 0x83,0x83,0x83,0x6d,0xe7,0xe7,0xe7,0x36,0xff,0xff,0xff,0x2c,0xff,0xff,0xff,0x27, + 0xff,0xff,0xff,0x1f,0xff,0xff,0xff,0x16,0xff,0xff,0xff,0x0a,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0xd3,0xd3,0x00, + 0x1a,0x1a,0x1a,0x19,0x1a,0x1a,0x1a,0x97,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0xff, + 0x26,0x26,0x26,0xff,0x32,0x32,0x32,0xff,0x3d,0x3d,0x3d,0xff,0x47,0x47,0x47,0xff, + 0x4f,0x4f,0x4f,0xff,0x55,0x55,0x55,0xff,0x5a,0x5a,0x5a,0xff,0x5c,0x5c,0x5c,0xff, + 0x5c,0x5c,0x5c,0xff,0x5d,0x5d,0x5d,0xf6,0x71,0x71,0x71,0xb3,0xc9,0xc9,0xc9,0x51, + 0xff,0xff,0xff,0x35,0xff,0xff,0xff,0x2b,0xff,0xff,0xff,0x20,0xff,0xff,0xff,0x13, + 0xff,0xff,0xff,0x03,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x08,0x1a,0x1a,0x1a,0x84, + 0x1a,0x1a,0x1a,0xf5,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x28,0x28,0x28,0xff, + 0x37,0x37,0x37,0xff,0x43,0x43,0x43,0xff,0x4f,0x4f,0x4f,0xff,0x5a,0x5a,0x5a,0xff, + 0x63,0x63,0x63,0xff,0x6a,0x6a,0x6a,0xff,0x6f,0x6f,0x6f,0xff,0x72,0x72,0x72,0xff, + 0x72,0x72,0x72,0xff,0x70,0x70,0x70,0xff,0x6c,0x6c,0x6c,0xff,0x67,0x67,0x67,0xf8, + 0x80,0x80,0x80,0xa8,0xeb,0xeb,0xeb,0x46,0xff,0xff,0xff,0x33,0xff,0xff,0xff,0x25, + 0xff,0xff,0xff,0x16,0xff,0xff,0xff,0x04,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x18,0x1a,0x1a,0x1a,0xc8,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x27,0x27,0x27,0xff,0x37,0x37,0x37,0xff, + 0x45,0x45,0x45,0xff,0x53,0x53,0x53,0xff,0x60,0x60,0x60,0xff,0x6c,0x6c,0x6c,0xff, + 0x76,0x76,0x76,0xff,0x7f,0x7f,0x7f,0xff,0x84,0x84,0x84,0xff,0x88,0x88,0x88,0xff, + 0x88,0x88,0x88,0xff,0x86,0x86,0x86,0xff,0x80,0x80,0x80,0xff,0x79,0x79,0x79,0xff, + 0x6f,0x6f,0x6f,0xff,0x71,0x71,0x71,0xda,0xd1,0xd1,0xd1,0x57,0xff,0xff,0xff,0x36, + 0xff,0xff,0xff,0x26,0xff,0xff,0xff,0x15,0xff,0xff,0xff,0x02,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x1a,0x1a,0x1a,0x2d,0x1a,0x1a,0x1a,0xe3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x21,0x21,0x21,0xff,0x32,0x32,0x32,0xff,0x42,0x42,0x42,0xff, + 0x53,0x53,0x53,0xff,0x62,0x62,0x62,0xff,0x6f,0x6f,0x6f,0xff,0x7d,0x7d,0x7d,0xff, + 0x88,0x88,0x88,0xff,0x92,0x92,0x92,0xff,0x9a,0x9a,0x9a,0xff,0x9d,0x9d,0x9d,0xff, + 0x9e,0x9e,0x9e,0xff,0x9b,0x9b,0x9b,0xff,0x95,0x95,0x95,0xff,0x8c,0x8c,0x8c,0xff, + 0x81,0x81,0x81,0xff,0x75,0x75,0x75,0xff,0x6c,0x6c,0x6c,0xec,0xb5,0xb5,0xb5,0x66, + 0xff,0xff,0xff,0x34,0xff,0xff,0xff,0x22,0xff,0xff,0xff,0x10,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x18, + 0x1a,0x1a,0x1a,0xe3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x2a,0x2a,0x2a,0xff,0x3c,0x3c,0x3c,0xff,0x4d,0x4d,0x4d,0xff, + 0x5d,0x5d,0x5d,0xff,0x6e,0x6e,0x6e,0xff,0x7e,0x7e,0x7e,0xff,0x8c,0x8c,0x8c,0xff, + 0x9a,0x9a,0x9a,0xff,0xa5,0xa5,0xa5,0xff,0xae,0xae,0xae,0xff,0xb3,0xb3,0xb3,0xff, + 0xb4,0xb4,0xb4,0xff,0xb0,0xb0,0xb0,0xff,0xa9,0xa9,0xa9,0xff,0x9e,0x9e,0x9e,0xff, + 0x91,0x91,0x91,0xff,0x83,0x83,0x83,0xff,0x74,0x74,0x74,0xff,0x6a,0x6a,0x6a,0xec, + 0xcd,0xcd,0xcd,0x52,0xff,0xff,0xff,0x2d,0xff,0xff,0xff,0x1a,0xff,0xff,0xff,0x05, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x08,0x1a,0x1a,0x1a,0xc8, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1e,0x1e,0x1e,0xff,0x31,0x31,0x31,0xff,0x43,0x43,0x43,0xff,0x55,0x55,0x55,0xff, + 0x66,0x66,0x66,0xff,0x77,0x77,0x77,0xff,0x88,0x88,0x88,0xff,0x99,0x99,0x99,0xff, + 0xa9,0xa9,0xa9,0xff,0xb6,0xb6,0xb6,0xff,0xc1,0xc1,0xc1,0xff,0xc8,0xc8,0xc8,0xff, + 0xca,0xca,0xca,0xff,0xc5,0xc5,0xc5,0xff,0xbb,0xbb,0xbb,0xff,0xae,0xae,0xae,0xff, + 0x9f,0x9f,0x9f,0xff,0x8f,0x8f,0x8f,0xff,0x7e,0x7e,0x7e,0xff,0x6d,0x6d,0x6d,0xff, + 0x67,0x67,0x67,0xd8,0xe7,0xe7,0xe7,0x3b,0xff,0xff,0xff,0x21,0xff,0xff,0xff,0x0d, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x84,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x23,0x23,0x23,0xff,0x36,0x36,0x36,0xff,0x48,0x48,0x48,0xff,0x5b,0x5b,0x5b,0xff, + 0x6d,0x6d,0x6d,0xff,0x7f,0x7f,0x7f,0xff,0x91,0x91,0x91,0xff,0xa3,0xa3,0xa3,0xff, + 0xb4,0xb4,0xb4,0xff,0xc4,0xc4,0xc4,0xff,0xd3,0xd3,0xd3,0xff,0xde,0xde,0xde,0xff, + 0xe0,0xe0,0xe0,0xff,0xd7,0xd7,0xd7,0xff,0xca,0xca,0xca,0xff,0xba,0xba,0xba,0xff, + 0xa9,0xa9,0xa9,0xff,0x98,0x98,0x98,0xff,0x86,0x86,0x86,0xff,0x73,0x73,0x73,0xff, + 0x61,0x61,0x61,0xff,0x6e,0x6e,0x6e,0xa0,0xff,0xff,0xff,0x27,0xff,0xff,0xff,0x12, + 0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x19,0x1a,0x1a,0x1a,0xf5,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x26,0x26,0x26,0xff,0x3e,0x3e,0x41,0xff,0x5f,0x5f,0x65,0xff,0x5d,0x5d,0x5d,0xff, + 0x6f,0x6f,0x6f,0xff,0x82,0x82,0x82,0xff,0x9b,0x9f,0x9b,0xff,0xad,0xae,0xad,0xff, + 0xba,0xba,0xba,0xff,0xcc,0xcc,0xcc,0xff,0xdf,0xdf,0xdf,0xff,0xf0,0xf0,0xf0,0xff, + 0xf6,0xf6,0xf6,0xff,0xe5,0xe5,0xe5,0xff,0xd3,0xd3,0xd3,0xff,0xc1,0xc1,0xc1,0xff, + 0xae,0xae,0xae,0xff,0x9b,0x9b,0x9b,0xff,0x89,0x89,0x89,0xff,0x76,0x76,0x76,0xff, + 0x65,0x65,0x65,0xff,0x53,0x53,0x53,0xf7,0xb1,0xb1,0xb1,0x3e,0xff,0xff,0xff,0x14, + 0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x97,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x25,0x25,0x25,0xff,0x6a,0x6a,0x86,0xff,0xa7,0xa7,0xc0,0xff,0x5e,0x5e,0x5f,0xff, + 0x6f,0x6f,0x6f,0xff,0x82,0x82,0x82,0xff,0xb0,0xc4,0xb0,0xff,0xcc,0xd5,0xcc,0xff, + 0xb9,0xb9,0xb9,0xff,0xcc,0xcc,0xcc,0xff,0xdd,0xdd,0xdd,0xff,0xf1,0xf0,0xf0,0xff, + 0xfe,0xfb,0xfb,0xff,0xe6,0xe5,0xe5,0xff,0xd2,0xd2,0xd2,0xff,0xc0,0xc0,0xc0,0xff, + 0xae,0xae,0xae,0xff,0x9b,0x9b,0x9b,0xff,0x88,0x88,0x88,0xff,0x76,0x76,0x76,0xff, + 0x64,0x64,0x64,0xff,0x52,0x52,0x52,0xff,0x52,0x52,0x52,0xa8,0xff,0xff,0xff,0x14, + 0x1a,0x1a,0x1a,0x07,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x27,0x27,0x2f,0xff,0x9a,0x9a,0xe3,0xff,0xca,0xca,0xff,0xff,0x84,0x84,0x8f,0xff, + 0x6c,0x6c,0x6c,0xff,0x7f,0x8a,0x7f,0xff,0xc1,0xf6,0xc1,0xff,0xe2,0xfe,0xe2,0xff, + 0xc0,0xc3,0xc0,0xff,0xc2,0xc2,0xc2,0xff,0xd0,0xd0,0xd0,0xff,0xf2,0xe8,0xe8,0xff, + 0xff,0xf4,0xf4,0xff,0xee,0xe8,0xe8,0xff,0xc8,0xc8,0xc8,0xff,0xb8,0xb8,0xb8,0xff, + 0xa8,0xa8,0xa8,0xff,0x96,0x96,0x96,0xff,0x85,0x85,0x85,0xff,0x73,0x73,0x73,0xff, + 0x61,0x61,0x61,0xff,0x4e,0x4e,0x4e,0xff,0x3e,0x3e,0x3e,0xf4,0xbf,0xbf,0xbf,0x18, + 0x1a,0x1a,0x1a,0x49,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x3e,0x3e,0x7a,0xff,0x9b,0x9b,0xff,0xff,0xbb,0xbb,0xff,0xff,0xc2,0xc2,0xe5,0xff, + 0x6f,0x6f,0x72,0xff,0x7e,0xb6,0x7e,0xff,0xb4,0xff,0xb4,0xff,0xd3,0xff,0xd3,0xff, + 0xda,0xe8,0xda,0xff,0xb5,0xb5,0xb5,0xff,0xce,0xc4,0xc4,0xff,0xff,0xe3,0xe3,0xff, + 0xff,0xe9,0xe9,0xff,0xff,0xed,0xed,0xff,0xcb,0xc6,0xc6,0xff,0xab,0xab,0xab,0xff, + 0x9d,0x9d,0x9d,0xff,0x8d,0x8d,0x8d,0xff,0x7d,0x7d,0x7d,0xff,0x6c,0x6c,0x6c,0xff, + 0x5b,0x5b,0x5b,0xff,0x49,0x49,0x49,0xff,0x37,0x37,0x37,0xff,0x3b,0x3b,0x3b,0x51, + 0x1a,0x1a,0x1a,0x98,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x2a,0xff, + 0x5a,0x5a,0xe5,0xff,0x88,0x88,0xff,0xff,0xaa,0xaa,0xff,0xff,0xc7,0xc7,0xff,0xff, + 0x9b,0xa1,0xac,0xff,0x73,0xf5,0x73,0xff,0x9e,0xff,0x9e,0xff,0xc0,0xff,0xc0,0xff, + 0xdd,0xff,0xdd,0xff,0xc0,0xc6,0xc0,0xff,0xe4,0xbc,0xbc,0xff,0xff,0xd2,0xd2,0xff, + 0xff,0xda,0xda,0xff,0xff,0xe1,0xe1,0xff,0xee,0xdb,0xdb,0xff,0xa0,0x9e,0x9e,0xff, + 0x8f,0x8f,0x8f,0xff,0x81,0x81,0x81,0xff,0x72,0x72,0x72,0xff,0x62,0x62,0x62,0xff, + 0x52,0x52,0x52,0xff,0x41,0x41,0x41,0xff,0x30,0x30,0x30,0xff,0x1f,0x1f,0x1f,0x99, + 0x1a,0x1a,0x1a,0xc1,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x22,0x22,0x7d,0xff, + 0x53,0x53,0xff,0xff,0x72,0x72,0xff,0xff,0x96,0x96,0xff,0xff,0xb7,0xb7,0xff,0xff, + 0xd0,0xd0,0xfc,0xff,0x74,0xd2,0x7c,0xff,0x84,0xff,0x84,0xff,0xaa,0xff,0xaa,0xff, + 0xca,0xff,0xca,0xff,0xde,0xf5,0xdd,0xff,0xec,0xb4,0xb2,0xff,0xff,0xbe,0xbe,0xff, + 0xff,0xc8,0xc8,0xff,0xff,0xd1,0xd1,0xff,0xff,0xda,0xda,0xff,0xbe,0xb1,0xb1,0xff, + 0x7f,0x7f,0x7f,0xff,0x72,0x72,0x72,0xff,0x65,0x65,0x65,0xff,0x56,0x56,0x56,0xff, + 0x47,0x47,0x47,0xff,0x37,0x37,0x37,0xff,0x26,0x26,0x26,0xff,0x1a,0x1a,0x1a,0xc1, + 0x1a,0x1a,0x1a,0xda,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x15,0x15,0x2c,0xff,0x24,0x24,0xe9,0xff, + 0x42,0x42,0xff,0xff,0x5f,0x5f,0xff,0xff,0x81,0x81,0xff,0xff,0xa3,0xa3,0xff,0xff, + 0xc1,0xc1,0xff,0xff,0xb1,0xc6,0xcb,0xff,0x67,0xf1,0x68,0xff,0x8e,0xff,0x8e,0xff, + 0xb2,0xff,0xb2,0xff,0xd1,0xff,0xd1,0xff,0xda,0xd0,0xc3,0xff,0xfc,0xa4,0xa4,0xff, + 0xff,0xb3,0xb3,0xff,0xff,0xbe,0xbe,0xff,0xff,0xc9,0xc9,0xff,0xfa,0xd2,0xd2,0xff, + 0x82,0x7d,0x7d,0xff,0x62,0x62,0x62,0xff,0x55,0x55,0x55,0xff,0x48,0x48,0x48,0xff, + 0x3a,0x3a,0x3a,0xff,0x2b,0x2b,0x2b,0xff,0x1b,0x1b,0x1b,0xff,0x1a,0x1a,0x1a,0xda, + 0x1a,0x1a,0x1a,0xf3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x08,0x08,0x82,0xff,0x16,0x16,0xff,0xff, + 0x32,0x32,0xff,0xff,0x4e,0x4e,0xff,0xff,0x6a,0x6a,0xff,0xff,0x8c,0x8c,0xff,0xff, + 0xad,0xad,0xff,0xff,0xc9,0xc9,0xff,0xff,0x7c,0xc3,0x8a,0xff,0x6e,0xff,0x6e,0xff, + 0x96,0xff,0x96,0xff,0xba,0xff,0xba,0xff,0xda,0xff,0xda,0xff,0xd8,0xa2,0x9b,0xff, + 0xff,0x99,0x99,0xff,0xff,0xa7,0xa7,0xff,0xff,0xb5,0xb5,0xff,0xff,0xc2,0xc2,0xff, + 0xc7,0xa7,0xa7,0xff,0x52,0x52,0x52,0xff,0x45,0x45,0x45,0xff,0x39,0x39,0x39,0xff, + 0x2c,0x2c,0x2c,0xff,0x1c,0x1c,0x1c,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf3, + 0x1a,0x1a,0x1a,0xf3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x13,0x13,0x2e,0xff,0x01,0x01,0xee,0xff,0x05,0x05,0xff,0xff, + 0x21,0x21,0xff,0xff,0x3d,0x3d,0xff,0xff,0x59,0x59,0xff,0xff,0x75,0x75,0xff,0xff, + 0x96,0x96,0xff,0xff,0xb6,0xb6,0xff,0xff,0xc1,0xc6,0xea,0xff,0x57,0xd9,0x5c,0xff, + 0x75,0xff,0x75,0xff,0x9d,0xff,0x9d,0xff,0xc2,0xff,0xc2,0xff,0xd5,0xde,0xc9,0xff, + 0xec,0x7f,0x7d,0xff,0xff,0x8d,0x8d,0xff,0xff,0x9d,0x9d,0xff,0xff,0xac,0xac,0xff, + 0xff,0xbc,0xbc,0xff,0x7b,0x6a,0x6a,0xff,0x34,0x34,0x34,0xff,0x28,0x28,0x28,0xff, + 0x1b,0x1b,0x1b,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf3, + 0x1a,0x1a,0x1a,0xda,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x08,0x08,0x87,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff, + 0x10,0x10,0xff,0xff,0x2d,0x2d,0xff,0xff,0x49,0x49,0xff,0xff,0x65,0x65,0xff,0xff, + 0x81,0x81,0xff,0xff,0x9e,0x9e,0xff,0xff,0xbd,0xbd,0xff,0xff,0x88,0xb6,0xa1,0xff, + 0x4d,0xfc,0x4d,0xff,0x7c,0xff,0x7c,0xff,0xa5,0xff,0xa5,0xff,0xcc,0xff,0xcc,0xff, + 0xc6,0x9d,0x90,0xff,0xff,0x70,0x70,0xff,0xff,0x82,0x82,0xff,0xff,0x93,0x93,0xff, + 0xff,0xa5,0xa5,0xff,0xe0,0xa3,0xa3,0xff,0x2e,0x2a,0x2a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xda, + 0x1a,0x1a,0x1a,0xc1,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x13,0x13,0x32,0xff,0x00,0x00,0xf0,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff, + 0x00,0x00,0xff,0xff,0x1c,0x1c,0xff,0xff,0x38,0x38,0xff,0xff,0x54,0x54,0xff,0xff, + 0x70,0x70,0xff,0xff,0x8d,0x8d,0xff,0xff,0xa9,0xa9,0xff,0xff,0xc4,0xc4,0xfe,0xff, + 0x4c,0xbc,0x59,0xff,0x55,0xff,0x55,0xff,0x83,0xff,0x83,0xff,0xaf,0xff,0xaf,0xff, + 0xd2,0xf5,0xd1,0xff,0xd1,0x61,0x5d,0xff,0xff,0x63,0x63,0xff,0xff,0x75,0x75,0xff, + 0xff,0x8a,0x8a,0xff,0xff,0xa0,0xa0,0xff,0x8c,0x67,0x67,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xc1, + 0x1a,0x1a,0x1a,0x98,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x08,0x08,0x8c,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff, + 0x00,0x00,0xff,0xff,0x0b,0x0b,0xff,0xff,0x27,0x27,0xff,0xff,0x44,0x44,0xff,0xff, + 0x60,0x60,0xff,0xff,0x7c,0x7c,0xff,0xff,0x98,0x98,0xff,0xff,0xb4,0xb4,0xff,0xff, + 0xa5,0xb8,0xc9,0xff,0x34,0xe3,0x37,0xff,0x60,0xff,0x60,0xff,0x8e,0xff,0x8e,0xff, + 0xbd,0xff,0xbd,0xff,0xbc,0xb0,0x98,0xff,0xf5,0x44,0x44,0xff,0xff,0x5e,0x5e,0xff, + 0xff,0x76,0x76,0xff,0xff,0x8e,0x8e,0xff,0xfd,0xa5,0xa5,0xff,0x46,0x38,0x38,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0x98, + 0x1a,0x1a,0x1a,0x49,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x12,0x12,0x34,0xff, + 0x00,0x00,0xdd,0xff,0x00,0x00,0xe9,0xff,0x00,0x00,0xe9,0xff,0x00,0x00,0xea,0xff, + 0x00,0x00,0xea,0xff,0x00,0x00,0xeb,0xff,0x15,0x15,0xeb,0xff,0x2f,0x2f,0xec,0xff, + 0x49,0x49,0xed,0xff,0x63,0x63,0xed,0xff,0x7e,0x7e,0xee,0xff,0x98,0x98,0xee,0xff, + 0xb4,0xb4,0xef,0xff,0x5f,0xa4,0x72,0xff,0x45,0xfd,0x45,0xff,0x75,0xfe,0x75,0xff, + 0xa3,0xfe,0xa3,0xff,0xd2,0xff,0xd2,0xff,0xa9,0x67,0x5b,0xff,0xd5,0x40,0x40,0xff, + 0xd5,0x54,0x54,0xff,0xd7,0x69,0x69,0xff,0xd9,0x7e,0x7e,0xff,0x9d,0x6c,0x6c,0xff, + 0x1d,0x1c,0x1c,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0x49, + 0x1a,0x1a,0x1a,0x07,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0xff,0x19,0x19,0x19,0xff, + 0x18,0x18,0x18,0xff,0x17,0x17,0x18,0xff,0x17,0x17,0x18,0xff,0x17,0x17,0x19,0xff, + 0x14,0x1a,0x16,0xff,0x12,0x1e,0x15,0xff,0x12,0x1f,0x15,0xff,0x13,0x1e,0x16,0xff, + 0x13,0x20,0x16,0xff,0x13,0x1f,0x15,0xff,0x14,0x21,0x16,0xff,0x14,0x22,0x16,0xff, + 0x14,0x22,0x16,0xff,0x14,0x22,0x15,0xff,0x16,0x24,0x16,0xff,0x1a,0x25,0x1a,0xff, + 0x1d,0x25,0x1d,0xff,0x20,0x25,0x20,0xff,0x1f,0x21,0x1f,0xff,0x19,0x19,0x19,0xff, + 0x19,0x19,0x19,0xff,0x19,0x19,0x19,0xff,0x18,0x18,0x18,0xff,0x18,0x18,0x18,0xff, + 0x19,0x19,0x19,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0x07, + 0x00,0x00,0x6e,0x00,0x1a,0x1a,0x1a,0x97,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0x97,0xd3,0xd3,0xd3,0x00, + 0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x19,0x1a,0x1a,0x1a,0xf5,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf5,0x1a,0x1a,0x1a,0x19,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x1a,0x1a,0x1a,0x84,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0x84,0xd3,0xd3,0xd3,0x00,0x98,0x88,0x88,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x1a,0x1a,0x1a,0x08,0x1a,0x1a,0x1a,0xc8, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xc8,0x1a,0x1a,0x1a,0x08,0xa4,0x6d,0x6d,0x00,0x73,0x58,0x58,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x18, + 0x1a,0x1a,0x1a,0xe3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xe3, + 0x1a,0x1a,0x1a,0x18,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x1a,0x1a,0x1a,0x2d,0x1a,0x1a,0x1a,0xe3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xe3,0x1a,0x1a,0x1a,0x2d, + 0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x18,0x1a,0x1a,0x1a,0xc8,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xc8,0x1a,0x1a,0x1a,0x18,0xff,0xff,0xff,0x00, + 0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x08,0x1a,0x1a,0x1a,0x84, + 0x1a,0x1a,0x1a,0xf5,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf5, + 0x1a,0x1a,0x1a,0x84,0x1a,0x1a,0x1a,0x08,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00, + 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x1a,0x1a,0x1a,0x19,0x1a,0x1a,0x1a,0x97,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0x97,0x1a,0x1a,0x1a,0x19, + 0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x07,0x1a,0x1a,0x1a,0x49, + 0x1a,0x1a,0x1a,0x98,0x1a,0x1a,0x1a,0xc1,0x1a,0x1a,0x1a,0xda,0x1a,0x1a,0x1a,0xf3, + 0x1a,0x1a,0x1a,0xf3,0x1a,0x1a,0x1a,0xda,0x1a,0x1a,0x1a,0xc1,0x1a,0x1a,0x1a,0x98, + 0x1a,0x1a,0x1a,0x49,0x1a,0x1a,0x1a,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, - {0x00,0x07,0xc0,0x00,0x00,0x1f,0xf0,0x00,0x00,0x7f,0xfc,0x00, - 0x00,0xff,0xfe,0x00,0x03,0xff,0xff,0x80,0x0f,0xff,0xff,0xe0, - 0x3f,0xff,0xff,0xf8,0x3f,0xff,0xff,0xfc,0x3f,0xff,0xff,0xfe, - 0x3f,0xff,0xff,0xfe,0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff, - 0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff, - 0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff, - 0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff, - 0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xfe,0x3f,0xff,0xff,0xfe, - 0x1f,0xff,0xff,0xfe,0x0f,0xff,0xff,0xf8,0x03,0xff,0xff,0xe0, - 0x01,0xff,0xff,0xc0,0x00,0x7f,0xff,0x00,0x00,0x1f,0xfc,0x00, - 0x00,0x07,0xf8,0x00,0x00,0x03,0xe0,0x00} + {0x00,0x0f,0xf0,0x00,0x00,0x7f,0xfe,0x00,0x01,0xff,0xff,0x80, + 0x03,0xff,0xff,0xc0,0x07,0xff,0xff,0xe0,0x0f,0xff,0xff,0xf0, + 0x1f,0xff,0xff,0xf8,0x3f,0xff,0xff,0xfc,0x3f,0xff,0xff,0xfc, + 0x7f,0xff,0xff,0xfe,0x7f,0xff,0xff,0xfe,0x7f,0xff,0xff,0xfe, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xfe, + 0x7f,0xff,0xff,0xfe,0x7f,0xff,0xff,0xfe,0x3f,0xff,0xff,0xfc, + 0x3f,0xff,0xff,0xfc,0x1f,0xff,0xff,0xf8,0x0f,0xff,0xff,0xf0, + 0x07,0xff,0xff,0xe0,0x03,0xff,0xff,0xc0,0x01,0xff,0xff,0x80, + 0x00,0x7f,0xfe,0x00,0x00,0x0f,0xf0,0x00} }; diff --git a/tools/icon_to_c.c b/tools/icon_to_c.c index 0d37ca9..6fd96fd 100644 --- a/tools/icon_to_c.c +++ b/tools/icon_to_c.c @@ -33,6 +33,8 @@ #define ERROR(str) printf("%s: error: %s\n", prog_name, str); exit(-1); +#define ALIGN(a, b) (((a) + ((b) - 1)) & ~((b) - 1)) + static char *prog_name = NULL; static size_t read_input(const char *file_name, uint8_t** out_buf) @@ -153,11 +155,20 @@ static Icon *init_icon(uint8_t *buf, size_t buf_size) if (bitmap->header_size != 40) { ERROR("invalid bitmap header"); } + + if (ico->plans == 0) { // 0 and 1 are equivalent + ico->plans = 1; + } + if (bitmap->width != ico->width || bitmap->height != ico->height * 2 || - bitmap->plans != ico->plans || bitmap->bpp != ico->bpp || !bitmap->image_size) { + bitmap->plans != ico->plans || bitmap->bpp != ico->bpp) { ERROR("invalid bitmap header"); } + if (!bitmap->image_size) { + bitmap->image_size = ALIGN(bitmap->bpp * bitmap->width, 32) / 8 * bitmap->height; + } + if (bitmap->compression || bitmap->horizontal_resolution || bitmap->vertical_resolution || bitmap->num_colors || bitmap->important_colors) { ERROR("invalid bitmap header"); |
From: Yaniv K. <yk...@re...> - 2010-01-04 19:13:18
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: master commit c362f8473b606912f538d670af2d0560f702a0ee Author: Yaniv Kamay <yk...@re...> Date: Mon Jan 4 21:13:03 2010 +0200 client: use spice icon instead-of solidice icon diff --git a/client/windows/redc.rc b/client/windows/redc.rc index d2908b3..0155d2e 100644 --- a/client/windows/redc.rc +++ b/client/windows/redc.rc @@ -101,7 +101,7 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -RED_ICON_RES_ID ICON "solideice.ico" +RED_ICON_RES_ID ICON "spice.ico" #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/client/windows/redc.vcproj b/client/windows/redc.vcproj index ce061ab..deff391 100644 --- a/client/windows/redc.vcproj +++ b/client/windows/redc.vcproj @@ -631,7 +631,7 @@ > </File> <File - RelativePath=".\solideice.ico" + RelativePath=".\spice.ico" > </File> <File diff --git a/client/windows/solideice.ico b/client/windows/solideice.ico deleted file mode 100644 index 9187fb7..0000000 Binary files a/client/windows/solideice.ico and /dev/null differ diff --git a/client/windows/spice.ico b/client/windows/spice.ico new file mode 100644 index 0000000..ae9200c Binary files /dev/null and b/client/windows/spice.ico differ diff --git a/client/x11/images/red_icon.c b/client/x11/images/red_icon.c index 824eab8..ce1a7d4 100644 --- a/client/x11/images/red_icon.c +++ b/client/x11/images/red_icon.c @@ -1,190 +1,275 @@ static const struct { - uint32_t width; - uint32_t height; - uint8_t pixmap[4096]; - uint8_t mask[128]; + uint32_t width; + uint32_t height; + uint8_t pixmap[4096]; + uint8_t mask[128]; } _red_icon = { 32, 32, { - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0xf9,0xf9,0xf9,0x2e,0xfc,0xfc,0xfc,0xa7,0xff,0xfb,0xef,0xf8,0xf5,0xf5,0xf5,0xae,0xce,0xce,0xce,0x3e, - 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0xf5,0xf5,0xf5,0x19,0xfd,0xfd,0xfd,0x87,0xfe,0xfa,0xee,0xea,0xff,0xe3,0x9a,0xff,0xff,0xcd,0x5b,0xff, - 0xff,0xe3,0xa8,0xff,0xfc,0xf7,0xea,0xef,0xea,0xea,0xea,0x95,0xb7,0xb7,0xb7,0x27,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x0d,0xfd,0xfd,0xfd,0x69,0xfe,0xfc,0xf6,0xd7,0xff,0xee,0xbc,0xff,0xff,0xd9,0x6d,0xff, - 0xff,0xcb,0x42,0xff,0xff,0xc2,0x3d,0xff,0xff,0xc5,0x55,0xff,0xff,0xd3,0x73,0xff,0xff,0xec,0xbf,0xff,0xf8,0xf5,0xef,0xdf, - 0xe6,0xe6,0xe6,0x78,0xa6,0xa6,0xa6,0x17,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0xfc,0x4b,0xfc,0xfc,0xfc,0xc0,0xff,0xf6,0xd6,0xff,0xff,0xe4,0x89,0xff, - 0xff,0xd6,0x58,0xff,0xff,0xd1,0x53,0xff,0xff,0xce,0x4f,0xff,0xff,0xc2,0x43,0xff,0xff,0xc0,0x55,0xff,0xff,0xc5,0x55,0xff, - 0xff,0xc9,0x59,0xff,0xff,0xd9,0x85,0xff,0xff,0xf1,0xd0,0xff,0xf5,0xf5,0xf5,0xc9,0xdd,0xdd,0xdd,0x5a,0x00,0x00,0x00,0x08, - 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0xfa,0xfa,0x33,0xfc,0xfc,0xfc,0xa4,0xff,0xfb,0xe6,0xfa,0xff,0xee,0xa5,0xff, - 0xff,0xe1,0x6e,0xff,0xff,0xda,0x5e,0xff,0xff,0xd7,0x5d,0xff,0xff,0xd2,0x59,0xff,0xff,0xce,0x4e,0xff,0xff,0xbe,0x3f,0xff, - 0xff,0xb7,0x4b,0xff,0xff,0xbe,0x52,0xff,0xff,0xc2,0x56,0xff,0xff,0xc6,0x54,0xff,0xff,0xce,0x62,0xff,0xff,0xe0,0x99,0xff, - 0xfe,0xf5,0xe0,0xf9,0xf1,0xf1,0xf1,0xb1,0xcf,0xcf,0xcf,0x40,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0xf5,0xf5,0x1a,0xfd,0xfd,0xfd,0x85,0xfe,0xfd,0xf3,0xea,0xff,0xf6,0xbe,0xff, - 0xff,0xec,0x85,0xff,0xff,0xe4,0x6e,0xff,0xff,0xe0,0x6b,0xff,0xff,0xdc,0x67,0xff,0xff,0xd6,0x5e,0xff,0xff,0xd1,0x57,0xff, - 0xff,0xcd,0x4d,0xff,0xff,0xbb,0x39,0xff,0xff,0xaf,0x40,0xff,0xff,0xb6,0x49,0xff,0xff,0xbb,0x4f,0xff,0xff,0xc1,0x55,0xff, - 0xff,0xc5,0x58,0xff,0xff,0xc9,0x58,0xff,0xff,0xd3,0x6f,0xff,0xff,0xe7,0xac,0xff,0xfc,0xf8,0xeb,0xf0,0xeb,0xeb,0xeb,0x98, - 0xbc,0xbc,0xbc,0x2a,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x0e,0xfd,0xfd,0xfd,0x68,0xfe,0xfe,0xf8,0xdd,0xff,0xfc,0xd1,0xff, - 0xff,0xf6,0x9b,0xff,0xff,0xee,0x7e,0xff,0xff,0xe9,0x78,0xff,0xff,0xe5,0x75,0xff,0xff,0xdf,0x6d,0xff,0xff,0xdb,0x65,0xff, - 0xff,0xd6,0x5d,0xff,0xff,0xd1,0x55,0xff,0xff,0xcc,0x47,0xff,0xff,0xb6,0x31,0xff,0xff,0xa2,0x2e,0xff,0xff,0xac,0x3c,0xff, - 0xff,0xb4,0x44,0xff,0xff,0xb9,0x4c,0xff,0xff,0xbf,0x52,0xff,0xff,0xc3,0x58,0xff,0xff,0xc8,0x59,0xff,0xff,0xcc,0x5b,0xff, - 0xff,0xd8,0x7b,0xff,0xff,0xec,0xc0,0xff,0xf9,0xf7,0xf1,0xe1,0xe3,0xe3,0xe3,0x77,0xaa,0xaa,0xaa,0x18,0x00,0x00,0x00,0x03, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,0xfe,0xb6,0xff,0xff,0xf0,0xff, - 0xff,0xfe,0xb0,0xff,0xff,0xf8,0x8b,0xff,0xff,0xf3,0x87,0xff,0xff,0xee,0x83,0xff,0xff,0xe9,0x7c,0xff,0xff,0xe4,0x73,0xff, - 0xff,0xde,0x6c,0xff,0xff,0xda,0x63,0xff,0xff,0xd4,0x56,0xff,0xff,0xce,0x4d,0xff,0xff,0xd8,0x79,0xff,0xff,0xe8,0xbd,0xff, - 0xff,0xca,0x8f,0xff,0xff,0xa9,0x3d,0xff,0xff,0xa6,0x30,0xff,0xff,0xaf,0x3f,0xff,0xff,0xb7,0x48,0xff,0xff,0xbb,0x4f,0xff, - 0xff,0xc1,0x55,0xff,0xff,0xc6,0x5b,0xff,0xff,0xca,0x5c,0xff,0xff,0xcd,0x5c,0xff,0xff,0xdd,0x87,0xff,0xff,0xf6,0xe1,0xff, - 0xf0,0xf0,0xf0,0xb9,0xe1,0xe1,0xe1,0x5f,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0xfb,0xed,0xfe,0xf9,0xf7,0xd9,0xf9,0xff,0xff,0xff,0xd3,0xff,0xff,0xfe,0xa2,0xff,0xff,0xf3,0x84,0xff,0xff,0xed,0x7f,0xff, - 0xff,0xe8,0x7a,0xff,0xff,0xe3,0x73,0xff,0xff,0xdd,0x67,0xff,0xff,0xd7,0x5b,0xff,0xff,0xda,0x73,0xff,0xff,0xeb,0xbb,0xff, - 0xff,0xfe,0xed,0xff,0xff,0xff,0xe4,0xff,0xff,0xff,0xeb,0xff,0xff,0xec,0xd4,0xff,0xff,0xc1,0x77,0xff,0xff,0xa8,0x37,0xff, - 0xff,0xaa,0x36,0xff,0xff,0xb3,0x44,0xff,0xff,0xba,0x4c,0xff,0xff,0xbd,0x4e,0xff,0xff,0xc0,0x4e,0xff,0xff,0xce,0x6e,0xff, - 0xff,0xe9,0xb7,0xff,0xea,0xf9,0xed,0xff,0xf3,0xf9,0xf7,0xee,0xdf,0xdf,0xdf,0x9e,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x06, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0xcc,0xfa,0xf1,0xce,0x2f,0xef,0xff,0xdf,0x7e,0xfa,0xff,0xfa,0xea,0xf3,0xff, - 0xff,0xff,0xc3,0xff,0xff,0xf4,0x8a,0xff,0xff,0xe6,0x71,0xff,0xff,0xe0,0x67,0xff,0xff,0xdf,0x72,0xff,0xff,0xea,0xaf,0xff, - 0xff,0xfa,0xe9,0xff,0xff,0xff,0xe6,0xff,0xff,0xff,0xcb,0xff,0xff,0xff,0xc5,0xff,0xff,0xff,0xc6,0xff,0xff,0xff,0xd9,0xff, - 0xff,0xff,0xf0,0xff,0xff,0xe1,0xbf,0xff,0xff,0xb8,0x60,0xff,0xff,0xa7,0x33,0xff,0xff,0xaa,0x33,0xff,0xff,0xb9,0x4f,0xff, - 0xff,0xda,0x9f,0xff,0xf6,0xf6,0xe7,0xff,0xb6,0xf8,0xe7,0xff,0x72,0xed,0xc0,0xff,0xe0,0xf3,0xeb,0xe9,0xd2,0xd2,0xd2,0xa0, - 0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0xd2,0xfa,0xf1,0xc4,0x14,0xeb,0xff, - 0xb9,0x00,0xe7,0xff,0xc5,0x2e,0xef,0xff,0xe5,0xa2,0xfc,0xff,0xfc,0xf4,0xea,0xff,0xff,0xfa,0xa8,0xff,0xff,0xed,0xa0,0xff, - 0xff,0xf9,0xde,0xff,0xff,0xff,0xec,0xff,0xff,0xff,0xd1,0xff,0xff,0xff,0xc5,0xff,0xff,0xff,0xc8,0xff,0xff,0xff,0xc9,0xff, - 0xff,0xff,0xc9,0xff,0xff,0xff,0xc5,0xff,0xff,0xff,0xc9,0xff,0xff,0xff,0xe4,0xff,0xff,0xf9,0xe8,0xff,0xff,0xd5,0xa2,0xff, - 0xff,0xc7,0x7f,0xff,0xfd,0xef,0xda,0xff,0xca,0xfb,0xf1,0xff,0x7d,0xf0,0xca,0xff,0x55,0xe9,0xb1,0xff,0x5a,0xe9,0xb4,0xff, - 0xe2,0xf3,0xed,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0xf2,0xd2,0xfa,0xf1,0xc2,0x1b,0xe9,0xff,0xb9,0x00,0xe6,0xff,0xb5,0x00,0xe5,0xff,0xb5,0x00,0xe5,0xff,0xc7,0x48,0xf1,0xff, - 0xeb,0xc1,0xf8,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xee,0xff,0xff,0xff,0xc6,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xc8,0xff, - 0xff,0xff,0xca,0xff,0xff,0xff,0xc9,0xff,0xff,0xff,0xc9,0xff,0xff,0xff,0xc9,0xff,0xff,0xff,0xc6,0xff,0xff,0xff,0xc2,0xff, - 0xff,0xff,0xdc,0xff,0xff,0xff,0xff,0xff,0xe8,0xfc,0xf8,0xff,0x93,0xf4,0xd6,0xff,0x5b,0xe9,0xb5,0xff,0x58,0xe9,0xb3,0xff, - 0x60,0xea,0xb7,0xff,0x61,0xea,0xb7,0xff,0xe2,0xf3,0xed,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0xd2,0xfa,0xf1,0xbd,0x1b,0xe7,0xff,0xb3,0x00,0xe4,0xff,0xb5,0x07,0xe4,0xff, - 0xb2,0x04,0xe3,0xff,0xa7,0x00,0xe0,0xff,0xbe,0x3c,0xea,0xff,0xfe,0xfb,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xf1,0xff, - 0xff,0xff,0xd7,0xff,0xff,0xfe,0xc4,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0xca,0xff,0xff,0xff,0xc9,0xff,0xff,0xff,0xc5,0xff, - 0xff,0xff,0xcf,0xff,0xff,0xff,0xe9,0xff,0xff,0xfd,0xec,0xff,0xff,0xfc,0xdd,0xff,0xbd,0xf7,0xe2,0xff,0x51,0xe7,0xaf,0xff, - 0x5d,0xe9,0xb5,0xff,0x62,0xea,0xb7,0xff,0x60,0xea,0xb7,0xff,0x61,0xea,0xb7,0xff,0xe2,0xf3,0xed,0xe9,0xd1,0xd1,0xd1,0xa1, - 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf1,0xd3,0xf9,0xf1,0xb9,0x1c,0xe5,0xff, - 0xae,0x00,0xe2,0xff,0xb0,0x07,0xe2,0xff,0xae,0x07,0xe2,0xff,0xa7,0x00,0xe0,0xff,0xba,0x3b,0xe6,0xff,0xfd,0xf9,0xfe,0xff, - 0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xfc,0xff,0xff,0xff,0xeb,0xff,0xff,0xfe,0xc9,0xff,0xff,0xfd,0xba,0xff, - 0xff,0xfd,0xc2,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xf6,0xff,0xff,0xfc,0xea,0xff,0xff,0xf9,0xc5,0xff,0xff,0xfa,0xc2,0xff, - 0xbd,0xf5,0xe0,0xff,0x53,0xe7,0xae,0xff,0x5d,0xe8,0xb4,0xff,0x61,0xea,0xb7,0xff,0x60,0xea,0xb7,0xff,0x61,0xea,0xb7,0xff, - 0xe2,0xf3,0xed,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0xf0,0xd3,0xf9,0xf1,0xb4,0x1c,0xe3,0xff,0xaa,0x00,0xe0,0xff,0xab,0x07,0xe0,0xff,0xa9,0x07,0xe0,0xff,0xa2,0x00,0xdd,0xff, - 0xb6,0x3d,0xe4,0xff,0xfd,0xfa,0xff,0xff,0xff,0xff,0xfc,0xff,0xff,0xfe,0xf6,0xff,0xff,0xfd,0xf0,0xff,0xff,0xfd,0xf2,0xff, - 0xff,0xfe,0xf2,0xff,0xff,0xfe,0xdf,0xff,0xff,0xfe,0xec,0xff,0xff,0xfd,0xfa,0xff,0xff,0xfb,0xe6,0xff,0xff,0xf9,0xcf,0xff, - 0xff,0xf8,0xbc,0xff,0xff,0xf9,0xc1,0xff,0xba,0xf5,0xde,0xff,0x49,0xe3,0xa5,0xff,0x55,0xe6,0xac,0xff,0x5d,0xe9,0xb3,0xff, - 0x5f,0xea,0xb6,0xff,0x61,0xea,0xb7,0xff,0xe2,0xf3,0xed,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0xd3,0xf8,0xf1,0xb0,0x1d,0xe2,0xff,0xa5,0x01,0xde,0xff,0xa6,0x08,0xde,0xff, - 0xa4,0x08,0xde,0xff,0x9e,0x00,0xdb,0xff,0xb3,0x3d,0xe3,0xff,0xfd,0xfa,0xfb,0xff,0xff,0xff,0xf1,0xff,0xff,0xfc,0xe9,0xff, - 0xff,0xfc,0xe2,0xff,0xff,0xfb,0xd9,0xff,0xff,0xfa,0xd7,0xff,0xff,0xfe,0xf5,0xff,0xff,0xff,0xfe,0xff,0xff,0xfc,0xeb,0xff, - 0xff,0xfb,0xda,0xff,0xff,0xf9,0xcb,0xff,0xff,0xf7,0xb7,0xff,0xff,0xf9,0xbd,0xff,0xb8,0xf4,0xdb,0xff,0x41,0xe1,0x9e,0xff, - 0x4c,0xe4,0xa5,0xff,0x54,0xe7,0xab,0xff,0x5a,0xe8,0xb1,0xff,0x5f,0xe9,0xb6,0xff,0xe3,0xf3,0xed,0xe9,0xd1,0xd1,0xd1,0xa1, - 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xd3,0xf8,0xf1,0xac,0x1d,0xe0,0xff, - 0xa0,0x01,0xdc,0xff,0xa1,0x09,0xdc,0xff,0xa0,0x09,0xdc,0xff,0x99,0x00,0xd9,0xff,0xaf,0x3d,0xe3,0xff,0xfd,0xfa,0xf6,0xff, - 0xff,0xff,0xe4,0xff,0xff,0xfb,0xdd,0xff,0xff,0xfb,0xd5,0xff,0xff,0xfa,0xce,0xff,0xff,0xf9,0xc5,0xff,0xff,0xfc,0xe8,0xff, - 0xff,0xfe,0xfa,0xff,0xff,0xfc,0xe6,0xff,0xff,0xfa,0xd5,0xff,0xff,0xf8,0xc6,0xff,0xff,0xf6,0xb2,0xff,0xff,0xf9,0xb9,0xff, - 0xb4,0xf3,0xd8,0xff,0x39,0xdf,0x97,0xff,0x43,0xe2,0x9e,0xff,0x4b,0xe4,0xa4,0xff,0x50,0xe5,0xa9,0xff,0x57,0xe7,0xae,0xff, - 0xe2,0xf3,0xec,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0xed,0xd3,0xf8,0xf1,0xa7,0x1e,0xde,0xff,0x9b,0x02,0xda,0xff,0x9c,0x09,0xda,0xff,0x9b,0x0a,0xda,0xff,0x93,0x00,0xd7,0xff, - 0xaa,0x3d,0xe2,0xff,0xfd,0xfb,0xf0,0xff,0xff,0xfe,0xd7,0xff,0xff,0xfa,0xd0,0xff,0xff,0xf9,0xca,0xff,0xff,0xf8,0xc1,0xff, - 0xff,0xf7,0xb9,0xff,0xff,0xfc,0xe3,0xff,0xff,0xfe,0xf6,0xff,0xff,0xfb,0xdf,0xff,0xff,0xfa,0xcf,0xff,0xff,0xf8,0xc0,0xff, - 0xff,0xf6,0xaa,0xff,0xff,0xf8,0xb1,0xff,0xb3,0xf2,0xd7,0xff,0x31,0xdd,0x90,0xff,0x3b,0xde,0x97,0xff,0x43,0xe2,0x9d,0xff, - 0x48,0xe3,0xa1,0xff,0x4f,0xe4,0xa7,0xff,0xe1,0xf3,0xeb,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0xd3,0xf7,0xf1,0xa3,0x1f,0xdc,0xff,0x96,0x03,0xd7,0xff,0x98,0x0a,0xd8,0xff, - 0x95,0x0a,0xd7,0xff,0x8a,0x00,0xd3,0xff,0xa6,0x3d,0xe0,0xff,0xfe,0xfe,0xf4,0xff,0xff,0xff,0xd0,0xff,0xff,0xf8,0xbf,0xff, - 0xff,0xf8,0xbb,0xff,0xff,0xf7,0xb5,0xff,0xff,0xf6,0xad,0xff,0xff,0xfb,0xde,0xff,0xff,0xfd,0xf2,0xff,0xff,0xfa,0xda,0xff, - 0xff,0xf9,0xca,0xff,0xff,0xf6,0xb7,0xff,0xff,0xf5,0xa7,0xff,0xff,0xfb,0xca,0xff,0xae,0xf0,0xd3,0xff,0x26,0xd9,0x85,0xff, - 0x33,0xdd,0x90,0xff,0x3b,0xdf,0x96,0xff,0x40,0xe0,0x9b,0xff,0x47,0xe2,0xa1,0xff,0xe0,0xf2,0xeb,0xe9,0xd1,0xd1,0xd1,0xa1, - 0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0xd4,0xf7,0xf1,0x9f,0x20,0xda,0xff, - 0x91,0x03,0xd5,0xff,0x8e,0x05,0xd4,0xff,0x8e,0x06,0xd4,0xff,0xa3,0x1e,0xdc,0xff,0xc9,0x4c,0xea,0xff,0xe9,0xa6,0xf7,0xff, - 0xfa,0xec,0xf4,0xff,0xff,0xff,0xd3,0xff,0xff,0xfa,0xaf,0xff,0xff,0xf4,0xa2,0xff,0xff,0xf4,0xa0,0xff,0xff,0xfb,0xda,0xff, - 0xff,0xfc,0xf0,0xff,0xff,0xf9,0xd2,0xff,0xff,0xf8,0xc1,0xff,0xff,0xfa,0xc5,0xff,0xfe,0xfc,0xe2,0xff,0xbf,0xf7,0xe4,0xff, - 0x57,0xe5,0xac,0xff,0x23,0xd8,0x83,0xff,0x2b,0xd9,0x86,0xff,0x32,0xdd,0x8e,0xff,0x38,0xde,0x94,0xff,0x3f,0xe0,0x99,0xff, - 0xde,0xf2,0xe9,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0xeb,0xd4,0xf7,0xf1,0x97,0x1d,0xd7,0xff,0x85,0x00,0xd1,0xff,0x9c,0x19,0xda,0xff,0xc7,0x4b,0xea,0xff,0xe2,0x69,0xf4,0xff, - 0xe2,0x67,0xf4,0xff,0xd7,0x55,0xf0,0xff,0xdc,0x70,0xf5,0xff,0xed,0xbb,0xfb,0xff,0xfd,0xf6,0xe7,0xff,0xff,0xff,0xb3,0xff, - 0xff,0xf4,0x8d,0xff,0xff,0xf9,0xd0,0xff,0xff,0xfc,0xea,0xff,0xff,0xf9,0xd2,0xff,0xff,0xfc,0xe4,0xff,0xd8,0xfb,0xec,0xff, - 0x7f,0xf1,0xd1,0xff,0x38,0xe7,0xad,0xff,0x32,0xe6,0xa7,0xff,0x38,0xe4,0xa3,0xff,0x2f,0xdd,0x91,0xff,0x2a,0xd8,0x86,0xff, - 0x2d,0xda,0x88,0xff,0x35,0xdd,0x92,0xff,0xde,0xf2,0xe8,0xe9,0xd1,0xd1,0xd1,0xa1,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x0a, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0xd2,0xf7,0xf8,0x9c,0x22,0xda,0xff,0xbd,0x3d,0xe6,0xff,0xea,0x73,0xf7,0xff, - 0xf1,0x7b,0xfa,0xff,0xea,0x73,0xf6,0xff,0xe3,0x6c,0xf5,0xff,0xe0,0x67,0xf3,0xff,0xdb,0x5c,0xf2,0xff,0xd8,0x58,0xf1,0xff, - 0xdf,0x82,0xf8,0xff,0xf2,0xcd,0xf7,0xff,0xff,0xfb,0xce,0xff,0xff,0xfd,0xdd,0xff,0xff,0xfe,0xf5,0xff,0xe9,0xfd,0xf0,0xff, - 0x9a,0xf5,0xde,0xff,0x4d,0xed,0xbf,0xff,0x37,0xe9,0xb1,0xff,0x3e,0xe9,0xb2,0xff,0x40,0xe9,0xaf,0xff,0x3d,0xe8,0xac,0xff, - 0x3b,0xe7,0xaa,0xff,0x36,0xe2,0x9f,0xff,0x2b,0xdb,0x8c,0xff,0x24,0xd8,0x84,0xff,0xdb,0xf2,0xe8,0xed,0xd4,0xd4,0xd4,0xa5, - 0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xe9,0xf8,0xd7,0xee,0xa1,0xf8,0xff, - 0xfd,0x88,0xfe,0xff,0xfa,0x82,0xfd,0xff,0xf2,0x7d,0xfa,0xff,0xee,0x79,0xf8,0xff,0xeb,0x74,0xf7,0xff,0xe6,0x6f,0xf6,0xff, - 0xe3,0x6b,0xf5,0xff,0xe0,0x65,0xf3,0xff,0xd9,0x58,0xf1,0xff,0xd7,0x5a,0xf2,0xff,0xe6,0x94,0xfb,0xff,0xf9,0xf5,0xfe,0xff, - 0xb5,0xfd,0xea,0xff,0x5e,0xf3,0xcd,0xff,0x3f,0xee,0xbf,0xff,0x41,0xee,0xbc,0xff,0x45,0xed,0xbb,0xff,0x44,0xec,0xb9,0xff, - 0x42,0xeb,0xb5,0xff,0x40,0xea,0xb1,0xff,0x3d,0xe8,0xae,0xff,0x36,0xe7,0xaa,0xff,0x33,0xe5,0xa5,0xff,0x6a,0xe8,0xb3,0xff, - 0xe1,0xec,0xe7,0xdb,0xbf,0xbf,0xbf,0x8c,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0xbb,0xbc,0xbb,0x2a,0xe6,0xe6,0xe4,0xab,0xfd,0xd9,0xfd,0xfd,0xfc,0xa0,0xfe,0xff,0xf8,0x80,0xfc,0xff,0xf4,0x7d,0xfa,0xff, - 0xf2,0x7b,0xf9,0xff,0xed,0x77,0xf8,0xff,0xe9,0x72,0xf7,0xff,0xe6,0x6e,0xf5,0xff,0xe2,0x6a,0xf4,0xff,0xdb,0x5c,0xf2,0xff, - 0xe1,0x62,0xf3,0xff,0xe6,0xe5,0xf9,0xff,0x60,0xfb,0xd2,0xff,0x43,0xf1,0xc7,0xff,0x4c,0xf1,0xc7,0xff,0x4a,0xf0,0xc4,0xff, - 0x49,0xef,0xc0,0xff,0x47,0xee,0xbe,0xff,0x44,0xed,0xba,0xff,0x3d,0xeb,0xb5,0xff,0x36,0xe9,0xaf,0xff,0x5d,0xed,0xbd,0xff, - 0xb7,0xf6,0xe0,0xff,0xd9,0xdb,0xdb,0xc1,0x6b,0x6b,0x6b,0x5f,0x2a,0x2a,0x2a,0x37,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x06, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x14,0xaf,0xb4,0xaf,0x64,0xe9,0xe6,0xe9,0xce, - 0xfe,0xca,0xff,0xff,0xfc,0x97,0xfe,0xff,0xf7,0x7e,0xfc,0xff,0xf3,0x7c,0xfa,0xff,0xef,0x7a,0xf9,0xff,0xec,0x76,0xf7,0xff, - 0xe8,0x71,0xf6,0xff,0xe2,0x67,0xf5,0xff,0xe9,0x6f,0xf6,0xff,0xe5,0xe7,0xf9,0xff,0x66,0xfc,0xd8,0xff,0x4b,0xf4,0xcf,0xff, - 0x4f,0xf3,0xcd,0xff,0x4d,0xf2,0xca,0xff,0x4c,0xf1,0xc6,0xff,0x46,0xef,0xc2,0xff,0x3e,0xee,0xbd,0xff,0x53,0xef,0xc2,0xff, - 0xa3,0xf6,0xdd,0xff,0xe2,0xeb,0xe8,0xdf,0xa5,0x9f,0xa1,0x83,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x17, - 0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04, - 0x00,0x00,0x00,0x0d,0x4e,0x4f,0x4e,0x29,0xc2,0xc7,0xc1,0x8a,0xf4,0xe8,0xf3,0xe6,0xfe,0xbb,0xff,0xff,0xfb,0x8b,0xfd,0xff, - 0xf5,0x7b,0xfb,0xff,0xf3,0x7b,0xf9,0xff,0xef,0x79,0xf8,0xff,0xe9,0x6f,0xf7,0xff,0xef,0x77,0xf8,0xff,0xe7,0xe9,0xf9,0xff, - 0x69,0xfe,0xde,0xff,0x4e,0xf6,0xd5,0xff,0x53,0xf5,0xd3,0xff,0x4d,0xf4,0xcf,0xff,0x44,0xf2,0xc9,0xff,0x50,0xf3,0xca,0xff, - 0x92,0xf7,0xdd,0xff,0xdb,0xf4,0xee,0xf4,0xcb,0xc5,0xc7,0xa8,0x4a,0x49,0x49,0x53,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x1f, - 0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x12,0x85,0x88,0x85,0x42, - 0xd6,0xdb,0xd6,0xab,0xf9,0xe3,0xf9,0xf5,0xfe,0xaf,0xff,0xff,0xfa,0x84,0xfd,0xff,0xf5,0x7b,0xfb,0xff,0xf0,0x77,0xf9,0xff, - 0xf5,0x7f,0xf9,0xff,0xe8,0xea,0xfa,0xff,0x6d,0xff,0xe3,0xff,0x52,0xf9,0xdb,0xff,0x4d,0xf7,0xd6,0xff,0x4e,0xf6,0xd3,0xff, - 0x83,0xfa,0xe0,0xff,0xd4,0xfc,0xf3,0xff,0xe1,0xdd,0xdf,0xc9,0x82,0x7e,0x7f,0x6e,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x26, - 0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x17,0xa8,0xac,0xa7,0x62,0xe5,0xe7,0xe5,0xcb,0xfe,0xdc,0xfe,0xff, - 0xfd,0x9e,0xff,0xff,0xf7,0x78,0xfc,0xff,0xfa,0x80,0xfb,0xff,0xe9,0xeb,0xfb,0xff,0x69,0xff,0xe7,0xff,0x49,0xfa,0xdf,0xff, - 0x75,0xfb,0xe4,0xff,0xc6,0xfe,0xf4,0xff,0xed,0xec,0xec,0xe5,0xac,0xa6,0xa8,0x90,0x20,0x1f,0x1f,0x44,0x00,0x00,0x00,0x2d, - 0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0d, - 0x41,0x43,0x41,0x25,0xc1,0xc6,0xc0,0x84,0xf0,0xeb,0xef,0xe6,0xfe,0xc8,0xff,0xff,0xff,0x98,0xfe,0xff,0xe5,0xec,0xfc,0xff, - 0x7d,0xff,0xee,0xff,0xad,0xff,0xf4,0xff,0xef,0xf7,0xf6,0xf7,0xcd,0xc5,0xc6,0xb3,0x58,0x57,0x57,0x5a,0x00,0x00,0x00,0x33, - 0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x11,0x7e,0x80,0x7d,0x3f,0xd2,0xd5,0xd1,0xaa, - 0xfc,0xef,0xfc,0xfd,0xf4,0xf9,0xfd,0xff,0xeb,0xfd,0xfb,0xff,0xe2,0xdc,0xdd,0xd4,0x8a,0x86,0x86,0x77,0x00,0x00,0x00,0x39, - 0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, - 0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x16,0xa5,0xa7,0xa4,0x60,0xdc,0xdb,0xd9,0xba,0xb6,0xb2,0xb1,0x97,0x29,0x29,0x29,0x47, - 0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x2d,0x2d,0x2d,0x10,0x9b,0x9b,0x9a,0x40, - 0x58,0x57,0x56,0x3a,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xd3,0xd3,0xd3,0x00,0x1a,0x1a,0x1a,0x07,0x1a,0x1a,0x1a,0x49, + 0x1a,0x1a,0x1a,0x98,0x1f,0x1f,0x1f,0xc2,0x2d,0x2d,0x2d,0xdd,0x34,0x34,0x34,0xf4, + 0x3c,0x3c,0x3c,0xf5,0x45,0x45,0x45,0xe0,0x4f,0x4f,0x4f,0xcc,0x5b,0x5b,0x5b,0xac, + 0x83,0x83,0x83,0x6d,0xe7,0xe7,0xe7,0x36,0xff,0xff,0xff,0x2c,0xff,0xff,0xff,0x27, + 0xff,0xff,0xff,0x1f,0xff,0xff,0xff,0x16,0xff,0xff,0xff,0x0a,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0xd3,0xd3,0x00, + 0x1a,0x1a,0x1a,0x19,0x1a,0x1a,0x1a,0x97,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0xff, + 0x26,0x26,0x26,0xff,0x32,0x32,0x32,0xff,0x3d,0x3d,0x3d,0xff,0x47,0x47,0x47,0xff, + 0x4f,0x4f,0x4f,0xff,0x55,0x55,0x55,0xff,0x5a,0x5a,0x5a,0xff,0x5c,0x5c,0x5c,0xff, + 0x5c,0x5c,0x5c,0xff,0x5d,0x5d,0x5d,0xf6,0x71,0x71,0x71,0xb3,0xc9,0xc9,0xc9,0x51, + 0xff,0xff,0xff,0x35,0xff,0xff,0xff,0x2b,0xff,0xff,0xff,0x20,0xff,0xff,0xff,0x13, + 0xff,0xff,0xff,0x03,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x08,0x1a,0x1a,0x1a,0x84, + 0x1a,0x1a,0x1a,0xf5,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x28,0x28,0x28,0xff, + 0x37,0x37,0x37,0xff,0x43,0x43,0x43,0xff,0x4f,0x4f,0x4f,0xff,0x5a,0x5a,0x5a,0xff, + 0x63,0x63,0x63,0xff,0x6a,0x6a,0x6a,0xff,0x6f,0x6f,0x6f,0xff,0x72,0x72,0x72,0xff, + 0x72,0x72,0x72,0xff,0x70,0x70,0x70,0xff,0x6c,0x6c,0x6c,0xff,0x67,0x67,0x67,0xf8, + 0x80,0x80,0x80,0xa8,0xeb,0xeb,0xeb,0x46,0xff,0xff,0xff,0x33,0xff,0xff,0xff,0x25, + 0xff,0xff,0xff,0x16,0xff,0xff,0xff,0x04,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x18,0x1a,0x1a,0x1a,0xc8,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x27,0x27,0x27,0xff,0x37,0x37,0x37,0xff, + 0x45,0x45,0x45,0xff,0x53,0x53,0x53,0xff,0x60,0x60,0x60,0xff,0x6c,0x6c,0x6c,0xff, + 0x76,0x76,0x76,0xff,0x7f,0x7f,0x7f,0xff,0x84,0x84,0x84,0xff,0x88,0x88,0x88,0xff, + 0x88,0x88,0x88,0xff,0x86,0x86,0x86,0xff,0x80,0x80,0x80,0xff,0x79,0x79,0x79,0xff, + 0x6f,0x6f,0x6f,0xff,0x71,0x71,0x71,0xda,0xd1,0xd1,0xd1,0x57,0xff,0xff,0xff,0x36, + 0xff,0xff,0xff,0x26,0xff,0xff,0xff,0x15,0xff,0xff,0xff,0x02,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x1a,0x1a,0x1a,0x2d,0x1a,0x1a,0x1a,0xe3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x21,0x21,0x21,0xff,0x32,0x32,0x32,0xff,0x42,0x42,0x42,0xff, + 0x53,0x53,0x53,0xff,0x62,0x62,0x62,0xff,0x6f,0x6f,0x6f,0xff,0x7d,0x7d,0x7d,0xff, + 0x88,0x88,0x88,0xff,0x92,0x92,0x92,0xff,0x9a,0x9a,0x9a,0xff,0x9d,0x9d,0x9d,0xff, + 0x9e,0x9e,0x9e,0xff,0x9b,0x9b,0x9b,0xff,0x95,0x95,0x95,0xff,0x8c,0x8c,0x8c,0xff, + 0x81,0x81,0x81,0xff,0x75,0x75,0x75,0xff,0x6c,0x6c,0x6c,0xec,0xb5,0xb5,0xb5,0x66, + 0xff,0xff,0xff,0x34,0xff,0xff,0xff,0x22,0xff,0xff,0xff,0x10,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x18, + 0x1a,0x1a,0x1a,0xe3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x2a,0x2a,0x2a,0xff,0x3c,0x3c,0x3c,0xff,0x4d,0x4d,0x4d,0xff, + 0x5d,0x5d,0x5d,0xff,0x6e,0x6e,0x6e,0xff,0x7e,0x7e,0x7e,0xff,0x8c,0x8c,0x8c,0xff, + 0x9a,0x9a,0x9a,0xff,0xa5,0xa5,0xa5,0xff,0xae,0xae,0xae,0xff,0xb3,0xb3,0xb3,0xff, + 0xb4,0xb4,0xb4,0xff,0xb0,0xb0,0xb0,0xff,0xa9,0xa9,0xa9,0xff,0x9e,0x9e,0x9e,0xff, + 0x91,0x91,0x91,0xff,0x83,0x83,0x83,0xff,0x74,0x74,0x74,0xff,0x6a,0x6a,0x6a,0xec, + 0xcd,0xcd,0xcd,0x52,0xff,0xff,0xff,0x2d,0xff,0xff,0xff,0x1a,0xff,0xff,0xff,0x05, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x08,0x1a,0x1a,0x1a,0xc8, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1e,0x1e,0x1e,0xff,0x31,0x31,0x31,0xff,0x43,0x43,0x43,0xff,0x55,0x55,0x55,0xff, + 0x66,0x66,0x66,0xff,0x77,0x77,0x77,0xff,0x88,0x88,0x88,0xff,0x99,0x99,0x99,0xff, + 0xa9,0xa9,0xa9,0xff,0xb6,0xb6,0xb6,0xff,0xc1,0xc1,0xc1,0xff,0xc8,0xc8,0xc8,0xff, + 0xca,0xca,0xca,0xff,0xc5,0xc5,0xc5,0xff,0xbb,0xbb,0xbb,0xff,0xae,0xae,0xae,0xff, + 0x9f,0x9f,0x9f,0xff,0x8f,0x8f,0x8f,0xff,0x7e,0x7e,0x7e,0xff,0x6d,0x6d,0x6d,0xff, + 0x67,0x67,0x67,0xd8,0xe7,0xe7,0xe7,0x3b,0xff,0xff,0xff,0x21,0xff,0xff,0xff,0x0d, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x84,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x23,0x23,0x23,0xff,0x36,0x36,0x36,0xff,0x48,0x48,0x48,0xff,0x5b,0x5b,0x5b,0xff, + 0x6d,0x6d,0x6d,0xff,0x7f,0x7f,0x7f,0xff,0x91,0x91,0x91,0xff,0xa3,0xa3,0xa3,0xff, + 0xb4,0xb4,0xb4,0xff,0xc4,0xc4,0xc4,0xff,0xd3,0xd3,0xd3,0xff,0xde,0xde,0xde,0xff, + 0xe0,0xe0,0xe0,0xff,0xd7,0xd7,0xd7,0xff,0xca,0xca,0xca,0xff,0xba,0xba,0xba,0xff, + 0xa9,0xa9,0xa9,0xff,0x98,0x98,0x98,0xff,0x86,0x86,0x86,0xff,0x73,0x73,0x73,0xff, + 0x61,0x61,0x61,0xff,0x6e,0x6e,0x6e,0xa0,0xff,0xff,0xff,0x27,0xff,0xff,0xff,0x12, + 0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x19,0x1a,0x1a,0x1a,0xf5,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x26,0x26,0x26,0xff,0x3e,0x3e,0x41,0xff,0x5f,0x5f,0x65,0xff,0x5d,0x5d,0x5d,0xff, + 0x6f,0x6f,0x6f,0xff,0x82,0x82,0x82,0xff,0x9b,0x9f,0x9b,0xff,0xad,0xae,0xad,0xff, + 0xba,0xba,0xba,0xff,0xcc,0xcc,0xcc,0xff,0xdf,0xdf,0xdf,0xff,0xf0,0xf0,0xf0,0xff, + 0xf6,0xf6,0xf6,0xff,0xe5,0xe5,0xe5,0xff,0xd3,0xd3,0xd3,0xff,0xc1,0xc1,0xc1,0xff, + 0xae,0xae,0xae,0xff,0x9b,0x9b,0x9b,0xff,0x89,0x89,0x89,0xff,0x76,0x76,0x76,0xff, + 0x65,0x65,0x65,0xff,0x53,0x53,0x53,0xf7,0xb1,0xb1,0xb1,0x3e,0xff,0xff,0xff,0x14, + 0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x97,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x25,0x25,0x25,0xff,0x6a,0x6a,0x86,0xff,0xa7,0xa7,0xc0,0xff,0x5e,0x5e,0x5f,0xff, + 0x6f,0x6f,0x6f,0xff,0x82,0x82,0x82,0xff,0xb0,0xc4,0xb0,0xff,0xcc,0xd5,0xcc,0xff, + 0xb9,0xb9,0xb9,0xff,0xcc,0xcc,0xcc,0xff,0xdd,0xdd,0xdd,0xff,0xf1,0xf0,0xf0,0xff, + 0xfe,0xfb,0xfb,0xff,0xe6,0xe5,0xe5,0xff,0xd2,0xd2,0xd2,0xff,0xc0,0xc0,0xc0,0xff, + 0xae,0xae,0xae,0xff,0x9b,0x9b,0x9b,0xff,0x88,0x88,0x88,0xff,0x76,0x76,0x76,0xff, + 0x64,0x64,0x64,0xff,0x52,0x52,0x52,0xff,0x52,0x52,0x52,0xa8,0xff,0xff,0xff,0x14, + 0x1a,0x1a,0x1a,0x07,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x27,0x27,0x2f,0xff,0x9a,0x9a,0xe3,0xff,0xca,0xca,0xff,0xff,0x84,0x84,0x8f,0xff, + 0x6c,0x6c,0x6c,0xff,0x7f,0x8a,0x7f,0xff,0xc1,0xf6,0xc1,0xff,0xe2,0xfe,0xe2,0xff, + 0xc0,0xc3,0xc0,0xff,0xc2,0xc2,0xc2,0xff,0xd0,0xd0,0xd0,0xff,0xf2,0xe8,0xe8,0xff, + 0xff,0xf4,0xf4,0xff,0xee,0xe8,0xe8,0xff,0xc8,0xc8,0xc8,0xff,0xb8,0xb8,0xb8,0xff, + 0xa8,0xa8,0xa8,0xff,0x96,0x96,0x96,0xff,0x85,0x85,0x85,0xff,0x73,0x73,0x73,0xff, + 0x61,0x61,0x61,0xff,0x4e,0x4e,0x4e,0xff,0x3e,0x3e,0x3e,0xf4,0xbf,0xbf,0xbf,0x18, + 0x1a,0x1a,0x1a,0x49,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x3e,0x3e,0x7a,0xff,0x9b,0x9b,0xff,0xff,0xbb,0xbb,0xff,0xff,0xc2,0xc2,0xe5,0xff, + 0x6f,0x6f,0x72,0xff,0x7e,0xb6,0x7e,0xff,0xb4,0xff,0xb4,0xff,0xd3,0xff,0xd3,0xff, + 0xda,0xe8,0xda,0xff,0xb5,0xb5,0xb5,0xff,0xce,0xc4,0xc4,0xff,0xff,0xe3,0xe3,0xff, + 0xff,0xe9,0xe9,0xff,0xff,0xed,0xed,0xff,0xcb,0xc6,0xc6,0xff,0xab,0xab,0xab,0xff, + 0x9d,0x9d,0x9d,0xff,0x8d,0x8d,0x8d,0xff,0x7d,0x7d,0x7d,0xff,0x6c,0x6c,0x6c,0xff, + 0x5b,0x5b,0x5b,0xff,0x49,0x49,0x49,0xff,0x37,0x37,0x37,0xff,0x3b,0x3b,0x3b,0x51, + 0x1a,0x1a,0x1a,0x98,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x2a,0xff, + 0x5a,0x5a,0xe5,0xff,0x88,0x88,0xff,0xff,0xaa,0xaa,0xff,0xff,0xc7,0xc7,0xff,0xff, + 0x9b,0xa1,0xac,0xff,0x73,0xf5,0x73,0xff,0x9e,0xff,0x9e,0xff,0xc0,0xff,0xc0,0xff, + 0xdd,0xff,0xdd,0xff,0xc0,0xc6,0xc0,0xff,0xe4,0xbc,0xbc,0xff,0xff,0xd2,0xd2,0xff, + 0xff,0xda,0xda,0xff,0xff,0xe1,0xe1,0xff,0xee,0xdb,0xdb,0xff,0xa0,0x9e,0x9e,0xff, + 0x8f,0x8f,0x8f,0xff,0x81,0x81,0x81,0xff,0x72,0x72,0x72,0xff,0x62,0x62,0x62,0xff, + 0x52,0x52,0x52,0xff,0x41,0x41,0x41,0xff,0x30,0x30,0x30,0xff,0x1f,0x1f,0x1f,0x99, + 0x1a,0x1a,0x1a,0xc1,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x22,0x22,0x7d,0xff, + 0x53,0x53,0xff,0xff,0x72,0x72,0xff,0xff,0x96,0x96,0xff,0xff,0xb7,0xb7,0xff,0xff, + 0xd0,0xd0,0xfc,0xff,0x74,0xd2,0x7c,0xff,0x84,0xff,0x84,0xff,0xaa,0xff,0xaa,0xff, + 0xca,0xff,0xca,0xff,0xde,0xf5,0xdd,0xff,0xec,0xb4,0xb2,0xff,0xff,0xbe,0xbe,0xff, + 0xff,0xc8,0xc8,0xff,0xff,0xd1,0xd1,0xff,0xff,0xda,0xda,0xff,0xbe,0xb1,0xb1,0xff, + 0x7f,0x7f,0x7f,0xff,0x72,0x72,0x72,0xff,0x65,0x65,0x65,0xff,0x56,0x56,0x56,0xff, + 0x47,0x47,0x47,0xff,0x37,0x37,0x37,0xff,0x26,0x26,0x26,0xff,0x1a,0x1a,0x1a,0xc1, + 0x1a,0x1a,0x1a,0xda,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x15,0x15,0x2c,0xff,0x24,0x24,0xe9,0xff, + 0x42,0x42,0xff,0xff,0x5f,0x5f,0xff,0xff,0x81,0x81,0xff,0xff,0xa3,0xa3,0xff,0xff, + 0xc1,0xc1,0xff,0xff,0xb1,0xc6,0xcb,0xff,0x67,0xf1,0x68,0xff,0x8e,0xff,0x8e,0xff, + 0xb2,0xff,0xb2,0xff,0xd1,0xff,0xd1,0xff,0xda,0xd0,0xc3,0xff,0xfc,0xa4,0xa4,0xff, + 0xff,0xb3,0xb3,0xff,0xff,0xbe,0xbe,0xff,0xff,0xc9,0xc9,0xff,0xfa,0xd2,0xd2,0xff, + 0x82,0x7d,0x7d,0xff,0x62,0x62,0x62,0xff,0x55,0x55,0x55,0xff,0x48,0x48,0x48,0xff, + 0x3a,0x3a,0x3a,0xff,0x2b,0x2b,0x2b,0xff,0x1b,0x1b,0x1b,0xff,0x1a,0x1a,0x1a,0xda, + 0x1a,0x1a,0x1a,0xf3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x08,0x08,0x82,0xff,0x16,0x16,0xff,0xff, + 0x32,0x32,0xff,0xff,0x4e,0x4e,0xff,0xff,0x6a,0x6a,0xff,0xff,0x8c,0x8c,0xff,0xff, + 0xad,0xad,0xff,0xff,0xc9,0xc9,0xff,0xff,0x7c,0xc3,0x8a,0xff,0x6e,0xff,0x6e,0xff, + 0x96,0xff,0x96,0xff,0xba,0xff,0xba,0xff,0xda,0xff,0xda,0xff,0xd8,0xa2,0x9b,0xff, + 0xff,0x99,0x99,0xff,0xff,0xa7,0xa7,0xff,0xff,0xb5,0xb5,0xff,0xff,0xc2,0xc2,0xff, + 0xc7,0xa7,0xa7,0xff,0x52,0x52,0x52,0xff,0x45,0x45,0x45,0xff,0x39,0x39,0x39,0xff, + 0x2c,0x2c,0x2c,0xff,0x1c,0x1c,0x1c,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf3, + 0x1a,0x1a,0x1a,0xf3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x13,0x13,0x2e,0xff,0x01,0x01,0xee,0xff,0x05,0x05,0xff,0xff, + 0x21,0x21,0xff,0xff,0x3d,0x3d,0xff,0xff,0x59,0x59,0xff,0xff,0x75,0x75,0xff,0xff, + 0x96,0x96,0xff,0xff,0xb6,0xb6,0xff,0xff,0xc1,0xc6,0xea,0xff,0x57,0xd9,0x5c,0xff, + 0x75,0xff,0x75,0xff,0x9d,0xff,0x9d,0xff,0xc2,0xff,0xc2,0xff,0xd5,0xde,0xc9,0xff, + 0xec,0x7f,0x7d,0xff,0xff,0x8d,0x8d,0xff,0xff,0x9d,0x9d,0xff,0xff,0xac,0xac,0xff, + 0xff,0xbc,0xbc,0xff,0x7b,0x6a,0x6a,0xff,0x34,0x34,0x34,0xff,0x28,0x28,0x28,0xff, + 0x1b,0x1b,0x1b,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf3, + 0x1a,0x1a,0x1a,0xda,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x08,0x08,0x87,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff, + 0x10,0x10,0xff,0xff,0x2d,0x2d,0xff,0xff,0x49,0x49,0xff,0xff,0x65,0x65,0xff,0xff, + 0x81,0x81,0xff,0xff,0x9e,0x9e,0xff,0xff,0xbd,0xbd,0xff,0xff,0x88,0xb6,0xa1,0xff, + 0x4d,0xfc,0x4d,0xff,0x7c,0xff,0x7c,0xff,0xa5,0xff,0xa5,0xff,0xcc,0xff,0xcc,0xff, + 0xc6,0x9d,0x90,0xff,0xff,0x70,0x70,0xff,0xff,0x82,0x82,0xff,0xff,0x93,0x93,0xff, + 0xff,0xa5,0xa5,0xff,0xe0,0xa3,0xa3,0xff,0x2e,0x2a,0x2a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xda, + 0x1a,0x1a,0x1a,0xc1,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x13,0x13,0x32,0xff,0x00,0x00,0xf0,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff, + 0x00,0x00,0xff,0xff,0x1c,0x1c,0xff,0xff,0x38,0x38,0xff,0xff,0x54,0x54,0xff,0xff, + 0x70,0x70,0xff,0xff,0x8d,0x8d,0xff,0xff,0xa9,0xa9,0xff,0xff,0xc4,0xc4,0xfe,0xff, + 0x4c,0xbc,0x59,0xff,0x55,0xff,0x55,0xff,0x83,0xff,0x83,0xff,0xaf,0xff,0xaf,0xff, + 0xd2,0xf5,0xd1,0xff,0xd1,0x61,0x5d,0xff,0xff,0x63,0x63,0xff,0xff,0x75,0x75,0xff, + 0xff,0x8a,0x8a,0xff,0xff,0xa0,0xa0,0xff,0x8c,0x67,0x67,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xc1, + 0x1a,0x1a,0x1a,0x98,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x08,0x08,0x8c,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff, + 0x00,0x00,0xff,0xff,0x0b,0x0b,0xff,0xff,0x27,0x27,0xff,0xff,0x44,0x44,0xff,0xff, + 0x60,0x60,0xff,0xff,0x7c,0x7c,0xff,0xff,0x98,0x98,0xff,0xff,0xb4,0xb4,0xff,0xff, + 0xa5,0xb8,0xc9,0xff,0x34,0xe3,0x37,0xff,0x60,0xff,0x60,0xff,0x8e,0xff,0x8e,0xff, + 0xbd,0xff,0xbd,0xff,0xbc,0xb0,0x98,0xff,0xf5,0x44,0x44,0xff,0xff,0x5e,0x5e,0xff, + 0xff,0x76,0x76,0xff,0xff,0x8e,0x8e,0xff,0xfd,0xa5,0xa5,0xff,0x46,0x38,0x38,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0x98, + 0x1a,0x1a,0x1a,0x49,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x12,0x12,0x34,0xff, + 0x00,0x00,0xdd,0xff,0x00,0x00,0xe9,0xff,0x00,0x00,0xe9,0xff,0x00,0x00,0xea,0xff, + 0x00,0x00,0xea,0xff,0x00,0x00,0xeb,0xff,0x15,0x15,0xeb,0xff,0x2f,0x2f,0xec,0xff, + 0x49,0x49,0xed,0xff,0x63,0x63,0xed,0xff,0x7e,0x7e,0xee,0xff,0x98,0x98,0xee,0xff, + 0xb4,0xb4,0xef,0xff,0x5f,0xa4,0x72,0xff,0x45,0xfd,0x45,0xff,0x75,0xfe,0x75,0xff, + 0xa3,0xfe,0xa3,0xff,0xd2,0xff,0xd2,0xff,0xa9,0x67,0x5b,0xff,0xd5,0x40,0x40,0xff, + 0xd5,0x54,0x54,0xff,0xd7,0x69,0x69,0xff,0xd9,0x7e,0x7e,0xff,0x9d,0x6c,0x6c,0xff, + 0x1d,0x1c,0x1c,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0x49, + 0x1a,0x1a,0x1a,0x07,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0xff,0x19,0x19,0x19,0xff, + 0x18,0x18,0x18,0xff,0x17,0x17,0x18,0xff,0x17,0x17,0x18,0xff,0x17,0x17,0x19,0xff, + 0x14,0x1a,0x16,0xff,0x12,0x1e,0x15,0xff,0x12,0x1f,0x15,0xff,0x13,0x1e,0x16,0xff, + 0x13,0x20,0x16,0xff,0x13,0x1f,0x15,0xff,0x14,0x21,0x16,0xff,0x14,0x22,0x16,0xff, + 0x14,0x22,0x16,0xff,0x14,0x22,0x15,0xff,0x16,0x24,0x16,0xff,0x1a,0x25,0x1a,0xff, + 0x1d,0x25,0x1d,0xff,0x20,0x25,0x20,0xff,0x1f,0x21,0x1f,0xff,0x19,0x19,0x19,0xff, + 0x19,0x19,0x19,0xff,0x19,0x19,0x19,0xff,0x18,0x18,0x18,0xff,0x18,0x18,0x18,0xff, + 0x19,0x19,0x19,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0x07, + 0x00,0x00,0x6e,0x00,0x1a,0x1a,0x1a,0x97,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0x97,0xd3,0xd3,0xd3,0x00, + 0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x19,0x1a,0x1a,0x1a,0xf5,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf5,0x1a,0x1a,0x1a,0x19,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x1a,0x1a,0x1a,0x84,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0x84,0xd3,0xd3,0xd3,0x00,0x98,0x88,0x88,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x1a,0x1a,0x1a,0x08,0x1a,0x1a,0x1a,0xc8, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xc8,0x1a,0x1a,0x1a,0x08,0xa4,0x6d,0x6d,0x00,0x73,0x58,0x58,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x18, + 0x1a,0x1a,0x1a,0xe3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xe3, + 0x1a,0x1a,0x1a,0x18,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x1a,0x1a,0x1a,0x2d,0x1a,0x1a,0x1a,0xe3,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xe3,0x1a,0x1a,0x1a,0x2d, + 0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x18,0x1a,0x1a,0x1a,0xc8,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xc8,0x1a,0x1a,0x1a,0x18,0xff,0xff,0xff,0x00, + 0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x08,0x1a,0x1a,0x1a,0x84, + 0x1a,0x1a,0x1a,0xf5,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf5, + 0x1a,0x1a,0x1a,0x84,0x1a,0x1a,0x1a,0x08,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00, + 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x1a,0x1a,0x1a,0x19,0x1a,0x1a,0x1a,0x97,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xff, + 0x1a,0x1a,0x1a,0xff,0x1a,0x1a,0x1a,0xf2,0x1a,0x1a,0x1a,0x97,0x1a,0x1a,0x1a,0x19, + 0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1a,0x1a,0x07,0x1a,0x1a,0x1a,0x49, + 0x1a,0x1a,0x1a,0x98,0x1a,0x1a,0x1a,0xc1,0x1a,0x1a,0x1a,0xda,0x1a,0x1a,0x1a,0xf3, + 0x1a,0x1a,0x1a,0xf3,0x1a,0x1a,0x1a,0xda,0x1a,0x1a,0x1a,0xc1,0x1a,0x1a,0x1a,0x98, + 0x1a,0x1a,0x1a,0x49,0x1a,0x1a,0x1a,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, - {0x00,0x07,0xc0,0x00,0x00,0x1f,0xf0,0x00,0x00,0x7f,0xfc,0x00, - 0x00,0xff,0xfe,0x00,0x03,0xff,0xff,0x80,0x0f,0xff,0xff,0xe0, - 0x3f,0xff,0xff,0xf8,0x3f,0xff,0xff,0xfc,0x3f,0xff,0xff,0xfe, - 0x3f,0xff,0xff,0xfe,0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff, - 0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff, - 0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff, - 0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff, - 0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xfe,0x3f,0xff,0xff,0xfe, - 0x1f,0xff,0xff,0xfe,0x0f,0xff,0xff,0xf8,0x03,0xff,0xff,0xe0, - 0x01,0xff,0xff,0xc0,0x00,0x7f,0xff,0x00,0x00,0x1f,0xfc,0x00, - 0x00,0x07,0xf8,0x00,0x00,0x03,0xe0,0x00} + {0x00,0x0f,0xf0,0x00,0x00,0x7f,0xfe,0x00,0x01,0xff,0xff,0x80, + 0x03,0xff,0xff,0xc0,0x07,0xff,0xff,0xe0,0x0f,0xff,0xff,0xf0, + 0x1f,0xff,0xff,0xf8,0x3f,0xff,0xff,0xfc,0x3f,0xff,0xff,0xfc, + 0x7f,0xff,0xff,0xfe,0x7f,0xff,0xff,0xfe,0x7f,0xff,0xff,0xfe, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xfe, + 0x7f,0xff,0xff,0xfe,0x7f,0xff,0xff,0xfe,0x3f,0xff,0xff,0xfc, + 0x3f,0xff,0xff,0xfc,0x1f,0xff,0xff,0xf8,0x0f,0xff,0xff,0xf0, + 0x07,0xff,0xff,0xe0,0x03,0xff,0xff,0xc0,0x01,0xff,0xff,0x80, + 0x00,0x7f,0xfe,0x00,0x00,0x0f,0xf0,0x00} }; diff --git a/tools/icon_to_c.c b/tools/icon_to_c.c index 0d37ca9..6fd96fd 100644 --- a/tools/icon_to_c.c +++ b/tools/icon_to_c.c @@ -33,6 +33,8 @@ #define ERROR(str) printf("%s: error: %s\n", prog_name, str); exit(-1); +#define ALIGN(a, b) (((a) + ((b) - 1)) & ~((b) - 1)) + static char *prog_name = NULL; static size_t read_input(const char *file_name, uint8_t** out_buf) @@ -153,11 +155,20 @@ static Icon *init_icon(uint8_t *buf, size_t buf_size) if (bitmap->header_size != 40) { ERROR("invalid bitmap header"); } + + if (ico->plans == 0) { // 0 and 1 are equivalent + ico->plans = 1; + } + if (bitmap->width != ico->width || bitmap->height != ico->height * 2 || - bitmap->plans != ico->plans || bitmap->bpp != ico->bpp || !bitmap->image_size) { + bitmap->plans != ico->plans || bitmap->bpp != ico->bpp) { ERROR("invalid bitmap header"); } + if (!bitmap->image_size) { + bitmap->image_size = ALIGN(bitmap->bpp * bitmap->width, 32) / 8 * bitmap->height; + } + if (bitmap->compression || bitmap->horizontal_resolution || bitmap->vertical_resolution || bitmap->num_colors || bitmap->important_colors) { ERROR("invalid bitmap header"); |
From: Yaniv K. <yk...@re...> - 2010-01-03 16:16:23
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit fc5c668f469be9860c5a92ac16dea57b3fb29534 Author: Yaniv Kamay <yk...@re...> Date: Sun Jan 3 18:16:14 2010 +0200 client: restore gl_fbo and gl_pbuff canavas type options diff --git a/client/application.cpp b/client/application.cpp index 778d103..c253ccc 100644 --- a/client/application.cpp +++ b/client/application.cpp @@ -1491,6 +1491,10 @@ bool Application::set_canvas_option(CmdLineParser& parser, char *val) #ifdef WIN32 canvas_types["gdi"] = CANVAS_OPTION_GDI; #endif +#ifdef USE_OGL + canvas_types["gl_fbo"] = CANVAS_OPTION_OGL_FBO; + canvas_types["gl_pbuff"] = CANVAS_OPTION_OGL_PBUFF; +#endif _canvas_types.clear(); do { CanvasNamesMap::iterator iter = canvas_types.find(val); |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:55:46
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 4202ee3945bdcbe78326562b49817c086dc67e18 Author: Arnon Gilboa <ag...@re...> Date: Wed Dec 30 13:41:58 2009 +0200 spice: position mouse in primary monitor center after full screen toggle -move _focused & _pointer_in_window from RedWindow to RedWindow_p's -move shadow focus & cursor handling to sync() -add reset_cursor_pos() to Platform -Monitor set_mode()/restore() use virtual do_set_mode()/do_restore() diff --git a/client/monitor.cpp b/client/monitor.cpp index 8526769..d56cfad 100644 --- a/client/monitor.cpp +++ b/client/monitor.cpp @@ -18,6 +18,7 @@ #include "common.h" #include "monitor.h" #include "debug.h" +#include "platform.h" uint32_t Monitor::self_monitors_change = 0; @@ -33,3 +34,13 @@ bool Monitor::is_self_change() return self_monitors_change != 0; } +void Monitor::set_mode(int width, int height) +{ + do_set_mode(width, height); + Platform::reset_cursor_pos(); +} +void Monitor::restore() +{ + do_restore(); + Platform::reset_cursor_pos(); +} diff --git a/client/monitor.h b/client/monitor.h index 59ec1e0..7a4ba3f 100644 --- a/client/monitor.h +++ b/client/monitor.h @@ -29,8 +29,8 @@ public: void set_free() {_free = true;} void set_used() {_free = false;} - virtual void set_mode(int width, int height) = 0; - virtual void restore() = 0; + void set_mode(int width, int height); + void restore(); virtual int get_depth() = 0; virtual Point get_position() = 0; virtual Point get_size() const = 0; @@ -41,6 +41,8 @@ public: protected: virtual ~Monitor() {} + virtual void do_set_mode(int width, int height) = 0; + virtual void do_restore() = 0; private: int _id; diff --git a/client/platform.h b/client/platform.h index c32b863..ff89181 100644 --- a/client/platform.h +++ b/client/platform.h @@ -100,6 +100,8 @@ public: static uint32_t get_keyboard_modifiers(); + static void reset_cursor_pos(); + static LocalCursor* create_local_cursor(CursorData* cursor_data); static LocalCursor* create_inactive_cursor(); static LocalCursor* create_default_cursor(); diff --git a/client/red_window.h b/client/red_window.h index 6f51f70..65d5efd 100644 --- a/client/red_window.h +++ b/client/red_window.h @@ -105,8 +105,6 @@ private: Type _type; LocalCursor* _local_cursor; bool _cursor_visible; - bool _focused; - bool _pointer_in_window; bool _trace_key_interception; bool _key_interception_on; Menu* _menu; diff --git a/client/windows/platform.cpp b/client/windows/platform.cpp index 6d5deba..2988827 100644 --- a/client/windows/platform.cpp +++ b/client/windows/platform.cpp @@ -222,8 +222,6 @@ class WinMonitor: public Monitor { public: WinMonitor(int id, const wchar_t* name, const wchar_t* string); - virtual void set_mode(int width, int height); - virtual void restore(); virtual int get_depth() { return _depth;} virtual Point get_position(); virtual Point get_size() const { Point size = {_width, _height}; return size;} @@ -232,6 +230,8 @@ public: protected: virtual ~WinMonitor(); + virtual void do_set_mode(int width, int height); + virtual void do_restore(); private: void update_position(); @@ -261,7 +261,7 @@ WinMonitor::WinMonitor(int id, const wchar_t* name, const wchar_t* string) WinMonitor::~WinMonitor() { - restore(); + do_restore(); } void WinMonitor::update_position() @@ -357,7 +357,7 @@ bool WinMonitor::best_display_setting(uint32_t width, uint32_t height, uint32_t == DISP_CHANGE_SUCCESSFUL; } -void WinMonitor::set_mode(int width, int height) +void WinMonitor::do_set_mode(int width, int height) { update_position(); if (width == _width && height == _height) { @@ -375,31 +375,37 @@ void WinMonitor::set_mode(int width, int height) update_position(); } -void WinMonitor::restore() +void WinMonitor::do_restore() { if (_active) { _active = false; self_monitors_change++; ChangeDisplaySettingsEx(_dev_name.c_str(), NULL, NULL, 0, NULL); self_monitors_change--; + update_position(); } } static MonitorsList monitors; +static Monitor* primary_monitor = NULL; const MonitorsList& Platform::init_monitors() { ASSERT(monitors.empty()); int id = 0; + Monitor* mon; DISPLAY_DEVICE device_info; DWORD device_id = 0; device_info.cb = sizeof(device_info); while (EnumDisplayDevices(NULL, device_id, &device_info, 0)) { if ((device_info.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) && - !(device_info.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER)) { - monitors.push_back(new WinMonitor(id++, device_info.DeviceName, - device_info.DeviceString)); + !(device_info.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER)) { + mon = new WinMonitor(id++, device_info.DeviceName, device_info.DeviceString); + monitors.push_back(mon); + if (device_info.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) { + primary_monitor = mon; + } } device_id++; } @@ -408,6 +414,7 @@ const MonitorsList& Platform::init_monitors() void Platform::destroy_monitors() { + primary_monitor = NULL; while (!monitors.empty()) { Monitor* monitor = monitors.front(); monitors.pop_front(); @@ -502,6 +509,16 @@ uint32_t Platform::get_keyboard_modifiers() KEY_BIT(keymap, VK_RMENU, R_ALT_MODIFIER); } +void Platform::reset_cursor_pos() +{ + if (!primary_monitor) { + return; + } + Point pos = primary_monitor->get_position(); + Point size = primary_monitor->get_size(); + SetCursorPos(pos.x + size.x / 2, pos.y + size.y / 2); +} + class WinBaseLocalCursor: public LocalCursor { public: WinBaseLocalCursor() : _handle (0) {} diff --git a/client/windows/red_window.cpp b/client/windows/red_window.cpp index 554c177..0d4c4a5 100644 --- a/client/windows/red_window.cpp +++ b/client/windows/red_window.cpp @@ -265,6 +265,8 @@ RedWindow_p::RedWindow_p() , _modal_refs (0) , _no_taskmgr_dll (NULL) , _no_taskmgr_hook (NULL) + , _focused (false) + , _pointer_in_window (false) , _minimized (false) , _valid_pos (false) , _sys_menu (NULL) @@ -344,8 +346,6 @@ RedWindow::RedWindow(RedWindow::Listener& listener, int screen_id) , _type (TYPE_NORMAL) , _local_cursor (NULL) , _cursor_visible (true) - , _focused (false) - , _pointer_in_window (false) , _trace_key_interception (false) , _key_interception_on (false) , _menu (NULL) diff --git a/client/windows/red_window_p.h b/client/windows/red_window_p.h index 4b5655e..b35de57 100644 --- a/client/windows/red_window_p.h +++ b/client/windows/red_window_p.h @@ -56,6 +56,8 @@ protected: uint32_t _modal_refs; HMODULE _no_taskmgr_dll; HHOOK _no_taskmgr_hook; + bool _focused; + bool _pointer_in_window; bool _minimized; bool _valid_pos; int _x; diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp index d00092b..a1c08ca 100644 --- a/client/x11/platform.cpp +++ b/client/x11/platform.cpp @@ -491,18 +491,20 @@ public: monitors.push_back(this); } - virtual void set_mode(int width, int height) - { - _out_of_sync = width > get_width() || height > get_height(); - } - - virtual void restore() {} virtual int get_depth() { return XPlatform::get_vinfo()[0]->depth;} virtual Point get_position() { return XScreen::get_position();} virtual Point get_size() const { Point pt = {get_width(), get_height()}; return pt;} virtual bool is_out_of_sync() { return _out_of_sync;} virtual int get_screen_id() { return get_screen();} +protected: + virtual void do_set_mode(int width, int height) + { + _out_of_sync = width > get_width() || height > get_height(); + } + + virtual void do_restore() {} + private: bool _out_of_sync; }; @@ -513,14 +515,16 @@ public: virtual ~DynamicScreen(); void publish_monitors(MonitorsList& monitors); - virtual void set_mode(int width, int height); - virtual void restore(); virtual int get_depth() { return XPlatform::get_vinfo()[0]->depth;} virtual Point get_position() { return XScreen::get_position();} virtual Point get_size() const { Point pt = {get_width(), get_height()}; return pt;} virtual bool is_out_of_sync() { return _out_of_sync;} virtual int get_screen_id() { return get_screen();} +protected: + virtual void do_set_mode(int width, int height); + virtual void do_restore(); + private: bool set_screen_size(int size_index); @@ -573,7 +577,7 @@ public: } }; -void DynamicScreen::set_mode(int width, int height) +void DynamicScreen::do_set_mode(int width, int height) { int num_sizes; @@ -595,7 +599,7 @@ void DynamicScreen::set_mode(int width, int height) X_DEBUG_SYNC(get_display()); } -void DynamicScreen::restore() +void DynamicScreen::do_restore() { X_DEBUG_SYNC(get_display()); if (is_broken() || (get_width() == _saved_width && get_height() == _saved_height)) { @@ -689,8 +693,6 @@ public: XMonitor(MultyMonScreen& container, int id, RRCrtc crtc); virtual ~XMonitor(); - virtual void set_mode(int width, int height); - virtual void restore(); virtual int get_depth(); virtual Point get_position(); virtual Point get_size() const; @@ -719,6 +721,10 @@ public: static void inc_change_ref() { Monitor::self_monitors_change++;} static void dec_change_ref() { Monitor::self_monitors_change--;} +protected: + virtual void do_set_mode(int width, int height); + virtual void do_restore(); + private: void update_position(); bool finde_mode_in_outputs(RRMode mode, int start_index, XRRScreenResources* res); @@ -1657,7 +1663,7 @@ XRRModeInfo* XMonitor::find_mode(int width, int height, XRRScreenResources* res) return NULL; } -void XMonitor::set_mode(int width, int height) +void XMonitor::do_set_mode(int width, int height) { if (width == _size.x && height == _size.y) { _out_of_sync = false; @@ -1743,12 +1749,12 @@ bool XMonitor::position_changed() return _position.x != _saved_position.x || _position.y != _saved_position.y; } -void XMonitor::restore() +void XMonitor::do_restore() { if (!mode_changed()) { return; } - set_mode(_saved_size.x, _saved_size.y); + do_set_mode(_saved_size.x, _saved_size.y); } int XMonitor::get_depth() @@ -1831,6 +1837,7 @@ void XMonitor::set_mode(const XRRModeInfo& mode) #endif static MonitorsList monitors; +static Monitor* primary_monitor = NULL; typedef std::list<XScreen*> ScreenList; static ScreenList screens; @@ -1861,11 +1868,20 @@ const MonitorsList& Platform::init_monitors() for (; iter != screens.end(); iter++) { (*iter)->publish_monitors(monitors); } + MonitorsList::iterator mon_iter = monitors.begin(); + for (; mon_iter != monitors.end(); mon_iter++) { + Monitor *mon = *mon_iter; + if (mon->get_id() == 0) { + primary_monitor = mon; + break; + } + } return monitors; } void Platform::destroy_monitors() { + primary_monitor = NULL; monitors.clear(); while (!screens.empty()) { XScreen* screen = screens.front(); @@ -2257,6 +2273,17 @@ uint32_t Platform::get_keyboard_modifiers() key_bit(keymap, XK_Alt_R, R_ALT_MODIFIER); } +void Platform::reset_cursor_pos() +{ + if (!primary_monitor) { + return; + } + Point pos = primary_monitor->get_position(); + Point size = primary_monitor->get_size(); + Window root_window = RootWindow(x_display, DefaultScreen(x_display)); + XWarpPointer(x_display, None, root_window, 0, 0, 0, 0, pos.x + size.x / 2, pos.y + size.y / 2); +} + WaveRecordAbstract* Platform::create_recorder(RecordClient& client, uint32_t sampels_per_sec, uint32_t bits_per_sample, diff --git a/client/x11/red_window.cpp b/client/x11/red_window.cpp index 1647cd4..7e25c60 100644 --- a/client/x11/red_window.cpp +++ b/client/x11/red_window.cpp @@ -844,6 +844,10 @@ void RedWindow_p::win_proc(XEvent& event) case EnterNotify: if (!red_window->_ignore_pointer) { red_window->on_pointer_enter(); + Point origin = red_window->get_origin(); + red_window->get_listener().on_mouse_motion(event.xcrossing.x - origin.x, + event.xcrossing.y - origin.y, + to_red_buttons_state(event.xcrossing.state)); } else { red_window->_shadow_pointer_state = true; memcpy(&red_window->_shadow_pointer_event, &event, sizeof(XEvent)); @@ -860,13 +864,35 @@ void RedWindow_p::win_proc(XEvent& event) } } -void RedWindow_p::sync() +void RedWindow_p::sync(bool shadowed) { + if (shadowed) { + _ignore_foucs = true; + _ignore_pointer = true; + _shadow_foucs_state = _focused; + _shadow_pointer_state = _pointer_in_window; + _shadow_focus_event.xany.serial = 0; + } XSync(x_display, False); XEvent event; while (XCheckWindowEvent(x_display, _win, ~long(0), &event)) { win_proc(event); } + if (!shadowed) { + return; + } + _ignore_foucs = false; + _ignore_pointer = false; + if (_shadow_foucs_state != _focused) { + DBG(0, "put back shadowed focus event"); + XPutBackEvent(x_display, &_shadow_focus_event); + } else if (_shadow_focus_event.xany.serial > 0) { + focus_serial = _shadow_focus_event.xany.serial; + } + if (_shadow_pointer_state != _pointer_in_window) { + DBG(0, "put back shadowed pointer event"); + XPutBackEvent(x_display, &_shadow_pointer_event); + } } void RedWindow_p::wait_for_reparent() @@ -977,7 +1003,9 @@ RedWindow_p::RedWindow_p() : _win (None) , _glcont_copy (NULL) , _icon (NULL) + , _focused (false) , _ignore_foucs (false) + , _pointer_in_window (false) , _ignore_pointer (false) { } @@ -1147,8 +1175,6 @@ RedWindow::RedWindow(RedWindow::Listener& listener, int screen) , _type (TYPE_NORMAL) , _local_cursor (NULL) , _cursor_visible (true) - , _focused (false) - , _pointer_in_window (false) , _trace_key_interception (false) , _key_interception_on (false) , _menu (NULL) @@ -1554,55 +1580,18 @@ void RedWindow::do_start_key_interception() // LeaveNotify and EnterNotify. ASSERT(_focused); - _ignore_foucs = true; - _ignore_pointer = true; - _shadow_foucs_state = true; - _shadow_pointer_state = true; - _shadow_focus_event.xany.serial = 0; XGrabKeyboard(x_display, _win, True, GrabModeAsync, GrabModeAsync, CurrentTime); - sync(); + sync(true); _listener.on_start_key_interception(); - _ignore_foucs = false; - _ignore_pointer = false; _key_interception_on = true; - if (!_shadow_foucs_state) { - DBG(0, "put back shadowed focus out"); - XPutBackEvent(x_display, &_shadow_focus_event); - } else if (_shadow_focus_event.xany.serial > 0) { - ASSERT(focus_window == this); - focus_serial = _shadow_focus_event.xany.serial; - } - - if (!_shadow_pointer_state) { - DBG(0, "put back shadowed pointer leave"); - XPutBackEvent(x_display, &_shadow_pointer_event); - } } void RedWindow::do_stop_key_interception() { - _ignore_foucs = true; - _ignore_pointer = true; - _shadow_foucs_state = _focused; - _shadow_pointer_state = _pointer_in_window; - _shadow_focus_event.xany.serial = 0; XUngrabKeyboard(x_display, CurrentTime); - sync(); + sync(true); _key_interception_on = false; _listener.on_stop_key_interception(); - _ignore_foucs = false; - _ignore_pointer = false; - if (_shadow_foucs_state != _focused) { - DBG(0, "put back shadowed focus event"); - XPutBackEvent(x_display, &_shadow_focus_event); - } else if (_shadow_focus_event.xany.serial > 0) { - focus_serial = _shadow_focus_event.xany.serial; - } - - if (_shadow_pointer_state != _pointer_in_window) { - DBG(0, "put back shadowed pointer event"); - XPutBackEvent(x_display, &_shadow_pointer_event); - } } void RedWindow::start_key_interception() @@ -1659,7 +1648,7 @@ void RedWindow::hide_cursor() void RedWindow::release_mouse() { XUngrabPointer(x_display, CurrentTime); - sync(); + sync(true); } void RedWindow::cupture_mouse() diff --git a/client/x11/red_window_p.h b/client/x11/red_window_p.h index 8b98b4a..ab9ce04 100644 --- a/client/x11/red_window_p.h +++ b/client/x11/red_window_p.h @@ -41,7 +41,7 @@ public: void wait_for_reparent(); void wait_for_map(); void wait_for_unmap(); - void sync(); + void sync(bool shadowed = false); void set_visibale(bool vis) { _visibale = vis;} void move_to_current_desktop(); Window get_window() {return _win;} @@ -60,9 +60,11 @@ protected: Point _show_pos; GLXContext _glcont_copy; Icon* _icon; + bool _focused; bool _ignore_foucs; bool _shadow_foucs_state; XEvent _shadow_focus_event; + bool _pointer_in_window; bool _ignore_pointer; bool _shadow_pointer_state; XEvent _shadow_pointer_event; |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:51:31
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 8ce343daa08d2807428f71f552e22ab5319f8aea Author: Arnon Gilboa <ag...@re...> Date: Wed Dec 30 12:19:54 2009 +0200 spice: on_activate_screen generates on_key_down for any modifier pressed -call SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc...) only once, in RedWindow::init() -add Application::cleanup_globals() & RedWindow::cleanup() -cleanup LowLevelKeyboardProc() diff --git a/client/application.cpp b/client/application.cpp index fb14fff..778d103 100644 --- a/client/application.cpp +++ b/client/application.cpp @@ -914,6 +914,32 @@ void Application::reset_sticky() } +struct ModifierKey { + int modifier; + RedKey key; +}; + +ModifierKey modifier_keys[] = { + {Platform::L_SHIFT_MODIFIER, REDKEY_L_SHIFT}, + {Platform::R_SHIFT_MODIFIER, REDKEY_R_SHIFT}, + {Platform::L_CTRL_MODIFIER, REDKEY_L_CTRL}, + {Platform::R_CTRL_MODIFIER, REDKEY_R_CTRL}, + {Platform::L_ALT_MODIFIER, REDKEY_L_ALT}, + {Platform::R_ALT_MODIFIER, REDKEY_R_ALT}, +}; + +void Application::sync_keyboard_modifiers() +{ + uint32_t modifiers = Platform::get_keyboard_modifiers(); + for (int i = 0; i < sizeof(modifier_keys) / sizeof(modifier_keys[0]); i++) { + if (modifiers & modifier_keys[i].modifier) { + on_key_down(modifier_keys[i].key); + } else { + on_key_up(modifier_keys[i].key); + } + } +} + void Application::on_key_down(RedKey key) { if (key <= 0 || key >= REDKEY_NUM_KEYS) { @@ -1037,6 +1063,7 @@ void Application::on_activate_screen(RedScreen* screen) { ASSERT(!_active_screen || (_active_screen == screen)); _active_screen = screen; + sync_keyboard_modifiers(); } void Application::on_start_screen_key_interception(RedScreen* screen) @@ -1211,6 +1238,7 @@ void Application::exit_full_screen() return; } LOG_INFO(""); + _changing_screens = true; release_capture(); for (int i = 0; i < (int)_screens.size(); i++) { if (_screens[i]) { @@ -1226,27 +1254,16 @@ void Application::exit_full_screen() _full_screen = false; show(); _main_screen->activate(); + _changing_screens = false; } bool Application::toggle_full_screen() { - RedKey shift_pressed = REDKEY_INVALID; - - if (_key_table[REDKEY_L_SHIFT].press) { - shift_pressed = REDKEY_L_SHIFT; - } else if (_key_table[REDKEY_R_SHIFT].press) { - shift_pressed = REDKEY_R_SHIFT; - } if (_full_screen) { exit_full_screen(); } else { enter_full_screen(); } - uint32_t modifiers = Platform::get_keyboard_modifiers(); - if ((shift_pressed == REDKEY_L_SHIFT && (modifiers & Platform::L_SHIFT_MODIFIER)) || - (shift_pressed == REDKEY_R_SHIFT && (modifiers & Platform::R_SHIFT_MODIFIER))) { - on_key_down(shift_pressed); - } return _full_screen; } @@ -1774,15 +1791,25 @@ void Application::init_globals() RedWindow::init(); } +void Application::cleanup_globals() +{ + RedWindow::cleanup(); +} + int Application::main(int argc, char** argv, const char* version_str) { + int ret; + init_globals(); LOG_INFO("starting %s", version_str); std::auto_ptr<Application> app(new Application()); AutoAbort auto_abort(*app.get()); - if (!app->process_cmd_line(argc, argv)) { - return app->_exit_code; + if (app->process_cmd_line(argc, argv)) { + ret = app->run(); + } else { + ret = app->_exit_code; } - return app->run(); + cleanup_globals(); + return ret; } diff --git a/client/application.h b/client/application.h index c576dba..38fd30e 100644 --- a/client/application.h +++ b/client/application.h @@ -208,9 +208,11 @@ private: bool unpress_key(RedKey key); void reset_sticky(); static bool is_sticky_trace_key(RedKey key); + void sync_keyboard_modifiers(); static void init_logger(); static void init_globals(); + static void cleanup_globals(); friend class DisconnectedEvent; friend class ConnectionErrorEvent; diff --git a/client/red_window.h b/client/red_window.h index 0d3e781..6f51f70 100644 --- a/client/red_window.h +++ b/client/red_window.h @@ -86,6 +86,7 @@ public: void unset_type_gl(); static void init(); + static void cleanup(); Listener& get_listener() { return _listener;} diff --git a/client/windows/red_window.cpp b/client/windows/red_window.cpp index 9365c69..554c177 100644 --- a/client/windows/red_window.cpp +++ b/client/windows/red_window.cpp @@ -35,6 +35,7 @@ static ATOM class_atom = 0; static const LPCWSTR win_class_name = L"redc_wclass"; static HWND focus_window = NULL; static HHOOK low_keyboard_hook = NULL; +static bool low_keyboard_hook_on = false; static HHOOK msg_filter_hook = NULL; typedef std::list<RedKey> KeysList; static KeysList filtered_up_keys; @@ -652,30 +653,14 @@ Point RedWindow::get_size() static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { - if ((nCode == HC_ACTION)) { + if (low_keyboard_hook_on && focus_window && nCode == HC_ACTION) { KBDLLHOOKSTRUCT *hooked = (KBDLLHOOKSTRUCT*)lParam; - DWORD dwMsg = 1; - - // dwMsg shall contain the information that would be stored - // in the usual lParam argument of a WM_KEYDOWN message. - // All information like hardware scan code and other flags - // are stored within one double word at different bit offsets. - // Refer to MSDN for further information: - // - // (Keystroke Messages) - dwMsg += hooked->scanCode << 16; - dwMsg += hooked->flags << 24; - - // In some cases scan code of VK_RSHIFT is fake shift (probably a bug) so we - // convert it to non extended code. Also, QEmu doesn't expect num-lock to be - // an extended key. - if ((hooked->vkCode == VK_NUMLOCK) || (hooked->vkCode == VK_RSHIFT)) { + DWORD dwMsg = (hooked->flags << 24) | (hooked->scanCode << 16) | 1; + + if (hooked->vkCode == VK_NUMLOCK || hooked->vkCode == VK_RSHIFT) { dwMsg &= ~(1 << 24); + SendMessage(focus_window, wParam, hooked->vkCode, dwMsg); } - - SendMessage(focus_window, wParam, hooked->vkCode, dwMsg); - - // Forward all modifier key strokes to update keyboard leds & shift/ctrl/alt state switch (hooked->vkCode) { case VK_CAPITAL: case VK_SCROLL: @@ -688,34 +673,25 @@ static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lP case VK_RMENU: break; default: + SendMessage(focus_window, wParam, hooked->vkCode, dwMsg); return 1; } } - - // In all other cases, we call the next hook and return it's value. return CallNextHookEx(NULL, nCode, wParam, lParam); } void RedWindow::do_start_key_interception() { + low_keyboard_hook_on = true; _key_interception_on = true; _listener.on_start_key_interception(); - if (low_keyboard_hook) { - return; - } - low_keyboard_hook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, - GetModuleHandle(NULL), 0); } void RedWindow::do_stop_key_interception() { + low_keyboard_hook_on = false; _key_interception_on = false; _listener.on_stop_key_interception(); - if (!low_keyboard_hook) { - return; - } - UnhookWindowsHookEx(low_keyboard_hook); - low_keyboard_hook = NULL; } void RedWindow::start_key_interception() @@ -745,6 +721,13 @@ void RedWindow::init() if (!(class_atom = register_class(instance))) { THROW("register class failed"); } + low_keyboard_hook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, + GetModuleHandle(NULL), 0); +} + +void RedWindow::cleanup() +{ + UnhookWindowsHookEx(low_keyboard_hook); } #ifdef USE_OGL @@ -788,6 +771,7 @@ void RedWindow::on_focus_out() } _focused = false; + focus_window = NULL; if (_key_interception_on) { do_stop_key_interception(); diff --git a/client/x11/red_window.cpp b/client/x11/red_window.cpp index 2b4228a..1647cd4 100644 --- a/client/x11/red_window.cpp +++ b/client/x11/red_window.cpp @@ -1998,3 +1998,7 @@ void RedWindow::init() #endif } +void RedWindow::cleanup() +{ +} + |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:51:16
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit d8a3c2c12a306eb814cebe8dac894950652f441a Author: Yaniv Kamay <yk...@re...> Date: Mon Dec 28 00:07:23 2009 +0200 use spaces instead of tabs in bitmap_to_c and icon_to_c output diff --git a/tools/bitmap_to_c.c b/tools/bitmap_to_c.c index 3329d5e..e9cd4db 100644 --- a/tools/bitmap_to_c.c +++ b/tools/bitmap_to_c.c @@ -30,6 +30,8 @@ #define TRUE 1 #define FALSE 0 +#define TAB " " + #define ERROR(str) printf("%s: error: %s\n", prog_name, str); exit(-1); static char *prog_name = NULL; @@ -185,8 +187,8 @@ static void do_dump_with_alpha_conversion(const Pixmap *pixmap, FILE *f) for (i = 0; i < pixmap->height; i++) { uint8_t *now = line; for (j = 0; j < pixmap->width; j++, now += 4) { - if ((line_size++ % 6) == 0) { - fprintf(f, "\n\t\t"); + if ((line_size++ % 4) == 0) { + fprintf(f, "\n" TAB); } double alpha = (double)now[3] / 0xff; put_char(f, alpha * now[0]); @@ -207,8 +209,8 @@ static void do_dump_32bpp(const Pixmap *pixmap, FILE *f) for (i = 0; i < pixmap->height; i++) { uint8_t *now = line; for (j = 0; j < pixmap->width; j++, now += 4) { - if ((line_size++ % 6) == 0) { - fprintf(f, "\n\t\t"); + if ((line_size++ % 4) == 0) { + fprintf(f, "\n" TAB); } put_char(f, now[0]); put_char(f, now[1]); @@ -228,8 +230,8 @@ static void do_dump_24bpp(const Pixmap *pixmap, FILE *f) for (i = 0; i < pixmap->height; i++) { uint8_t *now = line; for (j = 0; j < pixmap->width; j++, now += 3) { - if ((line_size++ % 6) == 0) { - fprintf(f, "\n\t\t"); + if ((line_size++ % 4) == 0) { + fprintf(f, "\n" TAB); } put_char(f, now[0]); put_char(f, now[1]); @@ -259,9 +261,9 @@ static int pixmap_to_c_struct(const Pixmap *pixmap, const char *dest_file, const uint32_t data_size = pixmap->width * sizeof(uint32_t) * pixmap->height; fprintf(f, "static const struct {\n" - "\tuint32_t width;\n" - "\tuint32_t height;\n" - "\tuint8_t pixel_data[%u];\n" + TAB "uint32_t width;\n" + TAB "uint32_t height;\n" + TAB "uint8_t pixel_data[%u];\n" "} %s = { %u, %u, {", data_size, image_name, pixmap->width, pixmap->height); diff --git a/tools/icon_to_c.c b/tools/icon_to_c.c index 79ae5fa..0d37ca9 100644 --- a/tools/icon_to_c.c +++ b/tools/icon_to_c.c @@ -29,6 +29,8 @@ #define TRUE 1 #define FALSE 0 +#define TAB " " + #define ERROR(str) printf("%s: error: %s\n", prog_name, str); exit(-1); static char *prog_name = NULL; @@ -213,10 +215,10 @@ static int icon_to_c_struct(const Icon *icon, const char *dest_file, const char uint32_t mask_stride = ALIGN(icon->width, 8) / 8; uint32_t mask_size = mask_stride * icon->height; fprintf(f, "static const struct {\n" - "\tuint32_t width;\n" - "\tuint32_t height;\n" - "\tuint8_t pixmap[%u];\n" - "\tuint8_t mask[%u];\n" + TAB "uint32_t width;\n" + TAB "uint32_t height;\n" + TAB "uint8_t pixmap[%u];\n" + TAB "uint8_t mask[%u];\n" "} %s = { %u, %u, {", pixmap_size, mask_size, image_name, icon->width, icon->height); @@ -226,8 +228,8 @@ static int icon_to_c_struct(const Icon *icon, const char *dest_file, const char for (i = 0; i < icon->height; i++) { uint8_t *now = line; for (j = 0; j < icon->width; j++, now += 4) { - if ((line_size++ % 6) == 0) { - fprintf(f, "\n\t\t"); + if ((line_size++ % 4) == 0) { + fprintf(f, "\n" TAB); } put_char(f, now[0]); put_char(f, now[1]); @@ -239,14 +241,14 @@ static int icon_to_c_struct(const Icon *icon, const char *dest_file, const char fseek(f, -1, SEEK_CUR); - fprintf(f, "},\n\n\t\t{"); + fprintf(f, "},\n\n" TAB TAB "{"); line = (uint8_t *)(icon->mask + ((icon->height - 1) * mask_stride)); line_size = 0; for (i = 0; i < icon->height; i++) { for (j = 0; j < mask_stride; j++) { if (line_size && (line_size % 12) == 0) { - fprintf(f, "\n\t\t "); + fprintf(f, "\n" TAB); } line_size++; put_char(f, line[j]); |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:50:44
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 87f35921c3e8dc654076a2296fae383156da35e7 Author: Yaniv Kamay <yk...@re...> Date: Thu Dec 24 00:45:20 2009 +0200 win client: change avcodec version to 51 diff --git a/client/windows/redc.vcproj b/client/windows/redc.vcproj index ed221ba..3b4b524 100644 --- a/client/windows/redc.vcproj +++ b/client/windows/redc.vcproj @@ -64,7 +64,7 @@ /> <Tool Name="VCLinkerTool" - AdditionalDependencies="log4cppD.lib libqcairo-2.dll.lib libeay32MTd.lib ssleay32MTd.lib ws2_32.lib msimg32.lib winmm.lib avcodec-52.lib avutil-49.lib libcelt_0_5_1D.lib pthreadsD.lib version.lib" + AdditionalDependencies="log4cppD.lib libqcairo-2.dll.lib libeay32MTd.lib ssleay32MTd.lib ws2_32.lib msimg32.lib winmm.lib avcodec-51.lib avutil-49.lib libcelt_0_5_1D.lib pthreadsD.lib version.lib" OutputFile="$(OutDir)\spicec.exe" LinkIncremental="2" AdditionalLibraryDirectories=""$(SPICE_LIBS)\lib"" @@ -144,7 +144,7 @@ /> <Tool Name="VCLinkerTool" - AdditionalDependencies="log4cpp.lib libqcairo-2.dll.lib libeay32MT.lib ssleay32MT.lib ws2_32.lib msimg32.lib winmm.lib avcodec-52.lib avutil-49.lib libcelt_0_5_1.lib pthreads.lib version.lib" + AdditionalDependencies="log4cpp.lib libqcairo-2.dll.lib libeay32MT.lib ssleay32MT.lib ws2_32.lib msimg32.lib winmm.lib avcodec-51.lib avutil-49.lib libcelt_0_5_1.lib pthreads.lib version.lib" OutputFile="$(OutDir)\spicec.exe" LinkIncremental="1" AdditionalLibraryDirectories=""$(SPICE_LIBS)\lib"" |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:49:14
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 8ac07c21f891c95da1699c357d546864c6954350 Author: Izik Eidus <ie...@re...> Date: Wed Dec 23 23:04:25 2009 +0200 spice: fix server crush in case connecting without qxl device Signed-off-by: Izik Eidus <ie...@re...> diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c index 3a5492c..b6c54f3 100644 --- a/server/red_dispatcher.c +++ b/server/red_dispatcher.c @@ -377,6 +377,9 @@ int red_dispatcher_count() uint32_t red_dispatcher_qxl_ram_size() { QXLDevInfo qxl_info; + if (!dispatchers) { + return 0; + } dispatchers->qxl_interface->get_info(dispatchers->qxl_interface, &qxl_info); return qxl_info.ram_size; } |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:49:01
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 032740323dda52be5b2cad0ddae96781072503f8 Author: Izik Eidus <ie...@re...> Date: Wed Dec 23 17:43:12 2009 +0200 spice client: fix wrong gdi-canvas handling of blend_alpha Signed-off-by: Izik Eidus <ie...@re...> diff --git a/common/gdi_canvas.c b/common/gdi_canvas.c index 99079f5..0bd19a4 100644 --- a/common/gdi_canvas.c +++ b/common/gdi_canvas.c @@ -1157,14 +1157,19 @@ void gdi_canvas_draw_transparent(GdiCanvas *canvas, Rect *bbox, Clip *clip, } static void gdi_draw_bitmap_alpha(HDC dest_dc, const Rect *src, const Rect *dest, - HDC src_dc, uint8_t alpha) + HDC src_dc, uint8_t alpha, int use_bitmap_alpha) { BLENDFUNCTION bf; bf.BlendOp = AC_SRC_OVER; bf.BlendFlags = 0; bf.SourceConstantAlpha = alpha; - bf.AlphaFormat = AC_SRC_ALPHA; + + if (use_bitmap_alpha) { + bf.AlphaFormat = AC_SRC_ALPHA; + } else { + bf.AlphaFormat = 0; + } if (!AlphaBlend(dest_dc, dest->left, dest->top, dest->right - dest->left, dest->bottom - dest->top, src_dc, src->left, src->top, @@ -1176,7 +1181,7 @@ static void gdi_draw_bitmap_alpha(HDC dest_dc, const Rect *src, const Rect *dest static void gdi_draw_image_alpha(HDC dest_dc, const Rect *src, const Rect *dest, const uint8_t *bitmap_data, int bit_stride, int bit_width, int bit_height, uint8_t alpha, - int rotate) + int rotate, int use_bitmap_alpha) { HDC dc; HBITMAP bitmap; @@ -1185,7 +1190,7 @@ static void gdi_draw_image_alpha(HDC dest_dc, const Rect *src, const Rect *dest, create_bitmap(&bitmap, &prev_bitmap, &dc, bitmap_data, bit_width, bit_height, bit_stride, 32, rotate); - gdi_draw_bitmap_alpha(dest_dc, src, dest, dc, alpha); + gdi_draw_bitmap_alpha(dest_dc, src, dest, dc, alpha, use_bitmap_alpha); release_bitmap(dc, bitmap, prev_bitmap, 0); } @@ -1195,8 +1200,10 @@ void gdi_canvas_draw_alpha_blend(GdiCanvas *canvas, Rect *bbox, Clip *clip, Alph cairo_surface_t *surface; GdiImage image; BitmapCache *bitmap_cache; + int use_bitmap_alpha; surface = canvas_get_image(&canvas->base, alpha_blend->src_bitmap); + use_bitmap_alpha = cairo_image_surface_get_format(surface) == CAIRO_FORMAT_ARGB32; bitmap_cache = (BitmapCache *)cairo_surface_get_user_data(surface, &bitmap_data_type); Lock lock(*canvas->lock); @@ -1207,7 +1214,8 @@ void gdi_canvas_draw_alpha_blend(GdiCanvas *canvas, Rect *bbox, Clip *clip, Alph dc = create_compatible_dc(); prev_bitmap = (HBITMAP)SelectObject(dc, bitmap_cache->bitmap); - gdi_draw_bitmap_alpha(canvas->dc, &alpha_blend->src_area, bbox, dc, alpha_blend->alpha); + gdi_draw_bitmap_alpha(canvas->dc, &alpha_blend->src_area, bbox, dc, alpha_blend->alpha, + use_bitmap_alpha); SelectObject(dc, prev_bitmap); DeleteObject(dc); ReleaseMutex(bitmap_cache->mutex); @@ -1215,7 +1223,7 @@ void gdi_canvas_draw_alpha_blend(GdiCanvas *canvas, Rect *bbox, Clip *clip, Alph surface_to_image(surface, &image); gdi_draw_image_alpha(canvas->dc, &alpha_blend->src_area, bbox, image.pixels, image.stride, image.width, image.height, - alpha_blend->alpha, 0); + alpha_blend->alpha, 0, use_bitmap_alpha); } cairo_surface_destroy(surface); |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:48:25
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 1c87b17283cec9a6b231a0109861aca71427d2d9 Author: Yaniv Kamay <yk...@re...> Date: Wed Dec 23 22:25:56 2009 +0200 client: new static title image diff --git a/client/windows/static_title.bmp b/client/windows/static_title.bmp index da575ae..e184f62 100644 Binary files a/client/windows/static_title.bmp and b/client/windows/static_title.bmp differ diff --git a/client/x11/images/info_image.c b/client/x11/images/info_image.c index 4750b13..966d0dc 100644 --- a/client/x11/images/info_image.c +++ b/client/x11/images/info_image.c @@ -1,8 +1,8 @@ static const struct { uint32_t width; uint32_t height; - uint8_t pixel_data[29700]; -} _info_image = { 275, 27, { + uint8_t pixel_data[24408]; +} _info_image = { 226, 27, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x12,0x12,0x16,0x4a,0x4a,0x4a,0x53, 0x5e,0x5e,0x5e,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, @@ -39,31 +39,15 @@ static const struct { 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, + 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x12,0x12,0x12,0x16, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53, - 0x12,0x12,0x12,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x28,0x28,0x28,0x69,0x2a,0x2a,0x2a,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x29,0x29,0x29,0x69, - 0x28,0x28,0x28,0x69,0x23,0x23,0x24,0x69,0x27,0x27,0x27,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, + 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x29,0x29,0x29,0x6a,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, + 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x29,0x29,0x29,0x6b, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, @@ -93,19 +77,15 @@ static const struct { 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x10,0x10,0x10,0x16, + 0x2a,0x2a,0x2a,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x10,0x10,0x10,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x29,0x29,0x29,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x16,0x16,0x25,0x69,0x0e,0x0f,0x4d,0x69,0x0b,0x0c,0x49,0x69,0x0a,0x0b,0x41,0x69,0x0a,0x0b,0x43,0x69, - 0x07,0x07,0x2d,0x69,0x12,0x12,0x2b,0x69,0x1f,0x1f,0x23,0x69,0x2a,0x2a,0x2a,0x69,0x29,0x29,0x29,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, + 0x10,0x10,0x10,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, + 0x2e,0x2e,0x31,0x7f,0x2c,0x2c,0x2e,0x7a,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, + 0x2a,0x2a,0x2a,0x69,0x2b,0x2e,0x2b,0x7b,0x2b,0x2b,0x2b,0x76,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, + 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x29,0x29,0x29,0x6d,0x37,0x33,0x33,0x86,0x2c,0x2a,0x2a,0x75,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, @@ -134,29 +114,16 @@ static const struct { 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69, - 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x10,0x10,0x10,0x16,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x28,0x28,0x28,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x25,0x25,0x26,0x69, - 0x0f,0x0f,0x3c,0x69,0x0a,0x0b,0x42,0x69,0x0b,0x0c,0x4a,0x69,0x0c,0x0d,0x4d,0x69,0x0d,0x0e,0x53,0x69,0x0a,0x0a,0x3f,0x69, - 0x0b,0x0c,0x46,0x69,0x10,0x10,0x33,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x28,0x28,0x28,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, + 0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x2a,0x2a,0x2a,0x69,0x5e,0x5e,0x5e,0x69, + 0x4a,0x4a,0x4a,0x53,0x10,0x10,0x10,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53, + 0x5e,0x5e,0x5e,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, + 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x2a,0x2a,0x2c,0x76,0x4e,0x4e,0x5f,0xa2,0x4c,0x4c,0x59,0x9a, + 0x2a,0x2a,0x2b,0x72,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x2b,0x29,0x74,0x48,0x5a,0x48,0x9f, + 0x49,0x55,0x49,0x99,0x2a,0x2a,0x2a,0x71,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, + 0x3a,0x33,0x33,0x83,0x6e,0x5b,0x5b,0xac,0x4d,0x44,0x44,0x93,0x29,0x29,0x29,0x6d,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, @@ -185,19 +152,16 @@ static const struct { 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x1e,0x1e,0x22,0x69,0x0b,0x0b,0x45,0x69, - 0x02,0x03,0x12,0x69,0x05,0x05,0x23,0x69,0x09,0x0a,0x3d,0x69,0x0d,0x0e,0x51,0x69,0x0d,0x0e,0x51,0x69,0x0d,0x0e,0x52,0x69, - 0x0e,0x0f,0x4a,0x69,0x22,0x22,0x23,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, + 0x28,0x28,0x28,0x6b,0x3a,0x3a,0x4b,0x90,0x65,0x65,0x88,0xb2,0x6b,0x6b,0x85,0xb1,0x41,0x41,0x4a,0x8f,0x28,0x28,0x29,0x6c, + 0x29,0x29,0x29,0x69,0x28,0x28,0x28,0x6a,0x32,0x45,0x32,0x8d,0x5a,0x84,0x5a,0xb1,0x64,0x81,0x64,0xb0,0x3e,0x46,0x3e,0x8d, + 0x28,0x29,0x28,0x6b,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x2b,0x29,0x29,0x74,0x60,0x48,0x48,0x9f,0x91,0x6f,0x6f,0xb4, + 0x7a,0x63,0x63,0xae,0x3e,0x38,0x38,0x88,0x28,0x28,0x28,0x6a,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, @@ -222,53 +186,40 @@ static const struct { 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x60,0x60,0x60,0x69, - 0x46,0x46,0x46,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69,0x29,0x29,0x29,0x69, - 0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16, - 0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x27,0x27,0x27,0x69, - 0x26,0x26,0x26,0x69,0x19,0x19,0x21,0x69,0x15,0x15,0x25,0x69,0x19,0x19,0x21,0x69,0x0b,0x0c,0x4a,0x69,0x0d,0x0e,0x54,0x69, - 0x0d,0x0e,0x54,0x69,0x0d,0x0e,0x51,0x69,0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4f,0x69,0x0d,0x0e,0x54,0x69, - 0x13,0x14,0x27,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, + 0x29,0x29,0x29,0x69,0x5e,0x5e,0x5e,0x69,0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5e,0x5e,0x5e,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, + 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, + 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, + 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x2a,0x2a,0x32,0x7f,0x4a,0x4a,0x72,0xaa, + 0x64,0x64,0x92,0xb4,0x6e,0x6e,0x92,0xb4,0x61,0x61,0x75,0xab,0x35,0x35,0x3a,0x83,0x28,0x28,0x28,0x69,0x26,0x30,0x26,0x7c, + 0x3b,0x6e,0x3b,0xa8,0x58,0x92,0x58,0xb4,0x68,0x92,0x68,0xb4,0x5d,0x72,0x5d,0xab,0x32,0x36,0x32,0x82,0x28,0x28,0x28,0x69, + 0x28,0x27,0x27,0x6b,0x45,0x33,0x33,0x8e,0x84,0x58,0x58,0xb1,0x92,0x69,0x69,0xb4,0x92,0x70,0x70,0xb4,0x6a,0x57,0x57,0xa6, + 0x30,0x2d,0x2d,0x7c,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, + 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x35,0x35,0x35,0x69,0x5c,0x5c,0x5c,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x39,0x39,0x39,0x69, - 0x57,0x57,0x57,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x31,0x31,0x31,0x69,0x5c,0x5c,0x5c,0x69,0x31,0x31,0x31,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x4a,0x4a,0x4a,0x69,0x69,0x69,0x69,0x69,0x35,0x35,0x35,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x2c,0x2c,0x2c,0x69,0x69,0x69,0x69,0x69, - 0x53,0x53,0x53,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x31,0x31,0x31,0x69,0x5c,0x5c,0x5c,0x69,0x31,0x31,0x31,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x35,0x35,0x35,0x69,0x5c,0x5c,0x5c,0x69,0x28,0x28,0x28,0x69,0x4a,0x4a,0x4a,0x69,0x69,0x69,0x69,0x69, - 0x35,0x35,0x35,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x46,0x46,0x46,0x69,0x4f,0x4f,0x4f,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x4a,0x4a,0x4a,0x69,0x69,0x69,0x69,0x69,0x35,0x35,0x35,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, - 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x60,0x60,0x60,0x69,0x46,0x46,0x46,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69, @@ -279,21 +230,13 @@ static const struct { 0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x28,0x28,0x28,0x69,0x5e,0x5e,0x5e,0x69, 0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53, - 0x5d,0x5d,0x5d,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x10,0x10,0x31,0x69, - 0x0e,0x0e,0x56,0x69,0x0e,0x0f,0x58,0x69,0x05,0x05,0x23,0x69,0x00,0x00,0x05,0x69,0x13,0x13,0x27,0x69,0x0f,0x0f,0x3b,0x69, - 0x0e,0x0f,0x4c,0x69,0x0c,0x0d,0x50,0x69,0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4f,0x69,0x0d,0x0e,0x54,0x69,0x10,0x10,0x30,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x53,0x53,0x53,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x69,0x69,0x69,0x69,0x46,0x46,0x46,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x60,0x60,0x60,0x69,0x4f,0x4f,0x4f,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x4f,0x4f,0x4f,0x69,0x60,0x60,0x60,0x69, + 0x5d,0x5d,0x5d,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x57,0x57,0x57,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69,0x30,0x30,0x30,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x26,0x26,0x28,0x70,0x35,0x35,0x57,0x9b,0x52,0x52,0x8d,0xb3,0x5d,0x5d,0x92,0xb4,0x67,0x67,0x92,0xb4, + 0x70,0x70,0x90,0xb4,0x55,0x55,0x64,0xa3,0x2a,0x2b,0x2c,0x7e,0x26,0x52,0x26,0x98,0x3b,0x8c,0x3b,0xb3,0x4d,0x92,0x4d,0xb4, + 0x5d,0x92,0x5d,0xb4,0x6c,0x90,0x6c,0xb4,0x52,0x61,0x52,0xa1,0x2a,0x2b,0x2a,0x77,0x30,0x28,0x28,0x7c,0x6c,0x40,0x40,0xa8, + 0x92,0x58,0x58,0xb4,0x92,0x61,0x61,0xb4,0x92,0x69,0x69,0xb4,0x8d,0x6e,0x6e,0xb3,0x59,0x4a,0x4a,0x9b,0x29,0x28,0x28,0x72, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, @@ -301,45 +244,16 @@ static const struct { 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x46,0x46,0x46,0x69,0x69,0x69,0x69,0x69,0x39,0x39,0x39,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x64,0x64,0x64,0x69,0x53,0x53,0x53,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69,0x30,0x30,0x30,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x60,0x60,0x60,0x69,0x4f,0x4f,0x4f,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x60,0x60,0x60,0x69,0x46,0x46,0x46,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x46,0x46,0x46,0x69,0x60,0x60,0x60,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x46,0x46,0x46,0x69,0x27,0x27,0x27,0x69,0x46,0x46,0x46,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x46,0x46,0x46,0x69, - 0x27,0x27,0x27,0x69,0x35,0x35,0x35,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x3d,0x3d,0x3d,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x46,0x46,0x46,0x69,0x64,0x64,0x64,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x53,0x53,0x53,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x53,0x53,0x53,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x5b,0x5b,0x5b,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x5d,0x5d,0x5d,0x69,0x4a,0x4a,0x4a,0x53, - 0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5d,0x5d,0x5d,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x12,0x12,0x29,0x69,0x0d,0x0e,0x55,0x69, - 0x0d,0x0e,0x51,0x69,0x0b,0x0c,0x4c,0x69,0x06,0x06,0x25,0x69,0x25,0x25,0x25,0x69,0x27,0x27,0x27,0x69,0x1e,0x1e,0x20,0x69, - 0x0b,0x0c,0x49,0x69,0x0d,0x0e,0x50,0x69,0x0c,0x0d,0x4f,0x69,0x0d,0x0e,0x52,0x69,0x0f,0x10,0x33,0x69,0x10,0x10,0x32,0x69, - 0x17,0x17,0x21,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x69,0x69,0x69,0x69, - 0x41,0x41,0x41,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x38,0x38,0x38,0x69,0x69,0x69,0x69,0x69,0x46,0x46,0x46,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x41,0x41,0x41,0x69, - 0x69,0x69,0x69,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x69,0x69,0x69,0x69,0x46,0x46,0x46,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x60,0x60,0x60,0x69, - 0x4e,0x4e,0x4e,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x4e,0x4e,0x4e,0x69,0x60,0x60,0x60,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x57,0x57,0x57,0x69, - 0x57,0x57,0x57,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69,0x2f,0x2f,0x2f,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, @@ -347,355 +261,323 @@ static const struct { 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x2b,0x2b,0x2b,0x69,0x64,0x64,0x64,0x69,0x4a,0x4a,0x4a,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x3c,0x3c,0x3c,0x69, - 0x69,0x69,0x69,0x69,0x38,0x38,0x38,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x41,0x41,0x41,0x69, - 0x69,0x69,0x69,0x69,0x2f,0x2f,0x2f,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x41,0x41,0x41,0x69, - 0x69,0x69,0x69,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x60,0x60,0x60,0x69,0x4e,0x4e,0x4e,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x60,0x60,0x60,0x69,0x46,0x46,0x46,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, - 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x3c,0x3c,0x3c,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x2b,0x2b,0x2b,0x69,0x46,0x46,0x46,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x41,0x41,0x41,0x69, - 0x34,0x34,0x34,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69,0x27,0x27,0x27,0x69,0x4e,0x4e,0x4e,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x53,0x53,0x53,0x69, - 0x27,0x27,0x27,0x69,0x53,0x53,0x53,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x5b,0x5b,0x5b,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x5d,0x5d,0x5d,0x69,0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5d,0x5d,0x5d,0x69,0x26,0x26,0x26,0x69, - 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x25,0x25,0x25,0x69,0x10,0x11,0x2c,0x69,0x0e,0x0f,0x52,0x69, - 0x0d,0x0e,0x51,0x69,0x0d,0x0e,0x54,0x69,0x0e,0x0e,0x45,0x69,0x11,0x11,0x2a,0x69,0x1c,0x1c,0x20,0x69,0x08,0x09,0x36,0x69, - 0x0d,0x0e,0x52,0x69,0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4e,0x69,0x0d,0x0e,0x53,0x69,0x0e,0x0f,0x52,0x69, - 0x17,0x17,0x20,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x69,0x69,0x69,0x69,0x41,0x41,0x41,0x69, - 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x60,0x60,0x60,0x69,0x4a,0x4a,0x4a,0x69,0x26,0x26,0x26,0x69, - 0x38,0x38,0x38,0x69,0x60,0x60,0x60,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x45,0x45,0x45,0x69,0x26,0x26,0x26,0x69, - 0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x5b,0x5b,0x5b,0x69,0x69,0x69,0x69,0x69, - 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x69,0x69,0x69,0x69, - 0x45,0x45,0x45,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x60,0x60,0x60,0x69,0x4e,0x4e,0x4e,0x69, - 0x26,0x26,0x26,0x69,0x33,0x33,0x33,0x69,0x64,0x64,0x64,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x52,0x52,0x52,0x69, - 0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x41,0x41,0x41,0x69, - 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x57,0x57,0x57,0x69,0x57,0x57,0x57,0x69, - 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69, - 0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x33,0x33,0x33,0x69,0x38,0x38,0x38,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x4e,0x4e,0x4e,0x69,0x26,0x26,0x26,0x69,0x38,0x38,0x38,0x69, - 0x60,0x60,0x60,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x45,0x45,0x45,0x69,0x26,0x26,0x26,0x69,0x38,0x38,0x38,0x69, - 0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x69,0x69,0x69,0x69,0x52,0x52,0x52,0x69,0x38,0x38,0x38,0x69,0x69,0x69,0x69,0x69, - 0x5b,0x5b,0x5b,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x41,0x41,0x41,0x69,0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69, - 0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x69,0x69,0x69,0x69,0x45,0x45,0x45,0x69,0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69, - 0x2f,0x2f,0x2f,0x69,0x2b,0x2b,0x2b,0x69,0x5b,0x5b,0x5b,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x5b,0x5b,0x5b,0x69, - 0x2f,0x2f,0x2f,0x69,0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69, - 0x38,0x38,0x38,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, - 0x4e,0x4e,0x4e,0x69,0x64,0x64,0x64,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x4e,0x4e,0x4e,0x69,0x64,0x64,0x64,0x69, - 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x60,0x60,0x60,0x69,0x4e,0x4e,0x4e,0x69,0x26,0x26,0x26,0x69,0x69,0x69,0x69,0x69, - 0x60,0x60,0x60,0x69,0x69,0x69,0x69,0x69,0x64,0x64,0x64,0x69,0x38,0x38,0x38,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x4e,0x4e,0x4e,0x69,0x26,0x26,0x26,0x69,0x69,0x69,0x69,0x69,0x45,0x45,0x45,0x69,0x26,0x26,0x26,0x69, - 0x38,0x38,0x38,0x69,0x69,0x69,0x69,0x69,0x38,0x38,0x38,0x69,0x26,0x26,0x26,0x69,0x4e,0x4e,0x4e,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x38,0x38,0x38,0x69,0x26,0x26,0x26,0x69,0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69, - 0x26,0x26,0x26,0x69,0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69,0x2f,0x2f,0x2f,0x69,0x2f,0x2f,0x2f,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x4e,0x4e,0x4e,0x69,0x26,0x26,0x26,0x69,0x41,0x41,0x41,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x45,0x45,0x45,0x69,0x26,0x26,0x26,0x69,0x57,0x57,0x57,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x2f,0x2f,0x2f,0x69,0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69, - 0x2f,0x2f,0x2f,0x69,0x26,0x26,0x26,0x69,0x41,0x41,0x41,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69, - 0x38,0x38,0x38,0x69,0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x60,0x60,0x60,0x69,0x69,0x69,0x69,0x69, - 0x60,0x60,0x60,0x69,0x33,0x33,0x33,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, - 0x26,0x26,0x26,0x69,0x60,0x60,0x60,0x69,0x45,0x45,0x45,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, - 0x26,0x26,0x26,0x69,0x4a,0x4a,0x4a,0x69,0x69,0x69,0x69,0x69,0x64,0x64,0x64,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, - 0x4a,0x4a,0x4a,0x69,0x3c,0x3c,0x3c,0x69,0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x64,0x64,0x64,0x69, - 0x26,0x26,0x26,0x69,0x2b,0x2b,0x2b,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x4a,0x4a,0x4a,0x69,0x33,0x33,0x33,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69,0x2f,0x2f,0x2f,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x4e,0x4e,0x4e,0x69,0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x52,0x52,0x52,0x69,0x26,0x26,0x26,0x69, - 0x52,0x52,0x52,0x69,0x69,0x69,0x69,0x69,0x52,0x52,0x52,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5d,0x5d,0x5d,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x6a,0x28,0x28,0x3e,0x88, + 0x3d,0x3d,0x7f,0xb0,0x4c,0x4c,0x92,0xb4,0x56,0x56,0x92,0xb4,0x60,0x60,0x92,0xb4,0x69,0x69,0x92,0xb4,0x6e,0x6e,0x8a,0xb3, + 0x46,0x53,0x51,0xa6,0x23,0x76,0x23,0xb0,0x32,0x92,0x32,0xb4,0x43,0x92,0x43,0xb4,0x52,0x92,0x52,0xb4,0x62,0x92,0x62,0xb4, + 0x6c,0x8a,0x6c,0xb3,0x48,0x50,0x46,0x99,0x52,0x30,0x30,0x9b,0x8d,0x46,0x46,0xb3,0x92,0x51,0x51,0xb4,0x92,0x58,0x58,0xb4, + 0x92,0x61,0x61,0xb4,0x92,0x69,0x69,0xb4,0x83,0x66,0x66,0xb1,0x47,0x3e,0x3e,0x8f,0x26,0x26,0x26,0x6c,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x37,0x37,0x37,0x75,0x6c,0x6c,0x6c,0x99,0x7e,0x7e,0x7e,0xa6,0x7c,0x7c,0x7c,0xa4,0x71,0x71,0x71,0x9d,0x44,0x44,0x44,0x7e, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x78,0x78,0x78,0xa2,0x60,0x60,0x60,0x91,0x2e,0x2e,0x2e,0x6e,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x35,0x35,0x35,0x73,0x61,0x61,0x61,0x92, + 0x77,0x77,0x77,0xa1,0x7e,0x7e,0x7e,0xa6,0x77,0x77,0x77,0xa1,0x60,0x60,0x60,0x91,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x53,0x53,0x53,0x88, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7c,0x7c,0x7c,0xa5,0x6d,0x6d,0x6d,0x9a, + 0x3a,0x3a,0x3a,0x77,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x53,0x53,0x53,0x88,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x74,0x74,0x74,0x9f,0x27,0x27,0x27,0x6a,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x6a,0x74,0x74,0x74,0x9f,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x3e,0x3e,0x3e,0x79,0x6a,0x6a,0x6a,0x98, + 0x7c,0x7c,0x7c,0xa4,0x7c,0x7c,0x7c,0xa4,0x6a,0x6a,0x6a,0x98,0x3f,0x3f,0x3f,0x7a,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x53,0x53,0x53,0x88,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x35,0x35,0x35,0x73,0x61,0x61,0x61,0x92, + 0x77,0x77,0x77,0xa1,0x7e,0x7e,0x7e,0xa6,0x77,0x77,0x77,0xa1,0x60,0x60,0x60,0x91,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x53,0x53,0x53,0x88,0x27,0x27,0x27,0x69, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x59,0x59,0x59,0x8c,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69,0x27,0x27,0x27,0x69, + 0x27,0x27,0x27,0x69,0x5d,0x5d,0x5d,0x69,0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5d,0x5d,0x5d,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, - 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x5d,0x5d,0x5d,0x69,0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53,0x5d,0x5d,0x5d,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, - 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x12,0x12,0x25,0x69,0x0c,0x0d,0x4e,0x69, - 0x0d,0x0e,0x54,0x69,0x0d,0x0e,0x51,0x69,0x0d,0x0e,0x54,0x69,0x0d,0x0e,0x50,0x69,0x0c,0x0d,0x4d,0x69,0x0c,0x0d,0x4f,0x69, - 0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4f,0x69,0x0c,0x0d,0x4f,0x69,0x0e,0x0e,0x56,0x69,0x12,0x13,0x25,0x69, - 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x69,0x69,0x69,0x69,0x40,0x40,0x40,0x69,0x25,0x25,0x25,0x69, - 0x25,0x25,0x25,0x69,0x37,0x37,0x37,0x69,0x69,0x69,0x69,0x69,0x40,0x40,0x40,0x69,0x2a,0x2a,0x2a,0x69,0x64,0x64,0x64,0x69, - 0x45,0x45,0x45,0x69,0x25,0x25,0x25,0x69,0x3c,0x3c,0x3c,0x69,0x69,0x69,0x69,0x69,0x33,0x33,0x33,0x69,0x37,0x37,0x37,0x69, - 0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69,0x25,0x25,0x25,0x69,0x57,0x57,0x57,0x69,0x69,0x69,0x69,0x69,0x25,0x25,0x25,0x69, - 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x4e,0x4e,0x4e,0x69,0x25,0x25,0x25,0x69, - 0x25,0x25,0x25,0x69,0x3c,0x3c,0x3c,0x69,0x25,0x25,0x25,0x69,0x37,0x37,0x37,0x69,0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69, - 0x25,0x25,0x25,0x69,0x4e,0x4e,0x4e,0x69,0x5f,0x5f,0x5f,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, - 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x57,0x57,0x57,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x2e,0x2e,0x2e,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69, - 0x3c,0x3c,0x3c,0x69,0x2a,0x2a,0x2a,0x69,0x5f,0x5f,0x5f,0x69,0x52,0x52,0x52,0x69,0x25,0x25,0x25,0x69,0x40,0x40,0x40,0x69, - 0x69,0x69,0x69,0x69,0x2e,0x2e,0x2e,0x69,0x25,0x25,0x25,0x69,0x2a,0x2a,0x2a,0x69,0x64,0x64,0x64,0x69,0x45,0x45,0x45,0x69, - 0x25,0x25,0x25,0x69,0x3c,0x3c,0x3c,0x69,0x69,0x69,0x69,0x69,0x33,0x33,0x33,0x69,0x37,0x37,0x37,0x69,0x69,0x69,0x69,0x69, - 0x49,0x49,0x49,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x37,0x37,0x37,0x69,0x69,0x69,0x69,0x69,0x4e,0x4e,0x4e,0x69, - 0x25,0x25,0x25,0x69,0x49,0x49,0x49,0x69,0x69,0x69,0x69,0x69,0x2a,0x2a,0x2a,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69, - 0x3c,0x3c,0x3c,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x40,0x40,0x40,0x69,0x69,0x69,0x69,0x69,0x2e,0x2e,0x2e,0x69, - 0x3c,0x3c,0x3c,0x69,0x69,0x69,0x69,0x69,0x37,0x37,0x37,0x69,0x2a,0x2a,0x2a,0x69,0x45,0x45,0x45,0x69,0x25,0x25,0x25,0x69, - 0x37,0x37,0x37,0x69,0x69,0x69,0x69,0x69,0x33,0x33,0x33,0x69,0x25,0x25,0x25,0x69,0x49,0x49,0x49,0x69,0x64,0x64,0x64,0x69, - 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x3c,0x3c,0x3c,0x69, - 0x69,0x69,0x69,0x69,0x37,0x37,0x37,0x69,0x25,0x25,0x25,0x69,0x64,0x64,0x64,0x69,0x49,0x49,0x49,0x69,0x25,0x25,0x25,0x69, - 0x25,0x25,0x25,0x69,0x5f,0x5f,0x5f,0x69,0x4e,0x4e,0x4e,0x69,0x25,0x25,0x25,0x69,0x69,0x69,0x69,0x69,0x5b,0x5b,0x5b,0x69, - 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x40,0x40,0x40,0x69,0x69,0x69,0x69,0x69,0x2e,0x2e,0x2e,0x69, - 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x69,0x69,0x69,0x69,0x45,0x45,0x45,0x69,0x25,0x25,0x25,0x69,0x37,0x37,0x37,0x69, - 0x69,0x69,0x69,0x69,0x37,0x37,0x37,0x69,0x25,0x25,0x25,0x69,0x37,0x37,0x37,0x69,0x2a,0x2a,0x2a,0x69,0x25,0x25,0x25,0x69, - 0x57,0x57,0x57,0x69,0x5b,0x5b,0x5b,0x69,0x25,0x25,0x25,0x69,0x40,0x40,0x40,0x69,0x69,0x69,0x69,0x69,0x25,0x25,0x25,0x69, - 0x40,0x40,0x40,0x69,0x69,0x69,0x69,0x69,0x2e,0x2e,0x2e,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, - 0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x37,0x37,0x37,0x69,0x25,0x25,0x25,0x69,0x2e,0x2e,0x2e,0x69,0x33,0x33,0x33,0x69, - 0x25,0x25,0x25,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x2a,0x2a,0x2a,0x69,0x25,0x25,0x25,0x69,0x5f,0x5f,0x5f,0x69, - 0x4e,0x4e,0x4e,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x40,0x40,0x40,0x69,0x69,0x69,0x69,0x69,0x2e,0x2e,0x2e,0x69, - 0x37,0x37,0x37,0x69,0x69,0x69,0x69,0x69,0x45,0x45,0x45,0x69,0x25,0x25,0x25,0x69,0x52,0x52,0x52,0x69,0x64,0x64,0x64,0x69, - 0x2a,0x2a,0x2a,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69,0x2a,0x2a,0x2a,0x69,0x5f,0x5f,0x5f,0x69, - 0x52,0x52,0x52,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, - 0x5f,0x5f,0x5f,0x69,0x45,0x45,0x45,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, - 0x37,0x37,0x37,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x64,0x64,0x64,0x69,0x49,0x49,0x49,0x69, - 0x2e,0x2e,0x2e,0x69,0x25,0x25,0x25,0x69,0x45,0x45,0x45,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69,0x33,0x33,0x33,0x69,0x69,0x69,0x69,0x69, - 0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69,0x3c,0x3c,0x3c,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x3c,0x3c,0x3c,0x69, - 0x25,0x25,0x25,0x69,0x2a,0x2a,0x2a,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x52,0x52,0x52,0x69, - 0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x33,0x33,0x33,0x69,0x25,0x25,0x25,0x69, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x24,0x24,0x2b,0x78,0x2b,0x2b,0x65,0xa4,0x3c,0x3c,0x91,0xb4,0x45,0x45,0x92,0xb4, + 0x4f,0x4f,0x92,0xb4,0x59,0x59,0x92,0xb4,0x63,0x63,0x92,0xb4,0x6c,0x6c,0x92,0xb4,0x66,0x6b,0x7f,0xb4,0x37,0x74,0x3e,0xb4, + 0x28,0x8f,0x28,0xb4,0x37,0x92,0x37,0xb4,0x48,0x92,0x48,0xb4,0x58,0x92,0x58,0xb4,0x68,0x92,0x68,0xb4,0x68,0x7c,0x65,0xb2, + 0x6e,0x4a,0x44,0xb3,0x8f,0x40,0x40,0xb4,0x92,0x49,0x49,0xb4,0x92,0x51,0x51,0xb4,0x92,0x59,0x59,0xb4,0x92,0x62,0x62,0xb4, + 0x92,0x6a,0x6a,0xb4,0x74,0x5b,0x5b,0xac,0x36,0x31,0x31,0x84,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x6f,0x6f,0x6f,0x9c,0x7f,0x7f,0x7f,0xa7, + 0x56,0x56,0x56,0x8a,0x47,0x47,0x47,0x80,0x58,0x58,0x58,0x8c,0x4a,0x4a,0x4a,0x82,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x45,0x45,0x45,0x7e,0x46,0x46,0x46,0x7f,0x62,0x62,0x62,0x93,0x7f,0x7f,0x7f,0xa7, + 0x67,0x67,0x67,0x96,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x37,0x37,0x37,0x75,0x7b,0x7b,0x7b,0xa4,0x7c,0x7c,0x7c,0xa5,0x57,0x57,0x57,0x8b,0x46,0x46,0x46,0x7f, + 0x4f,0x4f,0x4f,0x86,0x6f,0x6f,0x6f,0x9c,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x35,0x35,0x35,0x74,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x45,0x45,0x45,0x7e,0x5a,0x5a,0x5a,0x8d,0x7f,0x7f,0x7f,0xa7,0x72,0x72,0x72,0x9e,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e, + 0x35,0x35,0x35,0x74,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x42,0x42,0x42,0x7c, + 0x26,0x26,0x26,0x69,0x42,0x42,0x42,0x7c,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x3f,0x3f,0x3f,0x7a,0x7e,0x7e,0x7e,0xa6,0x77,0x77,0x77,0xa1,0x4c,0x4c,0x4c,0x83,0x4d,0x4d,0x4d,0x84, + 0x77,0x77,0x77,0xa1,0x7e,0x7e,0x7e,0xa6,0x3f,0x3f,0x3f,0x7a,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x7e, + 0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e, + 0x45,0x45,0x45,0x7e,0x35,0x35,0x35,0x74,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x37,0x37,0x37,0x75,0x7b,0x7b,0x7b,0xa4,0x7c,0x7c,0x7c,0xa5,0x57,0x57,0x57,0x8b,0x46,0x46,0x46,0x7f, + 0x4f,0x4f,0x4f,0x86,0x6f,0x6f,0x6f,0x9c,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x45,0x45,0x45,0x7e, + 0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x35,0x35,0x35,0x74,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x7c,0x7c,0x7c,0xa4,0x2e,0x2e,0x2e,0x6e,0x26,0x26,0x26,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x45,0x45,0x45,0x7e,0x45,0x45,0x45,0x7e,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69, + 0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x26,0x26,0x26,0x69,0x5d,0x5d,0x5d,0x69, + 0x4a,0x4a,0x4a,0x53,0x0f,0x0f,0x0f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x16,0x4a,0x4a,0x4a,0x53, + 0x5d,0x5d,0x5d,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x24,0x24,0x25,0x6c, + 0x20,0x20,0x49,0x93,0x29,0x29,0x88,0xb3,0x34,0x34,0x92,0xb4,0x3e,0x3e,0x92,0xb4,0x48,0x48,0x92,0xb4,0x51,0x51,0x92,0xb4, + 0x5b,0x5b,0x92,0xb4,0x65,0x65,0x92,0xb4,0x6f,0x6f,0x91,0xb4,0x5b,0x6b,0x6e,0xb4,0x2d,0x7a,0x31,0xb4,0x2d,0x91,0x2d,0xb4, + 0x3d,0x92,0x3d,0xb4,0x4d,0x92,0x4d,0xb4,0x5d,0x92,0x5d,0xb4,0x6d,0x90,0x6d,0xb4,0x6c,0x6f,0x5e,0xb4,0x7a,0x40,0x3e,0xb4, + 0x91,0x41,0x41,0xb4,0x92,0x4a,0x4a,0xb4,0x92,0x52,0x52,0xb4,0x92,0x5b,0x5b,0xb4,0x92,0x62,0x62,0xb4,0x90,0x6a,0x6a,0xb4, + 0x63,0x4f,0x4f,0xa3,0x2c,0x29,0x29,0x79,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x7d,0x7d,0x7d,0xa6,0x7f,0x7f,0x7f,0xa7,0x3a,0x3a,0x3a,0x78,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x29,0x29,0x29,0x6c,0x7f,0x7f,0x7f,0xa7,0x7d,0x7d,0x7d,0xa6,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x66,0x66,0x66,0x96, + 0x7f,0x7f,0x7f,0xa7,0x47,0x47,0x47,0x81,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x26,0x26,0x26,0x6a, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x2c,0x2c,0x2c,0x6e,0x2c,0x2c,0x2c,0x6e, + 0x2c,0x2c,0x2c,0x6e,0x29,0x29,0x29,0x6b,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x25,0x25,0x25,0x69, + 0x28,0x28,0x28,0x6b,0x7f,0x7f,0x7f,0xa7,0x7c,0x7c,0x7c,0xa5,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa7, + 0x7f,0x7f,0x7f,0xa7,0x2c,0x2c,0x2c,0x6e,0x2c,0x2c,0x2c,0x6e,0x2c,0x2c,0x2c,0x6e,0x29,0x29,0x29,0x6b,0x25,0x25,0x25,0x69, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x71,0x71,0x71,0x9d,0x66,0x66,0x66,0x96,0x25,0x25,0x25,0x69,0x68,0x68,0x68,0x97, + 0x71,0x71,0x71,0x9d,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x6a,0x6a,0x6a,0x99, + 0x7f,0x7f,0x7f,0xa7,0x3f,0x3f,0x3f,0x7b,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x40,0x40,0x40,0x7b,0x7f,0x7f,0x7f,0xa7, + 0x69,0x69,0x69,0x98,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x2c,0x2c,0x2c,0x6e,0x2c,0x2c,0x2c,0x6e,0x2c,0x2c,0x2c,0x6e,0x29,0x29,0x29,0x6b, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x66,0x66,0x66,0x96, + 0x7f,0x7f,0x7f,0xa7,0x47,0x47,0x47,0x81,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x26,0x26,0x26,0x6a, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa7,0x7f,0x7f,0x7f,0xa7,0x25,0x25,0x25,0x69, + 0x25,0x25,0x25,0x69,0x7f,0x7f,0x7f,0xa7,0... [truncated message content] |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:47:21
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 6333e034a3dbe00a9826cb5d802477dd78047221 Author: Izik Eidus <ie...@re...> Date: Tue Dec 22 06:52:14 2009 +0200 spice: fix ssl compiling errors (openssl api was changed, so lets have ifdef to compile in all cases) Signed-off-by: Izik Eidus <ie...@re...> diff --git a/client/red_peer.cpp b/client/red_peer.cpp index e20d5ca..d086872 100644 --- a/client/red_peer.cpp +++ b/client/red_peer.cpp @@ -174,7 +174,11 @@ void RedPeer::connect_secure(const ConnectionOptions& options, uint32_t ip) ASSERT(_ctx == NULL && _ssl == NULL && _peer != INVALID_SOCKET); try { +#if OPENSSL_VERSION_NUMBER >= 0x10000000L + const SSL_METHOD *ssl_method = TLSv1_method(); +#else SSL_METHOD *ssl_method = TLSv1_method(); +#endif _ctx = SSL_CTX_new(ssl_method); if (_ctx == NULL) { diff --git a/server/reds.c b/server/reds.c index 54225dc..38a6538 100644 --- a/server/reds.c +++ b/server/reds.c @@ -3163,7 +3163,11 @@ static void openssl_thread_setup() static void reds_init_ssl() { +#if OPENSSL_VERSION_NUMBER >= 0x10000000L + const SSL_METHOD *ssl_method; +#else SSL_METHOD *ssl_method; +#endif int return_code; long ssl_options = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3; |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:47:12
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 6b065f80dee389490c20289beb97415b06108d02 Author: Izik Eidus <ie...@re...> Date: Thu Dec 17 20:45:09 2009 +0200 spice: client: add checks to see if it is safe to use XShem. Beacuse that XShem internal checks wont fail when using the spice client from remote, we are adding check on the socket family to see if it is unix domain socket and fail in case it is not. Signed-off-by: Izik Eidus <ie...@re...> diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp index 217664a..d00092b 100644 --- a/client/x11/platform.cpp +++ b/client/x11/platform.cpp @@ -26,7 +26,9 @@ #include <X11/extensions/render.h> #include <X11/extensions/XKB.h> #include <X11/extensions/Xrender.h> +#include <X11/extensions/XShm.h> #include <unistd.h> +#include <sys/socket.h> #include <sys/epoll.h> #include <sys/resource.h> #include <sys/types.h> @@ -63,6 +65,7 @@ #endif static Display* x_display = NULL; +static bool x_shm_avail = false; static XVisualInfo **vinfo = NULL; static GLXFBConfig **fb_config; @@ -183,6 +186,11 @@ Display* XPlatform::get_display() return x_display; } +bool XPlatform::is_x_shm_avail() +{ + return x_shm_avail; +} + XVisualInfo** XPlatform::get_vinfo() { return vinfo; @@ -2069,6 +2077,9 @@ void Platform::init() { int err, ev; int threads_enable; + int connection_fd; + socklen_t sock_len; + struct sockaddr sock_addr; DBG(0, ""); @@ -2079,6 +2090,12 @@ void Platform::init() THROW("open X display failed"); } + connection_fd = ConnectionNumber(x_display); + if (!getsockname(connection_fd, &sock_addr, &sock_len) && + XShmQueryExtension(x_display) && sock_addr.sa_family == AF_UNIX ) { + x_shm_avail = true; + } + vinfo = new XVisualInfo *[ScreenCount(x_display)]; memset(vinfo, 0, sizeof(XVisualInfo *) * ScreenCount(x_display)); fb_config = new GLXFBConfig *[ScreenCount(x_display)]; diff --git a/client/x11/red_pixmap_cairo.cpp b/client/x11/red_pixmap_cairo.cpp index d15c35c..795c8a0 100644 --- a/client/x11/red_pixmap_cairo.cpp +++ b/client/x11/red_pixmap_cairo.cpp @@ -36,6 +36,7 @@ RedPixmapCairo::RedPixmapCairo(int width, int height, RedPixmap::Format format, XShmSegmentInfo *shminfo = NULL; _data = NULL; XVisualInfo *vinfo = NULL; + bool using_shm = false; try { @@ -45,7 +46,9 @@ RedPixmapCairo::RedPixmapCairo(int width, int height, RedPixmap::Format format, vinfo = XPlatform::get_vinfo()[win->get_screen_num()]; } - if (vinfo && XShmQueryExtension(XPlatform::get_display())) { + using_shm = vinfo && XPlatform::is_x_shm_avail(); + + if (using_shm) { int depth; switch (format) { @@ -146,14 +149,14 @@ RedPixmapCairo::RedPixmapCairo(int width, int height, RedPixmap::Format format, if (cairo_status(cairo) != CAIRO_STATUS_SUCCESS) { THROW("cairo create failed failed"); } - if (!(vinfo && XShmQueryExtension(XPlatform::get_display()))) { + if (!using_shm) { ((PixelsSource_p*)get_opaque())->pixmap.cairo_surf = cairo_surf; } else { ((PixelsSource_p*)get_opaque())->x_shm_drawable.cairo_surf = cairo_surf; } ((RedDrawable_p*)get_opaque())->cairo = cairo; } catch (...) { - if (vinfo && XShmQueryExtension(XPlatform::get_display())) { + if (using_shm) { if (image) { XDestroyImage(image); } diff --git a/client/x11/x_platform.h b/client/x11/x_platform.h index bc2f691..eafa02d 100644 --- a/client/x11/x_platform.h +++ b/client/x11/x_platform.h @@ -30,6 +30,8 @@ public: static void on_focus_in(); static void on_focus_out(); + + static bool is_x_shm_avail(); }; #endif |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:46:55
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit fe02804983422ce50d65867f311117907caa01b7 Author: Yaniv Kamay <yk...@re...> Date: Mon Dec 21 19:06:11 2009 +0200 spice: sever: increase client timeout Increase client timeout in order to prevent unnecessary disconnecting of client while the connection is over WAN. Tested by changing WinXP resolution (with desktop background) while connecting over WAN (1.5Mbit 150Kbit) diff --git a/server/red_worker.c b/server/red_worker.c index ca4804f..1a0deb4 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -62,10 +62,10 @@ #define CMD_RING_POLL_TIMEOUT 10 //milli #define CMD_RING_POLL_RETRIES 200 -#define DETACH_TIMEOUT 4000000000 //nano +#define DETACH_TIMEOUT 15000000000ULL //nano #define DETACH_SLEEP_DURATION 10000 //micro -#define DISPLAY_CLIENT_TIMEOUT 4000000000 //nano +#define DISPLAY_CLIENT_TIMEOUT 15000000000ULL //nano #define DISPLAY_CLIENT_RETRY_INTERVAL 10000 //micro #define DISPLAY_MAX_SUB_MESSAGES 10 |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:45:40
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 8aa4ea3662a17d9d7b6c25d5b055eae298e9c62a Author: Yaniv Kamay <yk...@re...> Date: Mon Dec 21 00:29:39 2009 +0200 spice: sever: remove assert on nop copy bits diff --git a/server/red_worker.c b/server/red_worker.c index 4d64b85..ca4804f 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -2910,7 +2910,7 @@ static inline void red_use_stream_trace(RedWorker *worker, Drawable *drawable) trace_end = trace + NUM_TRACE_ITEMS; for (; trace < trace_end; trace++) { if (__red_is_next_stream_frame(drawable, trace->width, trace->height, - &trace->dest_area, trace->time, NULL, worker->dev_info.phys_delta)) { + &trace->dest_area, trace->time, NULL, worker->dev_info.phys_delta)) { red_stream_add_frame(worker, drawable, trace->frames_count, trace->gradual_frames_count, @@ -3183,7 +3183,9 @@ static void add_clip_rects(QRegion *rgn, PHYSICAL data, unsigned long phys_delta static inline Shadow *__new_shadow(RedWorker *worker, Drawable *item, Point *delta) { - ASSERT(delta->x || delta->y); + if (!delta->x && !delta->y) { + return NULL; + } Shadow *shadow = malloc(sizeof(Shadow)); if (!shadow) { |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:43:04
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 80dddb8d2a9e43f4d7129ec48d5e229526488025 Author: Yonit Halperin <yha...@re...> Date: Sun Nov 29 15:23:03 2009 +0200 spice server: heuristic for distinguishing between "real" videos and textual streams diff --git a/server/red_common.h b/server/red_common.h index b397be5..49ba3ad 100644 --- a/server/red_common.h +++ b/server/red_common.h @@ -88,6 +88,13 @@ typedef enum { IMAGE_COMPRESS_OFF, } image_compression_t; +enum { + STREAM_VIDEO_INVALID, + STREAM_VIDEO_OFF, + STREAM_VIDEO_ALL, + STREAM_VIDEO_FILTER +}; + static inline uint64_t get_time_stamp() { struct timespec time_space; diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c index 58de5a3..3a5492c 100644 --- a/server/red_dispatcher.c +++ b/server/red_dispatcher.c @@ -317,7 +317,8 @@ void red_dispatcher_set_mm_time(uint32_t mm_time) static inline int calc_compression_level() { - if (streaming_video || (image_compression != IMAGE_COMPRESS_QUIC)) { + ASSERT(streaming_video != STREAM_VIDEO_INVALID); + if ((streaming_video != STREAM_VIDEO_OFF) || (image_compression != IMAGE_COMPRESS_QUIC)) { return 0; } else { return 1; diff --git a/server/red_worker.c b/server/red_worker.c index af0a571..4d64b85 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -74,7 +74,9 @@ #define RED_STREAM_DETACTION_MAX_DELTA ((1000 * 1000 * 1000) / 5) // 1/5 sec #define RED_STREAM_CONTINUS_MAX_DELTA ((1000 * 1000 * 1000) / 2) // 1/2 sec #define RED_STREAM_TIMOUT (1000 * 1000 * 1000) -#define RED_STREAM_START_CONDITION 20 +#define RED_STREAM_FRAMES_START_CONDITION 20 +#define RED_STREAM_GRADUAL_FRAMES_START_CONDITION 0.2 +#define RED_STREAM_FRAMES_RESET_CONDITION 100 #define FPS_TEST_INTERVAL 1 #define MAX_FPS 30 @@ -755,6 +757,13 @@ typedef struct DrawItem { Shadow *shadow; } DrawItem; +typedef enum { + BITMAP_GRADUAL_INVALID, + BITMAP_GRADUAL_NOT_AVAIL, + BITMAP_GRADUAL_TRUE, + BITMAP_GRADUAL_FALSE, +} BitmapGradualType; + struct Drawable { uint8_t refs; RingItem list_link; @@ -769,10 +778,13 @@ struct Drawable { red_time_t creation_time; int frames_count; + int gradual_frames_count; + int last_gradual_frame; Stream *stream; #ifdef STREAM_TRACE int streamable; #endif + BitmapGradualType copy_bitmap_graduality; }; typedef struct _Drawable _Drawable; @@ -840,6 +852,8 @@ typedef struct DrawContext { typedef struct ItemTrace { red_time_t time; int frames_count; + int gradual_frames_count; + int last_gradual_frame; int width; int height; Rect dest_area; @@ -965,6 +979,8 @@ static void red_display_release_stream_clip(DisplayChannel* channel, StreamClipI static int red_display_free_some_independent_glz_drawables(DisplayChannel *channel); static void red_display_free_glz_drawable(DisplayChannel *channel, RedGlzDrawable *drawable); static void reset_rate(StreamAgent *stream_agent); +static int _bitmap_is_gradual(RedWorker *worker, Bitmap *bitmap); +static inline int _stride_is_extra(Bitmap *bitmap); #ifdef DUMP_BITMAP static void dump_bitmap(RedWorker *worker, Bitmap *bitmap); @@ -1400,6 +1416,8 @@ static inline void red_add_item_trace(RedWorker *worker, Drawable *item) trace = &worker->items_trace[worker->next_item_trace++ & ITEMS_TRACE_MASK]; trace->time = item->creation_time; trace->frames_count = item->frames_count; + trace->gradual_frames_count = item->gradual_frames_count; + trace->last_gradual_frame = item->last_gradual_frame; Rect* src_area = &item->qxl_drawable->u.copy.src_area; trace->width = src_area->right - src_area->left; trace->height = src_area->bottom - src_area->top; @@ -2676,6 +2694,70 @@ static inline void pre_stream_item_swap(RedWorker *worker, Stream *stream) agent->drops = 0; } +static inline void red_update_copy_graduality(RedWorker* worker, Drawable *drawable) +{ + QXLImage *qxl_image; + ASSERT(drawable->qxl_drawable->type == QXL_DRAW_COPY); + + if (worker->streaming_video != STREAM_VIDEO_FILTER) { + drawable->copy_bitmap_graduality = BITMAP_GRADUAL_INVALID; + return; + } + + if (drawable->copy_bitmap_graduality != BITMAP_GRADUAL_INVALID) { + return; // already set + } + + qxl_image = (QXLImage *)(drawable->qxl_drawable->u.copy.src_bitmap + + worker->dev_info.phys_delta); + + if (!BITMAP_FMT_IS_RGB[qxl_image->bitmap.format] || _stride_is_extra(&qxl_image->bitmap) || + (qxl_image->bitmap.flags & QXL_BITMAP_UNSTABLE)) { + drawable->copy_bitmap_graduality = BITMAP_GRADUAL_NOT_AVAIL; + } else { + if (_bitmap_is_gradual(worker, &qxl_image->bitmap)) { + drawable->copy_bitmap_graduality = BITMAP_GRADUAL_TRUE; + } else { + drawable->copy_bitmap_graduality = BITMAP_GRADUAL_FALSE; + } + } +} + +static inline int red_is_stream_start(Drawable *drawable) +{ + return ((drawable->frames_count >= RED_STREAM_FRAMES_START_CONDITION) && + (drawable->gradual_frames_count >= + (RED_STREAM_GRADUAL_FRAMES_START_CONDITION * drawable->frames_count))); +} + +static void red_stream_add_frame(RedWorker* worker, Drawable *frame_drawable, + int frames_count, + int gradual_frames_count, + int last_gradual_frame) +{ + red_update_copy_graduality(worker, frame_drawable); + frame_drawable->frames_count = frames_count + 1; + frame_drawable->gradual_frames_count = gradual_frames_count; + + if (frame_drawable->copy_bitmap_graduality != BITMAP_GRADUAL_FALSE) { + if ((frame_drawable->frames_count - last_gradual_frame) > + RED_STREAM_FRAMES_RESET_CONDITION) { + frame_drawable->frames_count = 1; + frame_drawable->gradual_frames_count = 1; + } else { + frame_drawable->gradual_frames_count++; + } + + frame_drawable->last_gradual_frame = frame_drawable->frames_count; + } else { + frame_drawable->last_gradual_frame = last_gradual_frame; + } + + if (red_is_stream_start(frame_drawable)) { + red_create_stream(worker, frame_drawable); + } +} + static inline void red_stream_maintenance(RedWorker *worker, Drawable *candidate, Drawable *prev) { Stream *stream; @@ -2691,6 +2773,8 @@ static inline void red_stream_maintenance(RedWorker *worker, Drawable *candidate #else if (!worker->streaming_video || !red_is_next_stream_frame(candidate, prev, worker->dev_info.phys_delta)) { + if ((worker->streaming_video == STREAM_VIDEO_OFF) || + !red_is_next_stream_frame(candidate, prev, worker->dev_info.phys_delta) { return; } #endif @@ -2719,9 +2803,11 @@ static inline void red_stream_maintenance(RedWorker *worker, Drawable *candidate } } #endif - } else if ((candidate->frames_count = prev->frames_count + 1) == - RED_STREAM_START_CONDITION) { - red_create_stream(worker, candidate); + } else { + red_stream_add_frame(worker, candidate, + prev->frames_count, + prev->gradual_frames_count, + prev->last_gradual_frame); } } @@ -2823,12 +2909,12 @@ static inline void red_use_stream_trace(RedWorker *worker, Drawable *drawable) trace = worker->items_trace; trace_end = trace + NUM_TRACE_ITEMS; for (; trace < trace_end; trace++) { - if (__red_is_next_stream_frame(drawable, trace->width, trace->height, &trace->dest_area, - trace->time, NULL, worker->dev_info.phys_delta)) { - if ((drawable->frames_count = trace->frames_count + 1) == RED_STREAM_START_CONDITION) { - red_create_stream(worker, drawable); - } - return; + if (__red_is_next_stream_frame(drawable, trace->width, trace->height, + &trace->dest_area, trace->time, NULL, worker->dev_info.phys_delta)) { + red_stream_add_frame(worker, drawable, + trace->frames_count, + trace->gradual_frames_count, + trace->last_gradual_frame); } } } @@ -3174,7 +3260,7 @@ static inline void red_update_streamable(RedWorker *worker, Drawable *drawable, { QXLImage *qxl_image; - if (!worker->streaming_video) { + if (worker->streaming_video == STREAM_VIDEO_OFF) { return; } @@ -5398,8 +5484,12 @@ static inline int red_compress_image(DisplayChannel *display_channel, if ((src->x < MIN_DIMENSION_TO_QUIC) || (src->y < MIN_DIMENSION_TO_QUIC)) { quic_compress = FALSE; } else { - quic_compress = BITMAP_FMT_IS_RGB[src->format] && - _bitmap_is_gradual(display_channel->base.worker, src); + if (drawable->copy_bitmap_graduality == BITMAP_GRADUAL_INVALID) { + quic_compress = BITMAP_FMT_IS_RGB[src->format] && + _bitmap_is_gradual(display_channel->base.worker, src); + } else { + quic_compress = (drawable->copy_bitmap_graduality == BITMAP_GRADUAL_TRUE); + } } } else { quic_compress = FALSE; @@ -8191,7 +8281,20 @@ static void handle_dev_input(EventListener *listener, uint32_t events) break; case RED_WORKER_MESSAGE_SET_STREAMING_VIDEO: receive_data(worker->channel, &worker->streaming_video, sizeof(uint32_t)); - red_printf("sv %u", worker->streaming_video); + ASSERT(worker->streaming_video != STREAM_VIDEO_INVALID); + switch(worker->streaming_video) { + case STREAM_VIDEO_ALL: + red_printf("sv all"); + break; + case STREAM_VIDEO_FILTER: + red_printf("sv filter"); + break; + case STREAM_VIDEO_OFF: + red_printf("sv off"); + break; + default: + red_printf("sv invalid"); + } break; case RED_WORKER_MESSAGE_SET_MOUSE_MODE: receive_data(worker->channel, &worker->mouse_mode, sizeof(uint32_t)); diff --git a/server/reds.c b/server/reds.c index d73bec4..54225dc 100644 --- a/server/reds.c +++ b/server/reds.c @@ -80,7 +80,7 @@ static struct in_addr spice_addr = {INADDR_ANY}; static int ticketing_enabled = 1; //Ticketing is enabled by default static pthread_mutex_t *lock_cs; static long *lock_count; -uint32_t streaming_video = TRUE; +uint32_t streaming_video = STREAM_VIDEO_FILTER; image_compression_t image_compression = IMAGE_COMPRESS_AUTO_GLZ; int agent_mouse = TRUE; @@ -3492,7 +3492,21 @@ static void reds_do_info_spice() core->term_printf(core, " ic=invalid"); } - core->term_printf(core, " sv=%s", streaming_video ? "on" : "off"); + switch (streaming_video) { + case STREAM_VIDEO_ALL: + core->term_printf(core, " sv=all"); + break; + case STREAM_VIDEO_FILTER: + core->term_printf(core, " sv=filter"); + break; + case STREAM_VIDEO_OFF: + core->term_printf(core, " sv=off"); + break; + case STREAM_VIDEO_INVALID: + default: + core->term_printf(core, " sv=invalid"); + + } core->term_printf(core, " playback-compression=%s\n", snd_get_playback_compression() ? "on" : "off"); } @@ -3534,17 +3548,29 @@ static void reds_do_set_image_compression(const char *val) set_image_compression(real_val); } -static void reds_do_set_streaming_video(const char *val) +static int reds_get_streaming_video(const char *val) { - uint32_t new_val; if (strcmp(val, "on") == 0) { - new_val = TRUE; - } else if (strcmp(val, "off") == 0) { - new_val = FALSE; + return STREAM_VIDEO_FILTER; + } else if (strcmp(val, "filter") == 0) { + return STREAM_VIDEO_FILTER; + } else if (strcmp(val, "all") == 0) { + return STREAM_VIDEO_ALL; + } else if (strcmp(val, "off") == 0){ + return STREAM_VIDEO_OFF; } else { + return STREAM_VIDEO_INVALID; + } +} + +static void reds_do_set_streaming_video(const char *val) +{ + uint32_t new_val = reds_get_streaming_video(val); + if (new_val == STREAM_VIDEO_INVALID) { core->term_printf(core, "bad streaming video arg\n"); return; } + if (new_val == streaming_video) { return; } @@ -3882,9 +3908,8 @@ int __attribute__ ((visibility ("default"))) spice_parse_args(const char *in_arg if (!val) { goto error; } - if (strcmp(val, "off") == 0) { - streaming_video = FALSE; - } else if (strcmp(val, "on") != 0) { + streaming_video = reds_get_streaming_video(val); + if (streaming_video == STREAM_VIDEO_INVALID) { goto error; } break; @@ -4581,7 +4606,7 @@ static void add_monitor_action_commands(QTermInterface *mon) mon->add_action_command_handler(mon, "spice", "set_streaming_video", "s", reds_do_set_streaming_video, "", - "<on|off>"); + "<on|filter|all|off>"); mon->add_action_command_handler(mon, "spice", "set_playback_compression", "s", reds_do_set_playback_compression, "", |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:38:02
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 173ff6fe0f6f42d4fff2a36b7705258ad5079d83 Author: Yaniv Kamay <yk...@re...> Date: Wed Nov 18 14:03:46 2009 +0200 add missing alt_image.c to Makefile.am diff --git a/client/x11/images/Makefile.am b/client/x11/images/Makefile.am index 2e5725a..31803eb 100644 --- a/client/x11/images/Makefile.am +++ b/client/x11/images/Makefile.am @@ -2,4 +2,6 @@ EXTRA_DIST = \ info_image.c \ red_icon.c \ splash_image.c \ + alt_image.c \ $(NULL) + |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:37:46
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 03f23b870ea00c94f9f6148f6b1017742aca225d Author: Arnon Gilboa <ag...@re...> Date: Tue Nov 17 16:48:23 2009 +0200 spice: pass modifiers stroke events down the hook chain diff --git a/client/windows/red_window.cpp b/client/windows/red_window.cpp index ab1aa15..9365c69 100644 --- a/client/windows/red_window.cpp +++ b/client/windows/red_window.cpp @@ -666,10 +666,6 @@ static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lP dwMsg += hooked->scanCode << 16; dwMsg += hooked->flags << 24; - // Forward these keys so the keyboard leds will light up. - BOOL bNextHook = ((hooked->vkCode == VK_CAPITAL) || - (hooked->vkCode == VK_SCROLL) || (hooked->vkCode == VK_NUMLOCK)); - // In some cases scan code of VK_RSHIFT is fake shift (probably a bug) so we // convert it to non extended code. Also, QEmu doesn't expect num-lock to be // an extended key. @@ -679,7 +675,19 @@ static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lP SendMessage(focus_window, wParam, hooked->vkCode, dwMsg); - if (bNextHook == FALSE) { + // Forward all modifier key strokes to update keyboard leds & shift/ctrl/alt state + switch (hooked->vkCode) { + case VK_CAPITAL: + case VK_SCROLL: + case VK_NUMLOCK: + case VK_LSHIFT: + case VK_RSHIFT: + case VK_LCONTROL: + case VK_RCONTROL: + case VK_LMENU: + case VK_RMENU: + break; + default: return 1; } } |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:37:34
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 702b92cdb80eac8fd3b5da3a96bfcfa622f7c7af Author: Arnon Gilboa <ag...@re...> Date: Tue Nov 17 16:47:41 2009 +0200 spice: add [pid:tid] to log lines diff --git a/client/debug.h b/client/debug.h index cf84296..1c6f6a4 100644 --- a/client/debug.h +++ b/client/debug.h @@ -24,6 +24,8 @@ #include <log4cpp/Category.hh> #include <log4cpp/convenience.h> +#include "platform.h" + #ifdef WIN32 #define snprintf _snprintf #endif @@ -74,10 +76,11 @@ static inline std::string pretty_func_to_func_name(const std::string& f_name) LOG4CPP_LOGGER("spice") -#define LOG(type, format, ...) { \ - std::string log_message; \ - string_printf(log_message, "%s: " format, FUNC_NAME, ## __VA_ARGS__); \ - LOG4CPP_##type(logger, log_message.c_str()); \ +#define LOG(type, format, ...) { \ + std::string log_message; \ + string_printf(log_message, "[%llu:%llu] %s: " format, Platform::get_process_id(), \ + Platform::get_thread_id(), FUNC_NAME, ## __VA_ARGS__); \ + LOG4CPP_##type(logger, log_message.c_str()); \ } #define LOG_INFO(format, ...) LOG(INFO, format, ## __VA_ARGS__) diff --git a/client/platform.h b/client/platform.h index ece61c9..c32b863 100644 --- a/client/platform.h +++ b/client/platform.h @@ -38,6 +38,8 @@ public: static void yield(); static uint64_t get_monolithic_time(); static void get_temp_dir(std::string& path); + static uint64_t get_process_id(); + static uint64_t get_thread_id(); static const MonitorsList& init_monitors(); static void destroy_monitors(); diff --git a/client/windows/platform.cpp b/client/windows/platform.cpp index 6b21840..6d5deba 100644 --- a/client/windows/platform.cpp +++ b/client/windows/platform.cpp @@ -207,6 +207,17 @@ void Platform::get_temp_dir(std::string& path) delete[] tmp_path; } +uint64_t Platform::get_process_id() +{ + static uint64_t pid = GetCurrentProcessId(); + return pid; +} + +uint64_t Platform::get_thread_id() +{ + return GetCurrentThreadId(); +} + class WinMonitor: public Monitor { public: WinMonitor(int id, const wchar_t* name, const wchar_t* string); diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp index 10d621b..217664a 100644 --- a/client/x11/platform.cpp +++ b/client/x11/platform.cpp @@ -223,6 +223,17 @@ void Platform::get_temp_dir(std::string& path) path = "/tmp/"; } +uint64_t Platform::get_process_id() +{ + static uint64_t pid = uint64_t(getpid()); + return pid; +} + +uint64_t Platform::get_thread_id() +{ + return uint64_t(syscall(SYS_gettid)); +} + void Platform::msleep(unsigned int millisec) { usleep(millisec * 1000); |
From: Yaniv K. <yk...@re...> - 2010-01-03 15:37:18
|
repository: /home/tlv/ykamay/open_spice_upload/spice branch: 0.4 commit 18270e02353786a64e01a303ac4db5fa05e05eeb Author: Arnon Gilboa <ag...@re...> Date: Tue Nov 17 16:44:50 2009 +0200 spice: on toggle_full_screen, generate on_key_down if shift is still pressed diff --git a/client/application.cpp b/client/application.cpp index 061dc37..fb14fff 100644 --- a/client/application.cpp +++ b/client/application.cpp @@ -1230,11 +1230,23 @@ void Application::exit_full_screen() bool Application::toggle_full_screen() { + RedKey shift_pressed = REDKEY_INVALID; + + if (_key_table[REDKEY_L_SHIFT].press) { + shift_pressed = REDKEY_L_SHIFT; + } else if (_key_table[REDKEY_R_SHIFT].press) { + shift_pressed = REDKEY_R_SHIFT; + } if (_full_screen) { exit_full_screen(); } else { enter_full_screen(); } + uint32_t modifiers = Platform::get_keyboard_modifiers(); + if ((shift_pressed == REDKEY_L_SHIFT && (modifiers & Platform::L_SHIFT_MODIFIER)) || + (shift_pressed == REDKEY_R_SHIFT && (modifiers & Platform::R_SHIFT_MODIFIER))) { + on_key_down(shift_pressed); + } return _full_screen; } diff --git a/client/inputs_channel.cpp b/client/inputs_channel.cpp index d686be2..df43493 100644 --- a/client/inputs_channel.cpp +++ b/client/inputs_channel.cpp @@ -327,7 +327,7 @@ void InputsChannel::set_local_modifiers() modifiers |= Platform::CAPS_LOCK_MODIFIER; } - Platform::set_keyboard_modifiers(_modifiers); + Platform::set_keyboard_lock_modifiers(_modifiers); } void InputsChannel::on_focus_in() @@ -335,7 +335,7 @@ void InputsChannel::on_focus_in() #ifdef SYNC_REMOTH_MODIFIRES Message* message = new Message(REDC_INPUTS_KEY_MODIFAIERS, sizeof(RedcKeyDown)); RedcKeyModifiers* modifiers = (RedcKeyModifiers*)message->data(); - modifiers->modifiers = Platform::get_keyboard_modifiers(); + modifiers->modifiers = Platform::get_keyboard_lock_modifiers(); post_message(message); #else set_local_modifiers(); diff --git a/client/platform.h b/client/platform.h index 5dca717..ece61c9 100644 --- a/client/platform.h +++ b/client/platform.h @@ -77,8 +77,26 @@ public: CAPS_LOCK_MODIFIER = (1 << CAPS_LOCK_MODIFIER_SHIFT), }; + static uint32_t get_keyboard_lock_modifiers(); + static void set_keyboard_lock_modifiers(uint32_t modifiers); + + enum { + L_SHIFT_MODIFIER_SHIFT, + R_SHIFT_MODIFIER_SHIFT, + L_CTRL_MODIFIER_SHIFT, + R_CTRL_MODIFIER_SHIFT, + L_ALT_MODIFIER_SHIFT, + R_ALT_MODIFIER_SHIFT, + + L_SHIFT_MODIFIER = (1 << L_SHIFT_MODIFIER_SHIFT), + R_SHIFT_MODIFIER = (1 << R_SHIFT_MODIFIER_SHIFT), + L_CTRL_MODIFIER = (1 << L_CTRL_MODIFIER_SHIFT), + R_CTRL_MODIFIER = (1 << R_CTRL_MODIFIER_SHIFT), + L_ALT_MODIFIER = (1 << L_ALT_MODIFIER_SHIFT), + R_ALT_MODIFIER = (1 << R_ALT_MODIFIER_SHIFT), + }; + static uint32_t get_keyboard_modifiers(); - static void set_keyboard_modifiers(uint32_t modifiers); static LocalCursor* create_local_cursor(CursorData* cursor_data); static LocalCursor* create_inactive_cursor(); diff --git a/client/windows/platform.cpp b/client/windows/platform.cpp index 24c9ca9..6b21840 100644 --- a/client/windows/platform.cpp +++ b/client/windows/platform.cpp @@ -444,7 +444,7 @@ static void toggle_modifier(int key) SendInput(2, inputs, sizeof(INPUT)); } -uint32_t Platform::get_keyboard_modifiers() +uint32_t Platform::get_keyboard_lock_modifiers() { uint32_t modifiers = 0; if ((GetKeyState(VK_SCROLL) & 1)) { @@ -459,7 +459,7 @@ uint32_t Platform::get_keyboard_modifiers() return modifiers; } -void Platform::set_keyboard_modifiers(uint32_t modifiers) +void Platform::set_keyboard_lock_modifiers(uint32_t modifiers) { if (((modifiers >> SCROLL_LOCK_MODIFIER_SHIFT) & 1) != (GetKeyState(VK_SCROLL) & 1)) { toggle_modifier(VK_SCROLL); @@ -474,6 +474,23 @@ void Platform::set_keyboard_modifiers(uint32_t modifiers) } } +#define KEY_BIT(keymap, key, bit) (keymap[key] & 0x80 ? bit : 0) + +uint32_t Platform::get_keyboard_modifiers() +{ + BYTE keymap[256]; + + if (!GetKeyboardState(keymap)) { + return 0; + } + return KEY_BIT(keymap, VK_LSHIFT, L_SHIFT_MODIFIER) | + KEY_BIT(keymap, VK_RSHIFT, R_SHIFT_MODIFIER) | + KEY_BIT(keymap, VK_LCONTROL, L_CTRL_MODIFIER) | + KEY_BIT(keymap, VK_RCONTROL, R_CTRL_MODIFIER) | + KEY_BIT(keymap, VK_LMENU, L_ALT_MODIFIER) | + KEY_BIT(keymap, VK_RMENU, R_ALT_MODIFIER); +} + class WinBaseLocalCursor: public LocalCursor { public: WinBaseLocalCursor() : _handle (0) {} diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp index 8288f55..10d621b 100644 --- a/client/x11/platform.cpp +++ b/client/x11/platform.cpp @@ -2148,7 +2148,7 @@ void Platform::set_process_loop(ProcessLoop& main_process_loop) main_loop->add_file(*x_event_handler); } -uint32_t Platform::get_keyboard_modifiers() +uint32_t Platform::get_keyboard_lock_modifiers() { XKeyboardState keyboard_state; uint32_t modifiers = 0; @@ -2195,9 +2195,9 @@ static void set_keyboard_led(XLed led, int set) } } -void Platform::set_keyboard_modifiers(uint32_t modifiers) +void Platform::set_keyboard_lock_modifiers(uint32_t modifiers) { - uint32_t now = get_keyboard_modifiers(); + uint32_t now = get_keyboard_lock_modifiers(); if ((now & CAPS_LOCK_MODIFIER) != (modifiers & CAPS_LOCK_MODIFIER)) { set_keyboard_led(X11_CAPS_LOCK_LED, !!(modifiers & CAPS_LOCK_MODIFIER)); @@ -2210,6 +2210,25 @@ void Platform::set_keyboard_modifiers(uint32_t modifiers) } } +uint32_t key_bit(char* keymap, int key, uint32_t bit) +{ + KeyCode key_code = XKeysymToKeycode(x_display, key); + return (((keymap[key_code >> 3] >> (key_code & 7)) & 1) ? bit : 0); +} + +uint32_t Platform::get_keyboard_modifiers() +{ + char keymap[32]; + + XQueryKeymap(x_display, keymap); + return key_bit(keymap, XK_Shift_L, L_SHIFT_MODIFIER) | + key_bit(keymap, XK_Shift_R, R_SHIFT_MODIFIER) | + key_bit(keymap, XK_Control_L, L_CTRL_MODIFIER) | + key_bit(keymap, XK_Control_R, R_CTRL_MODIFIER) | + key_bit(keymap, XK_Alt_L, L_ALT_MODIFIER) | + key_bit(keymap, XK_Alt_R, R_ALT_MODIFIER); +} + WaveRecordAbstract* Platform::create_recorder(RecordClient& client, uint32_t sampels_per_sec, uint32_t bits_per_sample, |