aboutsummaryrefslogtreecommitdiffstats
path: root/protocols
diff options
context:
space:
mode:
Diffstat (limited to 'protocols')
-rw-r--r--protocols/Makefile2
-rw-r--r--protocols/account.c31
-rw-r--r--protocols/account.h3
-rw-r--r--protocols/jabber/Makefile2
-rw-r--r--protocols/jabber/conference.c2
-rw-r--r--protocols/jabber/io.c33
-rw-r--r--protocols/jabber/iq.c3
-rw-r--r--protocols/jabber/jabber.c9
-rw-r--r--protocols/jabber/jabber.h5
-rw-r--r--protocols/jabber/message.c24
-rw-r--r--protocols/jabber/sasl.c3
-rw-r--r--protocols/jabber/si.c6
-rw-r--r--protocols/msn/Makefile2
-rw-r--r--protocols/msn/msn.c68
-rw-r--r--protocols/msn/msn.h26
-rw-r--r--protocols/msn/msn_util.c17
-rw-r--r--protocols/msn/ns.c254
-rw-r--r--protocols/msn/sb.c54
-rw-r--r--protocols/msn/soap.c4
-rw-r--r--protocols/msn/soap.h2
-rw-r--r--protocols/nogaim.c25
-rw-r--r--protocols/nogaim.h12
-rw-r--r--protocols/oscar/Makefile2
-rw-r--r--protocols/oscar/aim.h32
-rw-r--r--protocols/oscar/aim_internal.h7
-rw-r--r--protocols/oscar/bos.c80
-rw-r--r--protocols/oscar/buddylist.c58
-rw-r--r--protocols/oscar/buddylist.h4
-rw-r--r--protocols/oscar/chat.c71
-rw-r--r--protocols/oscar/conn.c44
-rw-r--r--protocols/oscar/icq.c75
-rw-r--r--protocols/oscar/icq.h1
-rw-r--r--protocols/oscar/im.c647
-rw-r--r--protocols/oscar/im.h17
-rw-r--r--protocols/oscar/info.c180
-rw-r--r--protocols/oscar/info.h2
-rw-r--r--protocols/oscar/misc.c168
-rw-r--r--protocols/oscar/oscar.c56
-rw-r--r--protocols/oscar/oscar_util.c90
-rw-r--r--protocols/oscar/rxhandlers.c12
-rw-r--r--protocols/oscar/search.c21
-rw-r--r--protocols/oscar/search.h2
-rw-r--r--protocols/oscar/service.c172
-rw-r--r--protocols/oscar/ssi.c312
-rw-r--r--protocols/oscar/ssi.h6
-rw-r--r--protocols/oscar/tlv.c45
-rw-r--r--protocols/purple/Makefile2
-rw-r--r--protocols/purple/purple.c2
-rw-r--r--protocols/skype/.mailmap1
-rw-r--r--protocols/skype/HACKING64
-rw-r--r--protocols/skype/Makefile77
-rw-r--r--protocols/skype/README70
-rw-r--r--protocols/skype/asciidoc.conf7
-rw-r--r--protocols/skype/skype.c176
-rw-r--r--protocols/skype/skyped.py279
-rw-r--r--protocols/skype/skyped.txt42
-rw-r--r--protocols/skype/t/Makefile33
-rw-r--r--protocols/skype/t/add-yes-bitlbee.mock8
-rw-r--r--protocols/skype/t/add-yes-skyped.mock23
-rw-r--r--protocols/skype/t/added-no-bitlbee.mock9
-rw-r--r--protocols/skype/t/added-no-skyped.mock15
-rw-r--r--protocols/skype/t/added-yes-bitlbee.mock9
-rw-r--r--protocols/skype/t/added-yes-skyped.mock25
-rw-r--r--protocols/skype/t/bitlbee.conf0
-rw-r--r--protocols/skype/t/call-bitlbee.mock11
-rw-r--r--protocols/skype/t/call-failed-bitlbee.mock9
-rw-r--r--protocols/skype/t/call-failed-skyped.mock21
-rw-r--r--protocols/skype/t/call-skyped.mock26
-rw-r--r--protocols/skype/t/called-no-bitlbee.mock10
-rw-r--r--protocols/skype/t/called-no-skyped.mock24
-rw-r--r--protocols/skype/t/called-yes-bitlbee.mock9
-rw-r--r--protocols/skype/t/called-yes-skyped.mock22
-rw-r--r--protocols/skype/t/ctcp-help-bitlbee.mock9
-rw-r--r--protocols/skype/t/ctcp-help-skyped.mock16
-rw-r--r--protocols/skype/t/filetransfer-bitlbee.mock10
-rw-r--r--protocols/skype/t/filetransfer-skyped.mock37
-rw-r--r--protocols/skype/t/group-read-bitlbee.mock14
-rw-r--r--protocols/skype/t/group-read-skyped.mock36
-rw-r--r--protocols/skype/t/groupchat-invite-bitlbee.mock11
-rw-r--r--protocols/skype/t/groupchat-invite-skyped.mock48
-rw-r--r--protocols/skype/t/groupchat-invited-bitlbee.mock8
-rw-r--r--protocols/skype/t/groupchat-invited-skyped.mock58
-rw-r--r--protocols/skype/t/groupchat-leave-bitlbee.mock11
-rw-r--r--protocols/skype/t/groupchat-leave-skyped.mock63
-rw-r--r--protocols/skype/t/info-bitlbee.mock9
-rw-r--r--protocols/skype/t/info-skyped.mock46
-rwxr-xr-xprotocols/skype/t/irssi/livetest-irssi.sh109
-rw-r--r--protocols/skype/t/irssi/skype-call.test13
-rw-r--r--protocols/skype/t/irssi/skype-info.test12
-rw-r--r--protocols/skype/t/irssi/skype-login.test10
-rw-r--r--protocols/skype/t/irssi/skype-msg.test17
-rw-r--r--protocols/skype/t/irssi/trigger.pl1225
-rwxr-xr-xprotocols/skype/t/livetest-bitlbee.sh116
-rw-r--r--protocols/skype/t/login-bitlbee.mock7
-rw-r--r--protocols/skype/t/login-skyped.mock16
-rw-r--r--protocols/skype/t/msg-bitlbee.mock9
-rw-r--r--protocols/skype/t/msg-skyped.mock49
-rw-r--r--protocols/skype/t/set-mood-text-bitlbee.mock9
-rw-r--r--protocols/skype/t/set-mood-text-skyped.mock14
-rwxr-xr-xprotocols/skype/test.py135
-rw-r--r--protocols/twitter/Makefile2
-rw-r--r--protocols/twitter/twitter.c343
-rw-r--r--protocols/twitter/twitter.h18
-rw-r--r--protocols/twitter/twitter_http.c40
-rw-r--r--protocols/twitter/twitter_http.h12
-rw-r--r--protocols/twitter/twitter_lib.c934
-rw-r--r--protocols/twitter/twitter_lib.h50
-rw-r--r--protocols/yahoo/Makefile4
-rw-r--r--protocols/yahoo/crypt.c203
-rw-r--r--protocols/yahoo/libyahoo2.c36
-rw-r--r--protocols/yahoo/yahoo.c13
-rw-r--r--protocols/yahoo/yahoo2.h2
-rw-r--r--protocols/yahoo/yahoo2_callbacks.h4
-rw-r--r--protocols/yahoo/yahoo_fn.c4622
-rw-r--r--protocols/yahoo/yahoo_fn.h32
-rw-r--r--protocols/yahoo/yahoo_httplib.c4
116 files changed, 2545 insertions, 9556 deletions
diff --git a/protocols/Makefile b/protocols/Makefile
index e93f3b23..b4565ab6 100644
--- a/protocols/Makefile
+++ b/protocols/Makefile
@@ -54,6 +54,6 @@ $(objects): ../Makefile.settings Makefile
$(objects): %.o: $(_SRCDIR_)%.c
@echo '*' Compiling $<
- @$(CC) -c $(CFLAGS) $< -o $@
+ @$(CC) -c $(CFLAGS) $(CFLAGS_BITLBEE) $< -o $@
-include .depend/*.d
diff --git a/protocols/account.c b/protocols/account.c
index 020a55cd..dec9c3ea 100644
--- a/protocols/account.c
+++ b/protocols/account.c
@@ -1,7 +1,7 @@
/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
- * Copyright 2002-2010 Wilmer van der Gaast and others *
+ * Copyright 2002-2013 Wilmer van der Gaast and others *
\********************************************************************/
/* Account management functions */
@@ -153,18 +153,14 @@ char *set_eval_account( set_t *set, char *value )
}
else if( strcmp( set->key, "password" ) == 0 )
{
- if( value )
- {
- g_free( acc->pass );
- acc->pass = g_strdup( value );
- return NULL; /* password shouldn't be visible in plaintext! */
- }
- else
- {
- /* NULL can (should) be stored in the set_t
- variable, but is otherwise not correct. */
- return SET_INVALID;
- }
+ /* set -del should be allowed now, but I don't want to have any
+ NULL pointers to have to deal with. */
+ if( !value )
+ value = "";
+
+ g_free( acc->pass );
+ acc->pass = g_strdup( value );
+ return NULL; /* password shouldn't be visible in plaintext! */
}
else if( strcmp( set->key, "tag" ) == 0 )
{
@@ -353,7 +349,7 @@ void account_on( bee_t *bee, account_t *a )
a->reconnect = 0;
a->prpl->login( a );
- if( a->ic && !( a->ic->flags & OPT_SLOW_LOGIN ) )
+ if( a->ic && !( a->ic->flags & ( OPT_SLOW_LOGIN | OPT_LOGGED_IN ) ) )
a->ic->keepalive = b_timeout_add( 120000, account_on_timeout, a->ic );
}
@@ -372,8 +368,11 @@ static gboolean account_on_timeout( gpointer d, gint fd, b_input_condition cond
{
struct im_connection *ic = d;
- imcb_error( ic, "Connection timeout" );
- imc_logout( ic, TRUE );
+ if( !( ic->flags & ( OPT_SLOW_LOGIN | OPT_LOGGED_IN ) ) )
+ {
+ imcb_error( ic, "Connection timeout" );
+ imc_logout( ic, TRUE );
+ }
return FALSE;
}
diff --git a/protocols/account.h b/protocols/account.h
index ddc2b3e7..ed3ca531 100644
--- a/protocols/account.h
+++ b/protocols/account.h
@@ -1,7 +1,7 @@
/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
- * Copyright 2002-2004 Wilmer van der Gaast and others *
+ * Copyright 2002-2013 Wilmer van der Gaast and others *
\********************************************************************/
/* Account management functions */
@@ -68,6 +68,7 @@ typedef enum
{
ACC_FLAG_AWAY_MESSAGE = 0x01, /* Supports away messages instead of just states. */
ACC_FLAG_STATUS_MESSAGE = 0x02, /* Supports status messages (without being away). */
+ ACC_FLAG_HANDLE_DOMAINS = 0x04, /* Contact handles need a domain portion. */
} account_flag_t;
#endif
diff --git a/protocols/jabber/Makefile b/protocols/jabber/Makefile
index 20bc1259..b5c3b107 100644
--- a/protocols/jabber/Makefile
+++ b/protocols/jabber/Makefile
@@ -37,7 +37,7 @@ $(objects): ../../Makefile.settings Makefile
$(objects): %.o: $(_SRCDIR_)%.c
@echo '*' Compiling $<
- @$(CC) -c $(CFLAGS) $< -o $@
+ @$(CC) -c $(CFLAGS) $(CFLAGS_BITLBEE) $< -o $@
jabber_mod.o: $(objects)
@echo '*' Linking jabber_mod.o
diff --git a/protocols/jabber/conference.c b/protocols/jabber/conference.c
index 0a66b461..c8930f83 100644
--- a/protocols/jabber/conference.c
+++ b/protocols/jabber/conference.c
@@ -3,7 +3,7 @@
* BitlBee - An IRC to IM gateway *
* Jabber module - Conference rooms *
* *
-* Copyright 2007 Wilmer van der Gaast <wilmer@gaast.net> *
+* Copyright 2007-2012 Wilmer van der Gaast <wilmer@gaast.net> *
* *
* 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 *
diff --git a/protocols/jabber/io.c b/protocols/jabber/io.c
index 5b9149af..6f79b2d1 100644
--- a/protocols/jabber/io.c
+++ b/protocols/jabber/io.c
@@ -3,7 +3,7 @@
* BitlBee - An IRC to IM gateway *
* Jabber module - I/O stuff (plain, SSL), queues, etc *
* *
-* Copyright 2006 Wilmer van der Gaast <wilmer@gaast.net> *
+* Copyright 2006-2012 Wilmer van der Gaast <wilmer@gaast.net> *
* *
* 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 *
@@ -452,8 +452,39 @@ static xt_status jabber_pkt_proceed_tls( struct xt_node *node, gpointer data )
static xt_status jabber_pkt_stream_error( struct xt_node *node, gpointer data )
{
struct im_connection *ic = data;
+ struct jabber_data *jd = ic->proto_data;
int allow_reconnect = TRUE;
struct jabber_error *err;
+ struct xt_node *host;
+
+ if( !( ic->flags & OPT_LOGGED_IN ) &&
+ ( host = xt_find_node( node->children, "see-other-host" ) ) &&
+ host->text )
+ {
+ char *s;
+ int port = set_getint( &ic->acc->set, "port" );
+
+ /* Let's try to obey this request, if we're not logged
+ in yet (i.e. not have too much state yet). */
+ if( jd->ssl )
+ ssl_disconnect( jd->ssl );
+ closesocket( jd->fd );
+ b_event_remove( jd->r_inpa );
+ b_event_remove( jd->w_inpa );
+
+ jd->ssl = NULL;
+ jd->r_inpa = jd->w_inpa = 0;
+ jd->flags &= JFLAG_XMLCONSOLE;
+
+ s = strchr( host->text, ':' );
+ if( s != NULL )
+ sscanf( s + 1, "%d", &port );
+
+ imcb_log( ic, "Redirected to %s", host->text );
+ jd->fd = proxy_connect( host->text, port, jabber_connected_plain, ic );
+
+ return XT_ABORT;
+ }
err = jabber_error_parse( node, XMLNS_STREAM_ERROR );
diff --git a/protocols/jabber/iq.c b/protocols/jabber/iq.c
index b5a37a30..31b92049 100644
--- a/protocols/jabber/iq.c
+++ b/protocols/jabber/iq.c
@@ -3,7 +3,7 @@
* BitlBee - An IRC to IM gateway *
* Jabber module - IQ packets *
* *
-* Copyright 2006 Wilmer van der Gaast <wilmer@gaast.net> *
+* Copyright 2006-2012 Wilmer van der Gaast <wilmer@gaast.net> *
* *
* 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 *
@@ -127,6 +127,7 @@ xt_status jabber_pkt_iq( struct xt_node *node, gpointer data )
XMLNS_CHATSTATES,
XMLNS_MUC,
XMLNS_PING,
+ XMLNS_RECEIPTS,
XMLNS_SI,
XMLNS_BYTESTREAMS,
XMLNS_FILETRANSFER,
diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c
index dbae9ff9..dab4afdf 100644
--- a/protocols/jabber/jabber.c
+++ b/protocols/jabber/jabber.c
@@ -3,7 +3,7 @@
* BitlBee - An IRC to IM gateway *
* Jabber module - Main file *
* *
-* Copyright 2006 Wilmer van der Gaast <wilmer@gaast.net> *
+* Copyright 2006-2013 Wilmer van der Gaast <wilmer@gaast.net> *
* *
* 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 *
@@ -84,7 +84,7 @@ static void jabber_init( account_t *acc )
s = set_add( &acc->set, "ssl", "false", set_eval_bool, acc );
s->flags |= ACC_SET_OFFLINE_ONLY;
- s = set_add( &acc->set, "tls", "try", set_eval_tls, acc );
+ s = set_add( &acc->set, "tls", "true", set_eval_tls, acc );
s->flags |= ACC_SET_OFFLINE_ONLY;
s = set_add( &acc->set, "tls_verify", "true", set_eval_bool, acc );
@@ -95,7 +95,8 @@ static void jabber_init( account_t *acc )
s = set_add( &acc->set, "xmlconsole", "false", set_eval_bool, acc );
s->flags |= ACC_SET_OFFLINE_ONLY;
- acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE;
+ acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE |
+ ACC_FLAG_HANDLE_DOMAINS;
}
static void jabber_generate_id_hash( struct jabber_data *jd );
@@ -230,7 +231,7 @@ void jabber_connect( struct im_connection *ic )
non-standard ports... */
if( set_getbool( &acc->set, "ssl" ) )
{
- jd->ssl = ssl_connect( connect_to, set_getint( &acc->set, "port" ), FALSE, jabber_connected_ssl, ic );
+ jd->ssl = ssl_connect( connect_to, set_getint( &acc->set, "port" ), set_getbool( &acc->set, "tls_verify" ), jabber_connected_ssl, ic );
jd->fd = jd->ssl ? ssl_getfd( jd->ssl ) : -1;
}
else
diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h
index d11d2fe8..006da9a3 100644
--- a/protocols/jabber/jabber.h
+++ b/protocols/jabber/jabber.h
@@ -3,7 +3,7 @@
* BitlBee - An IRC to IM gateway *
* Jabber module - Main file *
* *
-* Copyright 2006 Wilmer van der Gaast <wilmer@gaast.net> *
+* Copyright 2006-2013 Wilmer van der Gaast <wilmer@gaast.net> *
* *
* 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 *
@@ -195,7 +195,7 @@ struct jabber_transfer
struct sockaddr_storage saddr;
};
-#define JABBER_XMLCONSOLE_HANDLE "xmlconsole"
+#define JABBER_XMLCONSOLE_HANDLE "_xmlconsole"
#define JABBER_OAUTH_HANDLE "jabber_oauth"
/* Prefixes to use for packet IDs (mainly for IQ packets ATM). Usually the
@@ -226,6 +226,7 @@ struct jabber_transfer
#define XMLNS_TIME_OLD "jabber:iq:time" /* XEP-0090 */
#define XMLNS_TIME "urn:xmpp:time" /* XEP-0202 */
#define XMLNS_PING "urn:xmpp:ping" /* XEP-0199 */
+#define XMLNS_RECEIPTS "urn:xmpp:receipts" /* XEP-0184 */
#define XMLNS_VCARD "vcard-temp" /* XEP-0054 */
#define XMLNS_DELAY "jabber:x:delay" /* XEP-0091 */
#define XMLNS_XDATA "jabber:x:data" /* XEP-0004 */
diff --git a/protocols/jabber/message.c b/protocols/jabber/message.c
index 85c71c9d..1c832bee 100644
--- a/protocols/jabber/message.c
+++ b/protocols/jabber/message.c
@@ -3,7 +3,7 @@
* BitlBee - An IRC to IM gateway *
* Jabber module - Handling of message(s) (tags), etc *
* *
-* Copyright 2006 Wilmer van der Gaast <wilmer@gaast.net> *
+* Copyright 2006-2012 Wilmer van der Gaast <wilmer@gaast.net> *
* *
* 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 *
@@ -28,12 +28,34 @@ xt_status jabber_pkt_message( struct xt_node *node, gpointer data )
struct im_connection *ic = data;
char *from = xt_find_attr( node, "from" );
char *type = xt_find_attr( node, "type" );
+ char *id = xt_find_attr( node, "id" );
struct xt_node *body = xt_find_node( node->children, "body" ), *c;
+ struct xt_node *request = xt_find_node( node->children, "request" );
struct jabber_buddy *bud = NULL;
char *s, *room = NULL, *reason = NULL;
if( !from )
return XT_HANDLED; /* Consider this packet corrupted. */
+
+ if( request && id )
+ {
+ /* Send a message receipt (XEP-0184), looking like this:
+ * <message
+ * from='kingrichard@royalty.england.lit/throne'
+ * id='bi29sg183b4v'
+ * to='northumberland@shakespeare.lit/westminster'>
+ * <received xmlns='urn:xmpp:receipts' id='richard2-4.1.247'/>
+ * </message> */
+ struct xt_node *received, *receipt;
+
+ received = xt_new_node( "received", NULL, NULL );
+ xt_add_attr( received, "xmlns", XMLNS_RECEIPTS );
+ xt_add_attr( received, "id", id );
+ receipt = jabber_make_packet( "message", NULL, from, received );
+
+ jabber_write_packet( ic, receipt );
+ xt_free_node( receipt );
+ }
bud = jabber_buddy_by_jid( ic, from, GET_BUDDY_EXACT );
diff --git a/protocols/jabber/sasl.c b/protocols/jabber/sasl.c
index f25d44c4..450b5b28 100644
--- a/protocols/jabber/sasl.c
+++ b/protocols/jabber/sasl.c
@@ -3,7 +3,7 @@
* BitlBee - An IRC to IM gateway *
* Jabber module - SASL authentication *
* *
-* Copyright 2006 Wilmer van der Gaast <wilmer@gaast.net> *
+* Copyright 2006-2012 Wilmer van der Gaast <wilmer@gaast.net> *
* *
* 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 *
@@ -386,6 +386,7 @@ xt_status sasl_pkt_challenge( struct xt_node *node, gpointer data )
else
{
/* We found rspauth, but don't really care... */
+ g_free( s );
}
s = reply ? tobase64( reply ) : NULL;
diff --git a/protocols/jabber/si.c b/protocols/jabber/si.c
index 4b0e57c4..f5f3b2fe 100644
--- a/protocols/jabber/si.c
+++ b/protocols/jabber/si.c
@@ -292,9 +292,11 @@ int jabber_si_handle_request( struct im_connection *ic, struct xt_node *node, st
requestok = FALSE;
}
- *s = '/';
+ if( s )
+ *s = '/';
}
- else
+
+ if( !requestok )
{
reply = jabber_make_error_packet( node, "item-not-found", "cancel", NULL );
if (!jabber_write_packet( ic, reply ))
diff --git a/protocols/msn/Makefile b/protocols/msn/Makefile
index 49b8d597..417bab78 100644
--- a/protocols/msn/Makefile
+++ b/protocols/msn/Makefile
@@ -37,7 +37,7 @@ $(objects): ../../Makefile.settings Makefile
$(objects): %.o: $(_SRCDIR_)%.c
@echo '*' Compiling $<
- @$(CC) -c $(CFLAGS) $< -o $@
+ @$(CC) -c $(CFLAGS) $(CFLAGS_BITLBEE) $< -o $@
msn_mod.o: $(objects)
@echo '*' Linking msn_mod.o
diff --git a/protocols/msn/msn.c b/protocols/msn/msn.c
index b1bd4b0a..ad01ca24 100644
--- a/protocols/msn/msn.c
+++ b/protocols/msn/msn.c
@@ -1,7 +1,7 @@
/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
- * Copyright 2002-2010 Wilmer van der Gaast and others *
+ * Copyright 2002-2013 Wilmer van der Gaast and others *
\********************************************************************/
/* MSN module - Main file; functions to be called from BitlBee */
@@ -43,7 +43,8 @@ static void msn_init( account_t *acc )
set_add( &acc->set, "mail_notifications", "false", set_eval_bool, acc );
set_add( &acc->set, "switchboard_keepalives", "false", set_eval_bool, acc );
- acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE;
+ acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE |
+ ACC_FLAG_HANDLE_DOMAINS;
}
static void msn_login( account_t *acc )
@@ -52,6 +53,7 @@ static void msn_login( account_t *acc )
struct msn_data *md = g_new0( struct msn_data, 1 );
ic->proto_data = md;
+ ic->flags |= OPT_PONGS | OPT_PONGED;
if( strchr( acc->user, '@' ) == NULL )
{
@@ -97,6 +99,7 @@ static void msn_logout( struct im_connection *ic )
g_free( md->tokens[i] );
g_free( md->lock_key );
g_free( md->pp_policy );
+ g_free( md->uuid );
while( md->groups )
{
@@ -138,6 +141,8 @@ static void msn_logout( struct im_connection *ic )
static int msn_buddy_msg( struct im_connection *ic, char *who, char *message, int away )
{
+ struct bee_user *bu = bee_user_by_handle( ic->bee, ic, who );
+ struct msn_buddy_data *bd = bu ? bu->data : NULL;
struct msn_switchboard *sb;
#ifdef DEBUG
@@ -147,7 +152,11 @@ static int msn_buddy_msg( struct im_connection *ic, char *who, char *message, in
}
else
#endif
- if( ( sb = msn_sb_by_handle( ic, who ) ) )
+ if( bd && bd->flags & MSN_BUDDY_FED )
+ {
+ msn_ns_sendmessage( ic, bu, message );
+ }
+ else if( ( sb = msn_sb_by_handle( ic, who ) ) )
{
return( msn_sb_sendmessage( sb, message ) );
}
@@ -189,11 +198,29 @@ static void msn_set_away( struct im_connection *ic, char *state, char *message )
else if( ( md->away_state = msn_away_state_by_name( state ) ) == NULL )
md->away_state = msn_away_state_list + 1;
- if( !msn_ns_write( ic, -1, "CHG %d %s\r\n", ++md->trId, md->away_state->code ) )
+ if( !msn_ns_write( ic, -1, "CHG %d %s %d:%02d\r\n", ++md->trId, md->away_state->code, MSN_CAP1, MSN_CAP2 ) )
return;
- uux = g_markup_printf_escaped( "<Data><PSM>%s</PSM><CurrentMedia></CurrentMedia>"
- "</Data>", message ? message : "" );
+ uux = g_markup_printf_escaped( "<EndpointData><Capabilities>%d:%02d"
+ "</Capabilities></EndpointData>",
+ MSN_CAP1, MSN_CAP2 );
+ msn_ns_write( ic, -1, "UUX %d %zd\r\n%s", ++md->trId, strlen( uux ), uux );
+ g_free( uux );
+
+ uux = g_markup_printf_escaped( "<PrivateEndpointData><EpName>%s</EpName>"
+ "<Idle>%s</Idle><ClientType>%d</ClientType>"
+ "<State>%s</State></PrivateEndpointData>",
+ md->uuid,
+ strcmp( md->away_state->code, "IDL" ) ? "false" : "true",
+ 1, /* ? */
+ md->away_state->code );
+ msn_ns_write( ic, -1, "UUX %d %zd\r\n%s", ++md->trId, strlen( uux ), uux );
+ g_free( uux );
+
+ uux = g_markup_printf_escaped( "<Data><DDP></DDP><PSM>%s</PSM>"
+ "<CurrentMedia></CurrentMedia>"
+ "<MachineGuid>%s</MachineGuid></Data>",
+ message ? message : "", md->uuid );
msn_ns_write( ic, -1, "UUX %d %zd\r\n%s", ++md->trId, strlen( uux ), uux );
g_free( uux );
}
@@ -231,13 +258,9 @@ static void msn_chat_msg( struct groupchat *c, char *message, int flags )
static void msn_chat_invite( struct groupchat *c, char *who, char *message )
{
struct msn_switchboard *sb = msn_sb_by_chat( c );
- char buf[1024];
if( sb )
- {
- g_snprintf( buf, sizeof( buf ), "CAL %d %s\r\n", ++sb->trId, who );
- msn_sb_write( sb, buf, strlen( buf ) );
- }
+ msn_sb_write( sb, "CAL %d %s\r\n", ++sb->trId, who );
}
static void msn_chat_leave( struct groupchat *c )
@@ -245,7 +268,7 @@ static void msn_chat_leave( struct groupchat *c )
struct msn_switchboard *sb = msn_sb_by_chat( c );
if( sb )
- msn_sb_write( sb, "OUT\r\n", 5 );
+ msn_sb_write( sb, "OUT\r\n" );
}
static struct groupchat *msn_chat_with( struct im_connection *ic, char *who )
@@ -339,8 +362,27 @@ static char *set_eval_display_name( set_t *set, char *value )
static void msn_buddy_data_add( bee_user_t *bu )
{
struct msn_data *md = bu->ic->proto_data;
- bu->data = g_new0( struct msn_buddy_data, 1 );
+ struct msn_buddy_data *bd;
+ char *handle;
+
+ bd = bu->data = g_new0( struct msn_buddy_data, 1 );
g_tree_insert( md->domaintree, bu->handle, bu );
+
+ for( handle = bu->handle; isdigit( *handle ); handle ++ );
+ if( *handle == ':' )
+ {
+ /* Pass a nick hint so hopefully the stupid numeric prefix
+ won't show up to the user. */
+ char *s = strchr( ++handle, '@' );
+ if( s )
+ {
+ handle = g_strndup( handle, s - handle );
+ imcb_buddy_nick_hint( bu->ic, bu->handle, handle );
+ g_free( handle );
+ }
+
+ bd->flags |= MSN_BUDDY_FED;
+ }
}
static void msn_buddy_data_free( bee_user_t *bu )
diff --git a/protocols/msn/msn.h b/protocols/msn/msn.h
index bf7cdfa8..eb5f7dd8 100644
--- a/protocols/msn/msn.h
+++ b/protocols/msn/msn.h
@@ -1,7 +1,7 @@
/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
- * Copyright 2002-2010 Wilmer van der Gaast and others *
+ * Copyright 2002-2012 Wilmer van der Gaast and others *
\********************************************************************/
/* MSN module */
@@ -52,13 +52,21 @@
#define MSNP11_PROD_ID "PROD01065C%ZFN6F"
*/
+/* <= BitlBee 3.0.5
#define MSNP11_PROD_KEY "ILTXC!4IXB5FB*PX"
#define MSNP11_PROD_ID "PROD0119GSJUC$18"
-#define MSNP_VER "MSNP15"
-#define MSNP_BUILD "8.5.1288"
+*/
+
+#define MSNP11_PROD_KEY "C1BX{V4W}Q3*10SM"
+#define MSNP11_PROD_ID "PROD0120PW!CCV9@"
+#define MSNP_VER "MSNP18"
+#define MSNP_BUILD "14.0.8117.416"
#define MSN_SB_NEW -24062002
+#define MSN_CAP1 0xC000
+#define MSN_CAP2 0x0000
+
#define MSN_MESSAGE_HEADERS "MIME-Version: 1.0\r\n" \
"Content-Type: text/plain; charset=UTF-8\r\n" \
"User-Agent: BitlBee " BITLBEE_VERSION "\r\n" \
@@ -117,6 +125,7 @@ struct msn_data
int trId;
char *tokens[4];
char *lock_key, *pp_policy;
+ char *uuid;
GSList *msgq, *grpq, *soapq;
GSList *switchboards;
@@ -188,6 +197,7 @@ typedef enum
MSN_BUDDY_RL = 8,
MSN_BUDDY_PL = 16,
MSN_BUDDY_ADL_SYNCED = 256,
+ MSN_BUDDY_FED = 512,
} msn_buddy_flags_t;
struct msn_buddy_data
@@ -221,15 +231,16 @@ extern GSList *msn_connections;
extern GSList *msn_switchboards;
/* ns.c */
-int msn_ns_write( struct im_connection *ic, int fd, const char *fmt, ... );
+int msn_ns_write( struct im_connection *ic, int fd, const char *fmt, ... ) G_GNUC_PRINTF( 3, 4 );
gboolean msn_ns_connect( struct im_connection *ic, struct msn_handler_data *handler, const char *host, int port );
void msn_ns_close( struct msn_handler_data *handler );
void msn_auth_got_passport_token( struct im_connection *ic, const char *token, const char *error );
void msn_auth_got_contact_list( struct im_connection *ic );
int msn_ns_finish_login( struct im_connection *ic );
+int msn_ns_sendmessage( struct im_connection *ic, struct bee_user *bu, const char *text );
+void msn_ns_oim_send_queue( struct im_connection *ic, GSList **msgq );
/* msn_util.c */
-int msn_logged_in( struct im_connection *ic );
int msn_buddy_list_add( struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *realname_, const char *group );
int msn_buddy_list_remove( struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *group );
void msn_buddy_ask( bee_user_t *bu );
@@ -241,6 +252,7 @@ gint msn_domaintree_cmp( gconstpointer a_, gconstpointer b_ );
struct msn_group *msn_group_by_name( struct im_connection *ic, const char *name );
struct msn_group *msn_group_by_id( struct im_connection *ic, const char *id );
int msn_ns_set_display_name( struct im_connection *ic, const char *value );
+const char *msn_normalize_handle( const char *handle );
/* tables.c */
const struct msn_away_state *msn_away_state_by_number( int number );
@@ -249,9 +261,9 @@ const struct msn_away_state *msn_away_state_by_name( char *name );
const struct msn_status_code *msn_status_by_number( int number );
/* sb.c */
-int msn_sb_write( struct msn_switchboard *sb, const char *fmt, ... );
+int msn_sb_write( struct msn_switchboard *sb, const char *fmt, ... ) G_GNUC_PRINTF( 2, 3 );;
struct msn_switchboard *msn_sb_create( struct im_connection *ic, char *host, int port, char *key, int session );
-struct msn_switchboard *msn_sb_by_handle( struct im_connection *ic, char *handle );
+struct msn_switchboard *msn_sb_by_handle( struct im_connection *ic, const char *handle );
struct msn_switchboard *msn_sb_by_chat( struct groupchat *c );
struct msn_switchboard *msn_sb_spare( struct im_connection *ic );
int msn_sb_sendmessage( struct msn_switchboard *sb, char *text );
diff --git a/protocols/msn/msn_util.c b/protocols/msn/msn_util.c
index d5a74a47..c6afd29a 100644
--- a/protocols/msn/msn_util.c
+++ b/protocols/msn/msn_util.c
@@ -1,7 +1,7 @@
/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
- * Copyright 2002-2010 Wilmer van der Gaast and others *
+ * Copyright 2002-2012 Wilmer van der Gaast and others *
\********************************************************************/
/* MSN module - Miscellaneous utilities */
@@ -29,13 +29,6 @@
#include "soap.h"
#include <ctype.h>
-int msn_logged_in( struct im_connection *ic )
-{
- imcb_connected( ic );
-
- return( 0 );
-}
-
static char *adlrml_entry( const char *handle_, msn_buddy_flags_t list )
{
char *domain, handle[strlen(handle_)+1];
@@ -536,3 +529,11 @@ int msn_ns_set_display_name( struct im_connection *ic, const char *value )
and won't give proper feedback yet if it doesn't. */
return msn_ns_write( ic, -1, "PRP %d MFN %s\r\n", ++md->trId, fn );
}
+
+const char *msn_normalize_handle( const char *handle )
+{
+ if( strncmp( handle, "1:", 2 ) == 0 )
+ return handle + 2;
+ else
+ return handle;
+}
diff --git a/protocols/msn/ns.c b/protocols/msn/ns.c
index 5436270e..7acf4654 100644
--- a/protocols/msn/ns.c
+++ b/protocols/msn/ns.c
@@ -1,7 +1,7 @@
/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
- * Copyright 2002-2010 Wilmer van der Gaast and others *
+ * Copyright 2002-2012 Wilmer van der Gaast and others *
\********************************************************************/
/* MSN module - Notification server callbacks */
@@ -24,9 +24,11 @@
*/
#include <ctype.h>
+#include <sys/utsname.h>
#include "nogaim.h"
#include "msn.h"
#include "md5.h"
+#include "sha1.h"
#include "soap.h"
#include "xmltree.h"
@@ -110,6 +112,23 @@ static gboolean msn_ns_connected( gpointer data, gint source, b_input_condition
handler->rxlen = 0;
handler->rxq = g_new0( char, 1 );
+ if( md->uuid == NULL )
+ {
+ struct utsname name;
+ sha1_state_t sha[1];
+
+ /* UUID == SHA1("BitlBee" + my hostname + MSN username) */
+ sha1_init( sha );
+ sha1_append( sha, (void*) "BitlBee", 7 );
+ if( uname( &name ) == 0 )
+ {
+ sha1_append( sha, (void*) name.nodename, strlen( name.nodename ) );
+ }
+ sha1_append( sha, (void*) ic->acc->user, strlen( ic->acc->user ) );
+ md->uuid = sha1_random_uuid( sha );
+ memcpy( md->uuid, "b171be3e", 8 ); /* :-P */
+ }
+
if( msn_ns_write( ic, source, "VER %d %s CVR0\r\n", ++md->trId, MSNP_VER ) )
{
handler->inpa = b_input_add( handler->fd, B_EV_IO_READ, msn_ns_callback, handler );
@@ -352,9 +371,11 @@ static int msn_ns_command( struct msn_handler_data *handler, char **cmd, int num
g_free( resp );
return st;
}
- else if( strcmp( cmd[0], "ILN" ) == 0 )
+ else if( strcmp( cmd[0], "ILN" ) == 0 || strcmp( cmd[0], "NLN" ) == 0 )
{
const struct msn_away_state *st;
+ const char *handle;
+ int cap = 0;
if( num_parts < 6 )
{
@@ -362,59 +383,45 @@ static int msn_ns_command( struct msn_handler_data *handler, char **cmd, int num
imc_logout( ic, TRUE );
return( 0 );
}
+ /* ILN and NLN are more or less the same, except ILN has a trId
+ at the start, and NLN has a capability field at the end.
+ Does ILN still exist BTW? */
+ if( cmd[0][1] == 'I' )
+ cmd ++;
+ else
+ cap = atoi( cmd[4] );
+
+ handle = msn_normalize_handle( cmd[2] );
+ if( strcmp( handle, ic->acc->user ) == 0 )
+ return 1; /* That's me! */
- http_decode( cmd[5] );
- imcb_rename_buddy( ic, cmd[3], cmd[5] );
+ http_decode( cmd[3] );
+ imcb_rename_buddy( ic, handle, cmd[3] );
- st = msn_away_state_by_code( cmd[2] );
+ st = msn_away_state_by_code( cmd[1] );
if( !st )
{
/* FIXME: Warn/Bomb about unknown away state? */
st = msn_away_state_list + 1;
}
- imcb_buddy_status( ic, cmd[3], OPT_LOGGED_IN |
- ( st != msn_away_state_list ? OPT_AWAY : 0 ),
+ imcb_buddy_status( ic, handle, OPT_LOGGED_IN |
+ ( st != msn_away_state_list ? OPT_AWAY : 0 ) |
+ ( cap & 1 ? OPT_MOBILE : 0 ),
st->name, NULL );
+
+ msn_sb_stop_keepalives( msn_sb_by_handle( ic, handle ) );
}
else if( strcmp( cmd[0], "FLN" ) == 0 )
{
+ const char *handle;
+
if( cmd[1] == NULL )
return 1;
- imcb_buddy_status( ic, cmd[1], 0, NULL, NULL );
-
- msn_sb_start_keepalives( msn_sb_by_handle( ic, cmd[1] ), TRUE );
- }
- else if( strcmp( cmd[0], "NLN" ) == 0 )
- {
- const struct msn_away_state *st;
- int cap;
-
- if( num_parts < 6 )
- {
- imcb_error( ic, "Syntax error" );
- imc_logout( ic, TRUE );
- return( 0 );
- }
-
- http_decode( cmd[4] );
- cap = atoi( cmd[5] );
- imcb_rename_buddy( ic, cmd[2], cmd[4] );
-
- st = msn_away_state_by_code( cmd[1] );
- if( !st )
- {
- /* FIXME: Warn/Bomb about unknown away state? */
- st = msn_away_state_list + 1;
- }
-
- imcb_buddy_status( ic, cmd[2], OPT_LOGGED_IN |
- ( st != msn_away_state_list ? OPT_AWAY : 0 ) |
- ( cap & 1 ? OPT_MOBILE : 0 ),
- st->name, NULL );
-
- msn_sb_stop_keepalives( msn_sb_by_handle( ic, cmd[2] ) );
+ handle = msn_normalize_handle( cmd[1] );
+ imcb_buddy_status( ic, handle, 0, NULL, NULL );
+ msn_sb_start_keepalives( msn_sb_by_handle( ic, handle ), TRUE );
}
else if( strcmp( cmd[0], "RNG" ) == 0 )
{
@@ -461,7 +468,7 @@ static int msn_ns_command( struct msn_handler_data *handler, char **cmd, int num
}
else
{
- sb->who = g_strdup( cmd[5] );
+ sb->who = g_strdup( msn_normalize_handle( cmd[5] ) );
}
}
else if( strcmp( cmd[0], "OUT" ) == 0 )
@@ -554,8 +561,8 @@ static int msn_ns_command( struct msn_handler_data *handler, char **cmd, int num
else if( strcmp( cmd[0], "UBX" ) == 0 )
{
/* Status message. */
- if( num_parts >= 4 )
- handler->msglen = atoi( cmd[3] );
+ if( num_parts >= 3 )
+ handler->msglen = atoi( cmd[2] );
}
else if( strcmp( cmd[0], "NOT" ) == 0 )
{
@@ -564,6 +571,15 @@ static int msn_ns_command( struct msn_handler_data *handler, char **cmd, int num
if( num_parts >= 2 )
handler->msglen = atoi( cmd[1] );
}
+ else if( strcmp( cmd[0], "UBM" ) == 0 )
+ {
+ if( num_parts >= 7 )
+ handler->msglen = atoi( cmd[6] );
+ }
+ else if( strcmp( cmd[0], "QNG" ) == 0 )
+ {
+ ic->flags |= OPT_PONGED;
+ }
else if( isdigit( cmd[0][0] ) )
{
int num = atoi( cmd[0] );
@@ -667,7 +683,57 @@ static int msn_ns_message( struct msn_handler_data *handler, char *msg, int msgl
}
else if( g_strncasecmp( ct, "text/x-msmsgsactivemailnotification", 35 ) == 0 )
{
- /* Sorry, but this one really is *USELESS* */
+ }
+ else if( g_strncasecmp( ct, "text/x-msmsgsinitialmdatanotification", 37 ) == 0 ||
+ g_strncasecmp( ct, "text/x-msmsgsoimnotification", 28 ) == 0 )
+ {
+ /* We received an offline message. Or at least notification
+ that there is one waiting for us. Fetching the message(s)
+ and purging them from the server is a lot of SOAPy work
+ not worth doing IMHO. Also I thought it was possible to
+ have the notification server send them directly, I was
+ pretty sure I saw Pidgin do it..
+
+ At least give a notification for now, seems like a
+ reasonable thing to do. Only problem is, they'll keep
+ coming back at login time until you read them using a
+ different client. :-( */
+
+ char *xml = get_rfc822_header( body, "Mail-Data:", blen );
+ struct xt_node *md, *m;
+
+ if( !xml )
+ return 1;
+ md = xt_from_string( xml, 0 );
+ if( !md )
+ return 1;
+
+ for( m = md->children; ( m = xt_find_node( m, "M" ) ); m = m->next )
+ {
+ struct xt_node *e = xt_find_node( m->children, "E" );
+ struct xt_node *rt = xt_find_node( m->children, "RT" );
+ struct tm tp;
+ time_t msgtime = 0;
+
+ if( !e || !e->text )
+ continue;
+
+ memset( &tp, 0, sizeof( tp ) );
+ if( rt && rt->text &&
+ sscanf( rt->text, "%4d-%2d-%2dT%2d:%2d:%2d.",
+ &tp.tm_year, &tp.tm_mon, &tp.tm_mday,
+ &tp.tm_hour, &tp.tm_min, &tp.tm_sec ) == 6 )
+ {
+ tp.tm_year -= 1900;
+ tp.tm_mon --;
+ msgtime = mktime_utc( &tp );
+
+ }
+ imcb_buddy_msg( ic, e->text, "<< \002BitlBee\002 - Received offline message. BitlBee can't show these. >>", 0, msgtime );
+ }
+
+ g_free( xml );
+ xt_free_node( md );
}
else
{
@@ -682,19 +748,19 @@ static int msn_ns_message( struct msn_handler_data *handler, char *msg, int msgl
struct xt_node *ubx, *psm;
char *psm_text = NULL;
- ubx = xt_from_string( msg );
+ ubx = xt_from_string( msg, msglen );
if( ubx && strcmp( ubx->name, "Data" ) == 0 &&
( psm = xt_find_node( ubx->children, "PSM" ) ) )
psm_text = psm->text;
- imcb_buddy_status_msg( ic, cmd[1], psm_text );
+ imcb_buddy_status_msg( ic, msn_normalize_handle( cmd[1] ), psm_text );
xt_free_node( ubx );
}
else if( strcmp( cmd[0], "ADL" ) == 0 )
{
struct xt_node *adl, *d, *c;
- if( !( adl = xt_from_string( msg ) ) )
+ if( !( adl = xt_from_string( msg, msglen ) ) )
return 1;
for( d = adl->children; d; d = d->next )
@@ -715,6 +781,8 @@ static int msn_ns_message( struct msn_handler_data *handler, char *msg, int msgl
( cn = xt_find_attr( c, "n" ) ) == NULL )
continue;
+ /* FIXME: Use "t" here, guess I should just add it
+ as a prefix like elsewhere in the protocol. */
handle = g_strdup_printf( "%s@%s", cn, dn );
if( !( ( bu = bee_user_by_handle( ic->bee, ic, handle ) ) ||
( bu = bee_user_new( ic->bee, ic, handle, 0 ) ) ) )
@@ -740,8 +808,37 @@ static int msn_ns_message( struct msn_handler_data *handler, char *msg, int msgl
}
}
}
+ else if( strcmp( cmd[0], "UBM" ) == 0 )
+ {
+ /* This one will give us msgs from federated networks. Technically
+ it should also get us offline messages, but I don't know how
+ I can signal MSN servers to use it. */
+ char *ct, *handle;
+
+ if( strcmp( cmd[1], ic->acc->user ) == 0 )
+ {
+ /* With MPOP, you'll get copies of your own msgs from other
+ sessions. Discard those at least for now. */
+ return 1;
+ }
+
+ ct = get_rfc822_header( msg, "Content-Type", msglen );
+ if( strncmp( ct, "text/plain", 10 ) != 0 )
+ {
+ /* Typing notification or something? */
+ g_free( ct );
+ return 1;
+ }
+ if( strcmp( cmd[2], "1" ) != 0 )
+ handle = g_strdup_printf( "%s:%s", cmd[2], cmd[1] );
+ else
+ handle = g_strdup( cmd[1] );
+
+ imcb_buddy_msg( ic, handle, body, 0, 0 );
+ g_free( handle );
+ }
- return( 1 );
+ return 1;
}
void msn_auth_got_passport_token( struct im_connection *ic, const char *token, const char *error )
@@ -756,7 +853,7 @@ void msn_auth_got_passport_token( struct im_connection *ic, const char *token, c
if( token )
{
- msn_ns_write( ic, -1, "USR %d SSO S %s %s\r\n", ++md->trId, md->tokens[0], token );
+ msn_ns_write( ic, -1, "USR %d SSO S %s %s {%s}\r\n", ++md->trId, md->tokens[0], token, md->uuid );
}
else
{
@@ -808,7 +905,7 @@ static gboolean msn_ns_send_adl_1( gpointer key, gpointer value, gpointer data )
c = xt_new_node( "c", NULL, NULL );
xt_add_attr( c, "n", handle );
xt_add_attr( c, "l", l );
- xt_add_attr( c, "t", "1" ); /* 1 means normal, 4 means mobile? */
+ xt_add_attr( c, "t", "1" ); /* FIXME: Network type, i.e. 32 for Y!MSG */
xt_insert_child( d, c );
/* Do this in batches of 100. */
@@ -885,3 +982,60 @@ int msn_ns_finish_login( struct im_connection *ic )
return 1;
}
+
+int msn_ns_sendmessage( struct im_connection *ic, bee_user_t *bu, const char *text )
+{
+ struct msn_data *md = ic->proto_data;
+ int type = 0;
+ char *buf, *handle;
+
+ if( strncmp( text, "\r\r\r", 3 ) == 0 )
+ /* Err. Shouldn't happen but I guess it can. Don't send others
+ any of the "SHAKE THAT THING" messages. :-D */
+ return 1;
+
+ /* This might be a federated contact. Get its network number,
+ prefixed to bu->handle with a colon. Default is 1. */
+ for( handle = bu->handle; isdigit( *handle ); handle ++ )
+ type = type * 10 + *handle - '0';
+ if( *handle == ':' )
+ handle ++;
+ else
+ type = 1;
+
+ buf = g_strdup_printf( "%s%s", MSN_MESSAGE_HEADERS, text );
+
+ if( msn_ns_write( ic, -1, "UUM %d %s %d %d %zd\r\n%s",
+ ++md->trId, handle, type,
+ 1, /* type == IM (not nudge/typing) */
+ strlen( buf ), buf ) )
+ return 1;
+ else
+ return 0;
+}
+
+void msn_ns_oim_send_queue( struct im_connection *ic, GSList **msgq )
+{
+ GSList *l;
+
+ for( l = *msgq; l; l = l->next )
+ {
+ struct msn_message *m = l->data;
+ bee_user_t *bu = bee_user_by_handle( ic->bee, ic, m->who );
+
+ if( bu )
+ if( !msn_ns_sendmessage( ic, bu, m->text ) )
+ return;
+ }
+
+ while( *msgq != NULL )
+ {
+ struct msn_message *m = (*msgq)->data;
+
+ g_free( m->who );
+ g_free( m->text );
+ g_free( m );
+
+ *msgq = g_slist_remove( *msgq, m );
+ }
+}
diff --git a/protocols/msn/sb.c b/protocols/msn/sb.c
index 45e74cb0..1cd1c743 100644
--- a/protocols/msn/sb.c
+++ b/protocols/msn/sb.c
@@ -1,7 +1,7 @@
/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
- * Copyright 2002-2010 Wilmer van der Gaast and others *
+ * Copyright 2002-2012 Wilmer van der Gaast and others *
\********************************************************************/
/* MSN module - Switchboard server callbacks and utilities */
@@ -121,7 +121,7 @@ struct msn_switchboard *msn_sb_create( struct im_connection *ic, char *host, int
return( sb );
}
-struct msn_switchboard *msn_sb_by_handle( struct im_connection *ic, char *handle )
+struct msn_switchboard *msn_sb_by_handle( struct im_connection *ic, const char *handle )
{
struct msn_data *md = ic->proto_data;
struct msn_switchboard *sb;
@@ -307,6 +307,7 @@ gboolean msn_sb_connected( gpointer data, gint source, b_input_condition cond )
{
struct msn_switchboard *sb = data;
struct im_connection *ic;
+ struct msn_data *md;
char buf[1024];
/* Are we still alive? */
@@ -314,6 +315,7 @@ gboolean msn_sb_connected( gpointer data, gint source, b_input_condition cond )
return FALSE;
ic = sb->ic;
+ md = ic->proto_data;
if( source != sb->fd )
{
@@ -331,9 +333,9 @@ gboolean msn_sb_connected( gpointer data, gint source, b_input_condition cond )
sb->handler->exec_message = msn_sb_message;
if( sb->session == MSN_SB_NEW )
- g_snprintf( buf, sizeof( buf ), "USR %d %s %s\r\n", ++sb->trId, ic->acc->user, sb->key );
+ g_snprintf( buf, sizeof( buf ), "USR %d %s;{%s} %s\r\n", ++sb->trId, ic->acc->user, md->uuid, sb->key );
else
- g_snprintf( buf, sizeof( buf ), "ANS %d %s %s %d\r\n", ++sb->trId, ic->acc->user, sb->key, sb->session );
+ g_snprintf( buf, sizeof( buf ), "ANS %d %s;{%s} %s %d\r\n", ++sb->trId, ic->acc->user, md->uuid, sb->key, sb->session );
if( msn_sb_write( sb, "%s", buf ) )
sb->inp = b_input_add( sb->fd, B_EV_IO_READ, msn_sb_callback, sb );
@@ -452,18 +454,31 @@ static int msn_sb_command( struct msn_handler_data *handler, char **cmd, int num
{
char buf[1024];
- if( num == 1 )
+ /* For as much as I understand this MPOP stuff now, a
+ switchboard has two (or more) roster entries per
+ participant. One "bare JID" and one JID;UUID. Ignore
+ the latter. */
+ if( !strchr( cmd[4], ';' ) )
{
- g_snprintf( buf, sizeof( buf ), "MSN groupchat session %d", sb->session );
- sb->chat = imcb_chat_new( ic, buf );
+ /* HACK: Since even 1:1 chats now have >2 participants
+ (ourselves included) it gets hard to tell them apart
+ from rooms. Let's hope this is enough: */
+ if( sb->chat == NULL && num != tot )
+ {
+ g_snprintf( buf, sizeof( buf ), "MSN groupchat session %d", sb->session );
+ sb->chat = imcb_chat_new( ic, buf );
+
+ g_free( sb->who );
+ sb->who = NULL;
+ }
- g_free( sb->who );
- sb->who = NULL;
+ if( sb->chat )
+ imcb_chat_add_buddy( sb->chat, cmd[4] );
}
- imcb_chat_add_buddy( sb->chat, cmd[4] );
-
- if( num == tot )
+ /* We have the full roster, start showing the channel to
+ the user. */
+ if( num == tot && sb->chat )
{
imcb_chat_add_buddy( sb->chat, ic->acc->user );
}
@@ -506,6 +521,10 @@ static int msn_sb_command( struct msn_handler_data *handler, char **cmd, int num
return( 0 );
}
+ /* See IRO above. Handle "bare JIDs" only. */
+ if( strchr( cmd[1], ';' ) )
+ return 1;
+
if( sb->who && g_strcasecmp( cmd[1], sb->who ) == 0 )
{
/* The user we wanted to talk to is finally there, let's send the queued messages then. */
@@ -540,6 +559,10 @@ static int msn_sb_command( struct msn_handler_data *handler, char **cmd, int num
return( st );
}
+ else if( strcmp( cmd[1], ic->acc->user ) == 0 )
+ {
+ /* Well, gee thanks. Thanks for letting me know I've arrived.. */
+ }
else if( sb->who )
{
debug( "Converting chat with %s to a groupchat because %s joined the session.", sb->who, cmd[1] );
@@ -612,7 +635,7 @@ static int msn_sb_command( struct msn_handler_data *handler, char **cmd, int num
as a spare for a next conversation sounds more sane to me.
The server will clean it up when it's idle for too long. */
}
- else if( sb->chat )
+ else if( sb->chat && !strchr( cmd[1], ';' ) )
{
imcb_chat_remove_buddy( sb->chat, cmd[1], "" );
}
@@ -628,12 +651,9 @@ static int msn_sb_command( struct msn_handler_data *handler, char **cmd, int num
/* If the person is offline, send an offline message instead,
and don't report an error. */
- /* TODO: Support for OIMs that works. (#874) */
- /*
if( num == 217 )
- msn_soap_oim_send_queue( ic, &sb->msgq );
+ msn_ns_oim_send_queue( ic, &sb->msgq );
else
- */
imcb_error( ic, "Error reported by switchboard server: %s", err->text );
if( err->flags & STATUS_SB_FATAL )
diff --git a/protocols/msn/soap.c b/protocols/msn/soap.c
index da32c291..b994172b 100644
--- a/protocols/msn/soap.c
+++ b/protocols/msn/soap.c
@@ -1,7 +1,7 @@
/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
- * Copyright 2002-2010 Wilmer van der Gaast and others *
+ * Copyright 2002-2012 Wilmer van der Gaast and others *
\********************************************************************/
/* MSN module - All the SOAPy XML stuff.
@@ -228,7 +228,7 @@ static void msn_soap_debug_print( const char *headers, const char *payload )
if( payload )
{
- struct xt_node *xt = xt_from_string( payload );
+ struct xt_node *xt = xt_from_string( payload, 0 );
if( xt )
xt_print( xt );
xt_free_node( xt );
diff --git a/protocols/msn/soap.h b/protocols/msn/soap.h
index d6a1f75e..cb731ea7 100644
--- a/protocols/msn/soap.h
+++ b/protocols/msn/soap.h
@@ -1,7 +1,7 @@
/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
- * Copyright 2002-2010 Wilmer van der Gaast and others *
+ * Copyright 2002-2012 Wilmer van der Gaast and others *
\********************************************************************/
/* MSN module - All the SOAPy XML stuff.
diff --git a/protocols/nogaim.c b/protocols/nogaim.c
index 773e3877..2f75a7b8 100644
--- a/protocols/nogaim.c
+++ b/protocols/nogaim.c
@@ -1,7 +1,7 @@
/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
- * Copyright 2002-2010 Wilmer van der Gaast and others *
+ * Copyright 2002-2012 Wilmer van der Gaast and others *
\********************************************************************/
/*
@@ -260,12 +260,32 @@ static gboolean send_keepalive( gpointer d, gint fd, b_input_condition cond )
{
struct im_connection *ic = d;
+ if( ( ic->flags & OPT_PONGS ) && !( ic->flags & OPT_PONGED ) )
+ {
+ /* This protocol is expected to ack keepalives and hasn't
+ since the last time we were here. */
+ imcb_error( ic, "Connection timeout" );
+ imc_logout( ic, TRUE );
+ return FALSE;
+ }
+ ic->flags &= ~OPT_PONGED;
+
if( ic->acc->prpl->keepalive )
ic->acc->prpl->keepalive( ic );
return TRUE;
}
+void start_keepalives( struct im_connection *ic, int interval )
+{
+ b_event_remove( ic->keepalive );
+ ic->keepalive = b_timeout_add( interval, send_keepalive, ic );
+
+ /* Connecting successfully counts as a first successful pong. */
+ if( ic->flags & OPT_PONGS )
+ ic->flags |= OPT_PONGED;
+}
+
void imcb_connected( struct im_connection *ic )
{
/* MSN servers sometimes redirect you to a different server and do
@@ -276,9 +296,8 @@ void imcb_connected( struct im_connection *ic )
imcb_log( ic, "Logged in" );
- b_event_remove( ic->keepalive );
- ic->keepalive = b_timeout_add( 60000, send_keepalive, ic );
ic->flags |= OPT_LOGGED_IN;
+ start_keepalives( ic, 60000 );
/* Necessary to send initial presence status, even if we're not away. */
imc_away_send_update( ic );
diff --git a/protocols/nogaim.h b/protocols/nogaim.h
index a98b7054..3fd940b5 100644
--- a/protocols/nogaim.h
+++ b/protocols/nogaim.h
@@ -1,7 +1,7 @@
/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
- * Copyright 2002-2010 Wilmer van der Gaast and others *
+ * Copyright 2002-2012 Wilmer van der Gaast and others *
\********************************************************************/
/*
@@ -15,7 +15,7 @@
*
* Copyright (C) 1998-1999, Mark Spencer <markster@marko.net>
* (and possibly other members of the Gaim team)
- * Copyright 2002-2007 Wilmer van der Gaast <wilmer@gaast.net>
+ * Copyright 2002-2012 Wilmer van der Gaast <wilmer@gaast.net>
*/
/*
@@ -67,6 +67,8 @@
#define OPT_TYPING 0x00000100 /* Some pieces of code make assumptions */
#define OPT_THINKING 0x00000200 /* about these values... Stupid me! */
#define OPT_NOOTR 0x00001000 /* protocol not suitable for OTR */
+#define OPT_PONGS 0x00010000 /* Service sends us keep-alives */
+#define OPT_PONGED 0x00020000 /* Received a keep-alive during last interval */
/* ok. now the fun begins. first we create a connection structure */
struct im_connection
@@ -87,11 +89,8 @@ struct im_connection
GSList *deny;
int permdeny;
- char displayname[128];
char *away;
- int evil;
-
/* BitlBee */
bee_t *bee;
@@ -126,7 +125,6 @@ struct buddy {
char name[80];
char show[BUDDY_ALIAS_MAXLEN];
int present;
- int evil;
time_t signon;
time_t idle;
int uc;
@@ -197,7 +195,7 @@ struct prpl {
void (* add_deny) (struct im_connection *, char *who);
void (* rem_permit) (struct im_connection *, char *who);
void (* rem_deny) (struct im_connection *, char *who);
- /* Doesn't actually have UI hooks. */
+ /* Doesn't actually have UI hooks. Not used at all, can be removed. */
void (* set_permit_deny)(struct im_connection *);
/* Request profile info. Free-formatted stuff, the IM module gives back
diff --git a/protocols/oscar/Makefile b/protocols/oscar/Makefile
index b26484ec..8088bdb6 100644
--- a/protocols/oscar/Makefile
+++ b/protocols/oscar/Makefile
@@ -38,7 +38,7 @@ $(objects): ../../Makefile.settings Makefile
$(objects): %.o: $(_SRCDIR_)%.c
@echo '*' Compiling $<
- @$(CC) -c $(CFLAGS) $< -o $@
+ @$(CC) -c $(CFLAGS) $(CFLAGS_BITLBEE) $< -o $@
oscar_mod.o: $(objects)
@echo '*' Linking oscar_mod.o
diff --git a/protocols/oscar/aim.h b/protocols/oscar/aim.h
index 479f8fd0..3f26b392 100644
--- a/protocols/oscar/aim.h
+++ b/protocols/oscar/aim.h
@@ -409,15 +409,6 @@ typedef struct {
#define AIM_USERINFO_PRESENT_CAPABILITIES 0x00000080
#define AIM_USERINFO_PRESENT_SESSIONLEN 0x00000100
-const char *aim_userinfo_sn(aim_userinfo_t *ui);
-guint16 aim_userinfo_flags(aim_userinfo_t *ui);
-guint16 aim_userinfo_idle(aim_userinfo_t *ui);
-float aim_userinfo_warnlevel(aim_userinfo_t *ui);
-time_t aim_userinfo_membersince(aim_userinfo_t *ui);
-time_t aim_userinfo_onlinesince(aim_userinfo_t *ui);
-guint32 aim_userinfo_sessionlen(aim_userinfo_t *ui);
-int aim_userinfo_hascap(aim_userinfo_t *ui, guint32 cap);
-
#define AIM_FLAG_UNCONFIRMED 0x0001 /* "damned transients" */
#define AIM_FLAG_ADMINISTRATOR 0x0002
#define AIM_FLAG_AOL 0x0004
@@ -473,7 +464,6 @@ int aim_writetlvchain(aim_bstream_t *bs, aim_tlvlist_t **list);
int aim_addtlvtochain8(aim_tlvlist_t **list, const guint16 t, const guint8 v);
int aim_addtlvtochain16(aim_tlvlist_t **list, const guint16 t, const guint16 v);
int aim_addtlvtochain32(aim_tlvlist_t **list, const guint16 type, const guint32 v);
-int aim_addtlvtochain_availmsg(aim_tlvlist_t **list, const guint16 type, const char *msg);
int aim_addtlvtochain_raw(aim_tlvlist_t **list, const guint16 t, const guint16 l, const guint8 *v);
int aim_addtlvtochain_caps(aim_tlvlist_t **list, const guint16 t, const guint32 caps);
int aim_addtlvtochain_noval(aim_tlvlist_t **list, const guint16 type);
@@ -600,13 +590,7 @@ struct aim_chat_invitation {
#define AIM_WARN_ANON 0x01
-int aim_sendpauseack(aim_session_t *sess, aim_conn_t *conn);
-int aim_send_warning(aim_session_t *sess, aim_conn_t *conn, const char *destsn, guint32 flags);
-int aim_nop(aim_session_t *, aim_conn_t *);
int aim_flap_nop(aim_session_t *sess, aim_conn_t *conn);
-int aim_bos_setidle(aim_session_t *, aim_conn_t *, guint32);
-int aim_bos_changevisibility(aim_session_t *, aim_conn_t *, int, const char *);
-int aim_bos_setbuddylist(aim_session_t *, aim_conn_t *, const char *);
int aim_bos_setprofile(aim_session_t *sess, aim_conn_t *conn, const char *profile, const char *awaymsg, guint32 caps);
int aim_bos_setgroupperm(aim_session_t *, aim_conn_t *, guint32 mask);
int aim_bos_setprivacyflags(aim_session_t *, aim_conn_t *, guint32);
@@ -615,8 +599,6 @@ int aim_reqservice(aim_session_t *, aim_conn_t *, guint16);
int aim_bos_reqrights(aim_session_t *, aim_conn_t *);
int aim_bos_reqbuddyrights(aim_session_t *, aim_conn_t *);
int aim_bos_reqlocaterights(aim_session_t *, aim_conn_t *);
-int aim_setdirectoryinfo(aim_session_t *sess, aim_conn_t *conn, const char *first, const char *middle, const char *last, const char *maiden, const char *nickname, const char *street, const char *city, const char *state, const char *zip, int country, guint16 privacy);
-int aim_setuserinterests(aim_session_t *sess, aim_conn_t *conn, const char *interest1, const char *interest2, const char *interest3, const char *interest4, const char *interest5, guint16 privacy);
int aim_setextstatus(aim_session_t *sess, aim_conn_t *conn, guint32 status);
struct aim_fileheader_t *aim_getlisting(aim_session_t *sess, FILE *);
@@ -626,7 +608,6 @@ struct aim_fileheader_t *aim_getlisting(aim_session_t *sess, FILE *);
#define AIM_CLIENTTYPE_WINAIM 0x0002
#define AIM_CLIENTTYPE_WINAIM41 0x0003
#define AIM_CLIENTTYPE_AOL_TOC 0x0004
-unsigned short aim_fingerprintclient(unsigned char *msghdr, int len);
#define AIM_RATE_CODE_CHANGE 0x0001
#define AIM_RATE_CODE_WARNING 0x0002
@@ -646,8 +627,6 @@ int aim_oft_getfile_end(aim_session_t *sess, aim_conn_t *conn);
#define AIM_SENDMEMBLOCK_FLAG_ISREQUEST 0
#define AIM_SENDMEMBLOCK_FLAG_ISHASH 1
-int aim_sendmemblock(aim_session_t *sess, aim_conn_t *conn, guint32 offset, guint32 len, const guint8 *buf, guint8 flag);
-
#define AIM_GETINFO_GENERALINFO 0x00001
#define AIM_GETINFO_AWAYMESSAGE 0x00003
#define AIM_GETINFO_CAPABILITIES 0x0004
@@ -673,12 +652,9 @@ int aim_handlerendconnect(aim_session_t *sess, aim_conn_t *cur);
#define AIM_TRANSFER_DENY_NOTSUPPORTED 0x0000
#define AIM_TRANSFER_DENY_DECLINE 0x0001
#define AIM_TRANSFER_DENY_NOTACCEPTING 0x0002
-int aim_denytransfer(aim_session_t *sess, const char *sender, const guint8 *cookie, unsigned short code);
aim_conn_t *aim_accepttransfer(aim_session_t *sess, aim_conn_t *conn, const char *sn, const guint8 *cookie, const guint8 *ip, guint16 listingfiles, guint16 listingtotsize, guint16 listingsize, guint32 listingchecksum, guint16 rendid);
int aim_getinfo(aim_session_t *, aim_conn_t *, const char *, unsigned short);
-int aim_sendbuddyoncoming(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *info);
-int aim_sendbuddyoffgoing(aim_session_t *sess, aim_conn_t *conn, const char *sn);
#define AIM_IMPARAM_FLAG_CHANMSGS_ALLOWED 0x00000001
#define AIM_IMPARAM_FLAG_MISSEDCALLS_ENABLED 0x00000002
@@ -746,16 +722,12 @@ struct aim_chat_exchangeinfo {
int aim_chat_send_im(aim_session_t *sess, aim_conn_t *conn, guint16 flags, const char *msg, int msglen);
int aim_chat_join(aim_session_t *sess, aim_conn_t *conn, guint16 exchange, const char *roomname, guint16 instance);
-int aim_chat_attachname(aim_conn_t *conn, guint16 exchange, const char *roomname, guint16 instance);
-char *aim_chat_getname(aim_conn_t *conn);
-aim_conn_t *aim_chat_getconn(aim_session_t *, const char *name);
int aim_chatnav_reqrights(aim_session_t *sess, aim_conn_t *conn);
int aim_chat_invite(aim_session_t *sess, aim_conn_t *conn, const char *sn, const char *msg, guint16 exchange, const char *roomname, guint16 instance);
int aim_chatnav_createroom(aim_session_t *sess, aim_conn_t *conn, const char *name, guint16 exchange);
-int aim_chat_leaveroom(aim_session_t *sess, const char *name);
/* aim_util.c */
/*
@@ -811,10 +783,6 @@ int aim_chat_leaveroom(aim_session_t *sess, const char *name);
(((*((buf)+3)) << 24) & 0xff000000))
-int aimutil_putstr(u_char *, const char *, int);
-int aimutil_tokslen(char *toSearch, int index, char dl);
-int aimutil_itemcnt(char *toSearch, char dl);
-char *aimutil_itemidx(char *toSearch, int index, char dl);
int aim_sncmp(const char *a, const char *b);
#include <aim_internal.h>
diff --git a/protocols/oscar/aim_internal.h b/protocols/oscar/aim_internal.h
index 80a9c758..e4cdd0a2 100644
--- a/protocols/oscar/aim_internal.h
+++ b/protocols/oscar/aim_internal.h
@@ -111,9 +111,6 @@ aim_snac_t *aim_remsnac(aim_session_t *, aim_snacid_t id);
void aim_cleansnacs(aim_session_t *, int maxage);
int aim_putsnac(aim_bstream_t *, guint16 family, guint16 type, guint16 flags, aim_snacid_t id);
-aim_conn_t *aim_cloneconn(aim_session_t *sess, aim_conn_t *src);
-void aim_clonehandlers(aim_session_t *sess, aim_conn_t *dest, aim_conn_t *src);
-
int aim_oft_buildheader(unsigned char *,struct aim_fileheader_t *);
int aim_parse_unknown(aim_session_t *, aim_frame_t *, ...);
@@ -194,12 +191,9 @@ int aim_freecookie(aim_session_t *sess, aim_msgcookie_t *cookie);
int aim_cookie_free(aim_session_t *sess, aim_msgcookie_t *cookie);
int aim_extractuserinfo(aim_session_t *sess, aim_bstream_t *bs, aim_userinfo_t *);
-int aim_putuserinfo(aim_bstream_t *bs, aim_userinfo_t *info);
int aim_chat_readroominfo(aim_bstream_t *bs, struct aim_chat_roominfo *outinfo);
-int aim_request_directim(aim_session_t *sess, const char *destsn, guint8 *ip, guint16 port, guint8 *ckret);
-int aim_request_sendfile(aim_session_t *sess, const char *sn, const char *filename, guint16 numfiles, guint32 totsize, guint8 *ip, guint16 port, guint8 *ckret);
void aim_conn_close_rend(aim_session_t *sess, aim_conn_t *conn);
void aim_conn_kill_rend(aim_session_t *sess, aim_conn_t *conn);
@@ -209,6 +203,5 @@ void aim_conn_kill_chat(aim_session_t *sess, aim_conn_t *conn);
int aim_setversions(aim_session_t *sess, aim_conn_t *conn);
int aim_reqrates(aim_session_t *, aim_conn_t *);
int aim_rates_addparam(aim_session_t *, aim_conn_t *);
-int aim_rates_delparam(aim_session_t *, aim_conn_t *);
#endif /* __AIM_INTERNAL_H__ */
diff --git a/protocols/oscar/bos.c b/protocols/oscar/bos.c
index e7f12f79..4a1c5036 100644
--- a/protocols/oscar/bos.c
+++ b/protocols/oscar/bos.c
@@ -55,86 +55,6 @@ int aim_bos_setgroupperm(aim_session_t *sess, aim_conn_t *conn, guint32 mask)
return aim_genericreq_l(sess, conn, 0x0009, 0x0004, &mask);
}
-/*
- * Modify permit/deny lists (group 9, types 5, 6, 7, and 8)
- *
- * Changes your visibility depending on changetype:
- *
- * AIM_VISIBILITYCHANGE_PERMITADD: Lets provided list of names see you
- * AIM_VISIBILITYCHANGE_PERMIDREMOVE: Removes listed names from permit list
- * AIM_VISIBILITYCHANGE_DENYADD: Hides you from provided list of names
- * AIM_VISIBILITYCHANGE_DENYREMOVE: Lets list see you again
- *
- * list should be a list of
- * screen names in the form "Screen Name One&ScreenNameTwo&" etc.
- *
- * Equivelents to options in WinAIM:
- * - Allow all users to contact me: Send an AIM_VISIBILITYCHANGE_DENYADD
- * with only your name on it.
- * - Allow only users on my Buddy List: Send an
- * AIM_VISIBILITYCHANGE_PERMITADD with the list the same as your
- * buddy list
- * - Allow only the uesrs below: Send an AIM_VISIBILITYCHANGE_PERMITADD
- * with everyone listed that you want to see you.
- * - Block all users: Send an AIM_VISIBILITYCHANGE_PERMITADD with only
- * yourself in the list
- * - Block the users below: Send an AIM_VISIBILITYCHANGE_DENYADD with
- * the list of users to be blocked
- *
- * XXX ye gods.
- */
-int aim_bos_changevisibility(aim_session_t *sess, aim_conn_t *conn, int changetype, const char *denylist)
-{
- aim_frame_t *fr;
- int packlen = 0;
- guint16 subtype;
- char *localcpy = NULL, *tmpptr = NULL;
- int i;
- int listcount;
- aim_snacid_t snacid;
-
- if (!denylist)
- return -EINVAL;
-
- if (changetype == AIM_VISIBILITYCHANGE_PERMITADD)
- subtype = 0x05;
- else if (changetype == AIM_VISIBILITYCHANGE_PERMITREMOVE)
- subtype = 0x06;
- else if (changetype == AIM_VISIBILITYCHANGE_DENYADD)
- subtype = 0x07;
- else if (changetype == AIM_VISIBILITYCHANGE_DENYREMOVE)
- subtype = 0x08;
- else
- return -EINVAL;
-
- localcpy = g_strdup(denylist);
-
- listcount = aimutil_itemcnt(localcpy, '&');
- packlen = aimutil_tokslen(localcpy, 99, '&') + listcount + 9;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, packlen))) {
- g_free(localcpy);
- return -ENOMEM;
- }
-
- snacid = aim_cachesnac(sess, 0x0009, subtype, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0009, subtype, 0x00, snacid);
-
- for (i = 0; (i < (listcount - 1)) && (i < 99); i++) {
- tmpptr = aimutil_itemidx(localcpy, i, '&');
-
- aimbs_put8(&fr->data, strlen(tmpptr));
- aimbs_putraw(&fr->data, (guint8 *)tmpptr, strlen(tmpptr));
-
- g_free(tmpptr);
- }
- g_free(localcpy);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
static int snachandler(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
{
diff --git a/protocols/oscar/buddylist.c b/protocols/oscar/buddylist.c
index a7b461f2..3335c5ab 100644
--- a/protocols/oscar/buddylist.c
+++ b/protocols/oscar/buddylist.c
@@ -90,61 +90,3 @@ int buddylist_modfirst(aim_session_t *sess, aim_module_t *mod)
return 0;
}
-
-/*
- * aim_add_buddy()
- *
- * Adds a single buddy to your buddy list after login.
- *
- * XXX this should just be an extension of setbuddylist()
- *
- */
-int aim_add_buddy(aim_session_t *sess, aim_conn_t *conn, const char *sn)
-{
- aim_frame_t *fr;
- aim_snacid_t snacid;
-
- if (!sn || !strlen(sn))
- return -EINVAL;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+1+strlen(sn))))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0003, 0x0004, 0x0000, sn, strlen(sn)+1);
- aim_putsnac(&fr->data, 0x0003, 0x0004, 0x0000, snacid);
-
- aimbs_put8(&fr->data, strlen(sn));
- aimbs_putraw(&fr->data, (guint8 *)sn, strlen(sn));
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-/*
- * XXX generalise to support removing multiple buddies (basically, its
- * the same as setbuddylist() but with a different snac subtype).
- *
- */
-int aim_remove_buddy(aim_session_t *sess, aim_conn_t *conn, const char *sn)
-{
- aim_frame_t *fr;
- aim_snacid_t snacid;
-
- if (!sn || !strlen(sn))
- return -EINVAL;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+1+strlen(sn))))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0003, 0x0005, 0x0000, sn, strlen(sn)+1);
- aim_putsnac(&fr->data, 0x0003, 0x0005, 0x0000, snacid);
-
- aimbs_put8(&fr->data, strlen(sn));
- aimbs_putraw(&fr->data, (guint8 *)sn, strlen(sn));
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
diff --git a/protocols/oscar/buddylist.h b/protocols/oscar/buddylist.h
index 9a325279..55189581 100644
--- a/protocols/oscar/buddylist.h
+++ b/protocols/oscar/buddylist.h
@@ -16,8 +16,4 @@
#define AIM_CB_BUD_OFFGOING 0x000c
#define AIM_CB_BUD_DEFAULT 0xffff
-/* aim_buddylist.c */
-int aim_add_buddy(aim_session_t *, aim_conn_t *, const char *);
-int aim_remove_buddy(aim_session_t *, aim_conn_t *, const char *);
-
#endif /* __OSCAR_BUDDYLIST_H__ */
diff --git a/protocols/oscar/chat.c b/protocols/oscar/chat.c
index a5db8fba..d8399563 100644
--- a/protocols/oscar/chat.c
+++ b/protocols/oscar/chat.c
@@ -27,65 +27,6 @@ void aim_conn_kill_chat(aim_session_t *sess, aim_conn_t *conn)
return;
}
-char *aim_chat_getname(aim_conn_t *conn)
-{
- struct chatconnpriv *ccp;
-
- if (!conn)
- return NULL;
-
- if (conn->type != AIM_CONN_TYPE_CHAT)
- return NULL;
-
- ccp = (struct chatconnpriv *)conn->priv;
-
- return ccp->name;
-}
-
-/* XXX get this into conn.c -- evil!! */
-aim_conn_t *aim_chat_getconn(aim_session_t *sess, const char *name)
-{
- aim_conn_t *cur;
-
- for (cur = sess->connlist; cur; cur = cur->next) {
- struct chatconnpriv *ccp = (struct chatconnpriv *)cur->priv;
-
- if (cur->type != AIM_CONN_TYPE_CHAT)
- continue;
- if (!cur->priv) {
- imcb_error(sess->aux_data, "chat connection with no name!");
- continue;
- }
-
- if (strcmp(ccp->name, name) == 0)
- break;
- }
-
- return cur;
-}
-
-int aim_chat_attachname(aim_conn_t *conn, guint16 exchange, const char *roomname, guint16 instance)
-{
- struct chatconnpriv *ccp;
-
- if (!conn || !roomname)
- return -EINVAL;
-
- if (conn->priv)
- g_free(conn->priv);
-
- if (!(ccp = g_malloc(sizeof(struct chatconnpriv))))
- return -ENOMEM;
-
- ccp->exchange = exchange;
- ccp->name = g_strdup(roomname);
- ccp->instance = instance;
-
- conn->priv = (void *)ccp;
-
- return 0;
-}
-
/*
* Send a Chat Message.
*
@@ -253,18 +194,6 @@ int aim_chat_readroominfo(aim_bstream_t *bs, struct aim_chat_roominfo *outinfo)
return 0;
}
-int aim_chat_leaveroom(aim_session_t *sess, const char *name)
-{
- aim_conn_t *conn;
-
- if (!(conn = aim_chat_getconn(sess, name)))
- return -ENOENT;
-
- aim_conn_close(conn);
-
- return 0;
-}
-
/*
* conn must be a BOS connection!
*/
diff --git a/protocols/oscar/conn.c b/protocols/oscar/conn.c
index 77ffd50f..a178761e 100644
--- a/protocols/oscar/conn.c
+++ b/protocols/oscar/conn.c
@@ -353,50 +353,6 @@ aim_conn_t *aim_getconn_type_all(aim_session_t *sess, int type)
}
/**
- * aim_cloneconn - clone an aim_conn_t
- * @sess: session containing parent
- * @src: connection to clone
- *
- * A new connection is allocated, and the values are filled in
- * appropriately. Note that this function sets the new connnection's
- * ->priv pointer to be equal to that of its parent: only the pointer
- * is copied, not the data it points to.
- *
- * This function returns a pointer to the new aim_conn_t, or %NULL on
- * error
- */
-aim_conn_t *aim_cloneconn(aim_session_t *sess, aim_conn_t *src)
-{
- aim_conn_t *conn;
-
- if (!(conn = aim_conn_getnext(sess)))
- return NULL;
-
- conn->fd = src->fd;
- conn->type = src->type;
- conn->subtype = src->subtype;
- conn->seqnum = src->seqnum;
- conn->priv = src->priv;
- conn->internal = src->internal;
- conn->lastactivity = src->lastactivity;
- conn->forcedlatency = src->forcedlatency;
- conn->sessv = src->sessv;
- aim_clonehandlers(sess, conn, src);
-
- if (src->inside) {
- /*
- * XXX should clone this section as well, but since currently
- * this function only gets called for some of that rendezvous
- * crap, and not on SNAC connections, its probably okay for
- * now.
- *
- */
- }
-
- return conn;
-}
-
-/**
* aim_newconn - Open a new connection
* @sess: Session to create connection in
* @type: Type of connection to create
diff --git a/protocols/oscar/icq.c b/protocols/oscar/icq.c
index c2f8dda6..bd1ba1d1 100644
--- a/protocols/oscar/icq.c
+++ b/protocols/oscar/icq.c
@@ -70,44 +70,6 @@ int aim_icq_ackofflinemsgs(aim_session_t *sess)
return 0;
}
-int aim_icq_sendxmlreq(aim_session_t *sess, const char *xml)
-{
- aim_conn_t *conn;
- aim_frame_t *fr;
- aim_snacid_t snacid;
- int bslen;
-
- if (!xml || !strlen(xml))
- return -EINVAL;
-
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0015)))
- return -EINVAL;
-
- bslen = 2 + 10 + 2 + strlen(xml) + 1;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 4 + bslen)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0015, 0x0002, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0015, 0x0002, 0x0000, snacid);
-
- /* For simplicity, don't bother using a tlvlist */
- aimbs_put16(&fr->data, 0x0001);
- aimbs_put16(&fr->data, bslen);
-
- aimbs_putle16(&fr->data, bslen - 2);
- aimbs_putle32(&fr->data, atoi(sess->sn));
- aimbs_putle16(&fr->data, 0x07d0); /* I command thee. */
- aimbs_putle16(&fr->data, snacid); /* eh. */
- aimbs_putle16(&fr->data, 0x0998); /* shrug. */
- aimbs_putle16(&fr->data, strlen(xml) + 1);
- aimbs_putraw(&fr->data, (guint8 *)xml, strlen(xml) + 1);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
int aim_icq_getallinfo(aim_session_t *sess, const char *uin)
{
aim_conn_t *conn;
@@ -153,43 +115,6 @@ int aim_icq_getallinfo(aim_session_t *sess, const char *uin)
return 0;
}
-int aim_icq_getsimpleinfo(aim_session_t *sess, const char *uin)
-{
- aim_conn_t *conn;
- aim_frame_t *fr;
- aim_snacid_t snacid;
- int bslen;
-
- if (!uin || uin[0] < '0' || uin[0] > '9')
- return -EINVAL;
-
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0015)))
- return -EINVAL;
-
- bslen = 2 + 4 + 2 + 2 + 2 + 4;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 4 + bslen)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0015, 0x0002, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0015, 0x0002, 0x0000, snacid);
-
- /* For simplicity, don't bother using a tlvlist */
- aimbs_put16(&fr->data, 0x0001);
- aimbs_put16(&fr->data, bslen);
-
- aimbs_putle16(&fr->data, bslen - 2);
- aimbs_putle32(&fr->data, atoi(sess->sn));
- aimbs_putle16(&fr->data, 0x07d0); /* I command thee. */
- aimbs_putle16(&fr->data, snacid); /* eh. */
- aimbs_putle16(&fr->data, 0x051f); /* shrug. */
- aimbs_putle32(&fr->data, atoi(uin));
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
static void aim_icq_freeinfo(struct aim_icq_info *info) {
int i;
diff --git a/protocols/oscar/icq.h b/protocols/oscar/icq.h
index c496f39c..41b3efb9 100644
--- a/protocols/oscar/icq.h
+++ b/protocols/oscar/icq.h
@@ -93,6 +93,5 @@ struct aim_icq_info {
int aim_icq_reqofflinemsgs(aim_session_t *sess);
int aim_icq_ackofflinemsgs(aim_session_t *sess);
int aim_icq_getallinfo(aim_session_t *sess, const char *uin);
-int aim_icq_getsimpleinfo(aim_session_t *sess, const char *uin);
#endif /* __OSCAR_ICQ_H__ */
diff --git a/protocols/oscar/im.c b/protocols/oscar/im.c
index 231dd959..05e06e91 100644
--- a/protocols/oscar/im.c
+++ b/protocols/oscar/im.c
@@ -24,83 +24,6 @@
#include "info.h"
/*
- * Takes a msghdr (and a length) and returns a client type
- * code. Note that this is *only a guess* and has a low likelihood
- * of actually being accurate.
- *
- * Its based on experimental data, with the help of Eric Warmenhoven
- * who seems to have collected a wide variety of different AIM clients.
- *
- *
- * Heres the current collection:
- * 0501 0003 0101 0101 01 AOL Mobile Communicator, WinAIM 1.0.414
- * 0501 0003 0101 0201 01 WinAIM 2.0.847, 2.1.1187, 3.0.1464,
- * 4.3.2229, 4.4.2286
- * 0501 0004 0101 0102 0101 WinAIM 4.1.2010, libfaim (right here)
- * 0501 0001 0101 01 AOL v6.0, CompuServe 2000 v6.0, any
- * TOC client
- *
- * Note that in this function, only the feature bytes are tested, since
- * the rest will always be the same.
- *
- */
-guint16 aim_fingerprintclient(guint8 *msghdr, int len)
-{
- static const struct {
- guint16 clientid;
- int len;
- guint8 data[10];
- } fingerprints[] = {
- /* AOL Mobile Communicator, WinAIM 1.0.414 */
- { AIM_CLIENTTYPE_MC,
- 3, {0x01, 0x01, 0x01}},
-
- /* WinAIM 2.0.847, 2.1.1187, 3.0.1464, 4.3.2229, 4.4.2286 */
- { AIM_CLIENTTYPE_WINAIM,
- 3, {0x01, 0x01, 0x02}},
-
- /* WinAIM 4.1.2010, libfaim */
- { AIM_CLIENTTYPE_WINAIM41,
- 4, {0x01, 0x01, 0x01, 0x02}},
-
- /* AOL v6.0, CompuServe 2000 v6.0, any TOC client */
- { AIM_CLIENTTYPE_AOL_TOC,
- 1, {0x01}},
-
- { 0, 0}
- };
- int i;
-
- if (!msghdr || (len <= 0))
- return AIM_CLIENTTYPE_UNKNOWN;
-
- for (i = 0; fingerprints[i].len; i++) {
- if (fingerprints[i].len != len)
- continue;
- if (memcmp(fingerprints[i].data, msghdr, fingerprints[i].len) == 0)
- return fingerprints[i].clientid;
- }
-
- return AIM_CLIENTTYPE_UNKNOWN;
-}
-
-/* This should be endian-safe now... but who knows... */
-guint16 aim_iconsum(const guint8 *buf, int buflen)
-{
- guint32 sum;
- int i;
-
- for (i = 0, sum = 0; i + 1 < buflen; i += 2)
- sum += (buf[i+1] << 8) + buf[i];
- if (i < buflen)
- sum += buf[i];
-
- sum = ((sum & 0xffff0000) >> 16) + (sum & 0x0000ffff);
-
- return (guint16)sum;
-}
-
-/*
* Send an ICBM (instant message).
*
*
@@ -366,483 +289,6 @@ int aim_send_im(aim_session_t *sess, const char *destsn, guint16 flags, const ch
return aim_send_im_ext(sess, &args);
}
-/*
- * This is also performance sensitive. (If you can believe it...)
- *
- */
-int aim_send_icon(aim_session_t *sess, const char *sn, const guint8 *icon, int iconlen, time_t stamp, guint16 iconsum)
-{
- aim_conn_t *conn;
- int i;
- guint8 ck[8];
- aim_frame_t *fr;
- aim_snacid_t snacid;
-
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
- return -EINVAL;
-
- if (!sn || !icon || (iconlen <= 0) || (iconlen >= MAXICONLEN))
- return -EINVAL;
-
- for (i = 0; i < 8; i++)
- aimutil_put8(ck+i, (guint8) rand());
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+8+2+1+strlen(sn)+2+2+2+8+16+2+2+2+2+2+2+2+4+4+4+iconlen+strlen(AIM_ICONIDENT)+2+2)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
-
- /*
- * Cookie
- */
- aimbs_putraw(&fr->data, ck, 8);
-
- /*
- * Channel (2)
- */
- aimbs_put16(&fr->data, 0x0002);
-
- /*
- * Dest sn
- */
- aimbs_put8(&fr->data, strlen(sn));
- aimbs_putraw(&fr->data, (guint8 *)sn, strlen(sn));
-
- /*
- * TLV t(0005)
- *
- * Encompasses everything below.
- */
- aimbs_put16(&fr->data, 0x0005);
- aimbs_put16(&fr->data, 2+8+16+6+4+4+iconlen+4+4+4+strlen(AIM_ICONIDENT));
-
- aimbs_put16(&fr->data, 0x0000);
- aimbs_putraw(&fr->data, ck, 8);
- aim_putcap(&fr->data, AIM_CAPS_BUDDYICON);
-
- /* TLV t(000a) */
- aimbs_put16(&fr->data, 0x000a);
- aimbs_put16(&fr->data, 0x0002);
- aimbs_put16(&fr->data, 0x0001);
-
- /* TLV t(000f) */
- aimbs_put16(&fr->data, 0x000f);
- aimbs_put16(&fr->data, 0x0000);
-
- /* TLV t(2711) */
- aimbs_put16(&fr->data, 0x2711);
- aimbs_put16(&fr->data, 4+4+4+iconlen+strlen(AIM_ICONIDENT));
- aimbs_put16(&fr->data, 0x0000);
- aimbs_put16(&fr->data, iconsum);
- aimbs_put32(&fr->data, iconlen);
- aimbs_put32(&fr->data, stamp);
- aimbs_putraw(&fr->data, icon, iconlen);
- aimbs_putraw(&fr->data, (guint8 *)AIM_ICONIDENT, strlen(AIM_ICONIDENT));
-
- /* TLV t(0003) */
- aimbs_put16(&fr->data, 0x0003);
- aimbs_put16(&fr->data, 0x0000);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-/*
- * This only works for ICQ 2001b (thats 2001 not 2000). Better, only
- * send it to clients advertising the RTF capability. In fact, if you send
- * it to a client that doesn't support that capability, the server will gladly
- * bounce it back to you.
- *
- * You'd think this would be in icq.c, but, well, I'm trying to stick with
- * the one-group-per-file scheme as much as possible. This could easily
- * be an exception, since Rendezvous IMs are external of the Oscar core,
- * and therefore are undefined. Really I just need to think of a good way to
- * make an interface similar to what AOL actually uses. But I'm not using COM.
- *
- */
-int aim_send_rtfmsg(aim_session_t *sess, struct aim_sendrtfmsg_args *args)
-{
- const char rtfcap[] = {"{97B12751-243C-4334-AD22-D6ABF73F1492}"}; /* AIM_CAPS_ICQRTF capability in string form */
- aim_conn_t *conn;
- int i;
- guint8 ck[8];
- aim_frame_t *fr;
- aim_snacid_t snacid;
- int servdatalen;
-
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
- return -EINVAL;
-
- if (!args || !args->destsn || !args->rtfmsg)
- return -EINVAL;
-
- servdatalen = 2+2+16+2+4+1+2 + 2+2+4+4+4 + 2+4+2+strlen(args->rtfmsg)+1 + 4+4+4+strlen(rtfcap)+1;
-
- for (i = 0; i < 8; i++)
- aimutil_put8(ck+i, (guint8) rand());
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+128+servdatalen)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
-
- /*
- * Cookie
- */
- aimbs_putraw(&fr->data, ck, 8);
-
- /*
- * Channel (2)
- */
- aimbs_put16(&fr->data, 0x0002);
-
- /*
- * Dest sn
- */
- aimbs_put8(&fr->data, strlen(args->destsn));
- aimbs_putraw(&fr->data, (guint8 *)args->destsn, strlen(args->destsn));
-
- /*
- * TLV t(0005)
- *
- * Encompasses everything below.
- */
- aimbs_put16(&fr->data, 0x0005);
- aimbs_put16(&fr->data, 2+8+16 + 2+2+2 + 2+2 + 2+2+servdatalen);
-
- aimbs_put16(&fr->data, 0x0000);
- aimbs_putraw(&fr->data, ck, 8);
- aim_putcap(&fr->data, AIM_CAPS_ICQSERVERRELAY);
-
- /*
- * t(000a) l(0002) v(0001)
- */
- aimbs_put16(&fr->data, 0x000a);
- aimbs_put16(&fr->data, 0x0002);
- aimbs_put16(&fr->data, 0x0001);
-
- /*
- * t(000f) l(0000) v()
- */
- aimbs_put16(&fr->data, 0x000f);
- aimbs_put16(&fr->data, 0x0000);
-
- /*
- * Service Data TLV
- */
- aimbs_put16(&fr->data, 0x2711);
- aimbs_put16(&fr->data, servdatalen);
-
- aimbs_putle16(&fr->data, 11 + 16 /* 11 + (sizeof CLSID) */);
- aimbs_putle16(&fr->data, 9);
- aim_putcap(&fr->data, AIM_CAPS_EMPTY);
- aimbs_putle16(&fr->data, 0);
- aimbs_putle32(&fr->data, 0);
- aimbs_putle8(&fr->data, 0);
- aimbs_putle16(&fr->data, 0x03ea); /* trid1 */
-
- aimbs_putle16(&fr->data, 14);
- aimbs_putle16(&fr->data, 0x03eb); /* trid2 */
- aimbs_putle32(&fr->data, 0);
- aimbs_putle32(&fr->data, 0);
- aimbs_putle32(&fr->data, 0);
-
- aimbs_putle16(&fr->data, 0x0001);
- aimbs_putle32(&fr->data, 0);
- aimbs_putle16(&fr->data, strlen(args->rtfmsg)+1);
- aimbs_putraw(&fr->data, (guint8 *)args->rtfmsg, strlen(args->rtfmsg)+1);
-
- aimbs_putle32(&fr->data, args->fgcolor);
- aimbs_putle32(&fr->data, args->bgcolor);
- aimbs_putle32(&fr->data, strlen(rtfcap)+1);
- aimbs_putraw(&fr->data, (guint8 *)rtfcap, strlen(rtfcap)+1);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-int aim_request_directim(aim_session_t *sess, const char *destsn, guint8 *ip, guint16 port, guint8 *ckret)
-{
- aim_conn_t *conn;
- guint8 ck[8];
- aim_frame_t *fr;
- aim_snacid_t snacid;
- aim_tlvlist_t *tl = NULL, *itl = NULL;
- int hdrlen, i;
- guint8 *hdr;
- aim_bstream_t hdrbs;
-
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
- return -EINVAL;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 256+strlen(destsn))))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
-
- /*
- * Generate a random message cookie
- *
- * This cookie needs to be alphanumeric and NULL-terminated to be
- * TOC-compatible.
- *
- * XXX have I mentioned these should be generated in msgcookie.c?
- *
- */
- for (i = 0; i < 7; i++)
- ck[i] = 0x30 + ((guint8) rand() % 10);
- ck[7] = '\0';
-
- if (ckret)
- memcpy(ckret, ck, 8);
-
- /* Cookie */
- aimbs_putraw(&fr->data, ck, 8);
-
- /* Channel */
- aimbs_put16(&fr->data, 0x0002);
-
- /* Destination SN */
- aimbs_put8(&fr->data, strlen(destsn));
- aimbs_putraw(&fr->data, (guint8 *)destsn, strlen(destsn));
-
- aim_addtlvtochain_noval(&tl, 0x0003);
-
- hdrlen = 2+8+16+6+8+6+4;
- hdr = g_malloc(hdrlen);
- aim_bstream_init(&hdrbs, hdr, hdrlen);
-
- aimbs_put16(&hdrbs, 0x0000);
- aimbs_putraw(&hdrbs, ck, 8);
- aim_putcap(&hdrbs, AIM_CAPS_IMIMAGE);
-
- aim_addtlvtochain16(&itl, 0x000a, 0x0001);
- aim_addtlvtochain_raw(&itl, 0x0003, 4, ip);
- aim_addtlvtochain16(&itl, 0x0005, port);
- aim_addtlvtochain_noval(&itl, 0x000f);
-
- aim_writetlvchain(&hdrbs, &itl);
-
- aim_addtlvtochain_raw(&tl, 0x0005, aim_bstream_curpos(&hdrbs), hdr);
-
- aim_writetlvchain(&fr->data, &tl);
-
- g_free(hdr);
- aim_freetlvchain(&itl);
- aim_freetlvchain(&tl);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-int aim_request_sendfile(aim_session_t *sess, const char *sn, const char *filename, guint16 numfiles, guint32 totsize, guint8 *ip, guint16 port, guint8 *ckret)
-{
- aim_conn_t *conn;
- int i;
- guint8 ck[8];
- aim_frame_t *fr;
- aim_snacid_t snacid;
-
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
- return -EINVAL;
-
- if (!sn || !filename)
- return -EINVAL;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+8+2+1+strlen(sn)+2+2+2+8+16+6+8+6+4+2+2+2+2+4+strlen(filename)+4)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
-
- for (i = 0; i < 7; i++)
- aimutil_put8(ck+i, 0x30 + ((guint8) rand() % 10));
- ck[7] = '\0';
-
- if (ckret)
- memcpy(ckret, ck, 8);
-
- /*
- * Cookie
- */
- aimbs_putraw(&fr->data, ck, 8);
-
- /*
- * Channel (2)
- */
- aimbs_put16(&fr->data, 0x0002);
-
- /*
- * Dest sn
- */
- aimbs_put8(&fr->data, strlen(sn));
- aimbs_putraw(&fr->data, (guint8 *)sn, strlen(sn));
-
- /*
- * TLV t(0005)
- *
- * Encompasses everything below. Gee.
- */
- aimbs_put16(&fr->data, 0x0005);
- aimbs_put16(&fr->data, 2+8+16+6+8+6+4+2+2+2+2+4+strlen(filename)+4);
-
- aimbs_put16(&fr->data, 0x0000);
- aimbs_putraw(&fr->data, ck, 8);
- aim_putcap(&fr->data, AIM_CAPS_SENDFILE);
-
- /* TLV t(000a) */
- aimbs_put16(&fr->data, 0x000a);
- aimbs_put16(&fr->data, 0x0002);
- aimbs_put16(&fr->data, 0x0001);
-
- /* TLV t(0003) (IP) */
- aimbs_put16(&fr->data, 0x0003);
- aimbs_put16(&fr->data, 0x0004);
- aimbs_putraw(&fr->data, ip, 4);
-
- /* TLV t(0005) (port) */
- aimbs_put16(&fr->data, 0x0005);
- aimbs_put16(&fr->data, 0x0002);
- aimbs_put16(&fr->data, port);
-
- /* TLV t(000f) */
- aimbs_put16(&fr->data, 0x000f);
- aimbs_put16(&fr->data, 0x0000);
-
- /* TLV t(2711) */
- aimbs_put16(&fr->data, 0x2711);
- aimbs_put16(&fr->data, 2+2+4+strlen(filename)+4);
-
- /* ? */
- aimbs_put16(&fr->data, 0x0001);
- aimbs_put16(&fr->data, numfiles);
- aimbs_put32(&fr->data, totsize);
- aimbs_putraw(&fr->data, (guint8 *)filename, strlen(filename));
-
- /* ? */
- aimbs_put32(&fr->data, 0x00000000);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-/**
- * Request the status message of the given ICQ user.
- *
- * @param sess The oscar session.
- * @param sn The UIN of the user of whom you wish to request info.
- * @param type The type of info you wish to request. This should be the current
- * state of the user, as one of the AIM_ICQ_STATE_* defines.
- * @return Return 0 if no errors, otherwise return the error number.
- */
-int aim_send_im_ch2_geticqmessage(aim_session_t *sess, const char *sn, int type)
-{
- aim_conn_t *conn;
- int i;
- guint8 ck[8];
- aim_frame_t *fr;
- aim_snacid_t snacid;
-
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)) || !sn)
- return -EINVAL;
-
- for (i = 0; i < 8; i++)
- aimutil_put8(ck+i, (guint8) rand());
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+8+2+1+strlen(sn) + 4+0x5e + 4)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
-
- /* Cookie */
- aimbs_putraw(&fr->data, ck, 8);
-
- /* Channel (2) */
- aimbs_put16(&fr->data, 0x0002);
-
- /* Dest sn */
- aimbs_put8(&fr->data, strlen(sn));
- aimbs_putraw(&fr->data, (guint8 *)sn, strlen(sn));
-
- /* TLV t(0005) - Encompasses almost everything below. */
- aimbs_put16(&fr->data, 0x0005); /* T */
- aimbs_put16(&fr->data, 0x005e); /* L */
- { /* V */
- aimbs_put16(&fr->data, 0x0000);
-
- /* Cookie */
- aimbs_putraw(&fr->data, ck, 8);
-
- /* Put the 16 byte server relay capability */
- aim_putcap(&fr->data, AIM_CAPS_ICQSERVERRELAY);
-
- /* TLV t(000a) */
- aimbs_put16(&fr->data, 0x000a);
- aimbs_put16(&fr->data, 0x0002);
- aimbs_put16(&fr->data, 0x0001);
-
- /* TLV t(000f) */
- aimbs_put16(&fr->data, 0x000f);
- aimbs_put16(&fr->data, 0x0000);
-
- /* TLV t(2711) */
- aimbs_put16(&fr->data, 0x2711);
- aimbs_put16(&fr->data, 0x0036);
- { /* V */
- aimbs_putle16(&fr->data, 0x001b); /* L */
- aimbs_putle16(&fr->data, 0x0008); /* AAA - Protocol version */
- aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
- aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
- aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
- aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
- aimbs_putle16(&fr->data, 0x0000); /* Unknown */
- aimbs_putle16(&fr->data, 0x0003); /* Client features? */
- aimbs_putle16(&fr->data, 0x0000); /* Unknown */
- aimbs_putle8(&fr->data, 0x00); /* Unkizown */
- aimbs_putle16(&fr->data, 0xffff); /* Sequence number? XXX - This should decrement by 1 with each request */
-
- aimbs_putle16(&fr->data, 0x000e); /* L */
- aimbs_putle16(&fr->data, 0xffff); /* Sequence number? XXX - This should decrement by 1 with each request */
- aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
- aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
- aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
-
- /* The type of status message being requested */
- if (type & AIM_ICQ_STATE_CHAT)
- aimbs_putle16(&fr->data, 0x03ec);
- else if(type & AIM_ICQ_STATE_DND)
- aimbs_putle16(&fr->data, 0x03eb);
- else if(type & AIM_ICQ_STATE_OUT)
- aimbs_putle16(&fr->data, 0x03ea);
- else if(type & AIM_ICQ_STATE_BUSY)
- aimbs_putle16(&fr->data, 0x03e9);
- else if(type & AIM_ICQ_STATE_AWAY)
- aimbs_putle16(&fr->data, 0x03e8);
-
- aimbs_putle16(&fr->data, 0x0000); /* Status? */
- aimbs_putle16(&fr->data, 0x0001); /* Priority of this message? */
- aimbs_putle16(&fr->data, 0x0001); /* L? */
- aimbs_putle8(&fr->data, 0x00); /* Null termination? */
- } /* End TLV t(2711) */
- } /* End TLV t(0005) */
-
- /* TLV t(0003) */
- aimbs_put16(&fr->data, 0x0003);
- aimbs_put16(&fr->data, 0x0000);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
/**
* answers status message requests
* @param sess the oscar session
@@ -1052,61 +498,6 @@ static int mpmsg_addsection(aim_session_t *sess, aim_mpmsg_t *mpm, guint16 chars
return 0;
}
-int aim_mpmsg_addraw(aim_session_t *sess, aim_mpmsg_t *mpm, guint16 charset, guint16 charsubset, const guint8 *data, guint16 datalen)
-{
- guint8 *dup;
-
- if (!(dup = g_malloc(datalen)))
- return -1;
- memcpy(dup, data, datalen);
-
- if (mpmsg_addsection(sess, mpm, charset, charsubset, dup, datalen) == -1) {
- g_free(dup);
- return -1;
- }
-
- return 0;
-}
-
-/* XXX should provide a way of saying ISO-8859-1 specifically */
-int aim_mpmsg_addascii(aim_session_t *sess, aim_mpmsg_t *mpm, const char *ascii)
-{
- char *dup;
-
- if (!(dup = g_strdup(ascii)))
- return -1;
-
- if (mpmsg_addsection(sess, mpm, 0x0000, 0x0000, (guint8 *)dup, (guint16) strlen(ascii)) == -1) {
- g_free(dup);
- return -1;
- }
-
- return 0;
-}
-
-int aim_mpmsg_addunicode(aim_session_t *sess, aim_mpmsg_t *mpm, const guint16 *unicode, guint16 unicodelen)
-{
- guint8 *buf;
- aim_bstream_t bs;
- int i;
-
- if (!(buf = g_malloc(unicodelen * 2)))
- return -1;
-
- aim_bstream_init(&bs, buf, unicodelen * 2);
-
- /* We assume unicode is in /host/ byte order -- convert to network */
- for (i = 0; i < unicodelen; i++)
- aimbs_put16(&bs, unicode[i]);
-
- if (mpmsg_addsection(sess, mpm, 0x0002, 0x0000, buf, aim_bstream_curpos(&bs)) == -1) {
- g_free(buf);
- return -1;
- }
-
- return 0;
-}
-
void aim_mpmsg_free(aim_session_t *sess, aim_mpmsg_t *mpm)
{
aim_mpmsg_section_t *cur;
@@ -1790,44 +1181,6 @@ static int incomingim(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, a
}
/*
- * Possible codes:
- * AIM_TRANSFER_DENY_NOTSUPPORTED -- "client does not support"
- * AIM_TRANSFER_DENY_DECLINE -- "client has declined transfer"
- * AIM_TRANSFER_DENY_NOTACCEPTING -- "client is not accepting transfers"
- *
- */
-int aim_denytransfer(aim_session_t *sess, const char *sender, const guint8 *cookie, guint16 code)
-{
- aim_conn_t *conn;
- aim_frame_t *fr;
- aim_snacid_t snacid;
- aim_tlvlist_t *tl = NULL;
-
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
- return -EINVAL;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+8+2+1+strlen(sender)+6)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0004, 0x000b, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0004, 0x000b, 0x0000, snacid);
-
- aimbs_putraw(&fr->data, cookie, 8);
-
- aimbs_put16(&fr->data, 0x0002); /* channel */
- aimbs_put8(&fr->data, strlen(sender));
- aimbs_putraw(&fr->data, (guint8 *)sender, strlen(sender));
-
- aim_addtlvtochain16(&tl, 0x0003, code);
- aim_writetlvchain(&fr->data, &tl);
- aim_freetlvchain(&tl);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-/*
* aim_reqicbmparaminfo()
*
* Request ICBM parameter information.
diff --git a/protocols/oscar/im.h b/protocols/oscar/im.h
index 42a8a6b1..34d5e238 100644
--- a/protocols/oscar/im.h
+++ b/protocols/oscar/im.h
@@ -46,9 +46,6 @@ typedef struct aim_mpmsg_s {
} aim_mpmsg_t;
int aim_mpmsg_init(aim_session_t *sess, aim_mpmsg_t *mpm);
-int aim_mpmsg_addraw(aim_session_t *sess, aim_mpmsg_t *mpm, guint16 charset, guint16 charsubset, const guint8 *data, guint16 datalen);
-int aim_mpmsg_addascii(aim_session_t *sess, aim_mpmsg_t *mpm, const char *ascii);
-int aim_mpmsg_addunicode(aim_session_t *sess, aim_mpmsg_t *mpm, const guint16 *unicode, guint16 unicodelen);
void aim_mpmsg_free(aim_session_t *sess, aim_mpmsg_t *mpm);
/*
@@ -85,16 +82,6 @@ struct aim_sendimext_args {
};
/*
- * Arguments to aim_send_rtfmsg().
- */
-struct aim_sendrtfmsg_args {
- const char *destsn;
- guint32 fgcolor;
- guint32 bgcolor;
- const char *rtfmsg; /* must be in RTF */
-};
-
-/*
* This information is provided in the Incoming ICBM callback for
* Channel 1 ICBM's.
*
@@ -182,18 +169,14 @@ struct aim_incomingim_ch4_args {
char *msg; /* Reason for auth request, deny, or accept */
};
-int aim_send_rtfmsg(aim_session_t *sess, struct aim_sendrtfmsg_args *args);
int aim_send_im_ext(aim_session_t *sess, struct aim_sendimext_args *args);
int aim_send_im(aim_session_t *, const char *destsn, unsigned short flags, const char *msg);
-int aim_send_icon(aim_session_t *sess, const char *sn, const guint8 *icon, int iconlen, time_t stamp, guint16 iconsum);
-guint16 aim_iconsum(const guint8 *buf, int buflen);
int aim_send_typing(aim_session_t *sess, aim_conn_t *conn, int typing);
int aim_send_im_direct(aim_session_t *, aim_conn_t *, const char *msg, int len);
const char *aim_directim_getsn(aim_conn_t *conn);
aim_conn_t *aim_directim_initiate(aim_session_t *, const char *destsn);
aim_conn_t *aim_directim_connect(aim_session_t *, const char *sn, const char *addr, const guint8 *cookie);
-int aim_send_im_ch2_geticqmessage(aim_session_t *sess, const char *sn, int type);
int aim_im_sendmtn(aim_session_t *sess, guint16 type1, const char *sn, guint16 type2);
int aim_send_im_ch2_statusmessage(aim_session_t *sess, const char *sender, const guint8 *cookie, const char *message, const guint8 state, const guint16 dc);
diff --git a/protocols/oscar/info.c b/protocols/oscar/info.c
index 7cc1dbbc..a5a65147 100644
--- a/protocols/oscar/info.c
+++ b/protocols/oscar/info.c
@@ -40,79 +40,6 @@ int aim_getinfo(aim_session_t *sess, aim_conn_t *conn, const char *sn, guint16 i
return 0;
}
-const char *aim_userinfo_sn(aim_userinfo_t *ui)
-{
-
- if (!ui)
- return NULL;
-
- return ui->sn;
-}
-
-guint16 aim_userinfo_flags(aim_userinfo_t *ui)
-{
-
- if (!ui)
- return 0;
-
- return ui->flags;
-}
-
-guint16 aim_userinfo_idle(aim_userinfo_t *ui)
-{
-
- if (!ui)
- return 0;
-
- return ui->idletime;
-}
-
-float aim_userinfo_warnlevel(aim_userinfo_t *ui)
-{
-
- if (!ui)
- return 0.00;
-
- return (ui->warnlevel / 10);
-}
-
-time_t aim_userinfo_membersince(aim_userinfo_t *ui)
-{
-
- if (!ui)
- return 0;
-
- return (time_t)ui->membersince;
-}
-
-time_t aim_userinfo_onlinesince(aim_userinfo_t *ui)
-{
-
- if (!ui)
- return 0;
-
- return (time_t)ui->onlinesince;
-}
-
-guint32 aim_userinfo_sessionlen(aim_userinfo_t *ui)
-{
-
- if (!ui)
- return 0;
-
- return ui->sessionlen;
-}
-
-int aim_userinfo_hascap(aim_userinfo_t *ui, guint32 cap)
-{
-
- if (!ui || !(ui->present & AIM_USERINFO_PRESENT_CAPABILITIES))
- return -1;
-
- return !!(ui->capabilities & cap);
-}
-
-
/*
* Capability blocks.
*
@@ -486,113 +413,6 @@ int aim_extractuserinfo(aim_session_t *sess, aim_bstream_t *bs, aim_userinfo_t *
}
/*
- * Inverse of aim_extractuserinfo()
- */
-int aim_putuserinfo(aim_bstream_t *bs, aim_userinfo_t *info)
-{
- aim_tlvlist_t *tlvlist = NULL;
-
- if (!bs || !info)
- return -EINVAL;
-
- aimbs_put8(bs, strlen(info->sn));
- aimbs_putraw(bs, (guint8 *)info->sn, strlen(info->sn));
-
- aimbs_put16(bs, info->warnlevel);
-
-
- aim_addtlvtochain16(&tlvlist, 0x0001, info->flags);
- aim_addtlvtochain32(&tlvlist, 0x0002, info->membersince);
- aim_addtlvtochain32(&tlvlist, 0x0003, info->onlinesince);
- aim_addtlvtochain16(&tlvlist, 0x0004, info->idletime);
-
-#if ICQ_OSCAR_SUPPORT
- if (atoi(info->sn) != 0) {
- aim_addtlvtochain16(&tlvlist, 0x0006, info->icqinfo.status);
- aim_addtlvtochain32(&tlvlist, 0x000a, info->icqinfo.ipaddr);
- }
-#endif
-
- aim_addtlvtochain_caps(&tlvlist, 0x000d, info->capabilities);
-
- aim_addtlvtochain32(&tlvlist, (guint16)((info->flags & AIM_FLAG_AOL) ? 0x0010 : 0x000f), info->sessionlen);
-
- aimbs_put16(bs, aim_counttlvchain(&tlvlist));
- aim_writetlvchain(bs, &tlvlist);
- aim_freetlvchain(&tlvlist);
-
- return 0;
-}
-
-int aim_sendbuddyoncoming(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *info)
-{
- aim_frame_t *fr;
- aim_snacid_t snacid;
-
- if (!sess || !conn || !info)
- return -EINVAL;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 1152)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0003, 0x000b, 0x0000, NULL, 0);
-
- aim_putsnac(&fr->data, 0x0003, 0x000b, 0x0000, snacid);
- aim_putuserinfo(&fr->data, info);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-int aim_sendbuddyoffgoing(aim_session_t *sess, aim_conn_t *conn, const char *sn)
-{
- aim_frame_t *fr;
- aim_snacid_t snacid;
-
- if (!sess || !conn || !sn)
- return -EINVAL;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+1+strlen(sn))))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0003, 0x000c, 0x0000, NULL, 0);
-
- aim_putsnac(&fr->data, 0x0003, 0x000c, 0x0000, snacid);
- aimbs_put8(&fr->data, strlen(sn));
- aimbs_putraw(&fr->data, (guint8 *)sn, strlen(sn));
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-/*
- * Huh? What is this?
- */
-int aim_0002_000b(aim_session_t *sess, aim_conn_t *conn, const char *sn)
-{
- aim_frame_t *fr;
- aim_snacid_t snacid;
-
- if (!sess || !conn || !sn)
- return -EINVAL;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+1+strlen(sn))))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0002, 0x000b, 0x0000, NULL, 0);
-
- aim_putsnac(&fr->data, 0x0002, 0x000b, 0x0000, snacid);
- aimbs_put8(&fr->data, strlen(sn));
- aimbs_putraw(&fr->data, (guint8 *)sn, strlen(sn));
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-/*
* Normally contains:
* t(0001) - short containing max profile length (value = 1024)
* t(0002) - short - unknown (value = 16) [max MIME type length?]
diff --git a/protocols/oscar/info.h b/protocols/oscar/info.h
index b4d99e9f..5651f187 100644
--- a/protocols/oscar/info.h
+++ b/protocols/oscar/info.h
@@ -39,6 +39,4 @@
#define AIM_CAPS_EXTCHAN2 0x00100000
#define AIM_CAPS_LAST 0x00200000
-int aim_0002_000b(aim_session_t *sess, aim_conn_t *conn, const char *sn);
-
#endif /* __OSCAR_INFO_H__ */
diff --git a/protocols/oscar/misc.c b/protocols/oscar/misc.c
index 58fb6c31..950cd852 100644
--- a/protocols/oscar/misc.c
+++ b/protocols/oscar/misc.c
@@ -13,56 +13,6 @@
#include <aim.h>
-/*
- * aim_bos_setbuddylist(buddylist)
- *
- * This just builds the "set buddy list" command then queues it.
- *
- * buddy_list = "Screen Name One&ScreenNameTwo&";
- *
- * TODO: Clean this up.
- *
- * XXX: I can't stress the TODO enough.
- *
- */
-int aim_bos_setbuddylist(aim_session_t *sess, aim_conn_t *conn, const char *buddy_list)
-{
- aim_frame_t *fr;
- aim_snacid_t snacid;
- int len = 0;
- char *localcpy = NULL;
- char *tmpptr = NULL;
-
- if (!buddy_list || !(localcpy = g_strdup(buddy_list)))
- return -EINVAL;
-
- for (tmpptr = strtok(localcpy, "&"); tmpptr; ) {
- len += 1 + strlen(tmpptr);
- tmpptr = strtok(NULL, "&");
- }
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+len)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0003, 0x0004, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0003, 0x0004, 0x0000, snacid);
-
- strncpy(localcpy, buddy_list, strlen(buddy_list) + 1);
-
- for (tmpptr = strtok(localcpy, "&"); tmpptr; ) {
-
- aimbs_put8(&fr->data, strlen(tmpptr));
- aimbs_putraw(&fr->data, (guint8 *)tmpptr, strlen(tmpptr));
- tmpptr = strtok(NULL, "&");
- }
-
- aim_tx_enqueue(sess, fr);
-
- g_free(localcpy);
-
- return 0;
-}
-
/*
* aim_bos_setprofile(profile)
*
@@ -126,40 +76,6 @@ int aim_bos_reqbuddyrights(aim_session_t *sess, aim_conn_t *conn)
}
/*
- * Send a warning to destsn.
- *
- * Flags:
- * AIM_WARN_ANON Send as an anonymous (doesn't count as much)
- *
- * returns -1 on error (couldn't alloc packet), 0 on success.
- *
- */
-int aim_send_warning(aim_session_t *sess, aim_conn_t *conn, const char *destsn, guint32 flags)
-{
- aim_frame_t *fr;
- aim_snacid_t snacid;
- guint16 outflags = 0x0000;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, strlen(destsn)+13)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0004, 0x0008, 0x0000, destsn, strlen(destsn)+1);
-
- aim_putsnac(&fr->data, 0x0004, 0x0008, 0x0000, snacid);
-
- if (flags & AIM_WARN_ANON)
- outflags |= 0x0001;
-
- aimbs_put16(&fr->data, outflags);
- aimbs_put8(&fr->data, strlen(destsn));
- aimbs_putraw(&fr->data, (guint8 *)destsn, strlen(destsn));
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-/*
* Generic routine for sending commands.
*
*
@@ -255,90 +171,6 @@ int aim_bos_reqlocaterights(aim_session_t *sess, aim_conn_t *conn)
return aim_genericreq_n(sess, conn, 0x0002, 0x0002);
}
-/*
- * Set directory profile data (not the same as aim_bos_setprofile!)
- *
- * privacy: 1 to allow searching, 0 to disallow.
- */
-int aim_setdirectoryinfo(aim_session_t *sess, aim_conn_t *conn, const char *first, const char *middle, const char *last, const char *maiden, const char *nickname, const char *street, const char *city, const char *state, const char *zip, int country, guint16 privacy)
-{
- aim_frame_t *fr;
- aim_snacid_t snacid;
- aim_tlvlist_t *tl = NULL;
-
-
- aim_addtlvtochain16(&tl, 0x000a, privacy);
-
- if (first)
- aim_addtlvtochain_raw(&tl, 0x0001, strlen(first), (guint8 *)first);
- if (last)
- aim_addtlvtochain_raw(&tl, 0x0002, strlen(last), (guint8 *)last);
- if (middle)
- aim_addtlvtochain_raw(&tl, 0x0003, strlen(middle), (guint8 *)middle);
- if (maiden)
- aim_addtlvtochain_raw(&tl, 0x0004, strlen(maiden), (guint8 *)maiden);
-
- if (state)
- aim_addtlvtochain_raw(&tl, 0x0007, strlen(state), (guint8 *)state);
- if (city)
- aim_addtlvtochain_raw(&tl, 0x0008, strlen(city), (guint8 *)city);
-
- if (nickname)
- aim_addtlvtochain_raw(&tl, 0x000c, strlen(nickname), (guint8 *)nickname);
- if (zip)
- aim_addtlvtochain_raw(&tl, 0x000d, strlen(zip), (guint8 *)zip);
-
- if (street)
- aim_addtlvtochain_raw(&tl, 0x0021, strlen(street), (guint8 *)street);
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+aim_sizetlvchain(&tl))))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0002, 0x0009, 0x0000, NULL, 0);
-
- aim_putsnac(&fr->data, 0x0002, 0x0009, 0x0000, snacid);
- aim_writetlvchain(&fr->data, &tl);
- aim_freetlvchain(&tl);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-/* XXX pass these in better */
-int aim_setuserinterests(aim_session_t *sess, aim_conn_t *conn, const char *interest1, const char *interest2, const char *interest3, const char *interest4, const char *interest5, guint16 privacy)
-{
- aim_frame_t *fr;
- aim_tlvlist_t *tl = NULL;
-
- /* ?? privacy ?? */
- aim_addtlvtochain16(&tl, 0x000a, privacy);
-
- if (interest1)
- aim_addtlvtochain_raw(&tl, 0x0000b, strlen(interest1), (guint8 *)interest1);
- if (interest2)
- aim_addtlvtochain_raw(&tl, 0x0000b, strlen(interest2), (guint8 *)interest2);
- if (interest3)
- aim_addtlvtochain_raw(&tl, 0x0000b, strlen(interest3), (guint8 *)interest3);
- if (interest4)
- aim_addtlvtochain_raw(&tl, 0x0000b, strlen(interest4), (guint8 *)interest4);
- if (interest5)
- aim_addtlvtochain_raw(&tl, 0x0000b, strlen(interest5), (guint8 *)interest5);
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+aim_sizetlvchain(&tl))))
- return -ENOMEM;
-
- aim_cachesnac(sess, 0x0002, 0x000f, 0x0000, NULL, 0);
-
- aim_putsnac(&fr->data, 0x0002, 0x000f, 0x0000, 0);
- aim_writetlvchain(&fr->data, &tl);
- aim_freetlvchain(&tl);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
/*
* Should be generic enough to handle the errors for all groups.
*
diff --git a/protocols/oscar/oscar.c b/protocols/oscar/oscar.c
index 8fbd3026..05be086d 100644
--- a/protocols/oscar/oscar.c
+++ b/protocols/oscar/oscar.c
@@ -946,9 +946,6 @@ static int gaim_parse_oncoming(aim_session_t *sess, aim_frame_t *fr, ...) {
g_hash_table_insert(od->ips, uin, (gpointer) (long) info->icqinfo.ipaddr);
}
- if (!aim_sncmp(ic->acc->user, info->sn))
- g_snprintf(ic->displayname, sizeof(ic->displayname), "%s", info->sn);
-
tmp = normalize(info->sn);
imcb_buddy_status(ic, tmp, flags, state_string, NULL);
imcb_buddy_times(ic, tmp, signon, time_idle);
@@ -1535,17 +1532,6 @@ static int gaim_parse_ratechange(aim_session_t *sess, aim_frame_t *fr, ...) {
}
static int gaim_selfinfo(aim_session_t *sess, aim_frame_t *fr, ...) {
- va_list ap;
- aim_userinfo_t *info;
- struct im_connection *ic = sess->aux_data;
-
- va_start(ap, fr);
- info = va_arg(ap, aim_userinfo_t *);
- va_end(ap);
-
- ic->evil = info->warnlevel/10;
- /* ic->correction_time = (info->onlinesince - ic->login_time); */
-
return 1;
}
@@ -2102,47 +2088,6 @@ static int gaim_ssi_parseack( aim_session_t *sess, aim_frame_t *fr, ... )
return( 1 );
}
-static void oscar_set_permit_deny(struct im_connection *ic) {
- struct oscar_data *od = (struct oscar_data *)ic->proto_data;
- if (od->icq) {
- GSList *list;
- char buf[MAXMSGLEN];
- int at;
-
- switch(ic->permdeny) {
- case 1:
- aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, ic->acc->user);
- break;
- case 2:
- aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, ic->acc->user);
- break;
- case 3:
- list = ic->permit;
- at = 0;
- while (list) {
- at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data);
- list = list->next;
- }
- aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_PERMITADD, buf);
- break;
- case 4:
- list = ic->deny;
- at = 0;
- while (list) {
- at += g_snprintf(buf + at, sizeof(buf) - at, "%s&", (char *)list->data);
- list = list->next;
- }
- aim_bos_changevisibility(od->sess, od->conn, AIM_VISIBILITYCHANGE_DENYADD, buf);
- break;
- default:
- break;
- }
- } else {
- if (od->sess->ssi.received_data)
- aim_ssi_setpermdeny(od->sess, od->conn, ic->permdeny, 0xffffffff);
- }
-}
-
static void oscar_add_permit(struct im_connection *ic, char *who) {
struct oscar_data *od = (struct oscar_data *)ic->proto_data;
if (od->icq) {
@@ -2623,7 +2568,6 @@ void oscar_initmodule()
ret->add_deny = oscar_add_deny;
ret->rem_permit = oscar_rem_permit;
ret->rem_deny = oscar_rem_deny;
- ret->set_permit_deny = oscar_set_permit_deny;
ret->send_typing = oscar_send_typing;
ret->handle_cmp = aim_sncmp;
diff --git a/protocols/oscar/oscar_util.c b/protocols/oscar/oscar_util.c
index 0ce06bd9..7d41d383 100644
--- a/protocols/oscar/oscar_util.c
+++ b/protocols/oscar/oscar_util.c
@@ -1,96 +1,6 @@
#include <aim.h>
#include <ctype.h>
-int aimutil_putstr(u_char *dest, const char *src, int len)
-{
- memcpy(dest, src, len);
- return len;
-}
-
-/*
- * Tokenizing functions. Used to portably replace strtok/sep.
- * -- DMP.
- *
- */
-int aimutil_tokslen(char *toSearch, int index, char dl)
-{
- int curCount = 1;
- char *next;
- char *last;
- int toReturn;
-
- last = toSearch;
- next = strchr(toSearch, dl);
-
- while(curCount < index && next != NULL) {
- curCount++;
- last = next + 1;
- next = strchr(last, dl);
- }
-
- if ((curCount < index) || (next == NULL))
- toReturn = strlen(toSearch) - (curCount - 1);
- else
- toReturn = next - toSearch - (curCount - 1);
-
- return toReturn;
-}
-
-int aimutil_itemcnt(char *toSearch, char dl)
-{
- int curCount;
- char *next;
-
- curCount = 1;
-
- next = strchr(toSearch, dl);
-
- while(next != NULL) {
- curCount++;
- next = strchr(next + 1, dl);
- }
-
- return curCount;
-}
-
-char *aimutil_itemidx(char *toSearch, int index, char dl)
-{
- int curCount;
- char *next;
- char *last;
- char *toReturn;
-
- curCount = 0;
-
- last = toSearch;
- next = strchr(toSearch, dl);
-
- while (curCount < index && next != NULL) {
- curCount++;
- last = next + 1;
- next = strchr(last, dl);
- }
-
- if (curCount < index) {
- toReturn = g_strdup("");
- }
- next = strchr(last, dl);
-
- if (curCount < index) {
- toReturn = g_strdup("");
- } else {
- if (next == NULL) {
- toReturn = g_malloc((strlen(last) + 1) * sizeof(char));
- strcpy(toReturn, last);
- } else {
- toReturn = g_malloc((next - last + 1) * sizeof(char));
- memcpy(toReturn, last, (next - last));
- toReturn[next - last] = '\0';
- }
- }
- return toReturn;
-}
-
/*
* int snlen(const char *)
*
diff --git a/protocols/oscar/rxhandlers.c b/protocols/oscar/rxhandlers.c
index 7014e693..bd071505 100644
--- a/protocols/oscar/rxhandlers.c
+++ b/protocols/oscar/rxhandlers.c
@@ -285,18 +285,6 @@ aim_rxcallback_t aim_callhandler(aim_session_t *sess, aim_conn_t *conn, guint16
return aim_callhandler(sess, conn, family, AIM_CB_SPECIAL_DEFAULT);
}
-void aim_clonehandlers(aim_session_t *sess, aim_conn_t *dest, aim_conn_t *src)
-{
- struct aim_rxcblist_s *cur;
-
- for (cur = (struct aim_rxcblist_s *)src->handlerlist; cur; cur = cur->next) {
- aim_conn_addhandler(sess, dest, cur->family, cur->type,
- cur->handler, cur->flags);
- }
-
- return;
-}
-
static int aim_callhandler_noparam(aim_session_t *sess, aim_conn_t *conn,guint16 family, guint16 type, aim_frame_t *ptr)
{
aim_rxcallback_t userfunc;
diff --git a/protocols/oscar/search.c b/protocols/oscar/search.c
index 3570e4df..4e0d3858 100644
--- a/protocols/oscar/search.c
+++ b/protocols/oscar/search.c
@@ -8,27 +8,6 @@
#include <aim.h>
-int aim_usersearch_address(aim_session_t *sess, aim_conn_t *conn, const char *address)
-{
- aim_frame_t *fr;
- aim_snacid_t snacid;
-
- if (!sess || !conn || !address)
- return -EINVAL;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+strlen(address))))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x000a, 0x0002, 0x0000, g_strdup(address), strlen(address)+1);
- aim_putsnac(&fr->data, 0x000a, 0x0002, 0x0000, snacid);
-
- aimbs_putraw(&fr->data, (guint8 *)address, strlen(address));
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
/* XXX can this be integrated with the rest of the error handling? */
static int error(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
{
diff --git a/protocols/oscar/search.h b/protocols/oscar/search.h
index 77eeb265..d5cf9b4d 100644
--- a/protocols/oscar/search.h
+++ b/protocols/oscar/search.h
@@ -1,6 +1,4 @@
#ifndef __OSCAR_SEARCH_H__
#define __OSCAR_SEARCH_H__
-int aim_usersearch_address(aim_session_t *, aim_conn_t *, const char *);
-
#endif /* __OSCAR_SEARCH_H__ */
diff --git a/protocols/oscar/service.c b/protocols/oscar/service.c
index a2678764..a3b37c33 100644
--- a/protocols/oscar/service.c
+++ b/protocols/oscar/service.c
@@ -360,28 +360,6 @@ int aim_rates_addparam(aim_session_t *sess, aim_conn_t *conn)
return 0;
}
-/* Delete Rate Parameter (group 1, type 9) */
-int aim_rates_delparam(aim_session_t *sess, aim_conn_t *conn)
-{
- aim_conn_inside_t *ins = (aim_conn_inside_t *)conn->inside;
- aim_frame_t *fr;
- aim_snacid_t snacid;
- struct rateclass *rc;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 512)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0001, 0x0009, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0001, 0x0009, 0x0000, snacid);
-
- for (rc = ins->rates; rc; rc = rc->next)
- aimbs_put16(&fr->data, rc->classid);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
/* Rate Change (group 1, type 0x0a) */
static int ratechange(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
{
@@ -430,43 +408,6 @@ static int serverpause(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx,
return 0;
}
-/*
- * Service Pause Acknowledgement (group 1, type 0x0c)
- *
- * It is rather important that aim_sendpauseack() gets called for the exact
- * same connection that the Server Pause callback was called for, since
- * libfaim extracts the data for the SNAC from the connection structure.
- *
- * Of course, if you don't do that, more bad things happen than just what
- * libfaim can cause.
- *
- */
-int aim_sendpauseack(aim_session_t *sess, aim_conn_t *conn)
-{
- aim_frame_t *fr;
- aim_snacid_t snacid;
- aim_conn_inside_t *ins = (aim_conn_inside_t *)conn->inside;
- struct snacgroup *sg;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 1024)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0001, 0x000c, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0001, 0x000c, 0x0000, snacid);
-
- /*
- * This list should have all the groups that the original
- * Host Online / Server Ready said this host supports. And
- * we want them all back after the migration.
- */
- for (sg = ins->groups; sg; sg = sg->next)
- aimbs_put16(&fr->data, sg->group);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
/* Service Resume (group 1, type 0x0d) */
static int serverresume(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
{
@@ -519,20 +460,6 @@ static int evilnotify(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, a
}
/*
- * Idle Notification (group 1, type 0x11)
- *
- * Should set your current idle time in seconds. Note that this should
- * never be called consecutively with a non-zero idle time. That makes
- * OSCAR do funny things. Instead, just set it once you go idle, and then
- * call it again with zero when you're back.
- *
- */
-int aim_bos_setidle(aim_session_t *sess, aim_conn_t *conn, guint32 idletime)
-{
- return aim_genericreq_l(sess, conn, 0x0001, 0x0011, &idletime);
-}
-
-/*
* Service Migrate (group 1, type 0x12)
*
* This is the final SNAC sent on the original connection during a migration.
@@ -636,17 +563,6 @@ int aim_bos_setprivacyflags(aim_session_t *sess, aim_conn_t *conn, guint32 flags
return aim_genericreq_l(sess, conn, 0x0001, 0x0014, &flags);
}
-/*
- * No-op (group 1, type 0x16)
- *
- * WinAIM sends these every 4min or so to keep the connection alive. Its not
- * real necessary.
- *
- */
-int aim_nop(aim_session_t *sess, aim_conn_t *conn)
-{
- return aim_genericreq_n(sess, conn, 0x0001, 0x0016);
-}
/*
* Set client versions (group 1, subtype 0x17)
@@ -810,94 +726,6 @@ static int memrequest(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, a
return 0;
}
-/* Client verification reply (group 1, subtype 0x20) */
-int aim_sendmemblock(aim_session_t *sess, aim_conn_t *conn, guint32 offset, guint32 len, const guint8 *buf, guint8 flag)
-{
- aim_frame_t *fr;
- aim_snacid_t snacid;
-
- if (!sess || !conn)
- return -EINVAL;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+2+16)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0001, 0x0020, 0x0000, NULL, 0);
-
- aim_putsnac(&fr->data, 0x0001, 0x0020, 0x0000, snacid);
- aimbs_put16(&fr->data, 0x0010); /* md5 is always 16 bytes */
-
- if ((flag == AIM_SENDMEMBLOCK_FLAG_ISHASH) && buf && (len == 0x10)) { /* we're getting a hash */
-
- aimbs_putraw(&fr->data, buf, 0x10);
-
- } else if (buf && (len > 0)) { /* use input buffer */
- md5_state_t state;
- md5_byte_t digest[0x10];
-
- md5_init(&state);
- md5_append(&state, (const md5_byte_t *)buf, len);
- md5_finish(&state, digest);
-
- aimbs_putraw(&fr->data, (guint8 *)digest, 0x10);
-
- } else if (len == 0) { /* no length, just hash NULL (buf is optional) */
- md5_state_t state;
- guint8 nil = '\0';
- md5_byte_t digest[0x10];
-
- /*
- * These MD5 routines are stupid in that you have to have
- * at least one append. So thats why this doesn't look
- * real logical.
- */
- md5_init(&state);
- md5_append(&state, (const md5_byte_t *)&nil, 0);
- md5_finish(&state, digest);
-
- aimbs_putraw(&fr->data, (guint8 *)digest, 0x10);
-
- } else {
-
- /*
- * This data is correct for AIM 3.5.1670.
- *
- * Using these blocks is as close to "legal" as you can get
- * without using an AIM binary.
- *
- */
- if ((offset == 0x03ffffff) && (len == 0x03ffffff)) {
-
-#if 1 /* with "AnrbnrAqhfzcd" */
- aimbs_put32(&fr->data, 0x44a95d26);
- aimbs_put32(&fr->data, 0xd2490423);
- aimbs_put32(&fr->data, 0x93b8821f);
- aimbs_put32(&fr->data, 0x51c54b01);
-#else /* no filename */
- aimbs_put32(&fr->data, 0x1df8cbae);
- aimbs_put32(&fr->data, 0x5523b839);
- aimbs_put32(&fr->data, 0xa0e10db3);
- aimbs_put32(&fr->data, 0xa46d3b39);
-#endif
-
-/* len can't be 0 here anyway...
- } else if ((offset == 0x00001000) && (len == 0x00000000)) {
-
- aimbs_put32(&fr->data, 0xd41d8cd9);
- aimbs_put32(&fr->data, 0x8f00b204);
- aimbs_put32(&fr->data, 0xe9800998);
- aimbs_put32(&fr->data, 0xecf8427e);
-*/
- } else
- imcb_error(sess->aux_data, "Warning: unknown hash request");
-
- }
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
static int snachandler(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
{
diff --git a/protocols/oscar/ssi.c b/protocols/oscar/ssi.c
index f37d98e5..e8502f68 100644
--- a/protocols/oscar/ssi.c
+++ b/protocols/oscar/ssi.c
@@ -262,28 +262,6 @@ int aim_ssi_getpermdeny(struct aim_ssi_item *list)
}
/**
- * Locally find the presence flag item, and return the setting. The returned setting is a
- * bitmask of the user flags that you are visible to. See the AIM_FLAG_* #defines
- * in aim.h
- *
- * @param list A pointer to the current list of items.
- * @return Return the current visibility mask.
- */
-guint32 aim_ssi_getpresence(struct aim_ssi_item *list)
-{
- struct aim_ssi_item *cur = aim_ssi_itemlist_finditem(list, NULL, NULL, AIM_SSI_TYPE_PRESENCEPREFS);
- if (cur) {
- aim_tlvlist_t *tlvlist = cur->data;
- if (tlvlist) {
- aim_tlv_t *tlv = aim_gettlv(tlvlist, 0x00c9, 1);
- if (tlv && tlv->length)
- return aimutil_get32(tlv->value);
- }
- }
- return 0xFFFFFFFF;
-}
-
-/**
* Add the given packet to the holding queue. We totally need to send SSI SNACs one at
* a time, so we have a local queue where packets get put before they are sent, and
* then we send stuff one at a time, nice and orderly-like.
@@ -344,143 +322,6 @@ static int aim_ssi_dispatch(aim_session_t *sess, aim_conn_t *conn)
}
/**
- * Send SNACs necessary to remove all SSI data from the server list,
- * and then free the local copy as well.
- *
- * @param sess The oscar session.
- * @param conn The bos connection for this session.
- * @return Return 0 if no errors, otherwise return the error number.
- */
-int aim_ssi_deletelist(aim_session_t *sess, aim_conn_t *conn)
-{
- int num;
- struct aim_ssi_item *cur, **items;
-
- for (cur=sess->ssi.items, num=0; cur; cur=cur->next)
- num++;
-
- if (!(items = g_new0(struct aim_ssi_item *, num)))
- return -ENOMEM;
-
- for (cur=sess->ssi.items, num=0; cur; cur=cur->next) {
- items[num] = cur;
- num++;
- }
-
- aim_ssi_addmoddel(sess, conn, items, num, AIM_CB_SSI_DEL);
- g_free(items);
- aim_ssi_dispatch(sess, conn);
- aim_ssi_freelist(sess);
-
- return 0;
-}
-
-/**
- * This "cleans" the ssi list. It does a few things, with the intent of making
- * sure there ain't nothin' wrong with your SSI.
- * -Make sure all buddies are in a group, and all groups have the correct
- * additional data.
- * -Make sure there are no empty groups in the list. While there is nothing
- * wrong empty groups in the SSI, it's wiser to not have them.
- *
- * @param sess The oscar session.
- * @param conn The bos connection for this session.
- * @return Return 0 if no errors, otherwise return the error number.
- */
-int aim_ssi_cleanlist(aim_session_t *sess, aim_conn_t *conn)
-{
- unsigned int i;
- struct aim_ssi_item *cur, *parentgroup;
-
- /* Make sure we actually need to clean out the list */
- for (cur=sess->ssi.items, i=0; cur && !i; cur=cur->next)
- /* Any buddies directly in the master group */
- if ((cur->type == AIM_SSI_TYPE_BUDDY) && (cur->gid == 0x0000))
- i++;
- if (!i)
- return 0;
-
- /* Remove all the additional data from all groups */
- for (cur=sess->ssi.items; cur; cur=cur->next)
- if ((cur->data) && (cur->type == AIM_SSI_TYPE_GROUP)) {
- aim_freetlvchain((aim_tlvlist_t **)&cur->data);
- cur->data = NULL;
- }
-
- /* If there are buddies directly in the master group, make sure */
- /* there is a group to put them in. Any group, any group at all. */
- for (cur=sess->ssi.items; ((cur) && ((cur->type != AIM_SSI_TYPE_BUDDY) || (cur->gid != 0x0000))); cur=cur->next);
- if (!cur) {
- for (parentgroup=sess->ssi.items; ((parentgroup) && (parentgroup->type!=AIM_SSI_TYPE_GROUP) && (parentgroup->gid==0x0000)); parentgroup=parentgroup->next);
- if (!parentgroup) {
- char *newgroup;
- newgroup = (char*)g_malloc(strlen("Unknown")+1);
- strcpy(newgroup, "Unknown");
- aim_ssi_addgroups(sess, conn, &newgroup, 1);
- }
- }
-
- /* Set parentgroup equal to any arbitray group */
- for (parentgroup=sess->ssi.items; parentgroup->gid==0x0000 || parentgroup->type!=AIM_SSI_TYPE_GROUP; parentgroup=parentgroup->next);
-
- /* If there are any buddies directly in the master group, put them in a real group */
- for (cur=sess->ssi.items; cur; cur=cur->next)
- if ((cur->type == AIM_SSI_TYPE_BUDDY) && (cur->gid == 0x0000)) {
- aim_ssi_addmoddel(sess, conn, &cur, 1, AIM_CB_SSI_DEL);
- cur->gid = parentgroup->gid;
- aim_ssi_addmoddel(sess, conn, &cur, 1, AIM_CB_SSI_ADD);
- }
-
- /* Rebuild additional data for all groups */
- for (parentgroup=sess->ssi.items; parentgroup; parentgroup=parentgroup->next)
- if (parentgroup->type == AIM_SSI_TYPE_GROUP)
- aim_ssi_itemlist_rebuildgroup(&sess->ssi.items, parentgroup);
-
- /* Send a mod snac for all groups */
- i = 0;
- for (cur=sess->ssi.items; cur; cur=cur->next)
- if (cur->type == AIM_SSI_TYPE_GROUP)
- i++;
- if (i > 0) {
- /* Allocate an array of pointers to each of the groups */
- struct aim_ssi_item **groups;
- if (!(groups = g_new0(struct aim_ssi_item *, i)))
- return -ENOMEM;
-
- for (cur=sess->ssi.items, i=0; cur; cur=cur->next)
- if (cur->type == AIM_SSI_TYPE_GROUP)
- groups[i] = cur;
-
- aim_ssi_addmoddel(sess, conn, groups, i, AIM_CB_SSI_MOD);
- g_free(groups);
- }
-
- /* Send a del snac for any empty groups */
- i = 0;
- for (cur=sess->ssi.items; cur; cur=cur->next)
- if ((cur->type == AIM_SSI_TYPE_GROUP) && !(cur->data))
- i++;
- if (i > 0) {
- /* Allocate an array of pointers to each of the groups */
- struct aim_ssi_item **groups;
- if (!(groups = g_new0(struct aim_ssi_item *, i)))
- return -ENOMEM;
-
- for (cur=sess->ssi.items, i=0; cur; cur=cur->next)
- if ((cur->type == AIM_SSI_TYPE_GROUP) && !(cur->data))
- groups[i] = cur;
-
- aim_ssi_addmoddel(sess, conn, groups, i, AIM_CB_SSI_DEL);
- g_free(groups);
- }
-
- /* Begin sending SSI SNACs */
- aim_ssi_dispatch(sess, conn);
-
- return 0;
-}
-
-/**
* Add an array of screen names to the given group.
*
* @param sess The oscar session.
@@ -998,128 +839,6 @@ int aim_ssi_delpord(aim_session_t *sess, aim_conn_t *conn, char **sn, unsigned i
return 0;
}
-/**
- * Stores your permit/deny setting on the server, and starts using it.
- *
- * @param sess The oscar session.
- * @param conn The bos connection for this session.
- * @param permdeny Your permit/deny setting. Can be one of the following:
- * 1 - Allow all users
- * 2 - Block all users
- * 3 - Allow only the users below
- * 4 - Block only the users below
- * 5 - Allow only users on my buddy list
- * @param vismask A bitmask of the class of users to whom you want to be
- * visible. See the AIM_FLAG_BLEH #defines in aim.h
- * @return Return 0 if no errors, otherwise return the error number.
- */
-int aim_ssi_setpermdeny(aim_session_t *sess, aim_conn_t *conn, guint8 permdeny, guint32 vismask) {
- struct aim_ssi_item *cur; //, *tmp;
-// guint16 j;
- aim_tlv_t *tlv;
-
- if (!sess || !conn)
- return -EINVAL;
-
- /* Look up the permit/deny settings item */
- cur = aim_ssi_itemlist_finditem(sess->ssi.items, NULL, NULL, AIM_SSI_TYPE_PDINFO);
-
- if (cur) {
- /* The permit/deny item exists */
- if (cur->data && (tlv = aim_gettlv(cur->data, 0x00ca, 1))) {
- /* Just change the value of the x00ca TLV */
- if (tlv->length != 1) {
- tlv->length = 1;
- g_free(tlv->value);
- tlv->value = (guint8 *)g_malloc(sizeof(guint8));
- }
- tlv->value[0] = permdeny;
- } else {
- /* Need to add the x00ca TLV to the TLV chain */
- aim_addtlvtochain8((aim_tlvlist_t**)&cur->data, 0x00ca, permdeny);
- }
-
- if (cur->data && (tlv = aim_gettlv(cur->data, 0x00cb, 1))) {
- /* Just change the value of the x00cb TLV */
- if (tlv->length != 4) {
- tlv->length = 4;
- g_free(tlv->value);
- tlv->value = (guint8 *)g_malloc(4*sizeof(guint8));
- }
- aimutil_put32(tlv->value, vismask);
- } else {
- /* Need to add the x00cb TLV to the TLV chain */
- aim_addtlvtochain32((aim_tlvlist_t**)&cur->data, 0x00cb, vismask);
- }
-
- /* Send the mod item SNAC */
- aim_ssi_addmoddel(sess, conn, &cur, 1, AIM_CB_SSI_MOD);
- } else {
- /* Need to add the permit/deny item */
- if (!(cur = aim_ssi_itemlist_add(&sess->ssi.items, NULL, NULL, AIM_SSI_TYPE_PDINFO)))
- return -ENOMEM;
- aim_addtlvtochain8((aim_tlvlist_t**)&cur->data, 0x00ca, permdeny);
- aim_addtlvtochain32((aim_tlvlist_t**)&cur->data, 0x00cb, vismask);
- aim_ssi_addmoddel(sess, conn, &cur, 1, AIM_CB_SSI_ADD);
- }
-
- /* Begin sending SSI SNACs */
- aim_ssi_dispatch(sess, conn);
-
- return 0;
-}
-
-/**
- * Stores your setting for whether you should show up as idle or not.
- *
- * @param sess The oscar session.
- * @param conn The bos connection for this session.
- * @param presence I think it's a bitmask, but I only know what one of the bits is:
- * 0x00000400 - Allow others to see your idle time
- * @return Return 0 if no errors, otherwise return the error number.
- */
-int aim_ssi_setpresence(aim_session_t *sess, aim_conn_t *conn, guint32 presence) {
- struct aim_ssi_item *cur; //, *tmp;
-// guint16 j;
- aim_tlv_t *tlv;
-
- if (!sess || !conn)
- return -EINVAL;
-
- /* Look up the item */
- cur = aim_ssi_itemlist_finditem(sess->ssi.items, NULL, NULL, AIM_SSI_TYPE_PRESENCEPREFS);
-
- if (cur) {
- /* The item exists */
- if (cur->data && (tlv = aim_gettlv(cur->data, 0x00c9, 1))) {
- /* Just change the value of the x00c9 TLV */
- if (tlv->length != 4) {
- tlv->length = 4;
- g_free(tlv->value);
- tlv->value = (guint8 *)g_malloc(4*sizeof(guint8));
- }
- aimutil_put32(tlv->value, presence);
- } else {
- /* Need to add the x00c9 TLV to the TLV chain */
- aim_addtlvtochain32((aim_tlvlist_t**)&cur->data, 0x00c9, presence);
- }
-
- /* Send the mod item SNAC */
- aim_ssi_addmoddel(sess, conn, &cur, 1, AIM_CB_SSI_MOD);
- } else {
- /* Need to add the item */
- if (!(cur = aim_ssi_itemlist_add(&sess->ssi.items, NULL, NULL, AIM_SSI_TYPE_PRESENCEPREFS)))
- return -ENOMEM;
- aim_addtlvtochain32((aim_tlvlist_t**)&cur->data, 0x00c9, presence);
- aim_ssi_addmoddel(sess, conn, &cur, 1, AIM_CB_SSI_ADD);
- }
-
- /* Begin sending SSI SNACs */
- aim_ssi_dispatch(sess, conn);
-
- return 0;
-}
-
/*
* Request SSI Rights.
*/
@@ -1142,37 +861,6 @@ static int parserights(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx,
return ret;
}
-/*
- * Request SSI Data.
- *
- * The data will only be sent if it is newer than the posted local
- * timestamp and revision.
- *
- * Note that the client should never increment the revision, only the server.
- *
- */
-int aim_ssi_reqdata(aim_session_t *sess, aim_conn_t *conn, time_t localstamp, guint16 localrev)
-{
- aim_frame_t *fr;
- aim_snacid_t snacid;
-
- if (!sess || !conn)
- return -EINVAL;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+4+2)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, AIM_CB_FAM_SSI, AIM_CB_SSI_REQLIST, 0x0000, NULL, 0);
-
- aim_putsnac(&fr->data, AIM_CB_FAM_SSI, AIM_CB_SSI_REQLIST, 0x0000, snacid);
- aimbs_put32(&fr->data, localstamp);
- aimbs_put16(&fr->data, localrev);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
int aim_ssi_reqalldata(aim_session_t *sess, aim_conn_t *conn)
{
aim_frame_t *fr;
diff --git a/protocols/oscar/ssi.h b/protocols/oscar/ssi.h
index 94b18d60..60d9faa5 100644
--- a/protocols/oscar/ssi.h
+++ b/protocols/oscar/ssi.h
@@ -44,7 +44,6 @@ struct aim_ssi_item {
/* These build the actual SNACs and queue them to be sent */
int aim_ssi_reqrights(aim_session_t *sess, aim_conn_t *conn);
-int aim_ssi_reqdata(aim_session_t *sess, aim_conn_t *conn, time_t localstamp, guint16 localrev);
int aim_ssi_reqalldata(aim_session_t *sess, aim_conn_t *conn);
int aim_ssi_enable(aim_session_t *sess, aim_conn_t *conn);
int aim_ssi_addmoddel(aim_session_t *sess, aim_conn_t *conn, struct aim_ssi_item **items, unsigned int num, guint16 subtype);
@@ -56,10 +55,8 @@ struct aim_ssi_item *aim_ssi_itemlist_find(struct aim_ssi_item *list, guint16 gi
struct aim_ssi_item *aim_ssi_itemlist_finditem(struct aim_ssi_item *list, char *gn, char *sn, guint16 type);
struct aim_ssi_item *aim_ssi_itemlist_findparent(struct aim_ssi_item *list, char *sn);
int aim_ssi_getpermdeny(struct aim_ssi_item *list);
-guint32 aim_ssi_getpresence(struct aim_ssi_item *list);
/* Send packets */
-int aim_ssi_cleanlist(aim_session_t *sess, aim_conn_t *conn);
int aim_ssi_addbuddies(aim_session_t *sess, aim_conn_t *conn, char *gn, char **sn, unsigned int num, unsigned int flags);
int aim_ssi_addmastergroup(aim_session_t *sess, aim_conn_t *conn);
int aim_ssi_addgroups(aim_session_t *sess, aim_conn_t *conn, char **gn, unsigned int num);
@@ -68,10 +65,7 @@ int aim_ssi_movebuddy(aim_session_t *sess, aim_conn_t *conn, char *oldgn, char *
int aim_ssi_delbuddies(aim_session_t *sess, aim_conn_t *conn, char *gn, char **sn, unsigned int num);
int aim_ssi_delmastergroup(aim_session_t *sess, aim_conn_t *conn);
int aim_ssi_delgroups(aim_session_t *sess, aim_conn_t *conn, char **gn, unsigned int num);
-int aim_ssi_deletelist(aim_session_t *sess, aim_conn_t *conn);
int aim_ssi_delpord(aim_session_t *sess, aim_conn_t *conn, char **sn, unsigned int num, guint16 type);
-int aim_ssi_setpermdeny(aim_session_t *sess, aim_conn_t *conn, guint8 permdeny, guint32 vismask);
-int aim_ssi_setpresence(aim_session_t *sess, aim_conn_t *conn, guint32 presence);
int aim_ssi_auth_request(aim_session_t *sess, aim_conn_t *conn, char *uin, char *reason);
int aim_ssi_auth_reply(aim_session_t *sess, aim_conn_t *conn, char *uin, int yesno, char *reason);
diff --git a/protocols/oscar/tlv.c b/protocols/oscar/tlv.c
index 9d827caf..89ef6f26 100644
--- a/protocols/oscar/tlv.c
+++ b/protocols/oscar/tlv.c
@@ -222,39 +222,6 @@ int aim_addtlvtochain32(aim_tlvlist_t **list, const guint16 t, const guint32 v)
}
/**
- * aim_addtlvtochain_availmsg - Add a ICQ availability message to a TLV chain
- * @list: Destination chain
- * @type: TLV type to add
- * @val: Value to add
- *
- * Adds a available message to a TLV chain
- *
- */
-int aim_addtlvtochain_availmsg(aim_tlvlist_t **list, const guint16 t, const char *msg)
-{
- int ret;
- guint16 unknown_data = 0x00;
- guint8 add_data_len = 4;
- guint16 msg_len = strlen(msg);
- guint8 total_len = strlen(msg) + add_data_len;
- guint8 *data, *cur;
- guint8 alloc_len = msg_len + (3*sizeof(guint16)) + (2*sizeof(guint8));
- data = cur = g_malloc(alloc_len);
-
- cur += aimutil_put16(cur, 2);
- cur += aimutil_put8(cur, add_data_len);
- cur += aimutil_put8(cur, total_len);
- cur += aimutil_put16(cur, msg_len);
- cur += aimutil_putstr(cur, msg, msg_len);
- cur += aimutil_put16(cur, unknown_data);
-
- ret = aim_addtlvtochain_raw(list, t, alloc_len, data);
- g_free(data);
-
- return ret;
-}
-
-/**
* aim_addtlvtochain_caps - Add a capability block to a TLV chain
* @list: Destination chain
* @type: TLV type to add
@@ -279,18 +246,6 @@ int aim_addtlvtochain_caps(aim_tlvlist_t **list, const guint16 t, const guint32
return aim_addtlvtochain_raw(list, t, aim_bstream_curpos(&bs), buf);
}
-int aim_addtlvtochain_userinfo(aim_tlvlist_t **list, guint16 type, aim_userinfo_t *ui)
-{
- guint8 buf[1024]; /* bleh */
- aim_bstream_t bs;
-
- aim_bstream_init(&bs, buf, sizeof(buf));
-
- aim_putuserinfo(&bs, ui);
-
- return aim_addtlvtochain_raw(list, type, aim_bstream_curpos(&bs), buf);
-}
-
/**
* aim_addtlvtochain_noval - Add a blank TLV to a TLV chain
* @list: Destination chain
diff --git a/protocols/purple/Makefile b/protocols/purple/Makefile
index e02641c1..562b4db1 100644
--- a/protocols/purple/Makefile
+++ b/protocols/purple/Makefile
@@ -38,7 +38,7 @@ $(objects): ../../Makefile.settings Makefile
$(objects): %.o: $(_SRCDIR_)%.c
@echo '*' Compiling $<
- @$(CC) -c $(CFLAGS) $< -o $@
+ @$(CC) -c $(CFLAGS) $(CFLAGS_BITLBEE) $< -o $@
purple_mod.o: $(objects)
@echo '*' Linking purple_mod.o
diff --git a/protocols/purple/purple.c b/protocols/purple/purple.c
index d107dc2f..6e9682ed 100644
--- a/protocols/purple/purple.c
+++ b/protocols/purple/purple.c
@@ -3,7 +3,7 @@
* BitlBee - An IRC to IM gateway *
* libpurple module - Main file *
* *
-* Copyright 2009-2010 Wilmer van der Gaast <wilmer@gaast.net> *
+* Copyright 2009-2012 Wilmer van der Gaast <wilmer@gaast.net> *
* *
* 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 *
diff --git a/protocols/skype/.mailmap b/protocols/skype/.mailmap
deleted file mode 100644
index cc8d43f9..00000000
--- a/protocols/skype/.mailmap
+++ /dev/null
@@ -1 +0,0 @@
-Miklos Vajna <vmiklos@frugalware.org>
diff --git a/protocols/skype/HACKING b/protocols/skype/HACKING
index f5516832..935856a7 100644
--- a/protocols/skype/HACKING
+++ b/protocols/skype/HACKING
@@ -17,10 +17,64 @@ python skyped.py -n -d
4) irssi
-== Get the code from git
-To get the code directly from git, you need:
+== Tests
-git clone git://vmiklos.hu/bitlbee-skype
-cd bitlbee-skype
-make autogen
+The plugin is tested with a mocked IRC client and a mocked skyped.
+
+=== Requirements
+
+Python pexpect module is required to run the tests.
+
+To run tests with bitlbee built in a development tree and not (the one)
+installed in the system (e.g. /usr), make sure to specify --plugindir= option to
+./configure script during the build process:
+
+bitlbee% ./configure --skype=1 --plugindir="$(realpath .)"
+
+Otherwise bitlbee will try to load skype.so (among other things) from /usr/lib,
+which is probably not what you want to test, or produce "Unknown protocol"
+error.
+
+=== Running
+
+Tests can be run by running test.py script in this ("protocols/skype")
+directory.
+
+For more control over how/which tests are being run from there, use "python -m
+unittest" command:
+
+bitlbee/protocols/skype% python -m unittest test
+bitlbee/protocols/skype% python -m unittest -f test
+bitlbee/protocols/skype% python -m unittest test.Test.testMsg
+
+If bitlbee crashes during tests with SIGSEGV (segmentation fault), it's likely
+that there is some problem with skype.c plugin.
+To get a backtrace of such crash, use:
+
+bitlbee/protocols/skype% ATTACH_GDB=true python -m unittest test.Test.testMsg
+
+Example shows running "testMsg" test with gdb attached to bitlbee, which will
+produce full backtrace in "t/gdb-<pid>.log" files (see pid in pexpect error
+output of the test).
+
+=== Adding new tests
+
+To add a new test, the following steps are necessary:
+
+1) Add a new -skyped.mock file: just do the test manually, copy&paste the
+skyped output and clean it up, so Alice talks to Bob. You can test the created
+mock file by starting skyped with the -m option, and testing it from an IRC
+client manually.
+
+2) Add a new -bitlbee.mock file: do the test manually from irssi, and use:
+
+/connect -rawlog rawlog localhost
+
+Then clean up the rawlog: the input lines are parsed as matching patterns, so
+boring prefix/suffix text can be left out, non-interesting lines can be
+deleted. The output lines still have to be strict IRC commands, as usual.
+
+3) Add the new test to test.py and run it!
+
+// vim: ft=asciidoc
diff --git a/protocols/skype/Makefile b/protocols/skype/Makefile
index 455a21f2..6548bfb9 100644
--- a/protocols/skype/Makefile
+++ b/protocols/skype/Makefile
@@ -3,10 +3,7 @@ ifdef _SRCDIR_
_SRCDIR_ := $(_SRCDIR_)protocols/skype/
endif
-VERSION = 0.9.0
DATE := $(shell date +%Y-%m-%d)
-# latest stable
-BITLBEE_VERSION = 3.0.1
INSTALL = install
ASCIIDOC = yes
@@ -16,69 +13,17 @@ else
MANPAGES =
endif
-ifeq ($(BITLBEE),yes)
-LIBS = skype.$(SHARED_EXT)
-else
-LIBS =
-endif
-
-all: $(LIBS) $(MANPAGES)
-
-skype.$(SHARED_EXT): $(_SRCDIR_)skype.c config.mak
-ifeq ($(BITLBEE),yes)
- $(CC) $(CFLAGS) $(SHARED_FLAGS) -o skype.$(SHARED_EXT) $(_SRCDIR_)skype.c $(LDFLAGS)
-endif
-
-install: all install-doc
-ifeq ($(BITLBEE),yes)
- $(INSTALL) -d $(DESTDIR)$(plugindir)
- $(INSTALL) skype.$(SHARED_EXT) $(DESTDIR)$(plugindir)
-endif
-ifeq ($(SKYPE4PY),yes)
- $(INSTALL) -d $(DESTDIR)$(bindir)
- $(INSTALL) -d $(DESTDIR)$(sysconfdir)
- $(INSTALL) skyped.py $(DESTDIR)$(bindir)/skyped
- perl -p -i -e 's|/usr/local/etc/skyped|$(sysconfdir)|' $(DESTDIR)$(bindir)/skyped
- $(INSTALL) -m644 skyped.conf.dist $(DESTDIR)$(sysconfdir)/skyped.conf
- perl -p -i -e 's|\$${prefix}|$(prefix)|' $(DESTDIR)$(sysconfdir)/skyped.conf
- $(INSTALL) -m644 skyped.cnf $(DESTDIR)$(sysconfdir)
-endif
-
-client: $(_SRCDIR_)client.c
-
-autogen: configure.ac
- cp $(shell ls /usr/share/automake-*/install-sh | tail -n1) ./
- autoconf
+all: $(MANPAGES)
clean:
- rm -f $(LIBS) $(MANPAGES)
-
-distclean: clean
- rm -f config.log config.mak config.status $(MANPAGES)
-
-autoclean: distclean
- rm -rf aclocal.m4 autom4te.cache configure install-sh
+ rm -f $(MANPAGES)
# take this from the kernel
check:
- perl checkpatch.pl --no-tree --file skype.c
+ perl checkpatch.pl --show-types --ignore LONG_LINE,CAMELCASE --no-tree --file skype.c
test: all
- $(MAKE) -C t/ all
-
-dist:
- git archive --format=tar --prefix=bitlbee-skype-$(VERSION)/ HEAD | tar xf -
- mkdir -p bitlbee-skype-$(VERSION)
- git log --no-merges |git name-rev --tags --stdin > bitlbee-skype-$(VERSION)/Changelog
- make -C bitlbee-skype-$(VERSION) autogen
- tar czf bitlbee-skype-$(VERSION).tar.gz bitlbee-skype-$(VERSION)
- rm -rf bitlbee-skype-$(VERSION)
-
-release:
- git tag $(VERSION)
- $(MAKE) dist
- gpg --comment "See http://vmiklos.hu/gpg/ for info" \
- -ba bitlbee-skype-$(VERSION).tar.gz
+ ./test.py
doc: $(MANPAGES)
@@ -91,17 +36,5 @@ endif
uninstall-doc:
rm -f $(DESTDIR)$(MANDIR)/man1/skyped.1*
-HEADER.html: README Makefile
- asciidoc -a toc -a numbered -a sectids -o HEADER.html -a icons -a data-uri --attribute iconsdir=./images/icons README
- sed -i 's|@VERSION@|$(VERSION)|g' HEADER.html
- sed -i 's|@BITLBEE_VERSION@|$(BITLBEE_VERSION)|g' HEADER.html
-
-Changelog: .git/refs/heads/master
- git log --no-merges |git name-rev --tags --stdin >Changelog
-
-AUTHORS: .git/refs/heads/master
- git shortlog -s -n |sed 's/.*\t//'> AUTHORS
-
%.1: $(_SRCDIR_)%.txt $(_SRCDIR_)asciidoc.conf
- a2x --asciidoc-opts="-f $(_SRCDIR_)asciidoc.conf" \
- -a bs_version=$(VERSION) -a bs_date=$(DATE) -f manpage -D . $<
+ a2x --asciidoc-opts="-f $(_SRCDIR_)asciidoc.conf" -a bee_date=$(DATE) -f manpage -D . $<
diff --git a/protocols/skype/README b/protocols/skype/README
index 2c962d54..b9f22481 100644
--- a/protocols/skype/README
+++ b/protocols/skype/README
@@ -30,7 +30,7 @@ not..)
== Requirements
-* Skype >= 1.4.0.99. The latest version I've tested is 2.1.0.81.
+* Skype >= 1.4.0.99. The latest version I've tested is 4.1.0.20.
* BitlBee >= 3.0. The latest version I've tested is @BITLBEE_VERSION@. Use
old versions (see the NEWS file about which one) if you have older BitlBee
installed.
@@ -144,62 +144,7 @@ This will install the plugin to where BitlBee expects them, which is
=== Configuring
-- Set up `~/.skyped/skyped.conf`: Create the `~/.skyped` directory, copy
- `skyped.conf` and `skyped.cnf` from
- `/usr/local/etc/skyped/skyped.conf` to `~/.skyped`, adjust `username`
- and `password`. The `username` should be your Skype login and the
- `password` can be whatever you want, but you will have to specify that
- one when adding the Skype account to BitlBee (see later).
-
-NOTE: Here, and later - `/usr/local/etc` can be different on your installation
-if you used the `--sysconfdir` switch when running bitlbee-skype's `configure`.
-
-- Generate the SSL pem files:
-
-----
-# cd ~/.skyped
-# openssl req -new -x509 -days 365 -nodes -config skyped.cnf -out skyped.cert.pem \
- -keyout skyped.key.pem
-----
-
-NOTE: Maybe you want to adjust the permissions in the `~/.skyped`
-dir. For example make it readable by just your user.
-
-- Start `skyped` (the tcp server):
-
-----
-$ skyped
-----
-
-- Start your `IRC` client, connect to BitlBee and add your account:
-
-----
-account add skype <user> <pass>
-account skype set server localhost
-----
-
-<user> should be your Skype account name, <pass> should be the one you declared
-in `skyped.conf`. If you want to run skyped on a remote machine, replace
-`localhost` with the name of the machine.
-
-If you are running skyped on a custom port:
-
-----
-account skype set port <port>
-----
-
-If you want to set your full name (optional):
-
-----
-account skype set display_name "John Smith"
-----
-
-If you want to see your skypeout contacts online as well (they are
-offline by default):
-
-----
-account skype set skypeout_offline false
-----
+See the manpage of `skyped`.
== Setting up Skype in a VNC server (optional)
@@ -346,12 +291,14 @@ $ skyped -n -d
* `account skype set test_join true`
-- Mood texts are not shown by default. If you want to see it:
+- Mood texts are not shown by default.
- * `account skype set show_moods true`
+ * If you want to see them: `account skype set show_moods true`
+ * If you want to change your mood text: `account skype set mood_text 'foo bar'`
- Group support:
+ * To enable: `account skype set read_groups true`
* Skype groups are told to BitlBee
* The usual `/invite` in a group channel adds the buddy to the group in skype
as well (and if necessary, it creates a new group in Skype)
@@ -371,7 +318,7 @@ $ skyped -n -d
== I would like to have support for ...
If something does not work and it's not in the TODO section, then please
-contact me! Please also try the link:HACKING[git version] before reporting a bug, your
+contact me! Please also try the bzr version before reporting a bug, your
problem may be already fixed there.
In fact, of course, I wrote this documentation after figured out how to do this
@@ -391,9 +338,6 @@ You can reach some screenshots link:shot[here].
== Additional resources
-You can reach the Changelog link:Changelog[here], and a gitweb interface
-http://vmiklos.hu/gitweb/?p=bitlbee-skype.git[here].
-
The Skype API documentation is
http://developer.skype.com/resources/public_api_ref.zip[here] if you're
interested.
diff --git a/protocols/skype/asciidoc.conf b/protocols/skype/asciidoc.conf
index 24a649c1..f52b3ad6 100644
--- a/protocols/skype/asciidoc.conf
+++ b/protocols/skype/asciidoc.conf
@@ -4,14 +4,13 @@ ifdef::backend-docbook[]
template::[header-declarations]
<refentry>
<refentryinfo>
- <date>{bs_date}</date>
+ <date>{bee_date}</date>
</refentryinfo>
<refmeta>
<refentrytitle>{mantitle}</refentrytitle>
<manvolnum>{manvolnum}</manvolnum>
- <refmiscinfo class="source">bitlbee-skype</refmiscinfo>
- <refmiscinfo class="version">{bs_version}</refmiscinfo>
- <refmiscinfo class="manual">bitlbee-skype manual</refmiscinfo>
+ <refmiscinfo class="source">BitlBee</refmiscinfo>
+ <refmiscinfo class="manual">BitlBee manual</refmiscinfo>
</refmeta>
<refnamediv>
<refname>{manname}</refname>
diff --git a/protocols/skype/skype.c b/protocols/skype/skype.c
index 8638b5c1..7ce562d4 100644
--- a/protocols/skype/skype.c
+++ b/protocols/skype/skype.c
@@ -1,7 +1,7 @@
/*
* skype.c - Skype plugin for BitlBee
*
- * Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012 by Miklos Vajna <vmiklos@frugalware.org>
+ * Copyright (c) 2007-2013 by Miklos Vajna <vmiklos@vmiklos.hu>
*
* 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
@@ -28,7 +28,7 @@
#define SKYPE_DEFAULT_SERVER "localhost"
#define SKYPE_DEFAULT_PORT "2727"
-#define IRC_LINE_SIZE 1024
+#define IRC_LINE_SIZE 16384
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
/*
@@ -45,6 +45,8 @@ enum {
enum {
SKYPE_FILETRANSFER_NEW = 1,
+ SKYPE_FILETRANSFER_TRANSFERRING,
+ SKYPE_FILETRANSFER_COMPLETED,
SKYPE_FILETRANSFER_FAILED
};
@@ -80,6 +82,8 @@ struct skype_data {
int call_out;
/* Same for file transfers. */
int filetransfer_status;
+ /* Path of the file being transferred. */
+ char *filetransfer_path;
/* Using /j #nick we want to have a groupchat with two people. Usually
* not (default). */
char *groupchat_with;
@@ -113,6 +117,8 @@ struct skype_data {
/* Pending user which has to be added to the next group which is
* created. */
char *pending_user;
+ /* If the info command was used, to determine what to do with FULLNAME result. */
+ int is_info;
};
struct skype_away_state {
@@ -189,7 +195,7 @@ int skype_printf(struct im_connection *ic, char *fmt, ...)
static void skype_buddy_ask_yes(void *data)
{
struct skype_buddy_ask_data *bla = data;
- skype_printf(bla->ic, "SET USER %s ISAUTHORIZED TRUE",
+ skype_printf(bla->ic, "SET USER %s ISAUTHORIZED TRUE\n",
bla->handle);
g_free(bla->handle);
g_free(bla);
@@ -198,7 +204,7 @@ static void skype_buddy_ask_yes(void *data)
static void skype_buddy_ask_no(void *data)
{
struct skype_buddy_ask_data *bla = data;
- skype_printf(bla->ic, "SET USER %s ISAUTHORIZED FALSE",
+ skype_printf(bla->ic, "SET USER %s ISAUTHORIZED FALSE\n",
bla->handle);
g_free(bla->handle);
g_free(bla);
@@ -213,8 +219,7 @@ void skype_buddy_ask(struct im_connection *ic, char *handle, char *message)
bla->ic = ic;
bla->handle = g_strdup(handle);
- buf = g_strdup_printf("The user %s wants to add you to "
- "his/her buddy list, saying: '%s'.", handle, message);
+ buf = g_strdup_printf("The user %s wants to add you to his/her buddy list, saying: '%s'.", handle, message);
imcb_ask(ic, buf, bla, skype_buddy_ask_yes, skype_buddy_ask_no);
g_free(buf);
}
@@ -222,7 +227,7 @@ void skype_buddy_ask(struct im_connection *ic, char *handle, char *message)
static void skype_call_ask_yes(void *data)
{
struct skype_buddy_ask_data *bla = data;
- skype_printf(bla->ic, "SET CALL %s STATUS INPROGRESS",
+ skype_printf(bla->ic, "SET CALL %s STATUS INPROGRESS\n",
bla->handle);
g_free(bla->handle);
g_free(bla);
@@ -231,7 +236,7 @@ static void skype_call_ask_yes(void *data)
static void skype_call_ask_no(void *data)
{
struct skype_buddy_ask_data *bla = data;
- skype_printf(bla->ic, "SET CALL %s STATUS FINISHED",
+ skype_printf(bla->ic, "SET CALL %s STATUS FINISHED\n",
bla->handle);
g_free(bla->handle);
g_free(bla);
@@ -316,8 +321,10 @@ static void skype_parse_users(struct im_connection *ic, char *line)
char **i, **nicks;
nicks = g_strsplit(line + 6, ", ", 0);
- for (i = nicks; *i; i++)
+ for (i = nicks; *i; i++) {
skype_printf(ic, "GET USER %s ONLINESTATUS\n", *i);
+ skype_printf(ic, "GET USER %s FULLNAME\n", *i);
+ }
g_strfreev(nicks);
}
@@ -371,9 +378,17 @@ static void skype_parse_user(struct im_connection *ic, char *line)
*buf ? buf : NULL);
if (set_getbool(&ic->acc->set, "show_moods"))
imcb_log(ic, "User `%s' changed mood text to `%s'", user, buf);
- } else if (!strncmp(ptr, "FULLNAME ", 9))
- sd->info_fullname = g_strdup(ptr + 9);
- else if (!strncmp(ptr, "PHONE_HOME ", 11))
+ } else if (!strncmp(ptr, "FULLNAME ", 9)) {
+ char *name = ptr + 9;
+ if (sd->is_info) {
+ sd->is_info = FALSE;
+ sd->info_fullname = g_strdup(name);
+ } else {
+ char *buf = g_strdup_printf("%s@skype.com", user);
+ imcb_rename_buddy(ic, buf, name);
+ g_free(buf);
+ }
+ } else if (!strncmp(ptr, "PHONE_HOME ", 11))
sd->info_phonehome = g_strdup(ptr + 11);
else if (!strncmp(ptr, "PHONE_OFFICE ", 13))
sd->info_phoneoffice = g_strdup(ptr + 13);
@@ -408,8 +423,7 @@ static void skype_parse_user(struct im_connection *ic, char *line)
sd->info_about = g_strdup(st->str);
g_string_free(st, TRUE);
}
- }
- else if (!strncmp(ptr, "BIRTHDAY ", 9)) {
+ } else if (!strncmp(ptr, "BIRTHDAY ", 9)) {
sd->info_birthday = g_strdup(ptr + 9);
GString *st = g_string_new("Contact Information\n");
@@ -565,10 +579,30 @@ static void skype_parse_user(struct im_connection *ic, char *line)
}
}
-static void skype_parse_chatmessage(struct im_connection *ic, char *line)
+static void skype_parse_chatmessage_said_emoted(struct im_connection *ic, struct groupchat *gc, char *body)
{
struct skype_data *sd = ic->proto_data;
char buf[IRC_LINE_SIZE];
+ if (!strcmp(sd->type, "SAID")) {
+ if (!sd->is_edit)
+ g_snprintf(buf, IRC_LINE_SIZE, "%s", body);
+ else {
+ g_snprintf(buf, IRC_LINE_SIZE, "%s %s", set_getstr(&ic->acc->set, "edit_prefix"), body);
+ sd->is_edit = 0;
+ }
+ } else
+ g_snprintf(buf, IRC_LINE_SIZE, "/me %s", body);
+ if (!gc)
+ /* Private message */
+ imcb_buddy_msg(ic, sd->handle, buf, 0, 0);
+ else
+ /* Groupchat message */
+ imcb_chat_msg(gc, sd->handle, buf, 0, 0);
+}
+
+static void skype_parse_chatmessage(struct im_connection *ic, char *line)
+{
+ struct skype_data *sd = ic->proto_data;
char *id = strchr(line, ' ');
if (!++id)
@@ -626,27 +660,7 @@ static void skype_parse_chatmessage(struct im_connection *ic, char *line)
char *body = g_list_nth_data(sd->body, i);
if (!strcmp(sd->type, "SAID") ||
!strcmp(sd->type, "EMOTED")) {
- if (!strcmp(sd->type, "SAID")) {
- if (!sd->is_edit)
- g_snprintf(buf, IRC_LINE_SIZE, "%s",
- body);
- else {
- g_snprintf(buf, IRC_LINE_SIZE, "%s %s",
- set_getstr(&ic->acc->set, "edit_prefix"),
- body);
- sd->is_edit = 0;
- }
- } else
- g_snprintf(buf, IRC_LINE_SIZE, "/me %s",
- body);
- if (!gc)
- /* Private message */
- imcb_buddy_msg(ic,
- sd->handle, buf, 0, 0);
- else
- /* Groupchat message */
- imcb_chat_msg(gc,
- sd->handle, buf, 0, 0);
+ skype_parse_chatmessage_said_emoted(ic, gc, body);
} else if (!strcmp(sd->type, "SETTOPIC") && gc)
imcb_chat_topic(gc,
sd->handle, body, 0);
@@ -715,8 +729,7 @@ static void skype_parse_call(struct im_connection *ic, char *line)
switch (sd->call_status) {
case SKYPE_CALL_RINGING:
if (sd->call_out)
- imcb_log(ic, "You are currently ringing "
- "the user %s.", info);
+ imcb_log(ic, "You are currently ringing the user %s.", info);
else {
g_snprintf(buf, IRC_LINE_SIZE,
"The user %s is currently ringing you.",
@@ -785,6 +798,15 @@ static void skype_parse_filetransfer(struct im_connection *ic, char *line)
skype_printf(ic, "GET FILETRANSFER %s PARTNER_HANDLE\n",
id);
sd->filetransfer_status = SKYPE_FILETRANSFER_FAILED;
+ } else if (!strcmp(info, "STATUS COMPLETED")) {
+ skype_printf(ic, "GET FILETRANSFER %s PARTNER_HANDLE\n", id);
+ sd->filetransfer_status = SKYPE_FILETRANSFER_COMPLETED;
+ } else if (!strcmp(info, "STATUS TRANSFERRING")) {
+ skype_printf(ic, "GET FILETRANSFER %s PARTNER_HANDLE\n", id);
+ sd->filetransfer_status = SKYPE_FILETRANSFER_TRANSFERRING;
+ } else if (!strncmp(info, "FILEPATH ", 9)) {
+ info += 9;
+ sd->filetransfer_path = g_strdup(info);
} else if (!strncmp(info, "PARTNER_HANDLE ", 15)) {
info += 15;
if (!sd->filetransfer_status)
@@ -798,6 +820,16 @@ static void skype_parse_filetransfer(struct im_connection *ic, char *line)
imcb_log(ic, "Failed to transfer file from user %s.",
info);
break;
+ case SKYPE_FILETRANSFER_COMPLETED:
+ imcb_log(ic, "File transfer from user %s completed.", info);
+ break;
+ case SKYPE_FILETRANSFER_TRANSFERRING:
+ if (sd->filetransfer_path) {
+ imcb_log(ic, "File transfer from user %s started, saving to %s.", info, sd->filetransfer_path);
+ g_free(sd->filetransfer_path);
+ sd->filetransfer_path = NULL;
+ }
+ break;
}
sd->filetransfer_status = 0;
}
@@ -897,7 +929,7 @@ static void skype_parse_group(struct im_connection *ic, char *line)
if (!sd->pending_user) {
/* Number of users changed in this group, query its type to see
* if it's a custom one we should care about. */
- skype_printf(ic, "GET GROUP %s TYPE", id);
+ skype_printf(ic, "GET GROUP %s TYPE\n", id);
return;
}
@@ -906,7 +938,7 @@ static void skype_parse_group(struct im_connection *ic, char *line)
struct skype_group *sg = skype_group_by_id(ic, atoi(id));
if (sg) {
- skype_printf(ic, "ALTER GROUP %d ADDUSER %s", sg->id, sd->pending_user);
+ skype_printf(ic, "ALTER GROUP %d ADDUSER %s\n", sg->id, sd->pending_user);
g_free(sd->pending_user);
sd->pending_user = NULL;
} else
@@ -914,7 +946,7 @@ static void skype_parse_group(struct im_connection *ic, char *line)
"No skype group with id %s. That's probably a bug.", id);
} else if (!strcmp(info, "TYPE CUSTOM_GROUP"))
/* This one is interesting, query its users. */
- skype_printf(ic, "GET GROUP %s USERS", id);
+ skype_printf(ic, "GET GROUP %s USERS\n", id);
}
static void skype_parse_chat(struct im_connection *ic, char *line)
@@ -982,8 +1014,8 @@ static void skype_parse_chat(struct im_connection *ic, char *line)
g_free(sd->adder);
sd->adder = NULL;
}
- } else if (!strncmp(info, "ACTIVEMEMBERS ", 14)) {
- info += 14;
+ } else if (!strncmp(info, "MEMBERS ", 8) || !strncmp(info, "ACTIVEMEMBERS ", 14) ) {
+ info += 8;
gc = bee_chat_by_title(ic->bee, ic, id);
/* Hack! We set ->data to TRUE
* while we're on the channel
@@ -1045,6 +1077,9 @@ static void skype_parse_chats(struct im_connection *ic, char *line)
static void skype_parse_groups(struct im_connection *ic, char *line)
{
+ if (!set_getbool(&ic->acc->set, "read_groups"))
+ return;
+
char **i;
char **groups = g_strsplit(line + 7, ", ", 0);
@@ -1123,6 +1158,13 @@ static gboolean skype_read_callback(gpointer data, gint fd,
return FALSE;
/* Read the whole data. */
st = ssl_read(sd->ssl, buf, sizeof(buf));
+ if (st >= IRC_LINE_SIZE-1) {
+ /* As we don't buffer incoming data, if IRC_LINE_SIZE amount of bytes
+ * were received, there's a good chance last message was truncated
+ * and the next recv() will yield garbage. */
+ imcb_error(ic, "Unable to handle incoming data from skyped");
+ st = 0;
+ }
if (st > 0) {
buf[st] = '\0';
/* Then split it up to lines. */
@@ -1177,8 +1219,12 @@ gboolean skype_start_stream(struct im_connection *ic)
skype_printf(ic, "SET USERSTATUS ONLINE\n");
/* Auto join to bookmarked chats if requested.*/
- if (set_getbool(&ic->acc->set, "auto_join"))
+ if (set_getbool(&ic->acc->set, "auto_join")) {
skype_printf(ic, "SEARCH BOOKMARKEDCHATS\n");
+ skype_printf(ic, "SEARCH ACTIVECHATS\n");
+ skype_printf(ic, "SEARCH MISSEDCHATS\n");
+ skype_printf(ic, "SEARCH RECENTCHATS\n");
+ }
return st;
}
@@ -1227,7 +1273,7 @@ static void skype_logout(struct im_connection *ic)
skype_printf(ic, "SET USERSTATUS OFFLINE\n");
- while( ic->groupchats )
+ while (ic->groupchats)
imcb_chat_free(ic->groupchats->data);
for (i = 0; i < g_list_length(sd->groups); i++) {
@@ -1314,7 +1360,16 @@ static char *skype_set_display_name(set_t *set, char *value)
account_t *acc = set->data;
struct im_connection *ic = acc->ic;
- skype_printf(ic, "SET PROFILE FULLNAME %s", value);
+ skype_printf(ic, "SET PROFILE FULLNAME %s\n", value);
+ return value;
+}
+
+static char *skype_set_mood_text(set_t *set, char *value)
+{
+ account_t *acc = set->data;
+ struct im_connection *ic = acc->ic;
+
+ skype_printf(ic, "SET PROFILE MOOD_TEXT %s\n", value);
return value;
}
@@ -1323,7 +1378,7 @@ static char *skype_set_balance(set_t *set, char *value)
account_t *acc = set->data;
struct im_connection *ic = acc->ic;
- skype_printf(ic, "GET PROFILE PSTN_BALANCE");
+ skype_printf(ic, "GET PROFILE PSTN_BALANCE\n");
return value;
}
@@ -1334,7 +1389,7 @@ static void skype_call(struct im_connection *ic, char *value)
if (ptr)
*ptr = '\0';
- skype_printf(ic, "CALL %s", nick);
+ skype_printf(ic, "CALL %s\n", nick);
g_free(nick);
}
@@ -1343,7 +1398,7 @@ static void skype_hangup(struct im_connection *ic)
struct skype_data *sd = ic->proto_data;
if (sd->call_id) {
- skype_printf(ic, "SET CALL %s STATUS FINISHED",
+ skype_printf(ic, "SET CALL %s STATUS FINISHED\n",
sd->call_id);
g_free(sd->call_id);
sd->call_id = 0;
@@ -1383,10 +1438,10 @@ static void skype_add_buddy(struct im_connection *ic, char *who, char *group)
if (!sg) {
/* No such group, we need to create it, then have to
* add the user once it's created. */
- skype_printf(ic, "CREATE GROUP %s", group);
+ skype_printf(ic, "CREATE GROUP %s\n", group);
sd->pending_user = g_strdup(nick);
} else {
- skype_printf(ic, "ALTER GROUP %d ADDUSER %s", sg->id, nick);
+ skype_printf(ic, "ALTER GROUP %d ADDUSER %s\n", sg->id, nick);
}
}
}
@@ -1463,11 +1518,13 @@ struct groupchat *skype_chat_with(struct im_connection *ic, char *who)
static void skype_get_info(struct im_connection *ic, char *who)
{
+ struct skype_data *sd = ic->proto_data;
char *ptr, *nick;
nick = g_strdup(who);
ptr = strchr(nick, '@');
if (ptr)
*ptr = '\0';
+ sd->is_info = TRUE;
skype_printf(ic, "GET USER %s FULLNAME\n", nick);
skype_printf(ic, "GET USER %s PHONE_HOME\n", nick);
skype_printf(ic, "GET USER %s PHONE_OFFICE\n", nick);
@@ -1490,11 +1547,6 @@ static void skype_get_info(struct im_connection *ic, char *who)
skype_printf(ic, "GET USER %s BIRTHDAY\n", nick);
}
-static void skype_set_my_name(struct im_connection *ic, char *info)
-{
- skype_set_display_name(set_find(&ic->acc->set, "display_name"), info);
-}
-
static void skype_init(account_t *acc)
{
set_t *s;
@@ -1510,6 +1562,9 @@ static void skype_init(account_t *acc)
acc);
s->flags |= SET_NOSAVE | ACC_SET_ONLINE_ONLY;
+ s = set_add(&acc->set, "mood_text", NULL, skype_set_mood_text, acc);
+ s->flags |= ACC_SET_NOSAVE | ACC_SET_ONLINE_ONLY;
+
s = set_add(&acc->set, "call", NULL, skype_set_call, acc);
s->flags |= SET_NOSAVE | ACC_SET_ONLINE_ONLY;
@@ -1535,6 +1590,8 @@ static void skype_init(account_t *acc)
s = set_add(&acc->set, "edit_prefix", "EDIT:",
NULL, acc);
+
+ s = set_add(&acc->set, "read_groups", "false", set_eval_bool, acc);
}
#if BITLBEE_VERSION_CODE > BITLBEE_VER(3, 0, 1)
@@ -1546,12 +1603,14 @@ GList *skype_buddy_action_list(bee_user_t *bu)
bu = bu;
if (ret == NULL) {
- static const struct buddy_action ba[3] = {
+ static const struct buddy_action ba[2] = {
{"CALL", "Initiate a call" },
{"HANGUP", "Hang up a call" },
};
+ int i;
- ret = g_list_prepend(ret, (void *) ba + 0);
+ for (i = 0; i < ARRAY_SIZE(ba); i++)
+ ret = g_list_prepend(ret, (void *)(ba + i));
}
return ret;
@@ -1582,7 +1641,6 @@ void init_plugin(void)
ret->logout = skype_logout;
ret->buddy_msg = skype_buddy_msg;
ret->get_info = skype_get_info;
- ret->set_my_name = skype_set_my_name;
ret->away_states = skype_away_states;
ret->set_away = skype_set_away;
ret->add_buddy = skype_add_buddy;
diff --git a/protocols/skype/skyped.py b/protocols/skype/skyped.py
index 07c08435..86b1e96a 100644
--- a/protocols/skype/skyped.py
+++ b/protocols/skype/skyped.py
@@ -1,32 +1,30 @@
#!/usr/bin/env python2.7
-#
+#
# skyped.py
-#
-# Copyright (c) 2007, 2008, 2009, 2010, 2011 by Miklos Vajna <vmiklos@frugalware.org>
+#
+# Copyright (c) 2007-2013 by Miklos Vajna <vmiklos@vmiklos.hu>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
-#
+#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-#
+#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
# USA.
#
import sys
import os
import signal
-import locale
import time
import socket
-import getopt
import Skype4Py
import hashlib
from ConfigParser import ConfigParser, NoOptionError
@@ -53,11 +51,12 @@ def eh(type, value, tb):
gobject.MainLoop().quit()
if options.conn:
options.conn.close()
- # shut down client if it's running
- try:
- skype.skype.Client.Shutdown()
- except NameError:
- pass
+ if not options.dont_start_skype:
+ # shut down client if it's running
+ try:
+ skype.skype.Client.Shutdown()
+ except NameError:
+ pass
sys.exit("Exiting.")
sys.excepthook = eh
@@ -119,39 +118,35 @@ def skype_idle_handler(skype):
try:
c = skype.skype.Command("PING", Block=True)
skype.skype.SendCommand(c)
- except Skype4Py.SkypeAPIError, s:
+ except (Skype4Py.SkypeAPIError, AttributeError), s:
dprint("Warning, pinging Skype failed (%s)." % (s))
+ time.sleep(1)
return True
-def send(sock, txt):
+def send(sock, txt, tries=10):
global options
- from time import sleep
- count = 1
- done = False
if hasgobject:
- while (not done) and (count < 10):
- try:
- sock.send(txt)
- done = True
- except Exception, s:
- count += 1
- dprint("Warning, sending '%s' failed (%s). count=%d" % (txt, s, count))
- sleep(1)
- if not done:
+ if not options.conn: return
+ try:
+ done = sock.sendall(txt)
+ except socket.error as s:
+ dprint("Warning, sending '%s' failed (%s)." % (txt, s))
options.conn.close()
+ options.conn = False
else:
- while (not done) and (count < 10) and options.conn:
+ for attempt in xrange(1, tries+1):
+ if not options.conn: break
if wait_for_lock(options.lock, 3, 10, "socket send"):
try:
- if options.conn: sock.send(txt)
+ if options.conn: done = sock.sendall(txt)
options.lock.release()
- done = True
- except Exception, s:
+ except socket.error as s:
options.lock.release()
- count += 1
dprint("Warning, sending '%s' failed (%s). count=%d" % (txt, s, count))
- sleep(1)
- if not done:
+ time.sleep(1)
+ else:
+ break
+ else:
if options.conn:
options.conn.close()
options.conn = False
@@ -206,9 +201,13 @@ def listener(sock, skype):
certfile=options.config.sslcert,
keyfile=options.config.sslkey,
ssl_version=ssl.PROTOCOL_TLSv1)
- except ssl.SSLError:
- dprint("Warning, SSL init failed, did you create your certificate?")
- return False
+ except (ssl.SSLError, socket.error) as err:
+ if isinstance(err, ssl.SSLError):
+ dprint("Warning, SSL init failed, did you create your certificate?")
+ return False
+ else:
+ dprint('Warning, SSL init failed')
+ return True
if hasattr(options.conn, 'handshake'):
try:
options.conn.handshake()
@@ -254,11 +253,13 @@ def dprint(msg):
from time import strftime
global options
- now = strftime("%Y-%m-%d %H:%M:%S")
-
if options.debug:
+ import inspect
+ prefix = strftime("[%Y-%m-%d %H:%M:%S]") + " %s:%d" % inspect.stack()[1][1:3]
+ sanitized = msg
+
try:
- print now + ": " + msg
+ print prefix + ": " + msg
except Exception, s:
try:
sanitized = msg.encode("ascii", "backslashreplace")
@@ -267,18 +268,57 @@ def dprint(msg):
sanitized = "hex [" + msg.encode("hex") + "]"
except Error, s:
sanitized = "[unable to print debug message]"
- print now + "~=" + sanitized
+ print prefix + "~=" + sanitized
+
+ if options.log:
+ sock = open(options.log, "a")
+ sock.write(prefix + ": " + sanitized)
+ sock.close()
+
sys.stdout.flush()
- if options.log:
- sock = open(options.log, "a")
- sock.write("%s: %s\n" % (now, msg))
- sock.close()
+
+class MockedSkype:
+ """Mock class for Skype4Py.Skype(), in case the -m option is used."""
+ def __init__(self, mock):
+ sock = open(mock)
+ self.lines = sock.readlines()
+
+ def SendCommand(self, c):
+ pass
+
+ def Command(self, msg, Block):
+ if msg == "PING":
+ return ["PONG"]
+ line = self.lines[0].strip()
+ if not line.startswith(">> "):
+ raise Exception("Corrupted mock input")
+ line = line[3:]
+ if line != msg:
+ raise Exception("'%s' != '%s'" % (line, msg))
+ self.lines = self.lines[1:] # drop the expected incoming line
+ ret = []
+ while True:
+ # and now send back all the following lines, up to the next expected incoming line
+ if len(self.lines) == 0:
+ break
+ if self.lines[0].startswith(">> "):
+ break
+ if not self.lines[0].startswith("<< "):
+ raise Exception("Corrupted mock input")
+ ret.append(self.lines[0][3:].strip())
+ self.lines = self.lines[1:]
+ return ret
class SkypeApi:
- def __init__(self):
- self.skype = Skype4Py.Skype()
- self.skype.OnNotify = self.recv
- self.skype.Client.Start()
+ def __init__(self, mock):
+ global options
+ if not mock:
+ self.skype = Skype4Py.Skype()
+ self.skype.OnNotify = self.recv
+ if not options.dont_start_skype:
+ self.skype.Client.Start()
+ else:
+ self.skype = MockedSkype(mock)
def recv(self, msg_text):
global options
@@ -333,48 +373,16 @@ class SkypeApi:
try:
c = self.skype.Command(e, Block=True)
self.skype.SendCommand(c)
- self.recv(c.Reply)
+ if hasattr(c, "Reply"):
+ self.recv(c.Reply) # Skype4Py answer
+ else:
+ for i in c: # mock may return multiple iterable answers
+ self.recv(i)
except Skype4Py.SkypeError:
pass
except Skype4Py.SkypeAPIError, s:
dprint("Warning, sending '%s' failed (%s)." % (e, s))
-class Options:
- def __init__(self):
- self.cfgpath = os.path.join(os.environ['HOME'], ".skyped", "skyped.conf")
- # fall back to system-wide settings
- self.syscfgpath = "/usr/local/etc/skyped/skyped.conf"
- if os.path.exists(self.syscfgpath) and not os.path.exists(self.cfgpath):
- self.cfgpath = self.syscfgpath
- self.daemon = True
- self.debug = False
- self.help = False
- self.host = "0.0.0.0"
- self.log = None
- self.port = None
- self.version = False
- # well, this is a bit hackish. we store the socket of the last connected client
- # here and notify it. maybe later notify all connected clients?
- self.conn = None
- # this will be read first by the input handler
- self.buf = None
-
-
- def usage(self, ret):
- print """Usage: skyped [OPTION]...
-
-skyped is a daemon that acts as a tcp server on top of a Skype instance.
-
-Options:
- -c --config path to configuration file (default: %s)
- -d --debug enable debug messages
- -h --help this help
- -H --host set the tcp host, supports IPv4 and IPv6 (default: %s)
- -l --log set the log file in background mode (default: none)
- -n --nofork don't run as daemon in the background
- -p --port set the tcp port (default: %s)
- -v --version display version information""" % (self.cfgpath, self.host, self.port)
- sys.exit(ret)
def serverloop(options, skype):
timeout = 1; # in seconds
@@ -417,58 +425,72 @@ def serverloop(options, skype):
else:
options.last_bitlbee_pong = now
-if __name__=='__main__':
- options = Options()
- try:
- opts, args = getopt.getopt(sys.argv[1:], "c:dhH:l:np:v", ["config=", "debug", "help", "host=", "log=", "nofork", "port=", "version"])
- except getopt.GetoptError:
- options.usage(1)
- for opt, arg in opts:
- if opt in ("-c", "--config"):
- options.cfgpath = arg
- elif opt in ("-d", "--debug"):
- options.debug = True
- elif opt in ("-h", "--help"):
- options.help = True
- elif opt in ("-H", "--host"):
- options.host = arg
- elif opt in ("-l", "--log"):
- options.log = arg
- elif opt in ("-n", "--nofork"):
- options.daemon = False
- elif opt in ("-p", "--port"):
- options.port = int(arg)
- elif opt in ("-v", "--version"):
- options.version = True
- if options.help:
- options.usage(0)
- elif options.version:
+
+def main(args=None):
+ global options
+ global skype
+
+ cfgpath = os.path.join(os.environ['HOME'], ".skyped", "skyped.conf")
+ syscfgpath = "/usr/local/etc/skyped/skyped.conf"
+ if not os.path.exists(cfgpath) and os.path.exists(syscfgpath):
+ cfgpath = syscfgpath # fall back to system-wide settings
+ port = 2727
+
+ import argparse
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-c', '--config',
+ metavar='path', default=cfgpath,
+ help='path to configuration file (default: %(default)s)')
+ parser.add_argument('-H', '--host', default='0.0.0.0',
+ help='set the tcp host, supports IPv4 and IPv6 (default: %(default)s)')
+ parser.add_argument('-p', '--port', type=int,
+ help='set the tcp port (default: %(default)s)')
+ parser.add_argument('-l', '--log', metavar='path',
+ help='set the log file in background mode (default: none)')
+ parser.add_argument('-v', '--version', action='store_true', help='display version information')
+ parser.add_argument('-n', '--nofork',
+ action='store_true', help="don't run as daemon in the background")
+ parser.add_argument('-s', '--dont-start-skype', action='store_true',
+ help="assume that skype is running independently, don't try to start/stop it")
+ parser.add_argument('-m', '--mock', help='fake interactions with skype (only useful for tests)')
+ parser.add_argument('-d', '--debug', action='store_true', help='enable debug messages')
+ options = parser.parse_args(sys.argv[1:] if args is None else args)
+
+ if options.version:
print "skyped %s" % __version__
sys.exit(0)
- # parse our config
- if not os.path.exists(options.cfgpath):
- print "Can't find configuration file at '%s'." % options.cfgpath
- print "Use the -c option to specify an alternate one."
- sys.exit(1)
+
+ # well, this is a bit hackish. we store the socket of the last connected client
+ # here and notify it. maybe later notify all connected clients?
+ options.conn = None
+ # this will be read first by the input handler
+ options.buf = None
+
+ if not os.path.exists(options.config):
+ parser.error(( "Can't find configuration file at '%s'. "
+ "Use the -c option to specify an alternate one." )% options.config)
+
+ cfgpath = options.config
options.config = ConfigParser()
- options.config.read(options.cfgpath)
- options.config.username = options.config.get('skyped', 'username').split('#')[0]
- options.config.password = options.config.get('skyped', 'password').split('#')[0]
- options.config.sslkey = os.path.expanduser(options.config.get('skyped', 'key').split('#')[0])
- options.config.sslcert = os.path.expanduser(options.config.get('skyped', 'cert').split('#')[0])
+ options.config.read(cfgpath)
+ options.config.username = options.config.get('skyped', 'username').split('#', 1)[0]
+ options.config.password = options.config.get('skyped', 'password').split('#', 1)[0]
+ options.config.sslkey = os.path.expanduser(options.config.get('skyped', 'key').split('#', 1)[0])
+ options.config.sslcert = os.path.expanduser(options.config.get('skyped', 'cert').split('#', 1)[0])
+
# hack: we have to parse the parameters first to locate the
# config file but the -p option should overwrite the value from
# the config file
try:
- options.config.port = int(options.config.get('skyped', 'port').split('#')[0])
+ options.config.port = int(options.config.get('skyped', 'port').split('#', 1)[0])
if not options.port:
options.port = options.config.port
except NoOptionError:
pass
if not options.port:
- options.port = 2727
- dprint("Parsing config file '%s' done, username is '%s'." % (options.cfgpath, options.config.username))
- if options.daemon:
+ options.port = port
+ dprint("Parsing config file '%s' done, username is '%s'." % (cfgpath, options.config.username))
+ if not options.nofork:
pid = os.fork()
if pid == 0:
nullin = file(os.devnull, 'r')
@@ -484,7 +506,7 @@ if __name__=='__main__':
if hasgobject:
server(options.host, options.port)
try:
- skype = SkypeApi()
+ skype = SkypeApi(options.mock)
except Skype4Py.SkypeAPIError, s:
sys.exit("%s. Are you sure you have started Skype?" % s)
if hasgobject:
@@ -496,3 +518,6 @@ if __name__=='__main__':
options.conn = False
options.lock = threading.Lock()
server(options.host, options.port, skype)
+
+
+if __name__ == '__main__': main()
diff --git a/protocols/skype/skyped.txt b/protocols/skype/skyped.txt
index 53f2626d..c5f9abb9 100644
--- a/protocols/skype/skyped.txt
+++ b/protocols/skype/skyped.txt
@@ -11,7 +11,7 @@ skyped [<options>]
== DESCRIPTION
Skype supports remote control of the GUI client only via X11 or DBus
-messages. This is hard in care you want remote control. This daemon
+messages. This is hard in case you want remote control. This daemon
listens on a TCP port and runs on the same machine where the GUI client
runs. It passes all the input it gets to Skype directly, except for a
few commands which is related to authentication. The whole communication
@@ -19,7 +19,37 @@ is done via SSL.
== CONFIGURATION
-See the README for information about how to configure this daemon.
+- Set up `~/.skyped/skyped.conf`: Create the `~/.skyped` directory, copy
+ `skyped.conf` and `skyped.cnf` from `/usr/local/etc/skyped/` to `~/.skyped`,
+ adjust `username` and `password`. The `username` should be your Skype login and
+ the `password` can be whatever you want, but you will have to specify that one
+ when adding the Skype account to BitlBee (see later).
+
+NOTE: Here, and later - `/usr/local/etc` can be different on your installation
+if you used the `--sysconfdir` switch when running the `configure` of BitlBee.
+
+- Generate the SSL pem files:
+
+----
+$ cd ~/.skyped
+$ openssl req -new -x509 -days 365 -nodes -config skyped.cnf -out skyped.cert.pem \
+ -keyout skyped.key.pem
+----
+
+- Start `skyped` (the TCP server), initially without detaching and enabling debug messages:
+
+----
+$ skyped -d -n
+----
+
+- Start your `IRC` client, connect to BitlBee and add your account:
+
+----
+account add skype <user> <pass>
+----
+
+`<user>` should be your Skype account name, `<pass>` should be the one you declared
+in `skyped.conf`.
== OPTIONS
@@ -38,9 +68,15 @@ See the README for information about how to configure this daemon.
-l, --log::
Set the log file in background mode (default: none)
+-m, --mock=<file>::
+ Mock mode: replay session from file, instead of connecting to Skype.
+
-n, --nofork::
Don't run as daemon in the background
+-s, --dont-start-skype::
+ Assume that skype is running independently, don't try to start/stop it.
+
-p, --port::
Set the tcp port (default: 2727)
@@ -49,4 +85,4 @@ See the README for information about how to configure this daemon.
== AUTHOR
-Written by Miklos Vajna <vmiklos@frugalware.org>
+Written by Miklos Vajna <vmiklos@vmiklos.hu>
diff --git a/protocols/skype/t/Makefile b/protocols/skype/t/Makefile
deleted file mode 100644
index 9c5e95f9..00000000
--- a/protocols/skype/t/Makefile
+++ /dev/null
@@ -1,33 +0,0 @@
-PORT=9876
-BITLBEE=/usr/sbin/bitlbee
-
-export TEST_SKYPE_ID=user
-export TEST_SKYPE_PASSWORD=pass
-
-testfiles := $(wildcard irssi/*.test)
-tests := $(patsubst %.test,%,$(testfiles))
-
-.PHONY: $(tests)
-
-all: $(tests)
- @echo "passed $$(echo $(testfiles)|wc -w) tests."
-
-$(tests): % : %.test
- @echo "--- Running test $@ ---"; \
- if [ -r "$(BITLBEE)" -a -x "$(BITLBEE)" ]; then \
- bitlbee_binary="$(BITLBEE)"; \
- else \
- bitlbee_basename=`basename $(BITLBEE)`; \
- bitlbee_binary=`which $$bitlbee_basename`; \
- fi; \
- if ! ./livetest-bitlbee.sh "$$bitlbee_binary" $(PORT) irssi/livetest-irssi.sh $< >$@.log; then \
- echo Test failed, log: ;\
- cat $@.log;\
- exit 1;\
- fi;\
- echo "--- OK ---" ;\
- sleep 1
-clean:
- rm -r irssi/*.log bitlbeetest.pid dotirssi livetest
-
-
diff --git a/protocols/skype/t/add-yes-bitlbee.mock b/protocols/skype/t/add-yes-bitlbee.mock
new file mode 100644
index 00000000..5f17fd33
--- /dev/null
+++ b/protocols/skype/t/add-yes-bitlbee.mock
@@ -0,0 +1,8 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :Alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype on
+<< PRIVMSG &bitlbee :add skype bob
+>> :bob!bob@skype.com JOIN :&bitlbee
diff --git a/protocols/skype/t/add-yes-skyped.mock b/protocols/skype/t/add-yes-skyped.mock
new file mode 100644
index 00000000..dea175a3
--- /dev/null
+++ b/protocols/skype/t/add-yes-skyped.mock
@@ -0,0 +1,23 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+>> SET USER bob BUDDYSTATUS 2 Please authorize me
+<< USER bob BUDDYSTATUS 2
+<< USER bob ISAUTHORIZED TRUE
+<< USER bob ISBLOCKED FALSE
+<< USER bob BUDDYSTATUS 2
+<< USER bob ONLINESTATUS OFFLINE
+<< USER bob FULLNAME skype test203
+<< USER bob BUDDYSTATUS 3
+<< USER bob ONLINESTATUS OFFLINE
+<< USER bob ONLINESTATUS ONLINE
+<< USER bob TIMEZONE 90000
diff --git a/protocols/skype/t/added-no-bitlbee.mock b/protocols/skype/t/added-no-bitlbee.mock
new file mode 100644
index 00000000..d7a70c66
--- /dev/null
+++ b/protocols/skype/t/added-no-bitlbee.mock
@@ -0,0 +1,9 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :Alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype on
+>> PRIVMSG &bitlbee :skype - New request: The user bob wants to add you
+<< PRIVMSG &bitlbee :no
+>> PRIVMSG &bitlbee :skype - Rejected
diff --git a/protocols/skype/t/added-no-skyped.mock b/protocols/skype/t/added-no-skyped.mock
new file mode 100644
index 00000000..0e4bfc8a
--- /dev/null
+++ b/protocols/skype/t/added-no-skyped.mock
@@ -0,0 +1,15 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+<< USER bob RECEIVEDAUTHREQUEST Please allow me to see when you are online
+>> SET USER bob ISAUTHORIZED FALSE
+<< USER bob ISAUTHORIZED FALSE
diff --git a/protocols/skype/t/added-yes-bitlbee.mock b/protocols/skype/t/added-yes-bitlbee.mock
new file mode 100644
index 00000000..df068f89
--- /dev/null
+++ b/protocols/skype/t/added-yes-bitlbee.mock
@@ -0,0 +1,9 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :Alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype on
+>> PRIVMSG &bitlbee :skype - New request: The user bob wants to add you
+<< PRIVMSG &bitlbee :yes
+>> :bob!bob@skype.com JOIN :&bitlbee
diff --git a/protocols/skype/t/added-yes-skyped.mock b/protocols/skype/t/added-yes-skyped.mock
new file mode 100644
index 00000000..fc3d756f
--- /dev/null
+++ b/protocols/skype/t/added-yes-skyped.mock
@@ -0,0 +1,25 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+<< USER bob RECEIVEDAUTHREQUEST Please allow me to see when you are online
+>> SET USER bob ISAUTHORIZED TRUE
+<< USER bob ISAUTHORIZED TRUE
+<< USER bob RECEIVEDAUTHREQUEST
+<< USER bob ISAUTHORIZED TRUE
+<< USER bob ISBLOCKED FALSE
+<< USER bob BUDDYSTATUS 3
+<< USER bob ONLINESTATUS OFFLINE
+<< USER bob ONLINESTATUS ONLINE
+<< USER bob TIMEZONE 90000
+<< USER bob FULLNAME Miklos V
+<< USER bob LANGUAGE hu Hungarian
+<< USER bob COUNTRY hu Hungary
diff --git a/protocols/skype/t/bitlbee.conf b/protocols/skype/t/bitlbee.conf
deleted file mode 100644
index e69de29b..00000000
--- a/protocols/skype/t/bitlbee.conf
+++ /dev/null
diff --git a/protocols/skype/t/call-bitlbee.mock b/protocols/skype/t/call-bitlbee.mock
new file mode 100644
index 00000000..e480e7f3
--- /dev/null
+++ b/protocols/skype/t/call-bitlbee.mock
@@ -0,0 +1,11 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype on
+>> :bob!bob@skype.com JOIN :&bitlbee
+<< PRIVMSG bob :CALL
+>> PRIVMSG &bitlbee :skype - You are currently ringing the user bob.
+<< PRIVMSG bob :HANGUP
+>> PRIVMSG &bitlbee :skype - You cancelled the call to the user bob.
diff --git a/protocols/skype/t/call-failed-bitlbee.mock b/protocols/skype/t/call-failed-bitlbee.mock
new file mode 100644
index 00000000..aae1d99a
--- /dev/null
+++ b/protocols/skype/t/call-failed-bitlbee.mock
@@ -0,0 +1,9 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype on
+>> PRIVMSG &bitlbee :skype - Logging in: Logged in
+<< PRIVMSG bob :CALL
+>> PRIVMSG &bitlbee :skype - Error: Call failed: User is offline
diff --git a/protocols/skype/t/call-failed-skyped.mock b/protocols/skype/t/call-failed-skyped.mock
new file mode 100644
index 00000000..30699f91
--- /dev/null
+++ b/protocols/skype/t/call-failed-skyped.mock
@@ -0,0 +1,21 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123, bob
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+>> GET USER bob ONLINESTATUS
+<< USER bob ONLINESTATUS OFFLINE
+>> GET USER bob FULLNAME
+<< USER bob FULLNAME Bob
+>> CALL bob
+<< CALL 216 STATUS UNPLACED
+<< CALL 216 STATUS ROUTING
+<< CALL 216 FAILUREREASON 3
+<< CALL 216 STATUS FAILED
diff --git a/protocols/skype/t/call-skyped.mock b/protocols/skype/t/call-skyped.mock
new file mode 100644
index 00000000..92947ba9
--- /dev/null
+++ b/protocols/skype/t/call-skyped.mock
@@ -0,0 +1,26 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123, bob
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS OFFLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+>> GET USER bob ONLINESTATUS
+<< USER bob ONLINESTATUS ONLINE
+>> GET USER bob FULLNAME
+<< USER bob FULLNAME Bob
+>> CALL bob
+<< CALL 178 STATUS UNPLACED
+<< CALL 178 STATUS ROUTING
+<< CALL 178 STATUS RINGING
+>> GET CALL 178 PARTNER_HANDLE
+<< CALL 178 PARTNER_HANDLE bob
+>> SET CALL 178 STATUS FINISHED
+<< CALL 178 STATUS CANCELLED
+>> GET CALL 178 PARTNER_HANDLE
+<< CALL 178 PARTNER_HANDLE bob
diff --git a/protocols/skype/t/called-no-bitlbee.mock b/protocols/skype/t/called-no-bitlbee.mock
new file mode 100644
index 00000000..c69a0c8b
--- /dev/null
+++ b/protocols/skype/t/called-no-bitlbee.mock
@@ -0,0 +1,10 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :Alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype on
+>> PRIVMSG &bitlbee :skype - New request: The user bob is currently ringing you.
+<< PRIVMSG &bitlbee :no
+>> PRIVMSG &bitlbee :skype - Rejected: The user bob is currently ringing you.
+>> PRIVMSG &bitlbee :skype - You refused the call from user bob.
diff --git a/protocols/skype/t/called-no-skyped.mock b/protocols/skype/t/called-no-skyped.mock
new file mode 100644
index 00000000..5152fe9e
--- /dev/null
+++ b/protocols/skype/t/called-no-skyped.mock
@@ -0,0 +1,24 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123, bob
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+>> GET USER bob ONLINESTATUS
+<< USER bob ONLINESTATUS ONLINE
+>> GET USER bob FULLNAME
+<< USER bob FULLNAME Bob
+<< CALL 212 CONF_ID 0
+<< CALL 212 STATUS RINGING
+>> GET CALL 212 PARTNER_HANDLE
+<< CALL 212 PARTNER_HANDLE bob
+>> SET CALL 212 STATUS FINISHED
+<< CALL 212 STATUS REFUSED
+>> GET CALL 212 PARTNER_HANDLE
+<< CALL 212 PARTNER_HANDLE bob
diff --git a/protocols/skype/t/called-yes-bitlbee.mock b/protocols/skype/t/called-yes-bitlbee.mock
new file mode 100644
index 00000000..47c54799
--- /dev/null
+++ b/protocols/skype/t/called-yes-bitlbee.mock
@@ -0,0 +1,9 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :Alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype on
+>> PRIVMSG &bitlbee :skype - New request: The user bob is currently ringing you.
+<< PRIVMSG &bitlbee :yes
+>> PRIVMSG &bitlbee :skype - Accepted: The user bob is currently ringing you.
diff --git a/protocols/skype/t/called-yes-skyped.mock b/protocols/skype/t/called-yes-skyped.mock
new file mode 100644
index 00000000..67cdffe3
--- /dev/null
+++ b/protocols/skype/t/called-yes-skyped.mock
@@ -0,0 +1,22 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123, bob
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+>> GET USER bob ONLINESTATUS
+<< USER bob ONLINESTATUS ONLINE
+>> GET USER bob FULLNAME
+<< USER bob FULLNAME Bob
+<< CALL 208 CONF_ID 0
+<< CALL 208 STATUS RINGING
+>> GET CALL 208 PARTNER_HANDLE
+<< CALL 208 PARTNER_HANDLE bob
+>> SET CALL 208 STATUS INPROGRESS
+<< CALL 208 STATUS INPROGRESS
diff --git a/protocols/skype/t/ctcp-help-bitlbee.mock b/protocols/skype/t/ctcp-help-bitlbee.mock
new file mode 100644
index 00000000..98522ec1
--- /dev/null
+++ b/protocols/skype/t/ctcp-help-bitlbee.mock
@@ -0,0 +1,9 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :Alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype on
+>> :bob!bob@skype.com JOIN :&bitlbee
+<< PRIVMSG bob :HELP
+>> :bob!bob@skype.com NOTICE alice :HELP Supported CTCPs: HANGUP (Hang up a call), CALL (Initiate a call)
diff --git a/protocols/skype/t/ctcp-help-skyped.mock b/protocols/skype/t/ctcp-help-skyped.mock
new file mode 100644
index 00000000..eacff2e6
--- /dev/null
+++ b/protocols/skype/t/ctcp-help-skyped.mock
@@ -0,0 +1,16 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123, bob
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+>> GET USER bob ONLINESTATUS
+<< USER bob ONLINESTATUS ONLINE
+>> GET USER bob FULLNAME
+<< USER bob FULLNAME Bob
diff --git a/protocols/skype/t/filetransfer-bitlbee.mock b/protocols/skype/t/filetransfer-bitlbee.mock
new file mode 100644
index 00000000..a08e52bc
--- /dev/null
+++ b/protocols/skype/t/filetransfer-bitlbee.mock
@@ -0,0 +1,10 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :Alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype on
+>> :bob!bob@skype.com JOIN :&bitlbee
+>> PRIVMSG &bitlbee :skype - The user bob offered a new file for you.
+>> PRIVMSG &bitlbee :skype - File transfer from user bob started, saving to /home/alice/text.odt.
+>> PRIVMSG &bitlbee :skype - File transfer from user bob completed.
diff --git a/protocols/skype/t/filetransfer-skyped.mock b/protocols/skype/t/filetransfer-skyped.mock
new file mode 100644
index 00000000..b24fcc94
--- /dev/null
+++ b/protocols/skype/t/filetransfer-skyped.mock
@@ -0,0 +1,37 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123, bob
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+>> GET USER bob ONLINESTATUS
+<< USER bob ONLINESTATUS ONLINE
+>> GET USER bob FULLNAME
+<< USER bob FULLNAME Bob
+<< FILETRANSFER 208 TYPE INCOMING
+<< FILETRANSFER 208 PARTNER_HANDLE bob
+<< FILETRANSFER 208 PARTNER_DISPNAME bob
+<< FILETRANSFER 208 FILENAME text.odt
+<< FILETRANSFER 208 STATUS NEW
+<< FILETRANSFER 208 FILESIZE 83534193
+<< FILETRANSFER 208 STARTTIME 1358458276
+<< FILETRANSFER 208 FINISHTIME 0
+<< FILETRANSFER 208 BYTESPERSECOND 0
+<< FILETRANSFER 208 BYTESTRANSFERRED 0
+<< FILETRANSFER 208 FILESIZE 83534193
+>> GET FILETRANSFER 208 PARTNER_HANDLE
+<< FILETRANSFER 208 PARTNER_HANDLE bob
+<< FILETRANSFER 208 FILEPATH /home/alice/text.odt
+<< FILETRANSFER 208 STATUS CONNECTING
+<< FILETRANSFER 208 STATUS TRANSFERRING
+>> GET FILETRANSFER 208 PARTNER_HANDLE
+<< FILETRANSFER 208 PARTNER_HANDLE bob
+<< FILETRANSFER 208 STATUS COMPLETED
+>> GET FILETRANSFER 208 PARTNER_HANDLE
+<< FILETRANSFER 208 PARTNER_HANDLE bob
diff --git a/protocols/skype/t/group-read-bitlbee.mock b/protocols/skype/t/group-read-bitlbee.mock
new file mode 100644
index 00000000..0f001400
--- /dev/null
+++ b/protocols/skype/t/group-read-bitlbee.mock
@@ -0,0 +1,14 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :Alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype set read_groups true
+<< PRIVMSG &bitlbee :account skype on
+>> :bob!bob@skype.com JOIN :&bitlbee
+>> :cecil!cecil@skype.com JOIN :&bitlbee
+>> :daniel!daniel@skype.com JOIN :&bitlbee
+<< JOIN &family
+>> 353 alice = &family :@alice +bob +cecil @root
+<< JOIN &work
+>> 353 alice = &work :@alice +daniel @root
diff --git a/protocols/skype/t/group-read-skyped.mock b/protocols/skype/t/group-read-skyped.mock
new file mode 100644
index 00000000..148661a1
--- /dev/null
+++ b/protocols/skype/t/group-read-skyped.mock
@@ -0,0 +1,36 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 70, 71
+>> SEARCH FRIENDS
+<< USERS echo123, bob, cecil, daniel, emily
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET GROUP 70 DISPLAYNAME
+<< GROUP 70 DISPLAYNAME Family
+>> GET GROUP 70 USERS
+<< GROUP 70 USERS bob, cecil
+>> GET GROUP 71 DISPLAYNAME
+<< GROUP 71 DISPLAYNAME Work
+>> GET GROUP 71 USERS
+<< GROUP 71 USERS daniel, emily
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+>> GET USER bob ONLINESTATUS
+<< USER bob ONLINESTATUS ONLINE
+>> GET USER bob FULLNAME
+<< USER bob FULLNAME Bob
+>> GET USER cecil ONLINESTATUS
+<< USER cecil ONLINESTATUS ONLINE
+>> GET USER cecil FULLNAME
+<< USER cecil FULLNAME Cecil
+>> GET USER daniel ONLINESTATUS
+<< USER daniel ONLINESTATUS ONLINE
+>> GET USER daniel FULLNAME
+<< USER daniel FULLNAME Daniel
+>> GET USER emily ONLINESTATUS
+<< USER emily ONLINESTATUS OFFLINE
+>> GET USER emily FULLNAME
+<< USER emily FULLNAME Emily
diff --git a/protocols/skype/t/groupchat-invite-bitlbee.mock b/protocols/skype/t/groupchat-invite-bitlbee.mock
new file mode 100644
index 00000000..7b44427f
--- /dev/null
+++ b/protocols/skype/t/groupchat-invite-bitlbee.mock
@@ -0,0 +1,11 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :Alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype on
+>> :bob!bob@skype.com JOIN :&bitlbee
+<< PRIVMSG &bitlbee :chat with bob
+>> 353 alice = ##alice/$bob;a7ab206ec780 :@alice bob @root
+<< INVITE cecil ##alice/$bob;a7ab206ec780
+>> cecil@skype.com JOIN :##alice/$bob;a7ab206ec780
diff --git a/protocols/skype/t/groupchat-invite-skyped.mock b/protocols/skype/t/groupchat-invite-skyped.mock
new file mode 100644
index 00000000..214ebec0
--- /dev/null
+++ b/protocols/skype/t/groupchat-invite-skyped.mock
@@ -0,0 +1,48 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123, bob, cecil
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+>> GET USER bob ONLINESTATUS
+<< USER bob ONLINESTATUS ONLINE
+>> GET USER bob FULLNAME
+<< USER bob FULLNAME Bob
+>> GET USER cecil ONLINESTATUS
+<< USER cecil ONLINESTATUS ONLINE
+>> GET USER cecil FULLNAME
+<< USER cecil FULLNAME Cecil
+>> CHAT CREATE bob
+<< CHAT #alice/$bob;a7ab206ec78060f1 STATUS DIALOG
+>> GET CHAT #alice/$bob;a7ab206ec78060f1 ADDER
+<< CHAT #alice/$bob;a7ab206ec78060f1 ADDER
+<< CHAT #alice/$bob;a7ab206ec78060f1 NAME #alice/$bob;a7ab206ec78060f1
+>> GET CHAT #alice/$bob;a7ab206ec78060f1 TOPIC
+<< CHAT #alice/$bob;a7ab206ec78060f1 TOPIC
+<< CHATMESSAGE 206 STATUS SENDING
+<< CHAT #alice/$bob;a7ab206ec78060f1 STATUS DIALOG
+<< CHATMEMBER 204 ROLE USER
+<< CHAT #alice/$bob;a7ab206ec78060f1 MYROLE USER
+<< CHAT #alice/$bob;a7ab206ec78060f1 MEMBERS bob alice
+<< CHAT #alice/$bob;a7ab206ec78060f1 ACTIVEMEMBERS alice
+<< CHAT #alice/$bob;a7ab206ec78060f1 STATUS DIALOG
+<< CHAT #alice/$bob;a7ab206ec78060f1 TIMESTAMP 1358344213
+<< CHAT #alice/$bob;a7ab206ec78060f1 DIALOG_PARTNER bob
+<< CHAT #alice/$bob;a7ab206ec78060f1 MEMBERS bob alice
+<< CHAT #alice/$bob;a7ab206ec78060f1 FRIENDLYNAME bob
+>> ALTER CHAT #alice/$bob;a7ab206ec78060f1 ADDMEMBERS cecil
+<< ALTER CHAT ADDMEMBERS
+<< CHAT #alice/$bob;a7ab206ec78060f1 STATUS MULTI_SUBSCRIBED
+<< CHAT #alice/$bob;a7ab206ec78060f1 MEMBERS bob cecil alice
+>> GET CHAT #alice/$bob;a7ab206ec78060f1 ADDER
+<< CHAT #alice/$bob;a7ab206ec78060f1 ADDER
+<< CHAT #alice/$bob;a7ab206ec78060f1 FRIENDLYNAME bob, cecil
+>> GET CHAT #alice/$bob;a7ab206ec78060f1 TOPIC
+<< CHAT #alice/$bob;a7ab206ec78060f1 TOPIC
+<< CHATMESSAGE 210 STATUS SENDING
diff --git a/protocols/skype/t/groupchat-invited-bitlbee.mock b/protocols/skype/t/groupchat-invited-bitlbee.mock
new file mode 100644
index 00000000..f63b7d5c
--- /dev/null
+++ b/protocols/skype/t/groupchat-invited-bitlbee.mock
@@ -0,0 +1,8 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :Alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype on
+>> JOIN :##cecil/$bob;4d8cc9965791
+>> 353 alice = ##cecil/$bob;4d8cc9965791 :@alice bob cecil @root
diff --git a/protocols/skype/t/groupchat-invited-skyped.mock b/protocols/skype/t/groupchat-invited-skyped.mock
new file mode 100644
index 00000000..a5c754ce
--- /dev/null
+++ b/protocols/skype/t/groupchat-invited-skyped.mock
@@ -0,0 +1,58 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123, bob, cecil
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+>> GET USER bob ONLINESTATUS
+<< USER bob ONLINESTATUS OFFLINE
+>> GET USER bob FULLNAME
+<< USER bob FULLNAME Bob
+>> GET USER cecil ONLINESTATUS
+<< USER cecil ONLINESTATUS OFFLINE
+>> GET USER cecil FULLNAME
+<< USER cecil FULLNAME Cecil
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 NAME #cecil/$bob;4d8cc9965791c6b9
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 STATUS MULTI_SUBSCRIBED
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 STATUS MULTI_SUBSCRIBED
+<< CHATMEMBER 186 ROLE USER
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 MYROLE USER
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 MEMBERS bob cecil alice
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 FRIENDLYNAME bob, cecil
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 ACTIVEMEMBERS bob alice
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 TIMESTAMP 1358276196
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 STATUS MULTI_SUBSCRIBED
+<< CHATMESSAGE 188 STATUS RECEIVED
+>> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob
+>> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC
+>> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob
+>> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC
+>> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob
+>> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC
+>> GET CHATMESSAGE 188 FROM_HANDLE
+<< CHATMESSAGE 188 FROM_HANDLE bob
+>> GET CHATMESSAGE 188 BODY
+<< CHATMESSAGE 188 BODY
+>> GET CHATMESSAGE 188 TYPE
+<< CHATMESSAGE 188 TYPE ADDEDMEMBERS
+>> GET CHATMESSAGE 188 CHATNAME
+<< CHATMESSAGE 188 CHATNAME #cecil/$bob;4d8cc9965791c6b9
+<< CHATMESSAGE 189 STATUS READ
+<< CHATMESSAGE 189 STATUS READ
+<< CHATMEMBER 186 IS_ACTIVE TRUE
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 ACTIVEMEMBERS bob cecil alice
+<< CHATMESSAGE 190 STATUS SENT
diff --git a/protocols/skype/t/groupchat-leave-bitlbee.mock b/protocols/skype/t/groupchat-leave-bitlbee.mock
new file mode 100644
index 00000000..36447cee
--- /dev/null
+++ b/protocols/skype/t/groupchat-leave-bitlbee.mock
@@ -0,0 +1,11 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :Alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype set skypeconsole_receive true
+<< PRIVMSG &bitlbee :account skype on
+>> JOIN :##cecil/$bob;4d8cc9965791
+>> 353 alice = ##cecil/$bob;4d8cc9965791 :@alice bob cecil @root
+<< PART ##cecil/$bob;4d8cc9965791
+>> PRIVMSG &bitlbee :alice: CHAT #cecil/$bob;4d8cc9965791c6b9 STATUS UNSUBSCRIBED
diff --git a/protocols/skype/t/groupchat-leave-skyped.mock b/protocols/skype/t/groupchat-leave-skyped.mock
new file mode 100644
index 00000000..86150d1c
--- /dev/null
+++ b/protocols/skype/t/groupchat-leave-skyped.mock
@@ -0,0 +1,63 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123, bob, cecil
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+>> GET USER bob ONLINESTATUS
+<< USER bob ONLINESTATUS OFFLINE
+>> GET USER bob FULLNAME
+<< USER bob FULLNAME Bob
+>> GET USER cecil ONLINESTATUS
+<< USER cecil ONLINESTATUS OFFLINE
+>> GET USER cecil FULLNAME
+<< USER cecil FULLNAME Cecil
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 NAME #cecil/$bob;4d8cc9965791c6b9
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 STATUS MULTI_SUBSCRIBED
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 STATUS MULTI_SUBSCRIBED
+<< CHATMEMBER 186 ROLE USER
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 MYROLE USER
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 MEMBERS bob cecil alice
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 FRIENDLYNAME bob, cecil
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 ACTIVEMEMBERS bob alice
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 TIMESTAMP 1358276196
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 STATUS MULTI_SUBSCRIBED
+<< CHATMESSAGE 188 STATUS RECEIVED
+>> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob
+>> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC
+>> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob
+>> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC
+>> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob
+>> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC
+>> GET CHATMESSAGE 188 FROM_HANDLE
+<< CHATMESSAGE 188 FROM_HANDLE bob
+>> GET CHATMESSAGE 188 BODY
+<< CHATMESSAGE 188 BODY
+>> GET CHATMESSAGE 188 TYPE
+<< CHATMESSAGE 188 TYPE ADDEDMEMBERS
+>> GET CHATMESSAGE 188 CHATNAME
+<< CHATMESSAGE 188 CHATNAME #cecil/$bob;4d8cc9965791c6b9
+<< CHATMESSAGE 189 STATUS READ
+<< CHATMESSAGE 189 STATUS READ
+<< CHATMEMBER 186 IS_ACTIVE TRUE
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 ACTIVEMEMBERS bob cecil alice
+<< CHATMESSAGE 190 STATUS SENT
+>> ALTER CHAT #cecil/$bob;4d8cc9965791c6b9 LEAVE
+<< ALTER CHAT LEAVE
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 MEMBERS bob cecil
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 ACTIVEMEMBERS bob cecil
+<< CHAT #cecil/$bob;4d8cc9965791c6b9 STATUS UNSUBSCRIBED
diff --git a/protocols/skype/t/info-bitlbee.mock b/protocols/skype/t/info-bitlbee.mock
new file mode 100644
index 00000000..a8896f6d
--- /dev/null
+++ b/protocols/skype/t/info-bitlbee.mock
@@ -0,0 +1,9 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :Alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype on
+>> :bob!bob@skype.com JOIN :&bitlbee
+<< PRIVMSG &bitlbee :info bob
+>> PRIVMSG &bitlbee :Full Name: Bob
diff --git a/protocols/skype/t/info-skyped.mock b/protocols/skype/t/info-skyped.mock
new file mode 100644
index 00000000..63076b09
--- /dev/null
+++ b/protocols/skype/t/info-skyped.mock
@@ -0,0 +1,46 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123, bob
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+>> GET USER bob ONLINESTATUS
+<< USER bob ONLINESTATUS ONLINE
+>> GET USER bob FULLNAME
+<< USER bob FULLNAME Bob
+>> GET USER bob FULLNAME
+<< USER bob FULLNAME Bob
+>> GET USER bob PHONE_HOME
+<< USER bob PHONE_HOME
+>> GET USER bob PHONE_OFFICE
+<< USER bob PHONE_OFFICE
+>> GET USER bob PHONE_MOBILE
+<< USER bob PHONE_MOBILE
+>> GET USER bob NROF_AUTHED_BUDDIES
+<< USER bob NROF_AUTHED_BUDDIES 145
+>> GET USER bob TIMEZONE
+<< USER bob TIMEZONE 90000
+>> GET USER bob LASTONLINETIMESTAMP
+<< USER bob LASTONLINETIMESTAMP 1358023469
+>> GET USER bob SEX
+<< USER bob SEX MALE
+>> GET USER bob LANGUAGE
+<< USER bob LANGUAGE hu Hungarian
+>> GET USER bob COUNTRY
+<< USER bob COUNTRY hu Hungary
+>> GET USER bob PROVINCE
+<< USER bob PROVINCE
+>> GET USER bob CITY
+<< USER bob CITY Budapest
+>> GET USER bob HOMEPAGE
+<< USER bob HOMEPAGE
+>> GET USER bob ABOUT
+<< USER bob ABOUT
+>> GET USER bob BIRTHDAY
+<< USER bob BIRTHDAY 19781108
diff --git a/protocols/skype/t/irssi/livetest-irssi.sh b/protocols/skype/t/irssi/livetest-irssi.sh
deleted file mode 100755
index a8e136cf..00000000
--- a/protocols/skype/t/irssi/livetest-irssi.sh
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/usr/bin/env bash
-ISCRIPT=$1
-OPT=$2
-
-[ -n "$ISCRIPT" ] || { echo Syntax: `basename "$0"` irssi-test-script; exit 1; }
-
-# Load variables from test
-eval `sed -e '1,/^###/!d;/^###/d' "$ISCRIPT"`
-
-#if [ "$OPT" == "checkvars" ]; then echo $TESTNEEDEDVARS; fi
-RET=0
-
-# Check if we have the neccessary environment variables for this test
-for var in $TESTNEEDEDVARS; do
- if [ -z `eval echo \$\{$var\}` ]; then
- if [ "$OPT" != "checkvars" ]; then
- echo Need environment variable "$var" for this test.
- exit 66
- else
- echo $var
- RET=66
- fi
- fi
-done
-
-# if we got this far we're OK
-if [ "$OPT" == "checkvars" ]; then exit $RET; fi
-
-[ -n "$PORT" ] || { echo 'Need the bitlbee listening port as environment variable PORT'; exit 1; }
-
-# Setup the irssi dir
-(
- rm -r dotirssi
- mkdir -p dotirssi/scripts dotirssi/logs
- cp "`dirname $0`"/trigger.pl dotirssi/scripts &&
- echo 'script load trigger.pl' >dotirssi/startup
-) &>/dev/null || { echo Failed to setup irssi testdir; exit 1; }
-
-# write irssi config
-
-echo '
-
-aliases = {
- runtest = "'`sed -e "1,/^###/d;s/@LOGIN@/$TESTLOGIN/;s/@PASSWORD@/$TESTPASSWORD/" "$ISCRIPT" | tr '\n' ';'`'";
- expectbee = "/trigger add -publics -channels &bitlbee -regexp";
- expectjoin = "/trigger add -joins -masks *!$0@* $1-";
- expectmsg = "/trigger add -privmsgs -masks *!$0@* $1-";
-};
-
-servers = ( { address = "localhost"; chatnet = "local"; port = "'$PORT'"; autoconnect="yes";});
-
-settings = {
- settings_autosave = "no";
- core = { real_name = "bitlbee-test"; user_name = "bitlbee-test"; nick = "bitlbeetest"; };
- "fe-text" = { actlist_sort = "refnum"; };
-};
-
-chatnets = { local = { type = "IRC"; autosendcmd = "/runtest"; }; };
-
-logs = {
-"dotirssi/logs/status.log" = { auto_open = "yes"; level = "ALL"; items = ( { type = "window"; name = "1"; } ); };
-"dotirssi/logs/control.log" = { auto_open = "yes"; level = "ALL"; items = ( { type = "target"; name = "&bitlbee"; } ); };
-' >dotirssi/config
-
-for nick in $TESTLOGNICKS; do
- echo '
- "dotirssi/logs/'$nick'.log" = { auto_open = "yes"; level = "ALL"; items = ( { type = "target"; name = "'$nick'"; } ); };
- ' >>dotirssi/config
-done
-
-echo '};' >>dotirssi/config
-
-# Go!
-
-echo Running irssi...
-screen -D -m irssi --config=dotirssi/config --home=dotirssi/ &
-
-# output logs
-
-submitlogs() {
- perl -p -i -e "s/$TESTLOGIN/---TESTLOGIN---/;s/$TESTPASSWORD/---TESTPASSWORD---/" dotirssi/logs/*.log
-
- if [ "$OPT" == "tgz" ]; then
- tar czf "`dirname $0`"/"`basename "$ISCRIPT"`".logs.tgz dotirssi/logs/*.log
- elif [ "$OPT" == "ctest" ]; then
- echo CTEST_FULL_OUTPUT
- for log in dotirssi/logs/*.log; do
- echo -n '<DartMeasurement name="'$log'" type="text/string"><![CDATA['
- cat "$log"
- echo "]]></DartMeasurement>"
- done
- else
- echo Test logs: dotirssi/logs/*.log
- fi
-}
-
-# timeout stuff
-
-t=$TESTDURATION
-intval=1
-while (( t >= intval )); do
- sleep $intval
- kill -0 $! &>/dev/null || { echo screen/irssi terminated.; submitlogs; bash -c "cd dotirssi/logs && $TESTCHECKRESULT" >/dev/null; exit $?; }
- t=$(( t - $intval ))
-done
-echo Killing screen/irssi...
-kill $!
-submitlogs
-exit 22
diff --git a/protocols/skype/t/irssi/skype-call.test b/protocols/skype/t/irssi/skype-call.test
deleted file mode 100644
index 8f502a59..00000000
--- a/protocols/skype/t/irssi/skype-call.test
+++ /dev/null
@@ -1,13 +0,0 @@
-TESTNEEDEDVARS="TEST_SKYPE_ID TEST_SKYPE_PASSWORD"
-TESTDURATION=60
-TESTCHECKRESULT="grep '\[Test Passed\]' status.log"
-TESTLOGIN="$TEST_SKYPE_ID"
-TESTPASSWORD="$TEST_SKYPE_PASSWORD"
-### Test receiving call output
-/expectbee 'Welcome to the BitlBee' -command 'msg $$C register testing'
-/expectbee 'Account successfully created' -command 'msg $$C account add skype @LOGIN@ @PASSWORD@'
-/expectbee 'Account successfully added' -command 'msg $$C account 0 set test_join true'
-/expectbee 'test_join' -command 'msg $$C account 0 on'
-/expectjoin echo123 -command 'ctcp echo123 call'
-/expectbee 'You are currently ringing the user' -command 'ctcp echo123 hangup'
-/expectbee '(You cancelled the call|You finished the call)' -command 'quit Test Passed'
diff --git a/protocols/skype/t/irssi/skype-info.test b/protocols/skype/t/irssi/skype-info.test
deleted file mode 100644
index e8507321..00000000
--- a/protocols/skype/t/irssi/skype-info.test
+++ /dev/null
@@ -1,12 +0,0 @@
-TESTNEEDEDVARS="TEST_SKYPE_ID TEST_SKYPE_PASSWORD"
-TESTDURATION=60
-TESTCHECKRESULT="grep '\[Test Passed\]' status.log"
-TESTLOGIN="$TEST_SKYPE_ID"
-TESTPASSWORD="$TEST_SKYPE_PASSWORD"
-### Test receiving info output
-/expectbee 'Welcome to the BitlBee' -command 'msg $$C register testing'
-/expectbee 'Account successfully created' -command 'msg $$C account add skype @LOGIN@ @PASSWORD@'
-/expectbee 'Account successfully added' -command 'msg $$C account 0 set test_join true'
-/expectbee 'test_join' -command 'msg $$C account 0 on'
-/expectjoin echo123 -command 'msg $$C info echo123'
-/expectbee 'Full Name: Echo / Sound Test Service' -command 'quit Test Passed'
diff --git a/protocols/skype/t/irssi/skype-login.test b/protocols/skype/t/irssi/skype-login.test
deleted file mode 100644
index ca627002..00000000
--- a/protocols/skype/t/irssi/skype-login.test
+++ /dev/null
@@ -1,10 +0,0 @@
-TESTNEEDEDVARS="TEST_SKYPE_ID TEST_SKYPE_PASSWORD"
-TESTDURATION=10
-TESTCHECKRESULT="grep '\[Test Passed\]' status.log"
-TESTLOGIN="$TEST_SKYPE_ID"
-TESTPASSWORD="$TEST_SKYPE_PASSWORD"
-### Test login
-/expectbee 'Welcome to the BitlBee' -command 'msg $$C register testing'
-/expectbee 'Account successfully created' -command 'msg $$C account add skype @LOGIN@ @PASSWORD@'
-/expectbee 'Account successfully added' -command 'msg $$C account 0 on'
-/expectbee 'Logged in' -command 'quit Test Passed'
diff --git a/protocols/skype/t/irssi/skype-msg.test b/protocols/skype/t/irssi/skype-msg.test
deleted file mode 100644
index d35615cd..00000000
--- a/protocols/skype/t/irssi/skype-msg.test
+++ /dev/null
@@ -1,17 +0,0 @@
-TESTNEEDEDVARS="TEST_SKYPE_ID TEST_SKYPE_PASSWORD"
-TESTDURATION=60
-TESTCHECKRESULT="grep '\[Test Passed\]' status.log"
-TESTLOGIN="$TEST_SKYPE_ID"
-TESTPASSWORD="$TEST_SKYPE_PASSWORD"
-### Test sending and receiving messages
-/expectbee 'Welcome to the BitlBee' -command 'msg $$C register testing'
-/expectbee 'Account successfully created' -command 'msg $$C account add skype @LOGIN@ @PASSWORD@'
-/expectbee 'Account successfully added' -command 'msg $$C account 0 set test_join true'
-/expectbee 'test_join' -command 'msg $$C account 0 on'
-# use builtin test service
-/expectjoin echo123 -command 'msg $$C echo123: ping, say pong'
-/expectbee 'pong' -command 'quit Test Passed'
-# use a public bot as well, just in case the above one would fail
-/expectjoin echo123 -command 'msg $$C add skype pam_bot'
-/expectjoin pam_bot -command 'msg $$C pam_bot: pambot help'
-/expectbee 'PamBot, thanks for chatting with me' -command 'quit Test Passed'
diff --git a/protocols/skype/t/irssi/trigger.pl b/protocols/skype/t/irssi/trigger.pl
deleted file mode 100644
index 02f8951f..00000000
--- a/protocols/skype/t/irssi/trigger.pl
+++ /dev/null
@@ -1,1225 +0,0 @@
-# trigger.pl - execute a command or replace text, triggered by an event in irssi
-# Do /TRIGGER HELP or look at http://wouter.coekaerts.be/irssi/ for help
-
-# Copyright (C) 2002-2006 Wouter Coekaerts <wouter@coekaerts.be>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-use strict;
-use Irssi 20020324 qw(command_bind command_runsub command signal_add_first signal_continue signal_stop signal_remove);
-use Text::ParseWords;
-use IO::File;
-use vars qw($VERSION %IRSSI);
-
-$VERSION = '1.0';
-%IRSSI = (
- authors => 'Wouter Coekaerts',
- contact => 'wouter@coekaerts.be',
- name => 'trigger',
- description => 'execute a command or replace text, triggered by an event in irssi',
- license => 'GPLv2 or later',
- url => 'http://wouter.coekaerts.be/irssi/',
- changed => '$LastChangedDate: 2006-01-23 13:10:19 +0100 (Mon, 23 Jan 2006) $',
-);
-
-sub cmd_help {
- Irssi::print (<<'SCRIPTHELP_EOF', MSGLEVEL_CLIENTCRAP);
-
-TRIGGER LIST
-TRIGGER SAVE
-TRIGGER RELOAD
-TRIGGER MOVE <number> <number>
-TRIGGER DELETE <number>
-TRIGGER CHANGE <number> ...
-TRIGGER ADD ...
-
-When to match:
-On which types of event to trigger:
- These are simply specified by -name_of_the_type
- The normal IRC event types are:
- publics, %|privmsgs, pubactions, privactions, pubnotices, privnotices, joins, parts, quits, kicks, topics, invites, nick_changes, dcc_msgs, dcc_actions, dcc_ctcps
- mode_channel: %|a mode on the (whole) channel (like +t, +i, +b)
- mode_nick: %|a mode on someone in the channel (like +o, +v)
- -all is an alias for all of those.
- Additionally, there is:
- rawin: %|raw text incoming from the server
- send_command: %|commands you give to irssi
- send_text: %|lines you type that aren't commands
- beep: %|when irssi beeps
- notify_join: %|someone in you notify list comes online
- notify_part: %|someone in your notify list goes offline
- notify_away: %|someone in your notify list goes away
- notify_unaway: %|someone in your notify list goes unaway
- notify_unidle: %|someone in your notify list stops idling
-
-Filters (conditions) the event has to satisfy. They all take one parameter.
-If you can give a list, seperate elements by space and use quotes around the list.
- -pattern: %|The message must match the given pattern. ? and * can be used as wildcards
- -regexp: %|The message must match the given regexp. (see man perlre)
- %|if -nocase is given as an option, the regexp or pattern is matched case insensitive
- -tags: %|The servertag must be in the given list of tags
- -channels: %|The event must be in one of the given list of channels.
- Examples: %|-channels '#chan1 #chan2' or -channels 'IRCNet/#channel'
- %|-channels 'EFNet/' means every channel on EFNet and is the same as -tags 'EFNet'
- -masks: %|The person who triggers it must match one of the given list of masks
- -hasmode: %|The person who triggers it must have the give mode
- Examples: %|'-o' means not opped, '+ov' means opped OR voiced, '-o&-v' means not opped AND not voiced
- -hasflag: %|Only trigger if if friends.pl (friends_shasta.pl) or people.pl is loaded and the person who triggers it has the given flag in the script (same syntax as -hasmode)
- -other_masks
- -other_hasmode
- -other_hasflag: %|Same as above but for the victim for kicks or mode_nick.
-
-What to do when it matches:
- -command: Execute the given Irssi-command
- %|You are able to use $1, $2 and so on generated by your regexp pattern.
- %|For multiple commands ; (or $;) can be used as seperator
- %|The following variables are also expanded:
- $T: %|Server tag
- $C: %|Channel name
- $N: %|Nickname of the person who triggered this command
- $A: %|His address (foo@bar.com),
- $I: %|His ident (foo)
- $H: %|His hostname (bar.com)
- $M: %|The complete message
- ${other}: %|The victim for kicks or mode_nick
- ${mode_type}: %|The type ('+' or '-') for a mode_channel or mode_nick
- ${mode_char}: %|The mode char ('o' for ops, 'b' for ban,...)
- ${mode_arg} : %|The argument to the mode (if there is one)
- %|$\X, with X being one of the above expands (e.g. $\M), escapes all non-alphanumeric characters, so it can be used with /eval or /exec. Don't use /eval or /exec without this, it's not safe.
-
- -replace: %|replaces the matching part with the given replacement in the event (requires a -regexp or -pattern)
- -once: %|remove the trigger if it is triggered, so it only executes once and then is forgotten.
- -stop: %|stops the signal. It won't get displayed by Irssi. Like /IGNORE
- -debug: %|print some debugging info
-
-Other options:
- -disabled: %|Same as removing it, but keeps it in case you might need it later
- -name: %|Give the trigger a name. You can refer to the trigger with this name in add/del/change commands
-
-Examples:
- Knockout people who do a !list:
- /TRIGGER ADD %|-publics -channels "#channel1 #channel2" -nocase -regexp ^!list -command "KN $N This is not a warez channel!"
- React to !echo commands from people who are +o in your friends-script:
- /TRIGGER ADD %|-publics -regexp '^!echo (.*)' -hasflag '+o' -command 'say echo: $1'
- Ignore all non-ops on #channel:
- /TRIGGER ADD %|-publics -actions -channels "#channel" -hasmode '-o' -stop
- Send a mail to yourself every time a topic is changed:
- /TRIGGER ADD %|-topics -command 'exec echo $\N changed topic of $\C to: $\M | mail you@somewhere.com -s topic'
-
-
-Examples with -replace:
- %|Replace every occurence of shit with sh*t, case insensitive:
- /TRIGGER ADD %|-all -nocase -regexp shit -replace sh*t
- %|Strip all colorcodes from *!lamer@*:
- /TRIGGER ADD %|-all -masks *!lamer@* -regexp '\x03\d?\d?(,\d\d?)?|\x02|\x1f|\x16|\x06' -replace ''
- %|Never let *!bot1@foo.bar or *!bot2@foo.bar hilight you
- %|(this works by cutting your nick in 2 different parts, 'myn' and 'ick' here)
- %|you don't need to understand the -replace argument, just trust that it works if the 2 parts separately don't hilight:
- /TRIGGER ADD %|-all masks '*!bot1@foo.bar *!bot2@foo.bar' -regexp '(myn)(ick)' -nocase -replace '$1\x02\x02$2'
- %|Avoid being hilighted by !top10 in eggdrops with stats.mod (but show your nick in bold):
- /TRIGGER ADD %|-publics -regexp '(Top.0\(.*\): 1.*)(my)(nick)' -replace '$1\x02$2\x02\x02$3\x02'
- %|Convert a Windows-1252 Euro to an ISO-8859-15 Euro (same effect as euro.pl):
- /TRIGGER ADD %|-regexp '\x80' -replace '\xA4'
- %|Show tabs as spaces, not the inverted I (same effect as tab_stop.pl):
- /TRIGGER ADD %|-all -regexp '\t' -replace ' '
-SCRIPTHELP_EOF
-} # /
-
-my @triggers; # array of all triggers
-my %triggers_by_type; # hash mapping types on triggers of that type
-my $recursion_depth = 0;
-my $changed_since_last_save = 0;
-
-###############
-### formats ###
-###############
-
-Irssi::theme_register([
- 'trigger_header' => 'Triggers:',
- 'trigger_line' => '%#$[-4]0 $1',
- 'trigger_added' => 'Trigger $0 added: $1',
- 'trigger_not_found' => 'Trigger {hilight $0} not found',
- 'trigger_saved' => 'Triggers saved to $0',
- 'trigger_loaded' => 'Triggers loaded from $0'
-]);
-
-#########################################
-### catch the signals & do your thing ###
-#########################################
-
-# trigger types with a message and a channel
-my @allchanmsg_types = qw(publics pubactions pubnotices pubctcps pubctcpreplies parts quits kicks topics);
-# trigger types with a message
-my @allmsg_types = (@allchanmsg_types, qw(privmsgs privactions privnotices privctcps privctcpreplies dcc_msgs dcc_actions dcc_ctcps));
-# trigger types with a channel
-my @allchan_types = (@allchanmsg_types, qw(mode_channel mode_nick joins invites));
-# trigger types in -all
-my @all_types = (@allmsg_types, qw(mode_channel mode_nick joins invites nick_changes));
-# trigger types with a server
-my @all_server_types = (@all_types, qw(rawin notify_join notify_part notify_away notify_unaway notify_unidle));
-# all trigger types
-my @trigger_types = (@all_server_types, qw(send_command send_text beep));
-#trigger types that are not in -all
-#my @notall_types = grep {my $a=$_; return (!grep {$_ eq $a} @all_types);} @trigger_types;
-my @notall_types = qw(rawin notify_join notify_part notify_away notify_unaway notify_unidle send_command send_text beep);
-
-my @signals = (
-# "message public", SERVER_REC, char *msg, char *nick, char *address, char *target
-{
- 'types' => ['publics'],
- 'signal' => 'message public',
- 'sub' => sub {check_signal_message(\@_,1,$_[0],$_[4],$_[2],$_[3],'publics');},
-},
-# "message private", SERVER_REC, char *msg, char *nick, char *address
-{
- 'types' => ['privmsgs'],
- 'signal' => 'message private',
- 'sub' => sub {check_signal_message(\@_,1,$_[0],undef,$_[2],$_[3],'privmsgs');},
-},
-# "message irc action", SERVER_REC, char *msg, char *nick, char *address, char *target
-{
- 'types' => ['privactions','pubactions'],
- 'signal' => 'message irc action',
- 'sub' => sub {
- if ($_[4] eq $_[0]->{nick}) {
- check_signal_message(\@_,1,$_[0],undef,$_[2],$_[3],'privactions');
- } else {
- check_signal_message(\@_,1,$_[0],$_[4],$_[2],$_[3],'pubactions');
- }
- },
-},
-# "message irc notice", SERVER_REC, char *msg, char *nick, char *address, char *target
-{
- 'types' => ['privnotices','pubnotices'],
- 'signal' => 'message irc notice',
- 'sub' => sub {
- if ($_[4] eq $_[0]->{nick}) {
- check_signal_message(\@_,1,$_[0],undef,$_[2],$_[3],'privnotices');
- } else {
- check_signal_message(\@_,1,$_[0],$_[4],$_[2],$_[3],'pubnotices');
- }
- }
-},
-# "message join", SERVER_REC, char *channel, char *nick, char *address
-{
- 'types' => ['joins'],
- 'signal' => 'message join',
- 'sub' => sub {check_signal_message(\@_,-1,$_[0],$_[1],$_[2],$_[3],'joins');}
-},
-# "message part", SERVER_REC, char *channel, char *nick, char *address, char *reason
-{
- 'types' => ['parts'],
- 'signal' => 'message part',
- 'sub' => sub {check_signal_message(\@_,4,$_[0],$_[1],$_[2],$_[3],'parts');}
-},
-# "message quit", SERVER_REC, char *nick, char *address, char *reason
-{
- 'types' => ['quits'],
- 'signal' => 'message quit',
- 'sub' => sub {check_signal_message(\@_,3,$_[0],undef,$_[1],$_[2],'quits');}
-},
-# "message kick", SERVER_REC, char *channel, char *nick, char *kicker, char *address, char *reason
-{
- 'types' => ['kicks'],
- 'signal' => 'message kick',
- 'sub' => sub {check_signal_message(\@_,5,$_[0],$_[1],$_[3],$_[4],'kicks',{'other'=>$_[2]});}
-},
-# "message topic", SERVER_REC, char *channel, char *topic, char *nick, char *address
-{
- 'types' => ['topics'],
- 'signal' => 'message topic',
- 'sub' => sub {check_signal_message(\@_,2,$_[0],$_[1],$_[3],$_[4],'topics');}
-},
-# "message invite", SERVER_REC, char *channel, char *nick, char *address
-{
- 'types' => ['invites'],
- 'signal' => 'message invite',
- 'sub' => sub {check_signal_message(\@_,-1,$_[0],$_[1],$_[2],$_[3],'invites');}
-},
-# "message nick", SERVER_REC, char *newnick, char *oldnick, char *address
-{
- 'types' => ['nick_changes'],
- 'signal' => 'message nick',
- 'sub' => sub {check_signal_message(\@_,-1,$_[0],undef,$_[1],$_[3],'nick_changes');}
-},
-# "message dcc", DCC_REC *dcc, char *msg
-{
- 'types' => ['dcc_msgs'],
- 'signal' => 'message dcc',
- 'sub' => sub {check_signal_message(\@_,1,$_[0]->{'server'},undef,$_[0]->{'nick'},undef,'dcc_msgs');
- }
-},
-# "message dcc action", DCC_REC *dcc, char *msg
-{
- 'types' => ['dcc_actions'],
- 'signal' => 'message dcc action',
- 'sub' => sub {check_signal_message(\@_,1,$_[0]->{'server'},undef,$_[0]->{'nick'},undef,'dcc_actions');}
-},
-# "message dcc ctcp", DCC_REC *dcc, char *cmd, char *data
-{
- 'types' => ['dcc_ctcps'],
- 'signal' => 'message dcc ctcp',
- 'sub' => sub {check_signal_message(\@_,1,$_[0]->{'server'},undef,$_[0]->{'nick'},undef,'dcc_ctcps');}
-},
-# "server incoming", SERVER_REC, char *data
-{
- 'types' => ['rawin'],
- 'signal' => 'server incoming',
- 'sub' => sub {check_signal_message(\@_,1,$_[0],undef,undef,undef,'rawin');}
-},
-# "send command", char *args, SERVER_REC, WI_ITEM_REC
-{
- 'types' => ['send_command'],
- 'signal' => 'send command',
- 'sub' => sub {
- sig_send_text_or_command(\@_,1);
- }
-},
-# "send text", char *line, SERVER_REC, WI_ITEM_REC
-{
- 'types' => ['send_text'],
- 'signal' => 'send text',
- 'sub' => sub {
- sig_send_text_or_command(\@_,0);
- }
-},
-# "beep"
-{
- 'types' => ['beep'],
- 'signal' => 'beep',
- 'sub' => sub {check_signal_message(\@_,-1,undef,undef,undef,undef,'beep');}
-},
-# "event "<cmd>, SERVER_REC, char *args, char *sender_nick, char *sender_address
-{
- 'types' => ['mode_channel', 'mode_nick'],
- 'signal' => 'event mode',
- 'sub' => sub {
- my ($server, $event_args, $nickname, $address) = @_;
- my ($target, $modes, $modeargs) = split(/ /, $event_args, 3);
- return if (!$server->ischannel($target));
- my (@modeargs) = split(/ /,$modeargs);
- my ($pos, $type, $event_type, $arg) = (0, '+');
- foreach my $char (split(//,$modes)) {
- if ($char eq "+" || $char eq "-") {
- $type = $char;
- } else {
- if ($char =~ /[Oovh]/) { # mode_nick
- $event_type = 'mode_nick';
- $arg = $modeargs[$pos++];
- } elsif ($char =~ /[beIqdk]/ || ( $char =~ /[lfJ]/ && $type eq '+')) { # chan_mode with arg
- $event_type = 'mode_channel';
- $arg = $modeargs[$pos++];
- } else { # chan_mode without arg
- $event_type = 'mode_channel';
- $arg = undef;
- }
- check_signal_message(\@_,-1,$server,$target,$nickname,$address,$event_type,{
- 'mode_type' => $type,
- 'mode_char' => $char,
- 'mode_arg' => $arg,
- 'other' => ($event_type eq 'mode_nick') ? $arg : undef
- });
- }
- }
- }
-},
-# "notifylist joined", SERVER_REC, char *nick, char *user, char *host, char *realname, char *awaymsg
-{
- 'types' => ['notify_join'],
- 'signal' => 'notifylist joined',
- 'sub' => sub {check_signal_message(\@_, 5, $_[0], undef, $_[1], $_[2].'@'.$_[3], 'notify_join', {'realname' => $_[4]});}
-},
-{
- 'types' => ['notify_part'],
- 'signal' => 'notifylist left',
- 'sub' => sub {check_signal_message(\@_, 5, $_[0], undef, $_[1], $_[2].'@'.$_[3], 'notify_left', {'realname' => $_[4]});}
-},
-{
- 'types' => ['notify_unidle'],
- 'signal' => 'notifylist unidle',
- 'sub' => sub {check_signal_message(\@_, 5, $_[0], undef, $_[1], $_[2].'@'.$_[3], 'notify_unidle', {'realname' => $_[4]});}
-},
-{
- 'types' => ['notify_away', 'notify_unaway'],
- 'signal' => 'notifylist away changed',
- 'sub' => sub {check_signal_message(\@_, 5, $_[0], undef, $_[1], $_[2].'@'.$_[3], ($_[5] ? 'notify_away' : 'notify_unaway'), {'realname' => $_[4]});}
-},
-# "ctcp msg", SERVER_REC, char *args, char *nick, char *addr, char *target
-{
- 'types' => ['pubctcps', 'privctcps'],
- 'signal' => 'ctcp msg',
- 'sub' => sub {
- my ($server, $args, $nick, $addr, $target) = @_;
- if ($target eq $server->{'nick'}) {
- check_signal_message(\@_, 1, $server, undef, $nick, $addr, 'privctcps');
- } else {
- check_signal_message(\@_, 1, $server, $target, $nick, $addr, 'pubctcps');
- }
- }
-},
-# "ctcp reply", SERVER_REC, char *args, char *nick, char *addr, char *target
-{
- 'types' => ['pubctcpreplies', 'privctcpreplies'],
- 'signal' => 'ctcp reply',
- 'sub' => sub {
- my ($server, $args, $nick, $addr, $target) = @_;
- if ($target eq $server->{'nick'}) {
- check_signal_message(\@_, 1, $server, undef, $nick, $addr, 'privctcps');
- } else {
- check_signal_message(\@_, 1, $server, $target, $nick, $addr, 'pubctcps');
- }
- }
-}
-);
-
-sub sig_send_text_or_command {
- my ($signal, $iscommand) = @_;
- my ($line, $server, $item) = @$signal;
- my ($channelname,$nickname,$address) = (undef,undef,undef);
- if ($item && (ref($item) eq 'Irssi::Irc::Channel' || ref($item) eq 'Irssi::Silc::Channel')) {
- $channelname = $item->{'name'};
- } elsif ($item && ref($item) eq 'Irssi::Irc::Query') { # TODO Silc query ?
- $nickname = $item->{'name'};
- $address = $item->{'address'}
- }
- # TODO pass context also for non-channels (queries and other stuff)
- check_signal_message($signal,0,$server,$channelname,$nickname,$address,$iscommand ? 'send_command' : 'send_text');
-
-}
-
-my %filters = (
-'tags' => {
- 'types' => \@all_server_types,
- 'sub' => sub {
- my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_;
-
- if (!defined($server)) {
- return 0;
- }
- my $matches = 0;
- foreach my $tag (split(/ /,$param)) {
- if (lc($server->{'tag'}) eq lc($tag)) {
- $matches = 1;
- last;
- }
- }
- return $matches;
- }
-},
-'channels' => {
- 'types' => \@allchan_types,
- 'sub' => sub {
- my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_;
-
- if (!defined($channelname) || !defined($server)) {
- return 0;
- }
- my $matches = 0;
- foreach my $trigger_channel (split(/ /,$param)) {
- if (lc($channelname) eq lc($trigger_channel)
- || lc($server->{'tag'}.'/'.$channelname) eq lc($trigger_channel)
- || lc($server->{'tag'}.'/') eq lc($trigger_channel)) {
- $matches = 1;
- last; # this channel matches, stop checking channels
- }
- }
- return $matches;
- }
-},
-'masks' => {
- 'types' => \@all_types,
- 'sub' => sub {
- my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_;
- return (defined($nickname) && defined($address) && defined($server) && $server->masks_match($param, $nickname, $address));
- }
-},
-'other_masks' => {
- 'types' => ['kicks', 'mode_nick'],
- 'sub' => sub {
- my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_;
- return 0 unless defined($extra->{'other'});
- my $other_address = get_address($extra->{'other'}, $server, $channelname);
- return defined($other_address) && $server->masks_match($param, $extra->{'other'}, $other_address);
- }
-},
-'hasmode' => {
- 'types' => \@all_types,
- 'sub' => sub {
- my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_;
- return hasmode($param, $nickname, $server, $channelname);
- }
-},
-'other_hasmode' => {
- 'types' => ['kicks', 'mode_nick'],
- 'sub' => sub {
- my ($param,$signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_;
- return defined($extra->{'other'}) && hasmode($param, $extra->{'other'}, $server, $channelname);
- }
-},
-'hasflag' => {
- 'types' => \@all_types,
- 'sub' => sub {
- my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_;
- return 0 unless defined($nickname) && defined($address) && defined($server);
- my $flags = get_flags ($server->{'chatnet'},$channelname,$nickname,$address);
- return defined($flags) && check_modes($flags,$param);
- }
-},
-'other_hasflag' => {
- 'types' => ['kicks', 'mode_nick'],
- 'sub' => sub {
- my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_;
- return 0 unless defined($extra->{'other'});
- my $other_address = get_address($extra->{'other'}, $server, $channelname);
- return 0 unless defined($other_address);
- my $flags = get_flags ($server->{'chatnet'},$channelname,$extra->{'other'},$other_address);
- return defined($flags) && check_modes($flags,$param);
- }
-},
-'mode_type' => {
- 'types' => ['mode_channel', 'mode_nick'],
- 'sub' => sub {
- my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_;
- return (($param) eq $extra->{'mode_type'});
- }
-},
-'mode_char' => {
- 'types' => ['mode_channel', 'mode_nick'],
- 'sub' => sub {
- my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_;
- return (($param) eq $extra->{'mode_char'});
- }
-},
-'mode_arg' => {
- 'types' => ['mode_channel', 'mode_nick'],
- 'sub' => sub {
- my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_;
- return (($param) eq $extra->{'mode_arg'});
- }
-}
-);
-
-sub get_address {
- my ($nick, $server, $channel) = @_;
- my $nickrec = get_nickrec($nick, $server, $channel);
- return $nickrec ? $nickrec->{'host'} : undef;
-}
-sub get_nickrec {
- my ($nick, $server, $channel) = @_;
- return unless defined($server) && defined($channel) && defined($nick);
- my $chanrec = $server->channel_find($channel);
- return $chanrec ? $chanrec->nick_find($nick) : undef;
-}
-
-sub hasmode {
- my ($param, $nickname, $server, $channelname) = @_;
- my $nickrec = get_nickrec($nickname, $server, $channelname);
- return 0 unless defined $nickrec;
- my $modes =
- ($nickrec->{'op'} ? 'o' : '')
- . ($nickrec->{'voice'} ? 'v' : '')
- . ($nickrec->{'halfop'} ? 'h' : '')
- ;
- return check_modes($modes, $param);
-}
-
-# list of all switches
-my @trigger_switches = (@trigger_types, qw(all nocase stop once debug disabled));
-# parameters (with an argument)
-my @trigger_params = qw(pattern regexp command replace name);
-# list of all options (including switches) for /TRIGGER ADD
-my @trigger_add_options = (@trigger_switches, @trigger_params, keys(%filters));
-# same for /TRIGGER CHANGE, this includes the -no<option>'s
-my @trigger_options = map(($_,'no'.$_) ,@trigger_add_options);
-
-# check the triggers on $signal's $parammessage parameter, for triggers with $condition set
-# on $server in $channelname, for $nickname!$address
-# set $parammessage to -1 if the signal doesn't have a message
-# for signal without channel, nick or address, set to undef
-sub check_signal_message {
- my ($signal, $parammessage, $server, $channelname, $nickname, $address, $condition, $extra) = @_;
- my ($changed, $stopped, $context, $need_rebuild);
- my $message = ($parammessage == -1) ? '' : $signal->[$parammessage];
-
- return if (!$triggers_by_type{$condition});
-
- if ($recursion_depth > 10) {
- Irssi::print("Trigger error: Maximum recursion depth reached, aborting trigger.", MSGLEVEL_CLIENTERROR);
- return;
- }
- $recursion_depth++;
-
-TRIGGER:
- foreach my $trigger (@{$triggers_by_type{$condition}}) {
- # check filters
- foreach my $trigfilter (@{$trigger->{'filters'}}) {
- if (! ($trigfilter->[2]($trigfilter->[1], $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra))) {
-
- next TRIGGER;
- }
- }
-
- # check regexp (and keep matches in @- and @+, so don't make a this a {block})
- next if ($trigger->{'compregexp'} && ($parammessage == -1 || $message !~ m/$trigger->{'compregexp'}/));
-
- # if we got this far, it fully matched, and we need to do the replace/command/stop/once
- my $expands = $extra;
- $expands->{'M'} = $message,;
- $expands->{'T'} = (defined($server)) ? $server->{'tag'} : '';
- $expands->{'C'} = $channelname;
- $expands->{'N'} = $nickname;
- $expands->{'A'} = $address;
- $expands->{'I'} = ((!defined($address)) ? '' : substr($address,0,index($address,'@')));
- $expands->{'H'} = ((!defined($address)) ? '' : substr($address,index($address,'@')+1));
- $expands->{'$'} = '$';
- $expands->{';'} = ';';
-
- if (defined($trigger->{'replace'})) { # it's a -replace
- $message =~ s/$trigger->{'compregexp'}/do_expands($trigger->{'compreplace'},$expands,$message)/ge;
- $changed = 1;
- }
-
- if ($trigger->{'command'}) { # it's a (nonempty) -command
- my $command = $trigger->{'command'};
- # $1 = the stuff behind the $ we want to expand: a number, or a character from %expands
- $command = do_expands($command, $expands, $message);
-
- if (defined($server)) {
- if (defined($channelname) && $server->channel_find($channelname)) {
- $context = $server->channel_find($channelname);
- } else {
- $context = $server;
- }
- } else {
- $context = undef;
- }
-
- if (defined($context)) {
- $context->command("eval $command");
- } else {
- Irssi::command("eval $command");
- }
- }
-
- if ($trigger->{'debug'}) {
- print("DEBUG: trigger $condition pmesg=$parammessage message=$message server=$server->{tag} channel=$channelname nick=$nickname address=$address " . join(' ',map {$_ . '=' . $extra->{$_}} keys(%$extra)));
- }
-
- if ($trigger->{'stop'}) {
- $stopped = 1;
- }
-
- if ($trigger->{'once'}) {
- # find this trigger in the real trigger list, and remove it
- for (my $realindex=0; $realindex < scalar(@triggers); $realindex++) {
- if ($triggers[$realindex] == $trigger) {
- splice (@triggers,$realindex,1);
- last;
- }
- }
- $need_rebuild = 1;
- }
- }
-
- if ($need_rebuild) {
- rebuild();
- $changed_since_last_save = 1;
- }
- if ($stopped) { # stopped with -stop
- signal_stop();
- } elsif ($changed) { # changed with -replace
- $signal->[$parammessage] = $message;
- signal_continue(@$signal);
- }
- $recursion_depth--;
-}
-
-# used in check_signal_message to expand $'s
-# $inthis is a string that can contain $ stuff (like 'foo$1bar$N')
-sub do_expands {
- my ($inthis, $expands, $from) = @_;
- # @+ and @- are copied because there are two s/// nested, and the inner needs the $1 and $2,... of the outer one
- my @plus = @+;
- my @min = @-;
- my $p = \@plus; my $m = \@min;
- $inthis =~ s/\$(\\*(\d+|[^0-9x{]|x[0-9a-fA-F][0-9a-fA-F]|{.*?}))/expand_and_escape($1,$expands,$m,$p,$from)/ge;
- return $inthis;
-}
-
-# \ $ and ; need extra escaping because we use eval
-sub expand_and_escape {
- my $retval = expand(@_);
- $retval =~ s/([\\\$;])/\\\1/g;
- return $retval;
-}
-
-# used in do_expands (via expand_and_escape), to_expand is the part after the $
-sub expand {
- my ($to_expand, $expands, $min, $plus, $from) = @_;
- if ($to_expand =~ /^\d+$/) { # a number => look up in $vars
- # from man perlvar:
- # $3 is the same as "substr $var, $-[3], $+[3] - $-[3])"
- return ($to_expand > @{$min} ? '' : substr($from,$min->[$to_expand],$plus->[$to_expand]-$min->[$to_expand]));
- } elsif ($to_expand =~ s/^\\//) { # begins with \, so strip that from to_expand
- my $exp = expand($to_expand,$expands,$min,$plus,$from); # first expand without \
- $exp =~ s/([^a-zA-Z0-9])/\\\1/g; # escape non-word chars
- return $exp;
- } elsif ($to_expand =~ /^x([0-9a-fA-F]{2})/) { # $xAA
- return chr(hex($1));
- } elsif ($to_expand =~ /^{(.*?)}$/) { # ${foo}
- return expand($1, $expands, $min, $plus, $from);
- } else { # look up in $expands
- return $expands->{$to_expand};
- }
-}
-
-sub check_modes {
- my ($has_modes, $need_modes) = @_;
- my $matches;
- my $switch = 1; # if a '-' if found, will be 0 (meaning the modes should not be set)
- foreach my $need_mode (split /&/, $need_modes) {
- $matches = 0;
- foreach my $char (split //, $need_mode) {
- if ($char eq '-') {
- $switch = 0;
- } elsif ($char eq '+') {
- $switch = 1;
- } elsif ((index($has_modes, $char) != -1) == $switch) {
- $matches = 1;
- last;
- }
- }
- if (!$matches) {
- return 0;
- }
- }
- return 1;
-}
-
-# get someones flags from people.pl or friends(_shasta).pl
-sub get_flags {
- my ($chatnet, $channel, $nick, $address) = @_;
- my $flags;
- no strict 'refs';
- if (defined %{ 'Irssi::Script::people::' }) {
- if (defined ($channel)) {
- $flags = (&{ 'Irssi::Script::people::find_local_flags' }($chatnet,$channel,$nick,$address));
- } else {
- $flags = (&{ 'Irssi::Script::people::find_global_flags' }($chatnet,$nick,$address));
- }
- $flags = join('',keys(%{$flags}));
- } else {
- my $shasta;
- if (defined %{ 'Irssi::Script::friends_shasta::' }) {
- $shasta = 'friends_shasta';
- } elsif (defined &{ 'Irssi::Script::friends::get_idx' }) {
- $shasta = 'friends';
- } else {
- return undef;
- }
- my $idx = (&{ 'Irssi::Script::'.$shasta.'::get_idx' }($nick, $address));
- if ($idx == -1) {
- return '';
- }
- $flags = (&{ 'Irssi::Script::'.$shasta.'::get_friends_flags' }($idx,undef));
- if ($channel) {
- $flags .= (&{ 'Irssi::Script::'.$shasta.'::get_friends_flags' }($idx,$channel));
- }
- }
- return $flags;
-}
-
-########################################################
-### internal stuff called by manage, needed by above ###
-########################################################
-
-my %mask_to_regexp = ();
-foreach my $i (0..255) {
- my $ch = chr $i;
- $mask_to_regexp{$ch} = "\Q$ch\E";
-}
-$mask_to_regexp{'?'} = '(.)';
-$mask_to_regexp{'*'} = '(.*)';
-
-sub compile_trigger {
- my ($trigger) = @_;
- my $regexp;
-
- if ($trigger->{'regexp'}) {
- $regexp = $trigger->{'regexp'};
- } elsif ($trigger->{'pattern'}) {
- $regexp = $trigger->{'pattern'};
- $regexp =~ s/(.)/$mask_to_regexp{$1}/g;
- } else {
- delete $trigger->{'compregexp'};
- return;
- }
-
- if ($trigger->{'nocase'}) {
- $regexp = '(?i)' . $regexp;
- }
-
- $trigger->{'compregexp'} = qr/$regexp/;
-
- if(defined($trigger->{'replace'})) {
- (my $replace = $trigger->{'replace'}) =~ s/\$/\$\$/g;
- $trigger->{'compreplace'} = Irssi::parse_special($replace);
- }
-}
-
-# rebuilds triggers_by_type and updates signal binds
-sub rebuild {
- %triggers_by_type = ();
- foreach my $trigger (@triggers) {
- if (!$trigger->{'disabled'}) {
- if ($trigger->{'all'}) {
- # -all is an alias for all types in @all_types for which the filters can apply
-ALLTYPES:
- foreach my $type (@all_types) {
- # check if all filters can apply to $type
- foreach my $filter (@{$trigger->{'filters'}}) {
- if (! grep {$_ eq $type} $filters{$filter->[0]}->{'types'}) {
- next ALLTYPES;
- }
- }
- push @{$triggers_by_type{$type}}, ($trigger);
- }
- }
-
- foreach my $type ($trigger->{'all'} ? @notall_types : @trigger_types) {
- if ($trigger->{$type}) {
- push @{$triggers_by_type{$type}}, ($trigger);
- }
- }
- }
- }
-
- foreach my $signal (@signals) {
- my $should_bind = 0;
- foreach my $type (@{$signal->{'types'}}) {
- if (defined($triggers_by_type{$type})) {
- $should_bind = 1;
- }
- }
- if ($should_bind && !$signal->{'bind'}) {
- signal_add_first($signal->{'signal'}, $signal->{'sub'});
- $signal->{'bind'} = 1;
- } elsif (!$should_bind && $signal->{'bind'}) {
- signal_remove($signal->{'signal'}, $signal->{'sub'});
- $signal->{'bind'} = 0;
- }
- }
-}
-
-################################
-### manage the triggers-list ###
-################################
-
-my $trigger_file; # cached setting
-
-sub sig_setup_changed {
- $trigger_file = Irssi::settings_get_str('trigger_file');
-}
-
-sub autosave {
- cmd_save() if ($changed_since_last_save);
-}
-
-# TRIGGER SAVE
-sub cmd_save {
- my $io = new IO::File $trigger_file, "w";
- if (defined $io) {
- $io->print("#Triggers file version $VERSION\n");
- foreach my $trigger (@triggers) {
- $io->print(to_string($trigger) . "\n");
- }
- $io->close;
- }
- Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'trigger_saved', $trigger_file);
- $changed_since_last_save = 0;
-}
-
-# save on unload
-sub UNLOAD {
- cmd_save();
-}
-
-# TRIGGER LOAD
-sub cmd_load {
- sig_setup_changed(); # make sure we've read the trigger_file setting
- my $converted = 0;
- my $io = new IO::File $trigger_file, "r";
- if (not defined $io) {
- if (-e $trigger_file) {
- Irssi::print("Error opening triggers file", MSGLEVEL_CLIENTERROR);
- }
- return;
- }
- if (defined $io) {
- @triggers = ();
- my $text;
- $text = $io->getline;
- my $file_version = '';
- if ($text =~ /^#Triggers file version (.*)\n/) {
- $file_version = $1;
- }
- if ($file_version lt '0.6.1+2') {
- no strict 'vars';
- $text .= $_ foreach ($io->getlines);
- my $rep = eval "$text";
- if (! ref $rep) {
- Irssi::print("Error in triggers file");
- return;
- }
- my @old_triggers = @$rep;
-
- for (my $index=0;$index < scalar(@old_triggers);$index++) {
- my $trigger = $old_triggers[$index];
-
- if ($file_version lt '0.6.1') {
- # convert old names: notices => pubnotices, actions => pubactions
- foreach $oldname ('notices','actions') {
- if ($trigger->{$oldname}) {
- delete $trigger->{$oldname};
- $trigger->{'pub'.$oldname} = 1;
- $converted = 1;
- }
- }
- }
- if ($file_version lt '0.6.1+1' && $trigger->{'modifiers'}) {
- if ($trigger->{'modifiers'} =~ /i/) {
- $trigger->{'nocase'} = 1;
- Irssi::print("Trigger: trigger ".($index+1)." had 'i' in it's modifiers, it has been converted to -nocase");
- }
- if ($trigger->{'modifiers'} !~ /^[ig]*$/) {
- Irssi::print("Trigger: trigger ".($index+1)." had unrecognised modifier '". $trigger->{'modifiers'} ."', which couldn't be converted.");
- }
- delete $trigger->{'modifiers'};
- $converted = 1;
- }
-
- if (defined($trigger->{'replace'}) && ! $trigger->{'regexp'}) {
- Irssi::print("Trigger: trigger ".($index+1)." had -replace but no -regexp, removed it");
- splice (@old_triggers,$index,1);
- $index--; # nr of next trigger now is the same as this one was
- }
-
- # convert to text with compat, and then to new trigger hash
- $text = to_string($trigger,1);
- my @args = &shellwords($text . ' a');
- my $trigger = parse_options({},@args);
- if ($trigger) {
- push @triggers, $trigger;
- }
- }
- } else { # new format
- while ( $text = $io->getline ) {
- chop($text);
- my @args = &shellwords($text . ' a');
- my $trigger = parse_options({},@args);
- if ($trigger) {
- push @triggers, $trigger;
- }
- }
- }
- }
- Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'trigger_loaded', $trigger_file);
- if ($converted) {
- Irssi::print("Trigger: Triggers file will be in new format next time it's saved.");
- }
- rebuild();
-}
-
-# escape for printing with to_string
-# <<abcdef>> => << 'abcdef' >>
-# <<abc'def>> => << "abc'def" >>
-# <<abc'def\x02>> => << 'abc'\''def\x02' >>
-sub param_to_string {
- my ($text) = @_;
- # avoid ugly escaping if we can use "-quotes without other escaping (no " or \)
- if ($text =~ /^[^"\\]*'[^"\\]$/) {
- return ' "' . $text . '" ';
- }
- # "'" signs without a (odd number of) \ in front of them, need be to escaped as '\''
- # this is ugly :(
- $text =~ s/(^|[^\\](\\\\)*)'/$1'\\''/g;
- return " '$text' ";
-}
-
-# converts a trigger back to "-switch -options 'foo'" form
-# if $compat, $trigger is in the old format (used to convert)
-sub to_string {
- my ($trigger, $compat) = @_;
- my $string;
-
- foreach my $switch (@trigger_switches) {
- if ($trigger->{$switch}) {
- $string .= '-'.$switch.' ';
- }
- }
-
- if ($compat) {
- foreach my $filter (keys(%filters)) {
- if ($trigger->{$filter}) {
- $string .= '-' . $filter . param_to_string($trigger->{$filter});
- }
- }
- } else {
- foreach my $trigfilter (@{$trigger->{'filters'}}) {
- $string .= '-' . $trigfilter->[0] . param_to_string($trigfilter->[1]);
- }
- }
-
- foreach my $param (@trigger_params) {
- if ($trigger->{$param} || ($param eq 'replace' && defined($trigger->{'replace'}))) {
- $string .= '-' . $param . param_to_string($trigger->{$param});
- }
- }
- return $string;
-}
-
-# find a trigger (for REPLACE and DELETE), returns index of trigger, or -1 if not found
-sub find_trigger {
- my ($data) = @_;
- if ($data =~ /^[0-9]*$/ and defined($triggers[$data-1])) {
- return $data-1;
- } else {
- for (my $i=0; $i < scalar(@triggers); $i++) {
- if ($triggers[$i]->{'name'} eq $data) {
- return $i;
- }
- }
- }
- Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'trigger_not_found', $data);
- return -1; # not found
-}
-
-
-# TRIGGER ADD <options>
-sub cmd_add {
- my ($data, $server, $item) = @_;
- my @args = shellwords($data . ' a');
-
- my $trigger = parse_options({}, @args);
- if ($trigger) {
- push @triggers, $trigger;
- Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'trigger_added', scalar(@triggers), to_string($trigger));
- rebuild();
- $changed_since_last_save = 1;
- }
-}
-
-# TRIGGER CHANGE <nr> <options>
-sub cmd_change {
- my ($data, $server, $item) = @_;
- my @args = shellwords($data . ' a');
- my $index = find_trigger(shift @args);
- if ($index != -1) {
- if(parse_options($triggers[$index], @args)) {
- Irssi::print("Trigger " . ($index+1) ." changed to: ". to_string($triggers[$index]));
- }
- rebuild();
- $changed_since_last_save = 1;
- }
-}
-
-# parses options for TRIGGER ADD and TRIGGER CHANGE
-# if invalid args returns undef, else changes $thetrigger and returns it
-sub parse_options {
- my ($thetrigger,@args) = @_;
- my ($trigger, $option);
-
- if (pop(@args) ne 'a') {
- Irssi::print("Syntax error, probably missing a closing quote", MSGLEVEL_CLIENTERROR);
- return undef;
- }
-
- %$trigger = %$thetrigger; # make a copy to prevent changing the given trigger if args doesn't parse
-ARGS: for (my $arg = shift @args; $arg; $arg = shift @args) {
- # expand abbreviated options, put in $option
- $arg =~ s/^-//;
- $option = undef;
- foreach my $ioption (@trigger_options) {
- if (index($ioption, $arg) == 0) { # -$opt starts with $arg
- if ($option) { # another already matched
- Irssi::print("Ambiguous option: $arg", MSGLEVEL_CLIENTERROR);
- return undef;
- }
- $option = $ioption;
- last if ($arg eq $ioption); # exact match is unambiguous
- }
- }
- if (!$option) {
- Irssi::print("Unknown option: $arg", MSGLEVEL_CLIENTERROR);
- return undef;
- }
-
- # -<param> <value> or -no<param>
- foreach my $param (@trigger_params) {
- if ($option eq $param) {
- $trigger->{$param} = shift @args;
- next ARGS;
- }
- if ($option eq 'no'.$param) {
- $trigger->{$param} = undef;
- next ARGS;
- }
- }
-
- # -[no]<switch>
- foreach my $switch (@trigger_switches) {
- # -<switch>
- if ($option eq $switch) {
- $trigger->{$switch} = 1;
- next ARGS;
- }
- # -no<switch>
- elsif ($option eq 'no'.$switch) {
- $trigger->{$switch} = undef;
- next ARGS;
- }
- }
-
- # -<filter> <value>
- if ($filters{$option}) {
- push @{$trigger->{'filters'}}, [$option, shift @args, $filters{$option}->{'sub'}];
- next ARGS;
- }
-
- # -<nofilter>
- if ($option =~ /^no(.*)$/ && $filters{$1}) {
- my $filter = $1;
- # the new filters are the old grepped for everything except ones with name $filter
- @{$trigger->{'filters'}} = grep( $_->[0] ne $filter, @{$trigger->{'filters'}} );
- }
- }
-
- if (defined($trigger->{'replace'}) && ! $trigger->{'regexp'} && !$trigger->{'pattern'}) {
- Irssi::print("Trigger error: Can't have -replace without -regexp", MSGLEVEL_CLIENTERROR);
- return undef;
- }
-
- if ($trigger->{'pattern'} && $trigger->{'regexp'}) {
- Irssi::print("Trigger error: Can't have -pattern and -regexp in same trigger", MSGLEVEL_CLIENTERROR);
- return undef;
- }
-
- # remove types that are implied by -all
- if ($trigger->{'all'}) {
- foreach my $type (@all_types) {
- delete $trigger->{$type};
- }
- }
-
- # remove types for which the filters don't apply
- foreach my $type (@trigger_types) {
- if ($trigger->{$type}) {
- foreach my $filter (@{$trigger->{'filters'}}) {
- if (!grep {$_ eq $type} @{$filters{$filter->[0]}->{'types'}}) {
- Irssi::print("Warning: the filter -" . $filter->[0] . " can't apply to an event of type -$type, so I'm removing that type from this trigger.");
- delete $trigger->{$type};
- }
- }
- }
- }
-
- # check if it has at least one type
- my $has_a_type;
- foreach my $type (@trigger_types) {
- if ($trigger->{$type}) {
- $has_a_type = 1;
- last;
- }
- }
- if (!$has_a_type && !$trigger->{'all'}) {
- Irssi::print("Warning: this trigger doesn't trigger on any type of message. you probably want to add -publics or -all");
- }
-
- compile_trigger($trigger);
- %$thetrigger = %$trigger; # copy changes to real trigger
- return $thetrigger;
-}
-
-# TRIGGER DELETE <num>
-sub cmd_del {
- my ($data, $server, $item) = @_;
- my @args = shellwords($data);
- my $index = find_trigger(shift @args);
- if ($index != -1) {
- Irssi::print("Deleted ". ($index+1) .": ". to_string($triggers[$index]));
- splice (@triggers,$index,1);
- rebuild();
- $changed_since_last_save = 1;
- }
-}
-
-# TRIGGER MOVE <num> <num>
-sub cmd_move {
- my ($data, $server, $item) = @_;
- my @args = &shellwords($data);
- my $index = find_trigger(shift @args);
- if ($index != -1) {
- my $newindex = shift @args;
- if ($newindex < 1 || $newindex > scalar(@triggers)) {
- Irssi::print("$newindex is not a valid trigger number");
- return;
- }
- Irssi::print("Moved from ". ($index+1) ." to $newindex: ". to_string($triggers[$index]));
- $newindex -= 1; # array starts counting from 0
- my $trigger = splice (@triggers,$index,1); # remove from old place
- splice (@triggers,$newindex,0,($trigger)); # insert at new place
- rebuild();
- $changed_since_last_save = 1;
- }
-}
-
-# TRIGGER LIST
-sub cmd_list {
- Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'trigger_header');
- my $i=1;
- foreach my $trigger (@triggers) {
- Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'trigger_line', $i++, to_string($trigger));
- }
-}
-
-######################
-### initialisation ###
-######################
-
-command_bind('trigger help',\&cmd_help);
-command_bind('help trigger',\&cmd_help);
-command_bind('trigger add',\&cmd_add);
-command_bind('trigger change',\&cmd_change);
-command_bind('trigger move',\&cmd_move);
-command_bind('trigger list',\&cmd_list);
-command_bind('trigger delete',\&cmd_del);
-command_bind('trigger save',\&cmd_save);
-command_bind('trigger reload',\&cmd_load);
-command_bind 'trigger' => sub {
- my ( $data, $server, $item ) = @_;
- $data =~ s/\s+$//g;
- command_runsub('trigger', $data, $server, $item);
-};
-
-Irssi::signal_add('setup saved', \&autosave);
-Irssi::signal_add('setup changed', \&sig_setup_changed);
-
-# This makes tab completion work
-Irssi::command_set_options('trigger add',join(' ',@trigger_add_options));
-Irssi::command_set_options('trigger change',join(' ',@trigger_options));
-
-Irssi::settings_add_str($IRSSI{'name'}, 'trigger_file', Irssi::get_irssi_dir()."/triggers");
-
-cmd_load();
diff --git a/protocols/skype/t/livetest-bitlbee.sh b/protocols/skype/t/livetest-bitlbee.sh
deleted file mode 100755
index 7cbfbf6e..00000000
--- a/protocols/skype/t/livetest-bitlbee.sh
+++ /dev/null
@@ -1,116 +0,0 @@
-#!/usr/bin/env bash
-
-start_skyped()
-{
- python ../skyped.py "$@" > skypedtest.pid
- while true
- do
- [ -e skypedtest.pid ] || break
- pid=$(sed 's/.*: //' skypedtest.pid)
- if [ -n "$(ps -p $pid -o pid=)" ]; then
- sleep 5
- else
- start_skyped "$@"
- break
- fi
- done
-}
-
-BITLBEE=$1
-typeset -ix PORT=`echo $2 | egrep '^[0-9]{1,5}$'`
-SCRIPT=$3
-shift 3
-
-[ -n "$SCRIPT" -a -n "$BITLBEE" -a -e "$SCRIPT" -a "$PORT" -ne 0 ] || { echo Syntax: `basename "$0"` bitlbee-executable listening-port test-script test-script-args; exit 1; }
-
-# Create or empty test dir
-mkdir livetest 2>/dev/null || rm livetest/bitlbeetest*.xml bitlbeetest.pid 2>/dev/null
-
-# Run the bee
-echo Running bitlbee...
-$VALGRIND $BITLBEE -n -c bitlbee.conf -d livetest/ -D -P bitlbeetest.pid -p $PORT 2>bitlbee.log &
-sleep 2
-
-# Check if it's really running
-kill -0 `cat bitlbeetest.pid 2>/dev/null ` 2>/dev/null || { echo Failed to run bitlbee daemon on port $PORT; exit 1; }
-
-if [ -z "$TUNNELED_MODE" ]; then
- # Set up skyped
-
- rm -rf etc
- mkdir etc
- cd etc
- cp ../../skyped.cnf .
- cp ~/.skyped/skyped.cert.pem .
- cp ~/.skyped/skyped.key.pem .
- cd ..
- echo "[skyped]" > skyped.conf
- echo "username = $TEST_SKYPE_ID" >> skyped.conf
- SHA1=`which sha1sum`
- if [ -z "$SHA1" ]; then
- SHA1=`which sha1`
- fi
- if [ -z "$SHA1" ]; then
- echo Test failed
- echo "(Can't compute password for skyped.conf)"
- exit 77
- fi
- echo "password = $(echo -n $TEST_SKYPE_PASSWORD|$SHA1|sed 's/ *-$//')" >> skyped.conf
- # we use ~ here to test that resolve that syntax works
- echo "cert = $(pwd|sed "s|$HOME|~|")/etc/skyped.cert.pem" >> skyped.conf
- echo "key = $(pwd|sed "s|$HOME|~|")/etc/skyped.key.pem" >> skyped.conf
- echo "port = 2727" >> skyped.conf
-
- # Run skyped
- start_skyped -c skyped.conf -l skypedtest.log &
- sleep 2
-fi
-
-if [ "$TUNNELED_MODE" = "yes" ]; then
- rm -f tunnel.pid
- if [ -n "$TUNNEL_SCRIPT" ]; then
- $TUNNEL_SCRIPT &
- echo $! > tunnel.pid
- sleep 5
- fi
-fi
-
-# Run the test
-echo Running test script...
-"$SCRIPT" $*
-RET=$?
-
-if [ -z "$TUNNELED_MODE" ]; then
- # skyped runs on another host: no means to kill it
- # Kill skyped
- killall -TERM skype
- if [ -f skypedtest.pid ]; then
- pid=$(sed 's/.*: //' skypedtest.pid)
- rm skypedtest.pid
- [ -n "$(ps -p $pid -o pid=)" ] && kill -TERM $pid
- fi
-fi
-
-if [ "$TUNNELED_MODE" = "yes" ]; then
- if [ -n "$TUNNEL_SCRIPT" ]; then
- cat tunnel.pid >> /tmp/tunnel.pid
- kill `cat tunnel.pid`
- rm -f tunnel.pid
- fi
-fi
-
-# Kill bee
-echo Killing bitlbee...
-kill `cat bitlbeetest.pid`
-
-if [ "$TUNNELED_MODE" = "yes" ]; then
- # give the skyped a chance to timeout
- sleep 30
-fi
-
-# Return test result
-[ $RET -eq 0 ] && echo Test passed
-[ $RET -ne 0 ] && echo Test failed
-[ $RET -eq 22 ] && echo '(timed out)'
-[ $RET -eq 66 ] && echo '(environment variables missing)'
-exit $RET
diff --git a/protocols/skype/t/login-bitlbee.mock b/protocols/skype/t/login-bitlbee.mock
new file mode 100644
index 00000000..41273a83
--- /dev/null
+++ b/protocols/skype/t/login-bitlbee.mock
@@ -0,0 +1,7 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :Alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype on
+>> PRIVMSG &bitlbee :skype - Logging in: Logged in
diff --git a/protocols/skype/t/login-skyped.mock b/protocols/skype/t/login-skyped.mock
new file mode 100644
index 00000000..eacff2e6
--- /dev/null
+++ b/protocols/skype/t/login-skyped.mock
@@ -0,0 +1,16 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123, bob
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+>> GET USER bob ONLINESTATUS
+<< USER bob ONLINESTATUS ONLINE
+>> GET USER bob FULLNAME
+<< USER bob FULLNAME Bob
diff --git a/protocols/skype/t/msg-bitlbee.mock b/protocols/skype/t/msg-bitlbee.mock
new file mode 100644
index 00000000..42cc163d
--- /dev/null
+++ b/protocols/skype/t/msg-bitlbee.mock
@@ -0,0 +1,9 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :Alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype on
+>> :bob!bob@skype.com JOIN :&bitlbee
+<< PRIVMSG &bitlbee :bob: foo
+>> :bob!bob@skype.com PRIVMSG &bitlbee :alice: bar
diff --git a/protocols/skype/t/msg-skyped.mock b/protocols/skype/t/msg-skyped.mock
new file mode 100644
index 00000000..03efb6bc
--- /dev/null
+++ b/protocols/skype/t/msg-skyped.mock
@@ -0,0 +1,49 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123, bob
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+>> GET USER bob ONLINESTATUS
+<< USER bob ONLINESTATUS ONLINE
+>> GET USER bob FULLNAME
+<< USER bob FULLNAME Bob
+>> MESSAGE bob foo
+<< CHATMESSAGE 290 STATUS SENDING
+<< CHAT #alice/$bob;ea753190f0a3e49b NAME #alice/$bob;ea753190f0a3e49b
+<< CHAT #alice/$bob;ea753190f0a3e49b STATUS DIALOG
+<< CHATMEMBER 287 ROLE USER
+<< CHAT #alice/$bob;ea753190f0a3e49b MYROLE USER
+<< CHAT #alice/$bob;ea753190f0a3e49b MEMBERS alice bob
+<< CHAT #alice/$bob;ea753190f0a3e49b ACTIVEMEMBERS alice
+<< CHAT #alice/$bob;ea753190f0a3e49b STATUS DIALOG
+<< CHAT #alice/$bob;ea753190f0a3e49b TIMESTAMP 1357987847
+<< CHAT #alice/$bob;ea753190f0a3e49b DIALOG_PARTNER bob
+<< CHAT #alice/$bob;ea753190f0a3e49b MEMBERS alice bob
+<< CHAT #alice/$bob;ea753190f0a3e49b FRIENDLYNAME bob | foo
+<< CHAT #alice/$bob;ea753190f0a3e49b POSTERS alice
+<< CHAT #alice/$bob;ea753190f0a3e49b ACTIVITY_TIMESTAMP 1357987847
+<< CHAT #alice/$bob;ea753190f0a3e49b FRIENDLYNAME bob | foo
+<< CHATMESSAGE 289 STATUS SENDING
+<< CHATMESSAGE 290 STATUS SENDING
+<< CHATMESSAGE 289 STATUS SENT
+<< CHATMESSAGE 290 STATUS SENT
+<< CHATMEMBER 288 IS_ACTIVE TRUE
+<< CHAT #alice/$bob;ea753190f0a3e49b ACTIVEMEMBERS alice bob
+<< CHAT #alice/$bob;ea753190f0a3e49b POSTERS alice bob
+<< CHAT #alice/$bob;ea753190f0a3e49b ACTIVITY_TIMESTAMP 1357987875
+<< CHATMESSAGE 293 STATUS RECEIVED
+>> GET CHATMESSAGE 293 FROM_HANDLE
+<< CHATMESSAGE 293 FROM_HANDLE bob
+>> GET CHATMESSAGE 293 BODY
+<< CHATMESSAGE 293 BODY bar
+>> GET CHATMESSAGE 293 TYPE
+<< CHATMESSAGE 293 TYPE SAID
+>> GET CHATMESSAGE 293 CHATNAME
+<< CHATMESSAGE 293 CHATNAME #alice/$bob;ea753190f0a3e49b
diff --git a/protocols/skype/t/set-mood-text-bitlbee.mock b/protocols/skype/t/set-mood-text-bitlbee.mock
new file mode 100644
index 00000000..f017f8bd
--- /dev/null
+++ b/protocols/skype/t/set-mood-text-bitlbee.mock
@@ -0,0 +1,9 @@
+>> NOTICE AUTH
+<< NICK alice
+<< USER alice alice localhost :Alice
+>> PRIVMSG &bitlbee
+<< PRIVMSG &bitlbee :account add skype alice foo
+<< PRIVMSG &bitlbee :account skype set skypeconsole_receive true
+<< PRIVMSG &bitlbee :account skype on
+<< PRIVMSG &bitlbee :account skype set mood_text "foo bar"
+>> PRIVMSG &bitlbee :alice: PROFILE MOOD_TEXT foo bar
diff --git a/protocols/skype/t/set-mood-text-skyped.mock b/protocols/skype/t/set-mood-text-skyped.mock
new file mode 100644
index 00000000..566f4234
--- /dev/null
+++ b/protocols/skype/t/set-mood-text-skyped.mock
@@ -0,0 +1,14 @@
+>> SEARCH GROUPS CUSTOM
+<< GROUPS 48, 49
+>> SEARCH FRIENDS
+<< USERS echo123
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> SET USERSTATUS ONLINE
+<< USERSTATUS ONLINE
+>> GET USER echo123 ONLINESTATUS
+<< USER echo123 ONLINESTATUS ONLINE
+>> GET USER echo123 FULLNAME
+<< USER echo123 FULLNAME Echo / Sound Test Service
+>> SET PROFILE MOOD_TEXT foo bar
+<< PROFILE MOOD_TEXT foo bar
diff --git a/protocols/skype/test.py b/protocols/skype/test.py
new file mode 100755
index 00000000..63652f76
--- /dev/null
+++ b/protocols/skype/test.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python2.7
+
+import subprocess
+import sys
+import pexpect
+import unittest
+import shutil
+import os
+import hashlib
+
+def openssl(args):
+ with open(os.devnull, "w") as devnull:
+ proc = subprocess.Popen(['openssl'] + args, stdin=subprocess.PIPE, stderr=devnull)
+ for i in range(6):
+ proc.stdin.write("\n")
+ proc.stdin.close()
+ proc.communicate()
+def setupSkyped():
+ try:
+ shutil.rmtree("t/skyped")
+ except OSError:
+ pass
+ os.makedirs("t/skyped")
+ cwd = os.getcwd()
+ os.chdir("t/skyped")
+ try:
+ shutil.copyfile("../../skyped.cnf", "skyped.cnf")
+ openssl(['req', '-new', '-x509', '-days', '365', '-nodes', '-config', 'skyped.cnf', '-out', 'skyped.cert.pem', '-keyout', 'skyped.key.pem'])
+ with open("skyped.conf", "w") as sock:
+ sock.write("[skyped]\n")
+ sock.write("username = alice\n")
+ sock.write("password = %s\n" % hashlib.sha1("foo").hexdigest())
+ sock.write("cert = %s/skyped.cert.pem\n" % os.getcwd())
+ sock.write("key = %s/skyped.key.pem\n" % os.getcwd())
+ sock.write("port = 2727\n")
+ finally:
+ os.chdir(cwd)
+
+class Test(unittest.TestCase):
+ def mock(self, name):
+ with open("t/skyped.log", "w") as skyped_log,\
+ open("t/pexpect.log", "w") as pexpect_log:
+ skyped = subprocess.Popen([sys.executable, "skyped.py",
+ "-c", "t/skyped/skyped.conf", "-n", "-d", "-m", "t/%s-skyped.mock" % name],
+ stdout=skyped_log, stderr=subprocess.STDOUT)
+ try:
+ bitlbee = pexpect.spawn('../../bitlbee', ['-d', 't/bitlbee'], logfile=pexpect_log)
+ if os.environ.get('ATTACH_GDB'):
+ subprocess.Popen(['gdb', '-batch-silent',
+ '-ex', 'set logging overwrite on',
+ '-ex', 'set logging file t/gdb-%s.log' % bitlbee.pid,
+ '-ex', 'set logging on',
+ '-ex', 'handle all pass nostop noprint',
+ '-ex', 'handle SIGSEGV pass stop print',
+ '-ex', 'set pagination 0',
+ '-ex', 'continue',
+ '-ex', 'backtrace full',
+ '-ex', 'info registers',
+ '-ex', 'thread apply all backtrace',
+ '-ex', 'quit',
+ '../../bitlbee', str(bitlbee.pid) ])
+ bitlbee_mock = open("t/%s-bitlbee.mock" % name)
+ for i in bitlbee_mock.readlines():
+ line = i.strip()
+ if line.startswith(">> "):
+ bitlbee.expect_exact(line[3:], timeout=10)
+ elif line.startswith("<< "):
+ bitlbee.sendline(line[3:])
+ bitlbee_mock.close()
+ bitlbee.close()
+ finally:
+ skyped.terminate()
+ skyped.communicate()
+
+ def setUp(self):
+ try:
+ shutil.rmtree("t/bitlbee")
+ except OSError:
+ pass
+ os.makedirs("t/bitlbee")
+
+ def testMsg(self):
+ self.mock("msg")
+
+ def testLogin(self):
+ self.mock("login")
+
+ def testInfo(self):
+ self.mock("info")
+
+ def testCall(self):
+ self.mock("call")
+
+ def testCallFailed(self):
+ self.mock("call-failed")
+
+ def testAddYes(self):
+ self.mock("add-yes")
+
+ def testAddedYes(self):
+ self.mock("added-yes")
+
+ def testAddedNo(self):
+ self.mock("added-no")
+
+ def testGroupchatInvited(self):
+ self.mock("groupchat-invited")
+
+ def testGroupchatInvite(self):
+ self.mock("groupchat-invite")
+
+ def testGroupchatLeave(self):
+ self.mock("groupchat-leave")
+
+ def testCalledYes(self):
+ self.mock("called-yes")
+
+ def testCalledNo(self):
+ self.mock("called-no")
+
+ def testFiletransfer(self):
+ self.mock("filetransfer")
+
+ def testGroupRead(self):
+ self.mock("group-read")
+
+ def testCtcpHelp(self):
+ self.mock("ctcp-help")
+
+ def testSetMoodText(self):
+ self.mock("set-mood-text")
+
+if __name__ == '__main__':
+ setupSkyped()
+ unittest.main()
diff --git a/protocols/twitter/Makefile b/protocols/twitter/Makefile
index a1ad2301..ce87090f 100644
--- a/protocols/twitter/Makefile
+++ b/protocols/twitter/Makefile
@@ -37,7 +37,7 @@ $(objects): ../../Makefile.settings Makefile
$(objects): %.o: $(_SRCDIR_)%.c
@echo '*' Compiling $<
- @$(CC) -c $(CFLAGS) $< -o $@
+ @$(CC) -c $(CFLAGS) $(CFLAGS_BITLBEE) $< -o $@
twitter_mod.o: $(objects)
@echo '*' Linking twitter_mod.o
diff --git a/protocols/twitter/twitter.c b/protocols/twitter/twitter.c
index f7e1ec76..db61ba7c 100644
--- a/protocols/twitter/twitter.c
+++ b/protocols/twitter/twitter.c
@@ -3,7 +3,8 @@
* BitlBee - An IRC to IM gateway *
* Simple module to facilitate twitter functionality. *
* *
-* Copyright 2009 Geert Mulders <g.c.w.m.mulders@gmail.com> *
+* Copyright 2009-2010 Geert Mulders <g.c.w.m.mulders@gmail.com> *
+* Copyright 2010-2013 Wilmer van der Gaast <wilmer@gaast.net> *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public *
@@ -28,17 +29,7 @@
#include "twitter_lib.h"
#include "url.h"
-#define twitter_msg( ic, fmt... ) \
- do { \
- struct twitter_data *td = ic->proto_data; \
- if( td->timeline_gc ) \
- imcb_chat_log( td->timeline_gc, fmt ); \
- else \
- imcb_log( ic, fmt ); \
- } while( 0 );
-
GSList *twitter_connections = NULL;
-
/**
* Main loop function
*/
@@ -61,15 +52,57 @@ static void twitter_main_loop_start(struct im_connection *ic)
{
struct twitter_data *td = ic->proto_data;
+ /* Create the room now that we "logged in". */
+ if (td->flags & TWITTER_MODE_CHAT)
+ twitter_groupchat_init(ic);
+
imcb_log(ic, "Getting initial statuses");
- // Run this once. After this queue the main loop function.
+ // Run this once. After this queue the main loop function (or open the
+ // stream if available).
twitter_main_loop(ic, -1, 0);
+
+ if (set_getbool(&ic->acc->set, "stream")) {
+ /* That fetch was just to get backlog, the stream will give
+ us the rest. \o/ */
+ twitter_open_stream(ic);
+
+ /* Stream sends keepalives (empty lines) or actual data at
+ least twice a minute. Disconnect if this stops. */
+ ic->flags |= OPT_PONGS;
+ } else {
+ /* Not using the streaming API, so keep polling the old-
+ fashioned way. :-( */
+ td->main_loop_id =
+ b_timeout_add(set_getint(&ic->acc->set, "fetch_interval") * 1000,
+ twitter_main_loop, ic);
+ }
+}
+
+struct groupchat *twitter_groupchat_init(struct im_connection *ic)
+{
+ char *name_hint;
+ struct groupchat *gc;
+ struct twitter_data *td = ic->proto_data;
+ GSList *l;
+
+ if (td->timeline_gc)
+ return td->timeline_gc;
+
+ td->timeline_gc = gc = imcb_chat_new(ic, "twitter/timeline");
+
+ name_hint = g_strdup_printf("%s_%s", td->prefix, ic->acc->user);
+ imcb_chat_name_hint(gc, name_hint);
+ g_free(name_hint);
- // Queue the main_loop
- // Save the return value, so we can remove the timeout on logout.
- td->main_loop_id =
- b_timeout_add(set_getint(&ic->acc->set, "fetch_interval") * 1000, twitter_main_loop, ic);
+ for (l = ic->bee->users; l; l = l->next) {
+ bee_user_t *bu = l->data;
+ if (bu->ic == ic)
+ imcb_chat_add_buddy(gc, bu->handle);
+ }
+ imcb_chat_add_buddy(gc, ic->acc->user);
+
+ return gc;
}
static void twitter_oauth_start(struct im_connection *ic);
@@ -82,11 +115,10 @@ void twitter_login_finish(struct im_connection *ic)
if (set_getbool(&ic->acc->set, "oauth") && !td->oauth_info)
twitter_oauth_start(ic);
- else if (g_strcasecmp(set_getstr(&ic->acc->set, "mode"), "one") != 0 &&
- !(td->flags & TWITTER_HAVE_FRIENDS)) {
+ else if (!(td->flags & TWITTER_MODE_ONE) &&
+ !(td->flags & TWITTER_HAVE_FRIENDS)) {
imcb_log(ic, "Getting contact list");
twitter_get_friends_ids(ic, -1);
- //twitter_get_statuses_friends(ic, -1);
} else
twitter_main_loop_start(ic);
}
@@ -160,17 +192,18 @@ static gboolean twitter_oauth_callback(struct oauth_info *info)
imcb_buddy_msg(ic, name, msg, 0, 0);
g_free(msg);
} else if (info->stage == OAUTH_ACCESS_TOKEN) {
+ const char *sn;
+
if (info->token == NULL || info->token_secret == NULL) {
imcb_error(ic, "OAuth error: %s", twitter_parse_error(info->http));
imc_logout(ic, TRUE);
return FALSE;
- } else {
- const char *sn = oauth_params_get(&info->params, "screen_name");
-
- if (sn != NULL && ic->acc->prpl->handle_cmp(sn, ic->acc->user) != 0) {
+ }
+
+ if ((sn = oauth_params_get(&info->params, "screen_name"))) {
+ if (ic->acc->prpl->handle_cmp(sn, ic->acc->user) != 0)
imcb_log(ic, "Warning: You logged in via OAuth as %s "
- "instead of %s.", sn, ic->acc->user);
- }
+ "instead of %s.", sn, ic->acc->user);
g_free(td->user);
td->user = g_strdup(sn);
}
@@ -186,16 +219,6 @@ static gboolean twitter_oauth_callback(struct oauth_info *info)
return TRUE;
}
-
-static char *set_eval_mode(set_t * set, char *value)
-{
- if (g_strcasecmp(value, "one") == 0 ||
- g_strcasecmp(value, "many") == 0 || g_strcasecmp(value, "chat") == 0)
- return value;
- else
- return NULL;
-}
-
int twitter_url_len_diff(gchar *msg, unsigned int target_len)
{
int url_len_diff = 0;
@@ -232,25 +255,39 @@ static gboolean twitter_length_check(struct im_connection *ic, gchar * msg)
if (max == 0 || (len = g_utf8_strlen(msg, -1) + url_len_diff) <= max)
return TRUE;
- imcb_error(ic, "Maximum message length exceeded: %d > %d", len, max);
+ twitter_log(ic, "Maximum message length exceeded: %d > %d", len, max);
return FALSE;
}
+static char *set_eval_commands(set_t * set, char *value)
+{
+ if (g_strcasecmp(value, "strict") == 0 )
+ return value;
+ else
+ return set_eval_bool(set, value);
+}
+
+static char *set_eval_mode(set_t * set, char *value)
+{
+ if (g_strcasecmp(value, "one") == 0 ||
+ g_strcasecmp(value, "many") == 0 || g_strcasecmp(value, "chat") == 0)
+ return value;
+ else
+ return NULL;
+}
+
static void twitter_init(account_t * acc)
{
set_t *s;
char *def_url;
- char *def_oauth;
char *def_tul;
if (strcmp(acc->prpl->name, "twitter") == 0) {
def_url = TWITTER_API_URL;
- def_oauth = "true";
def_tul = "20";
} else { /* if( strcmp( acc->prpl->name, "identica" ) == 0 ) */
def_url = IDENTICA_API_URL;
- def_oauth = "true";
def_tul = "0";
}
@@ -259,7 +296,7 @@ static void twitter_init(account_t * acc)
s = set_add(&acc->set, "base_url", def_url, NULL, acc);
s->flags |= ACC_SET_OFFLINE_ONLY;
- s = set_add(&acc->set, "commands", "true", set_eval_bool, acc);
+ s = set_add(&acc->set, "commands", "true", set_eval_commands, acc);
s = set_add(&acc->set, "fetch_interval", "60", set_eval_int, acc);
s->flags |= ACC_SET_OFFLINE_ONLY;
@@ -273,18 +310,22 @@ static void twitter_init(account_t * acc)
s = set_add(&acc->set, "mode", "chat", set_eval_mode, acc);
s->flags |= ACC_SET_OFFLINE_ONLY;
- s = set_add(&acc->set, "oauth", def_oauth, set_eval_oauth, acc);
+ s = set_add(&acc->set, "oauth", "true", set_eval_oauth, acc);
s = set_add(&acc->set, "show_ids", "true", set_eval_bool, acc);
- s->flags |= ACC_SET_OFFLINE_ONLY;
s = set_add(&acc->set, "show_old_mentions", "20", set_eval_int, acc);
s = set_add(&acc->set, "strip_newlines", "false", set_eval_bool, acc);
+
+ if (strcmp(acc->prpl->name, "twitter") == 0) {
+ s = set_add(&acc->set, "stream", "true", set_eval_bool, acc);
+ s->flags |= ACC_SET_OFFLINE_ONLY;
+ }
}
/**
- * Login method. Since the twitter API works with seperate HTTP request we
+ * Login method. Since the twitter API works with separate HTTP request we
* only save the user and pass to the twitter_data object.
*/
static void twitter_login(account_t * acc)
@@ -302,6 +343,12 @@ static void twitter_login(account_t * acc)
return;
}
+ if (!strstr(url.host, "twitter.com") &&
+ set_getbool(&ic->acc->set, "stream")) {
+ imcb_error(ic, "Warning: The streaming API is only supported by Twitter, "
+ "and you seem to be connecting to a different service.");
+ }
+
imcb_log(ic, "Connecting");
twitter_connections = g_slist_append(twitter_connections, ic);
@@ -342,8 +389,16 @@ static void twitter_login(account_t * acc)
imcb_add_buddy(ic, name, NULL);
imcb_buddy_status(ic, name, OPT_LOGGED_IN, NULL, NULL);
- if (set_getbool(&acc->set, "show_ids"))
- td->log = g_new0(struct twitter_log_data, TWITTER_LOG_LENGTH);
+ td->log = g_new0(struct twitter_log_data, TWITTER_LOG_LENGTH);
+ td->log_id = -1;
+
+ s = set_getstr(&ic->acc->set, "mode");
+ if (g_strcasecmp(s, "one") == 0)
+ td->flags |= TWITTER_MODE_ONE;
+ else if (g_strcasecmp(s, "many") == 0)
+ td->flags |= TWITTER_MODE_MANY;
+ else
+ td->flags |= TWITTER_MODE_CHAT;
twitter_login_finish(ic);
}
@@ -365,6 +420,7 @@ static void twitter_logout(struct im_connection *ic)
imcb_chat_free(td->timeline_gc);
if (td) {
+ http_close(td->stream);
oauth_info_free(td->oauth_info);
g_free(td->user);
g_free(td->prefix);
@@ -413,13 +469,6 @@ static int twitter_buddy_msg(struct im_connection *ic, char *who, char *message,
return (0);
}
-/**
- *
- */
-static void twitter_set_my_name(struct im_connection *ic, char *info)
-{
-}
-
static void twitter_get_info(struct im_connection *ic, char *who)
{
}
@@ -492,132 +541,131 @@ static void twitter_buddy_data_free(struct bee_user *bu)
g_free(bu->data);
}
+/** Convert the given bitlbee tweet ID, bitlbee username, or twitter tweet ID
+ * into a twitter tweet ID.
+ *
+ * Returns 0 if the user provides garbage.
+ */
+static guint64 twitter_message_id_from_command_arg(struct im_connection *ic, char *arg, bee_user_t **bu_) {
+ struct twitter_data *td = ic->proto_data;
+ struct twitter_user_data *tud;
+ bee_user_t *bu = NULL;
+ guint64 id = 0;
+
+ if (bu_)
+ *bu_ = NULL;
+ if (!arg || !arg[0])
+ return 0;
+
+ if (arg[0] != '#' && (bu = bee_user_by_handle(ic->bee, ic, arg))) {
+ if ((tud = bu->data))
+ id = tud->last_id;
+ } else {
+ if (arg[0] == '#')
+ arg++;
+ if (sscanf(arg, "%" G_GINT64_MODIFIER "x", &id) == 1 &&
+ id < TWITTER_LOG_LENGTH) {
+ bu = td->log[id].bu;
+ id = td->log[id].id;
+ /* Beware of dangling pointers! */
+ if (!g_slist_find(ic->bee->users, bu))
+ bu = NULL;
+ } else if (sscanf(arg, "%" G_GINT64_MODIFIER "d", &id) == 1) {
+ /* Allow normal tweet IDs as well; not a very useful
+ feature but it's always been there. Just ignore
+ very low IDs to avoid accidents. */
+ if (id < 1000000)
+ id = 0;
+ }
+ }
+ if (bu_)
+ *bu_ = bu;
+ return id;
+}
+
static void twitter_handle_command(struct im_connection *ic, char *message)
{
struct twitter_data *td = ic->proto_data;
char *cmds, **cmd, *new = NULL;
- guint64 in_reply_to = 0;
+ guint64 in_reply_to = 0, id;
+ gboolean allow_post =
+ g_strcasecmp(set_getstr(&ic->acc->set, "commands"), "strict") != 0;
+ bee_user_t *bu = NULL;
cmds = g_strdup(message);
cmd = split_command_parts(cmds);
if (cmd[0] == NULL) {
- g_free(cmds);
- return;
- } else if (!set_getbool(&ic->acc->set, "commands")) {
- /* Not supporting commands. */
+ goto eof;
+ } else if (!set_getbool(&ic->acc->set, "commands") && allow_post) {
+ /* Not supporting commands if "commands" is set to true/strict. */
} else if (g_strcasecmp(cmd[0], "undo") == 0) {
- guint64 id;
-
if (cmd[1] == NULL)
twitter_status_destroy(ic, td->last_status_id);
- else if (sscanf(cmd[1], "%" G_GUINT64_FORMAT, &id) == 1) {
- if (id < TWITTER_LOG_LENGTH && td->log)
- id = td->log[id].id;
-
+ else if ((id = twitter_message_id_from_command_arg(ic, cmd[1], NULL)))
twitter_status_destroy(ic, id);
- } else
- twitter_msg(ic, "Could not undo last action");
+ else
+ twitter_log(ic, "Could not undo last action");
- g_free(cmds);
- return;
+ goto eof;
+ } else if (g_strcasecmp(cmd[0], "favourite") == 0 && cmd[1]) {
+ if ((id = twitter_message_id_from_command_arg(ic, cmd[1], NULL))) {
+ twitter_favourite_tweet(ic, id);
+ } else {
+ twitter_log(ic, "Please provide a message ID or username.");
+ }
+ goto eof;
} else if (g_strcasecmp(cmd[0], "follow") == 0 && cmd[1]) {
twitter_add_buddy(ic, cmd[1], NULL);
- g_free(cmds);
- return;
+ goto eof;
} else if (g_strcasecmp(cmd[0], "unfollow") == 0 && cmd[1]) {
twitter_remove_buddy(ic, cmd[1], NULL);
- g_free(cmds);
- return;
+ goto eof;
} else if ((g_strcasecmp(cmd[0], "report") == 0 ||
g_strcasecmp(cmd[0], "spam") == 0) && cmd[1]) {
- char * screen_name;
- guint64 id;
- screen_name = cmd[1];
+ char *screen_name;
+
/* Report nominally works on users but look up the user who
posted the given ID if the user wants to do it that way */
- if (g_str_has_prefix(cmd[1], "#") &&
- sscanf(cmd[1] + 1, "%" G_GUINT64_FORMAT, &id) == 1) {
- if (id < TWITTER_LOG_LENGTH && td->log) {
- if (g_slist_find(ic->bee->users, td->log[id].bu)) {
- screen_name = td->log[id].bu->handle;
- }
- }
- }
+ twitter_message_id_from_command_arg(ic, cmd[1], &bu);
+ if (bu)
+ screen_name = bu->handle;
+ else
+ screen_name = cmd[1];
+
twitter_report_spam(ic, screen_name);
- g_free(cmds);
- return;
+ goto eof;
} else if (g_strcasecmp(cmd[0], "rt") == 0 && cmd[1]) {
- struct twitter_user_data *tud;
- bee_user_t *bu;
- guint64 id;
-
- if (g_str_has_prefix(cmd[1], "#") &&
- sscanf(cmd[1] + 1, "%" G_GUINT64_FORMAT, &id) == 1) {
- if (id < TWITTER_LOG_LENGTH && td->log)
- id = td->log[id].id;
- } else if ((bu = bee_user_by_handle(ic->bee, ic, cmd[1])) &&
- (tud = bu->data) && tud->last_id)
- id = tud->last_id;
- else if (sscanf(cmd[1], "%" G_GUINT64_FORMAT, &id) == 1){
- if (id < TWITTER_LOG_LENGTH && td->log)
- id = td->log[id].id;
- }
+ id = twitter_message_id_from_command_arg(ic, cmd[1], NULL);
td->last_status_id = 0;
if (id)
twitter_status_retweet(ic, id);
else
- twitter_msg(ic, "User `%s' does not exist or didn't "
+ twitter_log(ic, "User `%s' does not exist or didn't "
"post any statuses recently", cmd[1]);
- g_free(cmds);
- return;
+ goto eof;
} else if (g_strcasecmp(cmd[0], "reply") == 0 && cmd[1] && cmd[2]) {
- struct twitter_user_data *tud;
- bee_user_t *bu = NULL;
- guint64 id = 0;
-
- if (g_str_has_prefix(cmd[1], "#") &&
- sscanf(cmd[1] + 1, "%" G_GUINT64_FORMAT, &id) == 1 &&
- (id < TWITTER_LOG_LENGTH) && td->log) {
- bu = td->log[id].bu;
- if (g_slist_find(ic->bee->users, bu))
- id = td->log[id].id;
- else
- bu = NULL;
- } else if ((bu = bee_user_by_handle(ic->bee, ic, cmd[1])) &&
- (tud = bu->data) && tud->last_id) {
- id = tud->last_id;
- } else if (sscanf(cmd[1], "%" G_GUINT64_FORMAT, &id) == 1 &&
- (id < TWITTER_LOG_LENGTH) && td->log) {
- bu = td->log[id].bu;
- if (g_slist_find(ic->bee->users, bu))
- id = td->log[id].id;
- else
- bu = NULL;
- }
-
+ id = twitter_message_id_from_command_arg(ic, cmd[1], &bu);
if (!id || !bu) {
- twitter_msg(ic, "User `%s' does not exist or didn't "
+ twitter_log(ic, "User `%s' does not exist or didn't "
"post any statuses recently", cmd[1]);
- return;
+ goto eof;
}
message = new = g_strdup_printf("@%s %s", bu->handle, message + (cmd[2] - cmd[0]));
in_reply_to = id;
+ allow_post = TRUE;
} else if (g_strcasecmp(cmd[0], "post") == 0) {
message += 5;
+ allow_post = TRUE;
}
- {
+ if (allow_post) {
char *s;
- bee_user_t *bu;
- if (!twitter_length_check(ic, message)) {
- g_free(new);
- g_free(cmds);
- return;
- }
+ if (!twitter_length_check(ic, message))
+ goto eof;
s = cmd[0] + strlen(cmd[0]) - 1;
if (!new && s > cmd[0] && (*s == ':' || *s == ',')) {
@@ -640,11 +688,33 @@ static void twitter_handle_command(struct im_connection *ic, char *message)
this would delete the second-last Tweet. Prevent that. */
td->last_status_id = 0;
twitter_post_status(ic, message, in_reply_to);
- g_free(new);
+ } else {
+ twitter_log(ic, "Unknown command: %s", cmd[0]);
}
+eof:
+ g_free(new);
g_free(cmds);
}
+void twitter_log(struct im_connection *ic, char *format, ... )
+{
+ struct twitter_data *td = ic->proto_data;
+ va_list params;
+ char *text;
+
+ va_start(params, format);
+ text = g_strdup_vprintf(format, params);
+ va_end(params);
+
+ if (td->timeline_gc)
+ imcb_chat_log(td->timeline_gc, "%s", text);
+ else
+ imcb_log(ic, "%s", text);
+
+ g_free(text);
+}
+
+
void twitter_initmodule()
{
struct prpl *ret = g_new0(struct prpl, 1);
@@ -656,7 +726,6 @@ void twitter_initmodule()
ret->logout = twitter_logout;
ret->buddy_msg = twitter_buddy_msg;
ret->get_info = twitter_get_info;
- ret->set_my_name = twitter_set_my_name;
ret->add_buddy = twitter_add_buddy;
ret->remove_buddy = twitter_remove_buddy;
ret->chat_msg = twitter_chat_msg;
diff --git a/protocols/twitter/twitter.h b/protocols/twitter/twitter.h
index 14e43824..8792b7c9 100644
--- a/protocols/twitter/twitter.h
+++ b/protocols/twitter/twitter.h
@@ -3,7 +3,8 @@
* BitlBee - An IRC to IM gateway *
* Simple module to facilitate twitter functionality. *
* *
-* Copyright 2009 Geert Mulders <g.c.w.m.mulders@gmail.com> *
+* Copyright 2009-2010 Geert Mulders <g.c.w.m.mulders@gmail.com> *
+* Copyright 2010-2012 Wilmer van der Gaast <wilmer@gaast.net> *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public *
@@ -34,10 +35,13 @@
typedef enum
{
- TWITTER_HAVE_FRIENDS = 1,
+ TWITTER_HAVE_FRIENDS = 0x00001,
+ TWITTER_MODE_ONE = 0x00002,
+ TWITTER_MODE_MANY = 0x00004,
+ TWITTER_MODE_CHAT = 0x00008,
TWITTER_DOING_TIMELINE = 0x10000,
- TWITTER_GOT_TIMELINE = 0x20000,
- TWITTER_GOT_MENTIONS = 0x40000,
+ TWITTER_GOT_TIMELINE = 0x20000,
+ TWITTER_GOT_MENTIONS = 0x40000,
} twitter_flags_t;
struct twitter_log_data;
@@ -56,6 +60,7 @@ struct twitter_data
guint64 last_status_id; /* For undo */
gint main_loop_id;
+ struct http_request *stream;
struct groupchat *timeline_gc;
gint http_fails;
twitter_flags_t flags;
@@ -79,7 +84,7 @@ struct twitter_user_data
time_t last_time;
};
-#define TWITTER_LOG_LENGTH 100
+#define TWITTER_LOG_LENGTH 256
struct twitter_log_data
{
guint64 id;
@@ -98,4 +103,7 @@ void twitter_login_finish( struct im_connection *ic );
struct http_request;
char *twitter_parse_error( struct http_request *req );
+void twitter_log(struct im_connection *ic, char *format, ... );
+struct groupchat *twitter_groupchat_init(struct im_connection *ic);
+
#endif //_TWITTER_H
diff --git a/protocols/twitter/twitter_http.c b/protocols/twitter/twitter_http.c
index dbac5461..0f1ab518 100644
--- a/protocols/twitter/twitter_http.c
+++ b/protocols/twitter/twitter_http.c
@@ -46,14 +46,15 @@ static char *twitter_url_append(char *url, char *key, char *value);
* Do a request.
* This is actually pretty generic function... Perhaps it should move to the lib/http_client.c
*/
-void *twitter_http(struct im_connection *ic, char *url_string, http_input_function func,
- gpointer data, int is_post, char **arguments, int arguments_len)
+struct http_request *twitter_http(struct im_connection *ic, char *url_string, http_input_function func,
+ gpointer data, int is_post, char **arguments, int arguments_len)
{
struct twitter_data *td = ic->proto_data;
char *tmp;
GString *request = g_string_new("");
void *ret;
char *url_arguments;
+ url_t *base_url = NULL;
url_arguments = g_strdup("");
@@ -66,20 +67,34 @@ void *twitter_http(struct im_connection *ic, char *url_string, http_input_functi
url_arguments = tmp;
}
}
+
+ if (strstr(url_string, "://")) {
+ base_url = g_new0(url_t, 1);
+ if (!url_set(base_url, url_string)) {
+ g_free(base_url);
+ return NULL;
+ }
+ }
+
// Make the request.
g_string_printf(request, "%s %s%s%s%s HTTP/1.0\r\n"
"Host: %s\r\n"
"User-Agent: BitlBee " BITLBEE_VERSION " " ARCH "/" CPU "\r\n",
is_post ? "POST" : "GET",
- td->url_path, url_string,
- is_post ? "" : "?", is_post ? "" : url_arguments, td->url_host);
+ base_url ? base_url->file : td->url_path,
+ base_url ? "" : url_string,
+ is_post ? "" : "?", is_post ? "" : url_arguments,
+ base_url ? base_url->host : td->url_host);
// If a pass and user are given we append them to the request.
if (td->oauth_info) {
char *full_header;
char *full_url;
- full_url = g_strconcat(set_getstr(&ic->acc->set, "base_url"), url_string, NULL);
+ if (base_url)
+ full_url = g_strdup(url_string);
+ else
+ full_url = g_strconcat(set_getstr(&ic->acc->set, "base_url"), url_string, NULL);
full_header = oauth_http_header(td->oauth_info, is_post ? "POST" : "GET",
full_url, url_arguments);
@@ -108,10 +123,23 @@ void *twitter_http(struct im_connection *ic, char *url_string, http_input_functi
g_string_append(request, "\r\n");
}
- ret = http_dorequest(td->url_host, td->url_port, td->url_ssl, request->str, func, data);
+ if (base_url)
+ ret = http_dorequest(base_url->host, base_url->port, base_url->proto == PROTO_HTTPS, request->str, func, data);
+ else
+ ret = http_dorequest(td->url_host, td->url_port, td->url_ssl, request->str, func, data);
g_free(url_arguments);
g_string_free(request, TRUE);
+ g_free(base_url);
+ return ret;
+}
+
+struct http_request *twitter_http_f(struct im_connection *ic, char *url_string, http_input_function func,
+ gpointer data, int is_post, char **arguments, int arguments_len, twitter_http_flags_t flags)
+{
+ struct http_request *ret = twitter_http(ic, url_string, func, data, is_post, arguments, arguments_len);
+ if (ret)
+ ret->flags |= flags;
return ret;
}
diff --git a/protocols/twitter/twitter_http.h b/protocols/twitter/twitter_http.h
index 393a1c26..09ef350c 100644
--- a/protocols/twitter/twitter_http.h
+++ b/protocols/twitter/twitter_http.h
@@ -27,10 +27,18 @@
#include "nogaim.h"
#include "http_client.h"
+typedef enum {
+ /* With this set, twitter_http_post() will post a generic confirmation
+ message to the user. */
+ TWITTER_HTTP_USER_ACK = 0x1000000,
+} twitter_http_flags_t;
+
struct oauth_info;
-void *twitter_http(struct im_connection *ic, char *url_string, http_input_function func,
- gpointer data, int is_post, char** arguments, int arguments_len);
+struct http_request *twitter_http(struct im_connection *ic, char *url_string, http_input_function func,
+ gpointer data, int is_post, char** arguments, int arguments_len);
+struct http_request *twitter_http_f(struct im_connection *ic, char *url_string, http_input_function func,
+ gpointer data, int is_post, char** arguments, int arguments_len, twitter_http_flags_t flags);
#endif //_TWITTER_HTTP_H
diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c
index 20a2708d..05222af2 100644
--- a/protocols/twitter/twitter_lib.c
+++ b/protocols/twitter/twitter_lib.c
@@ -4,7 +4,7 @@
* Simple module to facilitate twitter functionality. *
* *
* Copyright 2009-2010 Geert Mulders <g.c.w.m.mulders@gmail.com> *
-* Copyright 2010-2011 Wilmer van der Gaast <wilmer@gaast.net> *
+* Copyright 2010-2013 Wilmer van der Gaast <wilmer@gaast.net> *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public *
@@ -34,8 +34,8 @@
#include "url.h"
#include "misc.h"
#include "base64.h"
-#include "xmltree.h"
#include "twitter_lib.h"
+#include "json_util.h"
#include <ctype.h>
#include <errno.h>
@@ -58,11 +58,10 @@ struct twitter_xml_status {
time_t created_at;
char *text;
struct twitter_xml_user *user;
- guint64 id, reply_to;
+ guint64 id, rt_id; /* Usually equal, with RTs id == *original* id */
+ guint64 reply_to;
};
-static void twitter_groupchat_init(struct im_connection *ic);
-
/**
* Frees a twitter_xml_user struct.
*/
@@ -139,17 +138,16 @@ static void twitter_add_buddy(struct im_connection *ic, char *name, const char *
// Check if the buddy is already in the buddy list.
if (!bee_user_by_handle(ic->bee, ic, name)) {
- char *mode = set_getstr(&ic->acc->set, "mode");
-
// The buddy is not in the list, add the buddy and set the status to logged in.
imcb_add_buddy(ic, name, NULL);
imcb_rename_buddy(ic, name, fullname);
- if (g_strcasecmp(mode, "chat") == 0) {
+ if (td->flags & TWITTER_MODE_CHAT) {
/* Necessary so that nicks always get translated to the
exact Twitter username. */
imcb_buddy_nick_hint(ic, name, name);
- imcb_chat_add_buddy(td->timeline_gc, name);
- } else if (g_strcasecmp(mode, "many") == 0)
+ if (td->timeline_gc)
+ imcb_chat_add_buddy(td->timeline_gc, name);
+ } else if (td->flags & TWITTER_MODE_MANY)
imcb_buddy_status(ic, name, OPT_LOGGED_IN, NULL, NULL);
}
}
@@ -159,28 +157,75 @@ static void twitter_add_buddy(struct im_connection *ic, char *name, const char *
char *twitter_parse_error(struct http_request *req)
{
static char *ret = NULL;
- struct xt_parser *xp = NULL;
- struct xt_node *node, *err;
+ json_value *root, *err;
g_free(ret);
ret = NULL;
if (req->body_size > 0) {
- xp = xt_new(NULL, NULL);
- xt_feed(xp, req->reply_body, req->body_size);
-
- for (node = xp->root; node; node = node->next)
- if ((err = xt_find_node(node->children, "error")) && err->text_len > 0) {
- ret = g_strdup_printf("%s (%s)", req->status_string, err->text);
- break;
- }
-
- xt_free(xp);
+ root = json_parse(req->reply_body);
+ err = json_o_get(root, "errors");
+ if (err && err->type == json_array && (err = err->u.array.values[0]) &&
+ err->type == json_object) {
+ const char *msg = json_o_str(err, "message");
+ if (msg)
+ ret = g_strdup_printf("%s (%s)", req->status_string, msg);
+ }
+ json_value_free(root);
}
return ret ? ret : req->status_string;
}
+/* WATCH OUT: This function might or might not destroy your connection.
+ Sub-optimal indeed, but just be careful when this returns NULL! */
+static json_value *twitter_parse_response(struct im_connection *ic, struct http_request *req)
+{
+ gboolean logging_in = !(ic->flags & OPT_LOGGED_IN);
+ gboolean periodic;
+ struct twitter_data *td = ic->proto_data;
+ json_value *ret;
+ char path[64] = "", *s;
+
+ if ((s = strchr(req->request, ' '))) {
+ path[sizeof(path)-1] = '\0';
+ strncpy(path, s + 1, sizeof(path) - 1);
+ if ((s = strchr(path, '?')) || (s = strchr(path, ' ')))
+ *s = '\0';
+ }
+
+ /* Kinda nasty. :-( Trying to suppress error messages, but only
+ for periodic (i.e. mentions/timeline) queries. */
+ periodic = strstr(path, "timeline") || strstr(path, "mentions");
+
+ if (req->status_code == 401 && logging_in) {
+ /* IIRC Twitter once had an outage where they were randomly
+ throwing 401s so I'll keep treating this one as fatal
+ only during login. */
+ imcb_error(ic, "Authentication failure (%s)",
+ twitter_parse_error(req));
+ imc_logout(ic, FALSE);
+ return NULL;
+ } else if (req->status_code != 200) {
+ // It didn't go well, output the error and return.
+ if (!periodic || logging_in || ++td->http_fails >= 5)
+ twitter_log(ic, "Error: Could not retrieve %s: %s",
+ path, twitter_parse_error(req));
+
+ if (logging_in)
+ imc_logout(ic, TRUE);
+ return NULL;
+ } else {
+ td->http_fails = 0;
+ }
+
+ if ((ret = json_parse(req->reply_body)) == NULL) {
+ imcb_error(ic, "Could not retrieve %s: %s",
+ path, "XML parse error");
+ }
+ return ret;
+}
+
static void twitter_http_get_friends_ids(struct http_request *req);
/**
@@ -198,45 +243,35 @@ void twitter_get_friends_ids(struct im_connection *ic, gint64 next_cursor)
}
/**
- * Function to help fill a list.
- */
-static xt_status twitter_xt_next_cursor(struct xt_node *node, struct twitter_xml_list *txl)
-{
- char *end = NULL;
-
- if (node->text)
- txl->next_cursor = g_ascii_strtoll(node->text, &end, 10);
- if (end == NULL)
- txl->next_cursor = -1;
-
- return XT_HANDLED;
-}
-
-/**
* Fill a list of ids.
*/
-static xt_status twitter_xt_get_friends_id_list(struct xt_node *node, struct twitter_xml_list *txl)
+static gboolean twitter_xt_get_friends_id_list(json_value *node, struct twitter_xml_list *txl)
{
- struct xt_node *child;
+ json_value *c;
+ int i;
// Set the list type.
txl->type = TXL_ID;
- // The root <statuses> node should hold the list of statuses <status>
- // Walk over the nodes children.
- for (child = node->children; child; child = child->next) {
- if (g_strcasecmp("ids", child->name) == 0) {
- struct xt_node *idc;
- for (idc = child->children; idc; idc = idc->next)
- if (g_strcasecmp(idc->name, "id") == 0)
- txl->list = g_slist_prepend(txl->list,
- g_memdup(idc->text, idc->text_len + 1));
- } else if (g_strcasecmp("next_cursor", child->name) == 0) {
- twitter_xt_next_cursor(child, txl);
- }
- }
+ c = json_o_get(node, "ids");
+ if (!c || c->type != json_array)
+ return FALSE;
- return XT_HANDLED;
+ for (i = 0; i < c->u.array.length; i ++) {
+ if (c->u.array.values[i]->type != json_integer)
+ continue;
+
+ txl->list = g_slist_prepend(txl->list,
+ g_strdup_printf("%lld", c->u.array.values[i]->u.integer));
+ }
+
+ c = json_o_get(node, "next_cursor");
+ if (c && c->type == json_integer)
+ txl->next_cursor = c->u.integer;
+ else
+ txl->next_cursor = -1;
+
+ return TRUE;
}
static void twitter_get_users_lookup(struct im_connection *ic);
@@ -247,7 +282,7 @@ static void twitter_get_users_lookup(struct im_connection *ic);
static void twitter_http_get_friends_ids(struct http_request *req)
{
struct im_connection *ic;
- struct xt_parser *parser;
+ json_value *parsed;
struct twitter_xml_list *txl;
struct twitter_data *td;
@@ -259,34 +294,15 @@ static void twitter_http_get_friends_ids(struct http_request *req)
td = ic->proto_data;
- // Check if the HTTP request went well. More strict checks as this is
- // the first request we do in a session.
- if (req->status_code == 401) {
- imcb_error(ic, "Authentication failure");
- imc_logout(ic, FALSE);
- return;
- } else if (req->status_code != 200) {
- // It didn't go well, output the error and return.
- imcb_error(ic, "Could not retrieve %s: %s",
- TWITTER_FRIENDS_IDS_URL, twitter_parse_error(req));
- imc_logout(ic, TRUE);
- return;
- } else {
- td->http_fails = 0;
- }
-
- /* Create the room now that we "logged in". */
- if (!td->timeline_gc && g_strcasecmp(set_getstr(&ic->acc->set, "mode"), "chat") == 0)
- twitter_groupchat_init(ic);
-
txl = g_new0(struct twitter_xml_list, 1);
txl->list = td->follow_ids;
// Parse the data.
- parser = xt_new(NULL, txl);
- xt_feed(parser, req->reply_body, req->body_size);
- twitter_xt_get_friends_id_list(parser->root, txl);
- xt_free(parser);
+ if (!(parsed = twitter_parse_response(ic, req)))
+ return;
+
+ twitter_xt_get_friends_id_list(parsed, txl);
+ json_value_free(parsed);
td->follow_ids = txl->list;
if (txl->next_cursor)
@@ -301,7 +317,7 @@ static void twitter_http_get_friends_ids(struct http_request *req)
txl_free(txl);
}
-static xt_status twitter_xt_get_users(struct xt_node *node, struct twitter_xml_list *txl);
+static gboolean twitter_xt_get_users(json_value *node, struct twitter_xml_list *txl);
static void twitter_http_get_users_lookup(struct http_request *req);
static void twitter_get_users_lookup(struct im_connection *ic)
@@ -342,8 +358,7 @@ static void twitter_get_users_lookup(struct im_connection *ic)
static void twitter_http_get_users_lookup(struct http_request *req)
{
struct im_connection *ic = req->data;
- struct twitter_data *td;
- struct xt_parser *parser;
+ json_value *parsed;
struct twitter_xml_list *txl;
GSList *l = NULL;
struct twitter_xml_user *user;
@@ -352,28 +367,14 @@ static void twitter_http_get_users_lookup(struct http_request *req)
if (!g_slist_find(twitter_connections, ic))
return;
- td = ic->proto_data;
-
- if (req->status_code != 200) {
- // It didn't go well, output the error and return.
- imcb_error(ic, "Could not retrieve %s: %s",
- TWITTER_USERS_LOOKUP_URL, twitter_parse_error(req));
- imc_logout(ic, TRUE);
- return;
- } else {
- td->http_fails = 0;
- }
-
txl = g_new0(struct twitter_xml_list, 1);
txl->list = NULL;
- // Parse the data.
- parser = xt_new(NULL, txl);
- xt_feed(parser, req->reply_body, req->body_size);
-
// Get the user list from the parsed xml feed.
- twitter_xt_get_users(parser->root, txl);
- xt_free(parser);
+ if (!(parsed = twitter_parse_response(ic, req)))
+ return;
+ twitter_xt_get_users(parsed, txl);
+ json_value_free(parsed);
// Add the users as buddies.
for (l = txl->list; l; l = g_slist_next(l)) {
@@ -387,25 +388,15 @@ static void twitter_http_get_users_lookup(struct http_request *req)
twitter_get_users_lookup(ic);
}
-/**
- * Function to fill a twitter_xml_user struct.
- * It sets:
- * - the name and
- * - the screen_name.
- */
-static xt_status twitter_xt_get_user(struct xt_node *node, struct twitter_xml_user *txu)
+struct twitter_xml_user *twitter_xt_get_user(const json_value *node)
{
- struct xt_node *child;
-
- // Walk over the nodes children.
- for (child = node->children; child; child = child->next) {
- if (g_strcasecmp("name", child->name) == 0) {
- txu->name = g_memdup(child->text, child->text_len + 1);
- } else if (g_strcasecmp("screen_name", child->name) == 0) {
- txu->screen_name = g_memdup(child->text, child->text_len + 1);
- }
- }
- return XT_HANDLED;
+ struct twitter_xml_user *txu;
+
+ txu = g_new0(struct twitter_xml_user, 1);
+ txu->name = g_strdup(json_o_str(node, "name"));
+ txu->screen_name = g_strdup(json_o_str(node, "screen_name"));
+
+ return txu;
}
/**
@@ -413,26 +404,26 @@ static xt_status twitter_xt_get_user(struct xt_node *node, struct twitter_xml_us
* It sets:
* - all <user>s from the <users> element.
*/
-static xt_status twitter_xt_get_users(struct xt_node *node, struct twitter_xml_list *txl)
+static gboolean twitter_xt_get_users(json_value *node, struct twitter_xml_list *txl)
{
struct twitter_xml_user *txu;
- struct xt_node *child;
+ int i;
// Set the type of the list.
txl->type = TXL_USER;
+ if (!node || node->type != json_array)
+ return FALSE;
+
// The root <users> node should hold the list of users <user>
// Walk over the nodes children.
- for (child = node->children; child; child = child->next) {
- if (g_strcasecmp("user", child->name) == 0) {
- txu = g_new0(struct twitter_xml_user, 1);
- twitter_xt_get_user(child, txu);
- // Put the item in the front of the list.
+ for (i = 0; i < node->u.array.length; i ++) {
+ txu = twitter_xt_get_user(node->u.array.values[i]);
+ if (txu)
txl->list = g_slist_prepend(txl->list, txu);
- }
}
- return XT_HANDLED;
+ return TRUE;
}
#ifdef __GLIBC__
@@ -441,6 +432,8 @@ static xt_status twitter_xt_get_users(struct xt_node *node, struct twitter_xml_l
#define TWITTER_TIME_FORMAT "%a %b %d %H:%M:%S +0000 %Y"
#endif
+static char* expand_entities(char* text, const json_value *entities);
+
/**
* Function to fill a twitter_xml_status struct.
* It sets:
@@ -449,77 +442,133 @@ static xt_status twitter_xt_get_users(struct xt_node *node, struct twitter_xml_l
* - the status id and
* - the user in a twitter_xml_user struct.
*/
-static xt_status twitter_xt_get_status(struct xt_node *node, struct twitter_xml_status *txs)
+static struct twitter_xml_status *twitter_xt_get_status(const json_value *node)
{
- struct xt_node *child, *rt = NULL;
-
- // Walk over the nodes children.
- for (child = node->children; child; child = child->next) {
- if (g_strcasecmp("text", child->name) == 0) {
- txs->text = g_memdup(child->text, child->text_len + 1);
- } else if (g_strcasecmp("retweeted_status", child->name) == 0) {
- rt = child;
- } else if (g_strcasecmp("created_at", child->name) == 0) {
+ struct twitter_xml_status *txs;
+ const json_value *rt = NULL, *entities = NULL;
+
+ if (node->type != json_object)
+ return FALSE;
+ txs = g_new0(struct twitter_xml_status, 1);
+
+ JSON_O_FOREACH (node, k, v) {
+ if (strcmp("text", k) == 0 && v->type == json_string) {
+ txs->text = g_memdup(v->u.string.ptr, v->u.string.length + 1);
+ strip_html(txs->text);
+ } else if (strcmp("retweeted_status", k) == 0 && v->type == json_object) {
+ rt = v;
+ } else if (strcmp("created_at", k) == 0 && v->type == json_string) {
struct tm parsed;
/* Very sensitive to changes to the formatting of
this field. :-( Also assumes the timezone used
is UTC since C time handling functions suck. */
- if (strptime(child->text, TWITTER_TIME_FORMAT, &parsed) != NULL)
+ if (strptime(v->u.string.ptr, TWITTER_TIME_FORMAT, &parsed) != NULL)
txs->created_at = mktime_utc(&parsed);
- } else if (g_strcasecmp("user", child->name) == 0) {
- txs->user = g_new0(struct twitter_xml_user, 1);
- twitter_xt_get_user(child, txs->user);
- } else if (g_strcasecmp("id", child->name) == 0) {
- txs->id = g_ascii_strtoull(child->text, NULL, 10);
- } else if (g_strcasecmp("in_reply_to_status_id", child->name) == 0) {
- txs->reply_to = g_ascii_strtoull(child->text, NULL, 10);
+ } else if (strcmp("user", k) == 0 && v->type == json_object) {
+ txs->user = twitter_xt_get_user(v);
+ } else if (strcmp("id", k) == 0 && v->type == json_integer) {
+ txs->rt_id = txs->id = v->u.integer;
+ } else if (strcmp("in_reply_to_status_id", k) == 0 && v->type == json_integer) {
+ txs->reply_to = v->u.integer;
+ } else if (strcmp("entities", k) == 0 && v->type == json_object) {
+ entities = v;
}
}
/* If it's a (truncated) retweet, get the original. Even if the API claims it
wasn't truncated because it may be lying. */
if (rt) {
- struct twitter_xml_status *rtxs = g_new0(struct twitter_xml_status, 1);
- if (twitter_xt_get_status(rt, rtxs) != XT_HANDLED) {
+ struct twitter_xml_status *rtxs = twitter_xt_get_status(rt);
+ if (rtxs) {
+ g_free(txs->text);
+ txs->text = g_strdup_printf("RT @%s: %s", rtxs->user->screen_name, rtxs->text);
+ txs->id = rtxs->id;
txs_free(rtxs);
- return XT_HANDLED;
}
+ } else if (entities) {
+ txs->text = expand_entities(txs->text, entities);
+ }
- g_free(txs->text);
- txs->text = g_strdup_printf("RT @%s: %s", rtxs->user->screen_name, rtxs->text);
- txs_free(rtxs);
- } else {
- struct xt_node *urls, *url;
+ if (txs->text && txs->user && txs->id)
+ return txs;
+
+ txs_free(txs);
+ return NULL;
+}
+
+/**
+ * Function to fill a twitter_xml_status struct (DM variant).
+ */
+static struct twitter_xml_status *twitter_xt_get_dm(const json_value *node)
+{
+ struct twitter_xml_status *txs;
+ const json_value *entities = NULL;
+
+ if (node->type != json_object)
+ return FALSE;
+ txs = g_new0(struct twitter_xml_status, 1);
+
+ JSON_O_FOREACH (node, k, v) {
+ if (strcmp("text", k) == 0 && v->type == json_string) {
+ txs->text = g_memdup(v->u.string.ptr, v->u.string.length + 1);
+ strip_html(txs->text);
+ } else if (strcmp("created_at", k) == 0 && v->type == json_string) {
+ struct tm parsed;
+
+ /* Very sensitive to changes to the formatting of
+ this field. :-( Also assumes the timezone used
+ is UTC since C time handling functions suck. */
+ if (strptime(v->u.string.ptr, TWITTER_TIME_FORMAT, &parsed) != NULL)
+ txs->created_at = mktime_utc(&parsed);
+ } else if (strcmp("sender", k) == 0 && v->type == json_object) {
+ txs->user = twitter_xt_get_user(v);
+ } else if (strcmp("id", k) == 0 && v->type == json_integer) {
+ txs->id = v->u.integer;
+ }
+ }
+
+ if (entities) {
+ txs->text = expand_entities(txs->text, entities);
+ }
+
+ if (txs->text && txs->user && txs->id)
+ return txs;
+
+ txs_free(txs);
+ return NULL;
+}
+
+static char* expand_entities(char* text, const json_value *entities) {
+ JSON_O_FOREACH (entities, k, v) {
+ int i;
+
+ if (v->type != json_array)
+ continue;
+ if (strcmp(k, "urls") != 0 && strcmp(k, "media") != 0)
+ continue;
- urls = xt_find_path(node, "entities");
- if (urls != NULL)
- urls = urls->children;
- for (; urls; urls = urls->next) {
- if (strcmp(urls->name, "urls") != 0 && strcmp(urls->name, "media") != 0)
+ for (i = 0; i < v->u.array.length; i ++) {
+ if (v->u.array.values[i]->type != json_object)
continue;
- for (url = urls ? urls->children : NULL; url; url = url->next) {
- /* "short" is a reserved word. :-P */
- struct xt_node *kort = xt_find_node(url->children, "url");
- struct xt_node *disp = xt_find_node(url->children, "display_url");
- char *pos, *new;
-
- if (!kort || !kort->text || !disp || !disp->text ||
- !(pos = strstr(txs->text, kort->text)))
- continue;
-
- *pos = '\0';
- new = g_strdup_printf("%s%s &lt;%s&gt;%s", txs->text, kort->text,
- disp->text, pos + strlen(kort->text));
-
- g_free(txs->text);
- txs->text = new;
- }
+ const char *kort = json_o_str(v->u.array.values[i], "url");
+ const char *disp = json_o_str(v->u.array.values[i], "display_url");
+ char *pos, *new;
+
+ if (!kort || !disp || !(pos = strstr(text, kort)))
+ continue;
+
+ *pos = '\0';
+ new = g_strdup_printf("%s%s <%s>%s", text, kort,
+ disp, pos + strlen(kort));
+
+ g_free(text);
+ text = new;
}
}
-
- return XT_HANDLED;
+
+ return text;
}
/**
@@ -528,198 +577,324 @@ static xt_status twitter_xt_get_status(struct xt_node *node, struct twitter_xml_
* - all <status>es within the <status> element and
* - the next_cursor.
*/
-static xt_status twitter_xt_get_status_list(struct im_connection *ic, struct xt_node *node,
- struct twitter_xml_list *txl)
+static gboolean twitter_xt_get_status_list(struct im_connection *ic, const json_value *node,
+ struct twitter_xml_list *txl)
{
struct twitter_xml_status *txs;
- struct xt_node *child;
- bee_user_t *bu;
+ int i;
// Set the type of the list.
txl->type = TXL_STATUS;
+
+ if (node->type != json_array)
+ return FALSE;
// The root <statuses> node should hold the list of statuses <status>
// Walk over the nodes children.
- for (child = node->children; child; child = child->next) {
- if (g_strcasecmp("status", child->name) == 0) {
- txs = g_new0(struct twitter_xml_status, 1);
- twitter_xt_get_status(child, txs);
- // Put the item in the front of the list.
- txl->list = g_slist_prepend(txl->list, txs);
-
- if (txs->user && txs->user->screen_name &&
- (bu = bee_user_by_handle(ic->bee, ic, txs->user->screen_name))) {
- struct twitter_user_data *tud = bu->data;
-
- if (txs->id > tud->last_id) {
- tud->last_id = txs->id;
- tud->last_time = txs->created_at;
- }
- }
- } else if (g_strcasecmp("next_cursor", child->name) == 0) {
- twitter_xt_next_cursor(child, txl);
- }
+ for (i = 0; i < node->u.array.length; i ++) {
+ txs = twitter_xt_get_status(node->u.array.values[i]);
+ if (!txs)
+ continue;
+
+ txl->list = g_slist_prepend(txl->list, txs);
}
- return XT_HANDLED;
+ return TRUE;
}
+/* Will log messages either way. Need to keep track of IDs for stream deduping.
+ Plus, show_ids is on by default and I don't see why anyone would disable it. */
static char *twitter_msg_add_id(struct im_connection *ic,
struct twitter_xml_status *txs, const char *prefix)
{
struct twitter_data *td = ic->proto_data;
- char *ret = NULL;
-
- if (!set_getbool(&ic->acc->set, "show_ids")) {
- if (*prefix)
- return g_strconcat(prefix, txs->text, NULL);
- else
- return NULL;
- }
+ int reply_to = -1;
+ bee_user_t *bu;
- td->log[td->log_id].id = txs->id;
- td->log[td->log_id].bu = bee_user_by_handle(ic->bee, ic, txs->user->screen_name);
if (txs->reply_to) {
int i;
for (i = 0; i < TWITTER_LOG_LENGTH; i++)
if (td->log[i].id == txs->reply_to) {
- ret = g_strdup_printf("\002[\002%02d->%02d\002]\002 %s%s",
- td->log_id, i, prefix, txs->text);
+ reply_to = i;
break;
}
}
- if (ret == NULL)
- ret = g_strdup_printf("\002[\002%02d\002]\002 %s%s", td->log_id, prefix, txs->text);
- td->log_id = (td->log_id + 1) % TWITTER_LOG_LENGTH;
- return ret;
-}
+ if (txs->user && txs->user->screen_name &&
+ (bu = bee_user_by_handle(ic->bee, ic, txs->user->screen_name))) {
+ struct twitter_user_data *tud = bu->data;
-static void twitter_groupchat_init(struct im_connection *ic)
-{
- char *name_hint;
- struct groupchat *gc;
- struct twitter_data *td = ic->proto_data;
- GSList *l;
-
- td->timeline_gc = gc = imcb_chat_new(ic, "twitter/timeline");
-
- name_hint = g_strdup_printf("%s_%s", td->prefix, ic->acc->user);
- imcb_chat_name_hint(gc, name_hint);
- g_free(name_hint);
-
- for (l = ic->bee->users; l; l = l->next) {
- bee_user_t *bu = l->data;
- if (bu->ic == ic)
- imcb_chat_add_buddy(td->timeline_gc, bu->handle);
+ if (txs->id > tud->last_id) {
+ tud->last_id = txs->id;
+ tud->last_time = txs->created_at;
+ }
+ }
+
+ td->log_id = (td->log_id + 1) % TWITTER_LOG_LENGTH;
+ td->log[td->log_id].id = txs->id;
+ td->log[td->log_id].bu = bee_user_by_handle(ic->bee, ic, txs->user->screen_name);
+
+ /* This is all getting hairy. :-( If we RT'ed something ourselves,
+ remember OUR id instead so undo will work. In other cases, the
+ original tweet's id should be remembered for deduplicating. */
+ if (strcmp(txs->user->screen_name, td->user) == 0)
+ td->log[td->log_id].id = txs->rt_id;
+
+ if (set_getbool(&ic->acc->set, "show_ids")) {
+ if (reply_to != -1)
+ return g_strdup_printf("\002[\002%02x->%02x\002]\002 %s%s",
+ td->log_id, reply_to, prefix, txs->text);
+ else
+ return g_strdup_printf("\002[\002%02x\002]\002 %s%s",
+ td->log_id, prefix, txs->text);
+ } else {
+ if (*prefix)
+ return g_strconcat(prefix, txs->text, NULL);
+ else
+ return NULL;
}
}
/**
* Function that is called to see the statuses in a groupchat window.
*/
-static void twitter_groupchat(struct im_connection *ic, GSList * list)
+static void twitter_status_show_chat(struct im_connection *ic, struct twitter_xml_status *status)
{
struct twitter_data *td = ic->proto_data;
- GSList *l = NULL;
- struct twitter_xml_status *status;
struct groupchat *gc;
- guint64 last_id = 0;
+ gboolean me = g_strcasecmp(td->user, status->user->screen_name) == 0;
+ char *msg;
// Create a new groupchat if it does not exsist.
- if (!td->timeline_gc)
- twitter_groupchat_init(ic);
-
- gc = td->timeline_gc;
- if (!gc->joined)
- imcb_chat_add_buddy(gc, ic->acc->user);
-
- for (l = list; l; l = g_slist_next(l)) {
- char *msg;
-
- status = l->data;
- if (status->user == NULL || status->text == NULL || last_id == status->id)
- continue;
-
- last_id = status->id;
-
- strip_html(status->text);
-
- if (set_getbool(&ic->acc->set, "strip_newlines"))
- strip_newlines(status->text);
-
- msg = twitter_msg_add_id(ic, status, "");
-
- // Say it!
- if (g_strcasecmp(td->user, status->user->screen_name) == 0) {
- imcb_chat_log(gc, "You: %s", msg ? msg : status->text);
- } else {
- twitter_add_buddy(ic, status->user->screen_name, status->user->name);
-
- imcb_chat_msg(gc, status->user->screen_name,
- msg ? msg : status->text, 0, status->created_at);
- }
-
- g_free(msg);
+ gc = twitter_groupchat_init(ic);
- // Update the timeline_id to hold the highest id, so that by the next request
- // we won't pick up the updates already in the list.
- td->timeline_id = MAX(td->timeline_id, status->id);
+ if (!me)
+ /* MUST be done before twitter_msg_add_id() to avoid #872. */
+ twitter_add_buddy(ic, status->user->screen_name, status->user->name);
+ msg = twitter_msg_add_id(ic, status, "");
+
+ // Say it!
+ if (me) {
+ imcb_chat_log(gc, "You: %s", msg ? msg : status->text);
+ } else {
+ imcb_chat_msg(gc, status->user->screen_name,
+ msg ? msg : status->text, 0, status->created_at);
}
+
+ g_free(msg);
}
/**
* Function that is called to see statuses as private messages.
*/
-static void twitter_private_message_chat(struct im_connection *ic, GSList * list)
+static void twitter_status_show_msg(struct im_connection *ic, struct twitter_xml_status *status)
{
struct twitter_data *td = ic->proto_data;
- GSList *l = NULL;
- struct twitter_xml_status *status;
- char from[MAX_STRING];
- gboolean mode_one;
- guint64 last_id = 0;
-
- mode_one = g_strcasecmp(set_getstr(&ic->acc->set, "mode"), "one") == 0;
+ char from[MAX_STRING] = "";
+ char *prefix = NULL, *text = NULL;
+ gboolean me = g_strcasecmp(td->user, status->user->screen_name) == 0;
- if (mode_one) {
+ if (td->flags & TWITTER_MODE_ONE) {
g_snprintf(from, sizeof(from) - 1, "%s_%s", td->prefix, ic->acc->user);
from[MAX_STRING - 1] = '\0';
}
- for (l = list; l; l = g_slist_next(l)) {
- char *prefix = NULL, *text = NULL;
+ if (td->flags & TWITTER_MODE_ONE)
+ prefix = g_strdup_printf("\002<\002%s\002>\002 ",
+ status->user->screen_name);
+ else if (!me)
+ twitter_add_buddy(ic, status->user->screen_name, status->user->name);
+ else
+ prefix = g_strdup("You: ");
- status = l->data;
- if (status->user == NULL || status->text == NULL || last_id == status->id)
- continue;
+ text = twitter_msg_add_id(ic, status, prefix ? prefix : "");
- last_id = status->id;
+ imcb_buddy_msg(ic,
+ *from ? from : status->user->screen_name,
+ text ? text : status->text, 0, status->created_at);
- strip_html(status->text);
- if (mode_one)
- prefix = g_strdup_printf("\002<\002%s\002>\002 ",
- status->user->screen_name);
- else
- twitter_add_buddy(ic, status->user->screen_name, status->user->name);
+ g_free(text);
+ g_free(prefix);
+}
- text = twitter_msg_add_id(ic, status, prefix ? prefix : "");
+static void twitter_status_show(struct im_connection *ic, struct twitter_xml_status *status)
+{
+ struct twitter_data *td = ic->proto_data;
+
+ if (status->user == NULL || status->text == NULL)
+ return;
+
+ /* Grrrr. Would like to do this during parsing, but can't access
+ settings from there. */
+ if (set_getbool(&ic->acc->set, "strip_newlines"))
+ strip_newlines(status->text);
+
+ if (td->flags & TWITTER_MODE_CHAT)
+ twitter_status_show_chat(ic, status);
+ else
+ twitter_status_show_msg(ic, status);
- imcb_buddy_msg(ic,
- mode_one ? from : status->user->screen_name,
- text ? text : status->text, 0, status->created_at);
+ // Update the timeline_id to hold the highest id, so that by the next request
+ // we won't pick up the updates already in the list.
+ td->timeline_id = MAX(td->timeline_id, status->rt_id);
+}
- // Update the timeline_id to hold the highest id, so that by the next request
- // we won't pick up the updates already in the list.
- td->timeline_id = MAX(td->timeline_id, status->id);
+static gboolean twitter_stream_handle_object(struct im_connection *ic, json_value *o);
- g_free(text);
- g_free(prefix);
+static void twitter_http_stream(struct http_request *req)
+{
+ struct im_connection *ic = req->data;
+ struct twitter_data *td;
+ json_value *parsed;
+ int len = 0;
+ char c, *nl;
+
+ if (!g_slist_find(twitter_connections, ic))
+ return;
+
+ ic->flags |= OPT_PONGED;
+ td = ic->proto_data;
+
+ if ((req->flags & HTTPC_EOF) || !req->reply_body) {
+ td->stream = NULL;
+ imcb_error(ic, "Stream closed (%s)", req->status_string);
+ imc_logout(ic, TRUE);
+ return;
+ }
+
+ /* MUST search for CRLF, not just LF:
+ https://dev.twitter.com/docs/streaming-apis/processing#Parsing_responses */
+ if (!(nl = strstr(req->reply_body, "\r\n")))
+ return;
+
+ len = nl - req->reply_body;
+ if (len > 0) {
+ c = req->reply_body[len];
+ req->reply_body[len] = '\0';
+
+ if ((parsed = json_parse(req->reply_body))) {
+ twitter_stream_handle_object(ic, parsed);
+ }
+ json_value_free(parsed);
+ req->reply_body[len] = c;
}
+
+ http_flush_bytes(req, len + 2);
+
+ /* One notification might bring multiple events! */
+ if (req->body_size > 0)
+ twitter_http_stream(req);
}
-static void twitter_http_get_home_timeline(struct http_request *req);
-static void twitter_http_get_mentions(struct http_request *req);
+static gboolean twitter_stream_handle_event(struct im_connection *ic, json_value *o);
+static gboolean twitter_stream_handle_status(struct im_connection *ic, struct twitter_xml_status *txs);
+
+static gboolean twitter_stream_handle_object(struct im_connection *ic, json_value *o)
+{
+ struct twitter_data *td = ic->proto_data;
+ struct twitter_xml_status *txs;
+ json_value *c;
+
+ if ((txs = twitter_xt_get_status(o))) {
+ gboolean ret = twitter_stream_handle_status(ic, txs);
+ txs_free(txs);
+ return ret;
+ } else if ((c = json_o_get(o, "direct_message")) &&
+ (txs = twitter_xt_get_dm(c))) {
+ if (strcmp(txs->user->screen_name, td->user) != 0)
+ imcb_buddy_msg(ic, txs->user->screen_name,
+ txs->text, 0, txs->created_at);
+ txs_free(txs);
+ return TRUE;
+ } else if ((c = json_o_get(o, "event")) && c->type == json_string) {
+ twitter_stream_handle_event(ic, o);
+ return TRUE;
+ } else if ((c = json_o_get(o, "disconnect")) && c->type == json_object) {
+ /* HACK: Because we're inside an event handler, we can't just
+ disconnect here. Instead, just change the HTTP status string
+ into a Twitter status string. */
+ char *reason = json_o_strdup(c, "reason");
+ if (reason) {
+ g_free(td->stream->status_string);
+ td->stream->status_string = reason;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gboolean twitter_stream_handle_status(struct im_connection *ic, struct twitter_xml_status *txs)
+{
+ struct twitter_data *td = ic->proto_data;
+ int i;
+
+ for (i = 0; i < TWITTER_LOG_LENGTH; i++) {
+ if (td->log[i].id == txs->id) {
+ /* Got a duplicate (RT, probably). Drop it. */
+ return TRUE;
+ }
+ }
+
+ if (!(strcmp(txs->user->screen_name, td->user) == 0 ||
+ set_getbool(&ic->acc->set, "fetch_mentions") ||
+ bee_user_by_handle(ic->bee, ic, txs->user->screen_name))) {
+ /* Tweet is from an unknown person and the user does not want
+ to see @mentions, so drop it. twitter_stream_handle_event()
+ picks up new follows so this simple filter should be safe. */
+ /* TODO: The streaming API seems to do poor @mention matching.
+ I.e. I'm getting mentions for @WilmerSomething, not just for
+ @Wilmer. But meh. You want spam, you get spam. */
+ return TRUE;
+ }
+
+ twitter_status_show(ic, txs);
+
+ return TRUE;
+}
+
+static gboolean twitter_stream_handle_event(struct im_connection *ic, json_value *o)
+{
+ struct twitter_data *td = ic->proto_data;
+ json_value *source = json_o_get(o, "source");
+ json_value *target = json_o_get(o, "target");
+ const char *type = json_o_str(o, "event");
+
+ if (!type || !source || source->type != json_object
+ || !target || target->type != json_object) {
+ return FALSE;
+ }
+
+ if (strcmp(type, "follow") == 0) {
+ struct twitter_xml_user *us = twitter_xt_get_user(source);
+ struct twitter_xml_user *ut = twitter_xt_get_user(target);
+ if (strcmp(us->screen_name, td->user) == 0) {
+ twitter_add_buddy(ic, ut->screen_name, ut->name);
+ }
+ txu_free(us);
+ txu_free(ut);
+ }
+
+ return TRUE;
+}
+
+gboolean twitter_open_stream(struct im_connection *ic)
+{
+ struct twitter_data *td = ic->proto_data;
+ char *args[2] = {"with", "followings"};
+
+ if ((td->stream = twitter_http(ic, TWITTER_USER_STREAM_URL,
+ twitter_http_stream, ic, 0, args, 2))) {
+ /* This flag must be enabled or we'll get no data until EOF
+ (which err, kind of, defeats the purpose of a streaming API). */
+ td->stream->flags |= HTTPC_STREAMING;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void twitter_get_home_timeline(struct im_connection *ic, gint64 next_cursor);
+static void twitter_get_mentions(struct im_connection *ic, gint64 next_cursor);
/**
* Get the timeline with optionally mentions
@@ -730,7 +905,10 @@ void twitter_get_timeline(struct im_connection *ic, gint64 next_cursor)
gboolean include_mentions = set_getbool(&ic->acc->set, "fetch_mentions");
if (td->flags & TWITTER_DOING_TIMELINE) {
- return;
+ if (++td->http_fails >= 5) {
+ imcb_error(ic, "Fetch timeout (%d)", td->flags);
+ imc_logout(ic, TRUE);
+ }
}
td->flags |= TWITTER_DOING_TIMELINE;
@@ -753,9 +931,12 @@ void twitter_flush_timeline(struct im_connection *ic)
int show_old_mentions = set_getint(&ic->acc->set, "show_old_mentions");
struct twitter_xml_list *home_timeline = td->home_timeline_obj;
struct twitter_xml_list *mentions = td->mentions_obj;
+ guint64 last_id = 0;
GSList *output = NULL;
GSList *l;
+ imcb_connected(ic);
+
if (!(td->flags & TWITTER_GOT_TIMELINE)) {
return;
}
@@ -781,12 +962,13 @@ void twitter_flush_timeline(struct im_connection *ic)
}
// See if the user wants to see the messages in a groupchat window or as private messages.
- if (g_strcasecmp(set_getstr(&ic->acc->set, "mode"), "chat") == 0)
- twitter_groupchat(ic, output);
- else
- twitter_private_message_chat(ic, output);
-
- g_slist_free(output);
+ while (output) {
+ struct twitter_xml_status *txs = output->data;
+ if (txs->id != last_id)
+ twitter_status_show(ic, txs);
+ last_id = txs->id;
+ output = g_slist_remove(output, txs);
+ }
txl_free(home_timeline);
txl_free(mentions);
@@ -795,10 +977,13 @@ void twitter_flush_timeline(struct im_connection *ic)
td->home_timeline_obj = td->mentions_obj = NULL;
}
+static void twitter_http_get_home_timeline(struct http_request *req);
+static void twitter_http_get_mentions(struct http_request *req);
+
/**
* Get the timeline.
*/
-void twitter_get_home_timeline(struct im_connection *ic, gint64 next_cursor)
+static void twitter_get_home_timeline(struct im_connection *ic, gint64 next_cursor)
{
struct twitter_data *td = ic->proto_data;
@@ -834,7 +1019,7 @@ void twitter_get_home_timeline(struct im_connection *ic, gint64 next_cursor)
/**
* Get mentions.
*/
-void twitter_get_mentions(struct im_connection *ic, gint64 next_cursor)
+static void twitter_get_mentions(struct im_connection *ic, gint64 next_cursor)
{
struct twitter_data *td = ic->proto_data;
@@ -865,9 +1050,7 @@ void twitter_get_mentions(struct im_connection *ic, gint64 next_cursor)
}
g_free(args[1]);
- if (td->timeline_id) {
- g_free(args[5]);
- }
+ g_free(args[5]);
}
/**
@@ -877,7 +1060,7 @@ static void twitter_http_get_home_timeline(struct http_request *req)
{
struct im_connection *ic = req->data;
struct twitter_data *td;
- struct xt_parser *parser;
+ json_value *parsed;
struct twitter_xml_list *txl;
// Check if the connection is still active.
@@ -886,33 +1069,21 @@ static void twitter_http_get_home_timeline(struct http_request *req)
td = ic->proto_data;
- // Check if the HTTP request went well.
- if (req->status_code == 200) {
- td->http_fails = 0;
- if (!(ic->flags & OPT_LOGGED_IN))
- imcb_connected(ic);
- } else {
- // It didn't go well, output the error and return.
- if (++td->http_fails >= 5)
- imcb_error(ic, "Could not retrieve %s: %s",
- TWITTER_HOME_TIMELINE_URL, twitter_parse_error(req));
-
- goto end;
- }
-
txl = g_new0(struct twitter_xml_list, 1);
txl->list = NULL;
- // Parse the data.
- parser = xt_new(NULL, txl);
- xt_feed(parser, req->reply_body, req->body_size);
// The root <statuses> node should hold the list of statuses <status>
- twitter_xt_get_status_list(ic, parser->root, txl);
- xt_free(parser);
+ if (!(parsed = twitter_parse_response(ic, req)))
+ goto end;
+ twitter_xt_get_status_list(ic, parsed, txl);
+ json_value_free(parsed);
td->home_timeline_obj = txl;
end:
+ if (!g_slist_find(twitter_connections, ic))
+ return;
+
td->flags |= TWITTER_GOT_TIMELINE;
twitter_flush_timeline(ic);
@@ -925,7 +1096,7 @@ static void twitter_http_get_mentions(struct http_request *req)
{
struct im_connection *ic = req->data;
struct twitter_data *td;
- struct xt_parser *parser;
+ json_value *parsed;
struct twitter_xml_list *txl;
// Check if the connection is still active.
@@ -934,33 +1105,21 @@ static void twitter_http_get_mentions(struct http_request *req)
td = ic->proto_data;
- // Check if the HTTP request went well.
- if (req->status_code == 200) {
- td->http_fails = 0;
- if (!(ic->flags & OPT_LOGGED_IN))
- imcb_connected(ic);
- } else {
- // It didn't go well, output the error and return.
- if (++td->http_fails >= 5)
- imcb_error(ic, "Could not retrieve %s: %s",
- TWITTER_MENTIONS_URL, twitter_parse_error(req));
-
- goto end;
- }
-
txl = g_new0(struct twitter_xml_list, 1);
txl->list = NULL;
- // Parse the data.
- parser = xt_new(NULL, txl);
- xt_feed(parser, req->reply_body, req->body_size);
// The root <statuses> node should hold the list of statuses <status>
- twitter_xt_get_status_list(ic, parser->root, txl);
- xt_free(parser);
+ if (!(parsed = twitter_parse_response(ic, req)))
+ goto end;
+ twitter_xt_get_status_list(ic, parsed, txl);
+ json_value_free(parsed);
td->mentions_obj = txl;
end:
+ if (!g_slist_find(twitter_connections, ic))
+ return;
+
td->flags |= TWITTER_GOT_MENTIONS;
twitter_flush_timeline(ic);
@@ -974,6 +1133,7 @@ static void twitter_http_post(struct http_request *req)
{
struct im_connection *ic = req->data;
struct twitter_data *td;
+ json_value *parsed, *id;
// Check if the connection is still active.
if (!g_slist_find(twitter_connections, ic))
@@ -982,26 +1142,17 @@ static void twitter_http_post(struct http_request *req)
td = ic->proto_data;
td->last_status_id = 0;
- // Check if the HTTP request went well.
- if (req->status_code != 200) {
- // It didn't go well, output the error and return.
- imcb_error(ic, "HTTP error: %s", twitter_parse_error(req));
+ if (!(parsed = twitter_parse_response(ic, req)))
return;
+
+ if ((id = json_o_get(parsed, "id")) && id->type == json_integer) {
+ td->last_status_id = id->u.integer;
}
-
- if (req->body_size > 0) {
- struct xt_parser *xp = NULL;
- struct xt_node *node;
-
- xp = xt_new(NULL, NULL);
- xt_feed(xp, req->reply_body, req->body_size);
-
- if ((node = xt_find_node(xp->root, "status")) &&
- (node = xt_find_node(node->children, "id")) && node->text)
- td->last_status_id = g_ascii_strtoull(node->text, NULL, 10);
-
- xt_free(xp);
- }
+
+ json_value_free(parsed);
+
+ if (req->flags & TWITTER_HTTP_USER_ACK)
+ twitter_log(ic, "Command processed successfully");
}
/**
@@ -1047,8 +1198,9 @@ void twitter_status_destroy(struct im_connection *ic, guint64 id)
{
char *url;
url = g_strdup_printf("%s%llu%s", TWITTER_STATUS_DESTROY_URL,
- (unsigned long long) id, ".xml");
- twitter_http(ic, url, twitter_http_post, ic, 1, NULL, 0);
+ (unsigned long long) id, ".json");
+ twitter_http_f(ic, url, twitter_http_post, ic, 1, NULL, 0,
+ TWITTER_HTTP_USER_ACK);
g_free(url);
}
@@ -1056,8 +1208,9 @@ void twitter_status_retweet(struct im_connection *ic, guint64 id)
{
char *url;
url = g_strdup_printf("%s%llu%s", TWITTER_STATUS_RETWEET_URL,
- (unsigned long long) id, ".xml");
- twitter_http(ic, url, twitter_http_post, ic, 1, NULL, 0);
+ (unsigned long long) id, ".json");
+ twitter_http_f(ic, url, twitter_http_post, ic, 1, NULL, 0,
+ TWITTER_HTTP_USER_ACK);
g_free(url);
}
@@ -1071,6 +1224,21 @@ void twitter_report_spam(struct im_connection *ic, char *screen_name)
NULL,
};
args[1] = screen_name;
- twitter_http(ic, TWITTER_REPORT_SPAM_URL, twitter_http_post,
- ic, 1, args, 2);
+ twitter_http_f(ic, TWITTER_REPORT_SPAM_URL, twitter_http_post,
+ ic, 1, args, 2, TWITTER_HTTP_USER_ACK);
+}
+
+/**
+ * Favourite a tweet.
+ */
+void twitter_favourite_tweet(struct im_connection *ic, guint64 id)
+{
+ char *args[2] = {
+ "id",
+ NULL,
+ };
+ args[1] = g_strdup_printf("%llu", (unsigned long long) id);
+ twitter_http_f(ic, TWITTER_FAVORITE_CREATE_URL, twitter_http_post,
+ ic, 1, args, 2, TWITTER_HTTP_USER_ACK);
+ g_free(args[1]);
}
diff --git a/protocols/twitter/twitter_lib.h b/protocols/twitter/twitter_lib.h
index 09b91e5b..f59c81ef 100644
--- a/protocols/twitter/twitter_lib.h
+++ b/protocols/twitter/twitter_lib.h
@@ -28,60 +28,61 @@
#include "nogaim.h"
#include "twitter_http.h"
-#define TWITTER_API_URL "http://api.twitter.com/1"
+#define TWITTER_API_URL "http://api.twitter.com/1.1"
#define IDENTICA_API_URL "https://identi.ca/api"
/* Status URLs */
-#define TWITTER_STATUS_UPDATE_URL "/statuses/update.xml"
+#define TWITTER_STATUS_UPDATE_URL "/statuses/update.json"
#define TWITTER_STATUS_SHOW_URL "/statuses/show/"
#define TWITTER_STATUS_DESTROY_URL "/statuses/destroy/"
#define TWITTER_STATUS_RETWEET_URL "/statuses/retweet/"
/* Timeline URLs */
-#define TWITTER_PUBLIC_TIMELINE_URL "/statuses/public_timeline.xml"
-#define TWITTER_FEATURED_USERS_URL "/statuses/featured.xml"
-#define TWITTER_FRIENDS_TIMELINE_URL "/statuses/friends_timeline.xml"
-#define TWITTER_HOME_TIMELINE_URL "/statuses/home_timeline.xml"
-#define TWITTER_MENTIONS_URL "/statuses/mentions.xml"
-#define TWITTER_USER_TIMELINE_URL "/statuses/user_timeline.xml"
+#define TWITTER_PUBLIC_TIMELINE_URL "/statuses/public_timeline.json"
+#define TWITTER_FEATURED_USERS_URL "/statuses/featured.json"
+#define TWITTER_FRIENDS_TIMELINE_URL "/statuses/friends_timeline.json"
+#define TWITTER_HOME_TIMELINE_URL "/statuses/home_timeline.json"
+#define TWITTER_MENTIONS_URL "/statuses/mentions_timeline.json"
+#define TWITTER_USER_TIMELINE_URL "/statuses/user_timeline.json"
/* Users URLs */
-#define TWITTER_USERS_LOOKUP_URL "/users/lookup.xml"
+#define TWITTER_USERS_LOOKUP_URL "/users/lookup.json"
/* Direct messages URLs */
-#define TWITTER_DIRECT_MESSAGES_URL "/direct_messages.xml"
-#define TWITTER_DIRECT_MESSAGES_NEW_URL "/direct_messages/new.xml"
-#define TWITTER_DIRECT_MESSAGES_SENT_URL "/direct_messages/sent.xml"
+#define TWITTER_DIRECT_MESSAGES_URL "/direct_messages.json"
+#define TWITTER_DIRECT_MESSAGES_NEW_URL "/direct_messages/new.json"
+#define TWITTER_DIRECT_MESSAGES_SENT_URL "/direct_messages/sent.json"
#define TWITTER_DIRECT_MESSAGES_DESTROY_URL "/direct_messages/destroy/"
/* Friendships URLs */
-#define TWITTER_FRIENDSHIPS_CREATE_URL "/friendships/create.xml"
-#define TWITTER_FRIENDSHIPS_DESTROY_URL "/friendships/destroy.xml"
-#define TWITTER_FRIENDSHIPS_SHOW_URL "/friendships/show.xml"
+#define TWITTER_FRIENDSHIPS_CREATE_URL "/friendships/create.json"
+#define TWITTER_FRIENDSHIPS_DESTROY_URL "/friendships/destroy.json"
+#define TWITTER_FRIENDSHIPS_SHOW_URL "/friendships/show.json"
/* Social graphs URLs */
-#define TWITTER_FRIENDS_IDS_URL "/friends/ids.xml"
-#define TWITTER_FOLLOWERS_IDS_URL "/followers/ids.xml"
+#define TWITTER_FRIENDS_IDS_URL "/friends/ids.json"
+#define TWITTER_FOLLOWERS_IDS_URL "/followers/ids.json"
/* Account URLs */
-#define TWITTER_ACCOUNT_RATE_LIMIT_URL "/account/rate_limit_status.xml"
+#define TWITTER_ACCOUNT_RATE_LIMIT_URL "/account/rate_limit_status.json"
/* Favorites URLs */
-#define TWITTER_FAVORITES_GET_URL "/favorites.xml"
-#define TWITTER_FAVORITE_CREATE_URL "/favorites/create/"
-#define TWITTER_FAVORITE_DESTROY_URL "/favorites/destroy/"
+#define TWITTER_FAVORITES_GET_URL "/favorites.json"
+#define TWITTER_FAVORITE_CREATE_URL "/favorites/create.json"
+#define TWITTER_FAVORITE_DESTROY_URL "/favorites/destroy.json"
/* Block URLs */
#define TWITTER_BLOCKS_CREATE_URL "/blocks/create/"
#define TWITTER_BLOCKS_DESTROY_URL "/blocks/destroy/"
/* Report spam */
-#define TWITTER_REPORT_SPAM_URL "/report_spam.xml"
+#define TWITTER_REPORT_SPAM_URL "/users/report_spam.json"
+#define TWITTER_USER_STREAM_URL "https://userstream.twitter.com/1.1/user.json"
+
+gboolean twitter_open_stream(struct im_connection *ic);
void twitter_get_timeline(struct im_connection *ic, gint64 next_cursor);
void twitter_get_friends_ids(struct im_connection *ic, gint64 next_cursor);
-void twitter_get_home_timeline(struct im_connection *ic, gint64 next_cursor);
-void twitter_get_mentions(struct im_connection *ic, gint64 next_cursor);
void twitter_get_statuses_friends(struct im_connection *ic, gint64 next_cursor);
void twitter_post_status(struct im_connection *ic, char *msg, guint64 in_reply_to);
@@ -90,6 +91,7 @@ void twitter_friendships_create_destroy(struct im_connection *ic, char *who, int
void twitter_status_destroy(struct im_connection *ic, guint64 id);
void twitter_status_retweet(struct im_connection *ic, guint64 id);
void twitter_report_spam(struct im_connection *ic, char *screen_name);
+void twitter_favourite_tweet(struct im_connection *ic, guint64 id);
#endif //_TWITTER_LIB_H
diff --git a/protocols/yahoo/Makefile b/protocols/yahoo/Makefile
index d756d1e7..8ac73e49 100644
--- a/protocols/yahoo/Makefile
+++ b/protocols/yahoo/Makefile
@@ -12,7 +12,7 @@ _SRCDIR_ := $(_SRCDIR_)protocols/yahoo/
endif
# [SH] Program variables
-objects = yahoo.o crypt.o libyahoo2.o yahoo_fn.o yahoo_httplib.o yahoo_util.o
+objects = yahoo.o libyahoo2.o yahoo_httplib.o yahoo_util.o
CFLAGS += -DSTDC_HEADERS -DHAVE_STRING_H -DHAVE_STRCHR -DHAVE_MEMCPY -DHAVE_GLIB
LFLAGS += -r
@@ -38,7 +38,7 @@ $(objects): ../../Makefile.settings Makefile
$(objects): %.o: $(_SRCDIR_)%.c
@echo '*' Compiling $<
- @$(CC) -c $(CFLAGS) $< -o $@
+ @$(CC) -c $(CFLAGS) $(CFLAGS_BITLBEE) $< -o $@
yahoo_mod.o: $(objects)
@echo '*' Linking yahoo_mod.o
diff --git a/protocols/yahoo/crypt.c b/protocols/yahoo/crypt.c
deleted file mode 100644
index 5122e3af..00000000
--- a/protocols/yahoo/crypt.c
+++ /dev/null
@@ -1,203 +0,0 @@
-/* One way encryption based on MD5 sum.
- Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-/* warmenhoven took this file and made it work with the md5.[ch] we
- * already had. isn't that lovely. people should just use linux or
- * freebsd, crypt works properly on those systems. i hate solaris */
-
-#if HAVE_STRING_H
-# include <string.h>
-#elif HAVE_STRINGS_H
-# include <strings.h>
-#endif
-
-#include <stdlib.h>
-#include "yahoo_util.h"
-
-#include "md5.h"
-
-/* Define our magic string to mark salt for MD5 "encryption"
- replacement. This is meant to be the same as for other MD5 based
- encryption implementations. */
-static const char md5_salt_prefix[] = "$1$";
-
-/* Table with characters for base64 transformation. */
-static const char b64t[64] =
-"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
-
-char *yahoo_crypt(char *key, char *salt)
-{
- char *buffer = NULL;
- int buflen = 0;
- int needed = 3 + strlen (salt) + 1 + 26 + 1;
-
- md5_byte_t alt_result[16];
- md5_state_t ctx;
- md5_state_t alt_ctx;
- size_t salt_len;
- size_t key_len;
- size_t cnt;
- char *cp;
-
- if (buflen < needed) {
- buflen = needed;
- if ((buffer = realloc(buffer, buflen)) == NULL)
- return NULL;
- }
-
- /* Find beginning of salt string. The prefix should normally always
- be present. Just in case it is not. */
- if (strncmp (md5_salt_prefix, salt, sizeof (md5_salt_prefix) - 1) == 0)
- /* Skip salt prefix. */
- salt += sizeof (md5_salt_prefix) - 1;
-
- salt_len = MIN (strcspn (salt, "$"), 8);
- key_len = strlen (key);
-
- /* Prepare for the real work. */
- md5_init(&ctx);
-
- /* Add the key string. */
- md5_append(&ctx, (md5_byte_t *)key, key_len);
-
- /* Because the SALT argument need not always have the salt prefix we
- add it separately. */
- md5_append(&ctx, (md5_byte_t *)md5_salt_prefix, sizeof (md5_salt_prefix) - 1);
-
- /* The last part is the salt string. This must be at most 8
- characters and it ends at the first `$' character (for
- compatibility which existing solutions). */
- md5_append(&ctx, (md5_byte_t *)salt, salt_len);
-
- /* Compute alternate MD5 sum with input KEY, SALT, and KEY. The
- final result will be added to the first context. */
- md5_init(&alt_ctx);
-
- /* Add key. */
- md5_append(&alt_ctx, (md5_byte_t *)key, key_len);
-
- /* Add salt. */
- md5_append(&alt_ctx, (md5_byte_t *)salt, salt_len);
-
- /* Add key again. */
- md5_append(&alt_ctx, (md5_byte_t *)key, key_len);
-
- /* Now get result of this (16 bytes) and add it to the other
- context. */
- md5_finish(&alt_ctx, alt_result);
-
- /* Add for any character in the key one byte of the alternate sum. */
- for (cnt = key_len; cnt > 16; cnt -= 16)
- md5_append(&ctx, alt_result, 16);
- md5_append(&ctx, alt_result, cnt);
-
- /* For the following code we need a NUL byte. */
- alt_result[0] = '\0';
-
- /* The original implementation now does something weird: for every 1
- bit in the key the first 0 is added to the buffer, for every 0
- bit the first character of the key. This does not seem to be
- what was intended but we have to follow this to be compatible. */
- for (cnt = key_len; cnt > 0; cnt >>= 1)
- md5_append(&ctx, (cnt & 1) != 0 ? alt_result : (md5_byte_t *)key, 1);
-
- /* Create intermediate result. */
- md5_finish(&ctx, alt_result);
-
- /* Now comes another weirdness. In fear of password crackers here
- comes a quite long loop which just processes the output of the
- previous round again. We cannot ignore this here. */
- for (cnt = 0; cnt < 1000; ++cnt) {
- /* New context. */
- md5_init(&ctx);
-
- /* Add key or last result. */
- if ((cnt & 1) != 0)
- md5_append(&ctx, (md5_byte_t *)key, key_len);
- else
- md5_append(&ctx, alt_result, 16);
-
- /* Add salt for numbers not divisible by 3. */
- if (cnt % 3 != 0)
- md5_append(&ctx, (md5_byte_t *)salt, salt_len);
-
- /* Add key for numbers not divisible by 7. */
- if (cnt % 7 != 0)
- md5_append(&ctx, (md5_byte_t *)key, key_len);
-
- /* Add key or last result. */
- if ((cnt & 1) != 0)
- md5_append(&ctx, alt_result, 16);
- else
- md5_append(&ctx, (md5_byte_t *)key, key_len);
-
- /* Create intermediate result. */
- md5_finish(&ctx, alt_result);
- }
-
- /* Now we can construct the result string. It consists of three
- parts. */
-
- strncpy(buffer, md5_salt_prefix, MAX (0, buflen));
- cp = buffer + strlen(buffer);
- buflen -= sizeof (md5_salt_prefix);
-
- strncpy(cp, salt, MIN ((size_t) buflen, salt_len));
- cp = cp + strlen(cp);
- buflen -= MIN ((size_t) buflen, salt_len);
-
- if (buflen > 0) {
- *cp++ = '$';
- --buflen;
- }
-
-#define b64_from_24bit(B2, B1, B0, N) \
- do { \
- unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \
- int n = (N); \
- while (n-- > 0 && buflen > 0) { \
- *cp++ = b64t[w & 0x3f]; \
- --buflen; \
- w >>= 6; \
- }\
- } while (0)
-
- b64_from_24bit (alt_result[0], alt_result[6], alt_result[12], 4);
- b64_from_24bit (alt_result[1], alt_result[7], alt_result[13], 4);
- b64_from_24bit (alt_result[2], alt_result[8], alt_result[14], 4);
- b64_from_24bit (alt_result[3], alt_result[9], alt_result[15], 4);
- b64_from_24bit (alt_result[4], alt_result[10], alt_result[5], 4);
- b64_from_24bit (0, 0, alt_result[11], 2);
- if (buflen <= 0) {
- FREE(buffer);
- } else
- *cp = '\0'; /* Terminate the string. */
-
- /* Clear the buffer for the intermediate result so that people
- attaching to processes or reading core dumps cannot get any
- information. We do it in this way to clear correct_words[]
- inside the MD5 implementation as well. */
- md5_init(&ctx);
- md5_finish(&ctx, alt_result);
- memset (&ctx, '\0', sizeof (ctx));
- memset (&alt_ctx, '\0', sizeof (alt_ctx));
-
- return buffer;
-}
diff --git a/protocols/yahoo/libyahoo2.c b/protocols/yahoo/libyahoo2.c
index ca2a161e..da427279 100644
--- a/protocols/yahoo/libyahoo2.c
+++ b/protocols/yahoo/libyahoo2.c
@@ -82,7 +82,6 @@ char *strchr (), *strrchr ();
#include "yahoo2.h"
#include "yahoo_httplib.h"
#include "yahoo_util.h"
-#include "yahoo_fn.h"
#include "yahoo2_callbacks.h"
#include "yahoo_debug.h"
@@ -121,11 +120,6 @@ int yahoo_log_message(char *fmt, ...)
return YAHOO_CALLBACK(ext_yahoo_log) ("%s", out);
}
-int yahoo_connect(char *host, int port)
-{
- return YAHOO_CALLBACK(ext_yahoo_connect) (host, port);
-}
-
static enum yahoo_log_level log_level = YAHOO_LOG_NONE;
enum yahoo_log_level yahoo_get_log_level()
@@ -374,6 +368,7 @@ static struct yahoo_input_data * find_input_by_id(int id)
}
*/
+#if 0
static struct yahoo_input_data *find_input_by_id_and_webcam_user(int id,
const char *who)
{
@@ -390,6 +385,7 @@ static struct yahoo_input_data *find_input_by_id_and_webcam_user(int id,
}
return NULL;
}
+#endif
static struct yahoo_input_data *find_input_by_id_and_type(int id,
enum yahoo_connection_type type)
@@ -430,8 +426,6 @@ static int count_inputs_with_id(int id)
return c;
}
-extern char *yahoo_crypt(char *, char *);
-
/* Free a buddy list */
static void yahoo_free_buddies(YList *list)
{
@@ -2642,6 +2636,7 @@ static struct yahoo_packet *yahoo_getdata(struct yahoo_input_data *yid)
return pkt;
}
+#if 0
static struct yab *yahoo_yab_read(unsigned char *d, int len)
{
char *st, *en;
@@ -2792,6 +2787,7 @@ static struct yab *yahoo_getyab(struct yahoo_input_data *yid)
return yab;
}
+#endif
static char *yahoo_getwebcam_master(struct yahoo_input_data *yid)
{
@@ -3099,6 +3095,7 @@ static void yahoo_process_chatcat_connection(struct yahoo_input_data *yid,
}
}
+#if 0
static void yahoo_process_yab_connection(struct yahoo_input_data *yid, int over)
{
struct yahoo_data *yd = yid->yd;
@@ -3158,6 +3155,7 @@ static void yahoo_process_yab_connection(struct yahoo_input_data *yid, int over)
YAHOO_CALLBACK(ext_yahoo_got_buddies) (yd->client_id,
yd->buddies);
}
+#endif
static void yahoo_process_search_connection(struct yahoo_input_data *yid,
int over)
@@ -3413,7 +3411,7 @@ static void yahoo_process_webcam_connection(struct yahoo_input_data *yid,
static void (*yahoo_process_connection[]) (struct yahoo_input_data *,
int over) = {
yahoo_process_pager_connection, yahoo_process_ft_connection,
- yahoo_process_yab_connection,
+ NULL, /*yahoo_process_yab_connection, */
yahoo_process_webcam_master_connection,
yahoo_process_webcam_connection,
yahoo_process_chatcat_connection,
@@ -3577,10 +3575,12 @@ void *yahoo_get_fd(int id)
return yid->fd;
}
+#if 0
void yahoo_send_buzz(int id, const char *from, const char *who)
{
yahoo_send_im(id, from, who, "<ding>", 1, 0);
}
+#endif
void yahoo_send_im(int id, const char *from, const char *who, const char *what,
int utf8, int picture)
@@ -3722,6 +3722,7 @@ void yahoo_logoff(int id)
}
+#if 0
void yahoo_get_list(int id)
{
struct yahoo_input_data *yid =
@@ -3741,6 +3742,7 @@ void yahoo_get_list(int id)
yahoo_packet_free(pkt);
}
}
+#endif
static void _yahoo_http_connected(int id, void *fd, int error, void *data)
{
@@ -3757,6 +3759,7 @@ static void _yahoo_http_connected(int id, void *fd, int error, void *data)
YAHOO_INPUT_READ, yid);
}
+#if 0
/* FIXME Get address book from address.yahoo.com instead */
void yahoo_get_yab(int id)
{
@@ -3897,6 +3900,7 @@ void yahoo_refresh(int id)
yahoo_packet_free(pkt);
}
}
+#endif
void yahoo_keepalive(int id)
{
@@ -3914,6 +3918,7 @@ void yahoo_keepalive(int id)
yahoo_packet_free(pkt);
}
+#if 0
void yahoo_chat_keepalive(int id)
{
struct yahoo_input_data *yid =
@@ -3931,6 +3936,7 @@ void yahoo_chat_keepalive(int id)
yahoo_send_packet(yid, pkt, 0);
yahoo_packet_free(pkt);
}
+#endif
void yahoo_add_buddy(int id, const char *who, const char *group,
const char *msg)
@@ -4023,6 +4029,7 @@ void yahoo_confirm_buddy(int id, const char *who, int reject, const char *msg)
yahoo_packet_free(pkt);
}
+#if 0
void yahoo_ignore_buddy(int id, const char *who, int unignore)
{
struct yahoo_input_data *yid =
@@ -4069,6 +4076,7 @@ void yahoo_stealth_buddy(int id, const char *who, int unstealth)
yahoo_send_packet(yid, pkt, 0);
yahoo_packet_free(pkt);
}
+#endif
void yahoo_change_buddy_group(int id, const char *who, const char *old_group,
const char *new_group)
@@ -4097,6 +4105,7 @@ void yahoo_change_buddy_group(int id, const char *who, const char *old_group,
yahoo_packet_free(pkt);
}
+#if 0
void yahoo_group_rename(int id, const char *old_group, const char *new_group)
{
struct yahoo_input_data *yid =
@@ -4148,6 +4157,7 @@ void yahoo_conference_addinvite(int id, const char *from, const char *who,
yahoo_packet_free(pkt);
}
+#endif
void yahoo_conference_invite(int id, const char *from, YList *who,
const char *room, const char *msg)
@@ -4289,6 +4299,7 @@ void yahoo_conference_message(int id, const char *from, YList *who,
yahoo_packet_free(pkt);
}
+#if 0
void yahoo_get_chatrooms(int id, int chatroomid)
{
struct yahoo_data *yd = find_conn_by_id(id);
@@ -4731,6 +4742,7 @@ void yahoo_send_picture(int id, const char *name, unsigned long size,
{
/* Not Implemented */
}
+#endif
/* File Transfer */
static YList *active_file_transfers = NULL;
@@ -4758,6 +4770,7 @@ struct send_file_data {
void *data;
};
+#if 0
static char *yahoo_get_random(void)
{
int i = 0;
@@ -4787,6 +4800,7 @@ static char *yahoo_get_random(void)
return strdup(out);
}
+#endif
static int _are_same_id(const void *sfd1, const void *id)
{
@@ -5167,6 +5181,7 @@ static void yahoo_process_filetransfer(struct yahoo_input_data *yid,
}
}
+#if 0
void yahoo_send_file(int id, const char *who, const char *msg,
const char *name, unsigned long size,
yahoo_get_fd_callback callback, void *data)
@@ -5245,6 +5260,7 @@ void yahoo_send_file_transfer_response(int client_id, int response, char *id, vo
if(response == YAHOO_FILE_TRANSFER_REJECT)
yahoo_remove_active_transfer(sfd);
}
+#endif
static void yahoo_process_ft_connection(struct yahoo_input_data *yid, int over)
{
@@ -5358,6 +5374,7 @@ static void yahoo_process_ft_connection(struct yahoo_input_data *yid, int over)
/* End File Transfer */
+#if 0
enum yahoo_status yahoo_current_status(int id)
{
struct yahoo_data *yd = find_conn_by_id(id);
@@ -5407,6 +5424,7 @@ const char *yahoo_get_cookie(int id, const char *which)
return yd->login_cookie;
return NULL;
}
+#endif
const char *yahoo_get_profile_url(void)
{
diff --git a/protocols/yahoo/yahoo.c b/protocols/yahoo/yahoo.c
index 8b3b0c05..a9fb2f34 100644
--- a/protocols/yahoo/yahoo.c
+++ b/protocols/yahoo/yahoo.c
@@ -1,7 +1,7 @@
/*
* libyahoo2 wrapper to BitlBee
*
- * Mostly Copyright 2004-2010 Wilmer van der Gaast <wilmer@gaast.net>
+ * Mostly Copyright 2004-2012 Wilmer van der Gaast <wilmer@gaast.net>
*
* 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
@@ -569,10 +569,6 @@ void ext_yahoo_got_buddies( int id, YList *buds )
}
}
-void ext_yahoo_got_ignore( int id, YList *igns )
-{
-}
-
void ext_yahoo_got_identities( int id, YList *ids )
{
}
@@ -813,13 +809,6 @@ void ext_yahoo_got_buddy_change_group( int id, const char *me, const char *who,
imcb_add_buddy( ic, who, new_group );
}
-/* Because we don't want asynchronous connects in BitlBee, and because
- libyahoo doesn't seem to use this one anyway, this one is now defunct. */
-int ext_yahoo_connect(const char *host, int port)
-{
- return -1;
-}
-
static void byahoo_accept_conf( void *data )
{
struct byahoo_conf_invitation *inv = data;
diff --git a/protocols/yahoo/yahoo2.h b/protocols/yahoo/yahoo2.h
index 589aaa5a..b9e6665b 100644
--- a/protocols/yahoo/yahoo2.h
+++ b/protocols/yahoo/yahoo2.h
@@ -120,7 +120,7 @@ extern "C" {
/* utf8 is whether msg is a utf8 string or not. */
void yahoo_send_im(int id, const char *from, const char *who,
const char *msg, int utf8, int picture);
- void yahoo_send_buzz(int id, const char *from, const char *who);
+// void yahoo_send_buzz(int id, const char *from, const char *who);
/* if type is true, send typing notice, else send stopped typing notice */
void yahoo_send_typing(int id, const char *from, const char *who,
int typ);
diff --git a/protocols/yahoo/yahoo2_callbacks.h b/protocols/yahoo/yahoo2_callbacks.h
index 0dccf188..0a3aab46 100644
--- a/protocols/yahoo/yahoo2_callbacks.h
+++ b/protocols/yahoo/yahoo2_callbacks.h
@@ -112,7 +112,7 @@ struct yahoo_callbacks {
* id - the id that identifies the server connection
* igns - the ignore list
*/
- void YAHOO_CALLBACK_TYPE(ext_yahoo_got_ignore) (int id, YList *igns);
+// void YAHOO_CALLBACK_TYPE(ext_yahoo_got_ignore) (int id, YList *igns);
/*
* Name: ext_yahoo_got_identities
@@ -677,7 +677,7 @@ struct yahoo_callbacks {
* Returns:
* a unix file descriptor to the socket
*/
- int YAHOO_CALLBACK_TYPE(ext_yahoo_connect) (const char *host, int port);
+// int YAHOO_CALLBACK_TYPE(ext_yahoo_connect) (const char *host, int port);
/*
* Name: ext_yahoo_connect_async
diff --git a/protocols/yahoo/yahoo_fn.c b/protocols/yahoo/yahoo_fn.c
deleted file mode 100644
index 9544999d..00000000
--- a/protocols/yahoo/yahoo_fn.c
+++ /dev/null
@@ -1,4622 +0,0 @@
-/*
- * libyahoo2 - originally from gaim patches by Amatus
- *
- * Copyright (C) 2003-2004
- *
- * Some code copyright (C) 1998-1999, Mark Spencer <markster@marko.net>
- * libfaim code copyright 1998, 1999 Adam Fritzler <afritz@auk.cx>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "yahoo_fn.h"
-
-static const unsigned char table_0[256] = {
- 0x5A, 0x41, 0x11, 0x77, 0x29, 0x9C, 0x31, 0xAD,
- 0x4A, 0x32, 0x1A, 0x6D, 0x56, 0x9F, 0x39, 0xA6,
- 0x0C, 0xE8, 0x49, 0x40, 0xA4, 0x21, 0xE9, 0x01,
- 0x91, 0x86, 0x2F, 0xB9, 0xED, 0x80, 0x51, 0xAB,
- 0x7F, 0x92, 0xF2, 0x73, 0xCD, 0xD9, 0x75, 0x2A,
- 0x70, 0x34, 0x35, 0x8D, 0xA8, 0x72, 0x7D, 0x9B,
- 0x2E, 0xC5, 0x2D, 0x76, 0x1E, 0xBB, 0xE7, 0x37,
- 0xBA, 0xB7, 0xB2, 0x03, 0x20, 0x17, 0x8A, 0x07,
- 0xD6, 0x96, 0x13, 0x95, 0xE5, 0xF1, 0x18, 0x3B,
- 0xA5, 0x62, 0x33, 0xC1, 0x44, 0x3D, 0x6C, 0xA7,
- 0xBF, 0x1C, 0x60, 0xFF, 0x5B, 0xF5, 0x8E, 0xE6,
- 0x5C, 0xCC, 0xF7, 0x69, 0x15, 0x0F, 0x0B, 0xBD,
- 0x12, 0x9D, 0xB3, 0x65, 0x53, 0xB1, 0x14, 0xF4,
- 0x19, 0x3E, 0xB6, 0x45, 0xCB, 0xA2, 0x7A, 0xD3,
- 0xF8, 0xD1, 0x61, 0xEE, 0xBC, 0xC6, 0xB0, 0x5D,
- 0x4B, 0x09, 0x26, 0xE1, 0x1D, 0x6E, 0xC3, 0xFB,
- 0x68, 0x4C, 0x42, 0x52, 0x5F, 0xDE, 0xFD, 0xEF,
- 0x81, 0x04, 0x6F, 0xE0, 0xF0, 0x1F, 0x0D, 0x7C,
- 0x58, 0x4F, 0x1B, 0x30, 0xCF, 0x9A, 0x2B, 0x05,
- 0xF6, 0x3F, 0x78, 0xAC, 0xD8, 0xEC, 0xE2, 0x25,
- 0x93, 0xDA, 0x84, 0x8C, 0x4E, 0xD5, 0x38, 0x0A,
- 0x06, 0x7E, 0xD4, 0x59, 0x98, 0xE3, 0x36, 0xC2,
- 0xD2, 0xA3, 0x10, 0x79, 0xFA, 0xC9, 0x16, 0x27,
- 0x66, 0x89, 0xFE, 0x57, 0xF3, 0x83, 0xB8, 0x28,
- 0x3C, 0xC7, 0xCE, 0x71, 0xC8, 0xDB, 0x22, 0xE4,
- 0xDD, 0xDF, 0x02, 0x8F, 0x5E, 0xEB, 0x48, 0x2C,
- 0x08, 0xC4, 0x43, 0xEA, 0x50, 0x55, 0x90, 0x54,
- 0x87, 0xCA, 0x00, 0x24, 0x6B, 0x85, 0x97, 0xD7,
- 0xDC, 0x6A, 0x67, 0xD0, 0x88, 0xA1, 0x9E, 0xC0,
- 0x46, 0xAE, 0x64, 0x74, 0x4D, 0xA0, 0x99, 0xB5,
- 0x0E, 0x8B, 0xAA, 0x3A, 0xB4, 0xFC, 0xA9, 0x94,
- 0x7B, 0xBE, 0xF9, 0xAF, 0x82, 0x63, 0x47, 0x23 };
-
-static const unsigned char table_1[256] = {
- 0x08, 0xCB, 0x54, 0xCF, 0x97, 0x53, 0x59, 0xF1,
- 0x66, 0xEC, 0xDB, 0x1B, 0xB1, 0xE2, 0x36, 0xEB,
- 0xB3, 0x8F, 0x71, 0xA8, 0x90, 0x7D, 0xDA, 0xDC,
- 0x2C, 0x2F, 0xE8, 0x6A, 0x73, 0x37, 0xAE, 0xCC,
- 0xA1, 0x16, 0xE6, 0xFC, 0x9C, 0xA9, 0x2A, 0x3F,
- 0x58, 0xFD, 0x56, 0x4C, 0xA5, 0xF2, 0x33, 0x99,
- 0x1A, 0xB7, 0xFE, 0xA6, 0x1E, 0x32, 0x9E, 0x48,
- 0x03, 0x4A, 0x78, 0xEE, 0xCA, 0xC3, 0x88, 0x7A,
- 0xAC, 0x23, 0xAA, 0xBD, 0xDE, 0xD3, 0x67, 0x43,
- 0xFF, 0x64, 0x8A, 0xF9, 0x04, 0xD0, 0x7B, 0xC2,
- 0xBC, 0xF3, 0x89, 0x0E, 0xDD, 0xAB, 0x9D, 0x84,
- 0x5A, 0x62, 0x7F, 0x6D, 0x82, 0x68, 0xA3, 0xED,
- 0x2E, 0x07, 0x41, 0xEF, 0x2D, 0x70, 0x4F, 0x69,
- 0x8E, 0xE7, 0x0F, 0x11, 0x19, 0xAF, 0x31, 0xFB,
- 0x8D, 0x4B, 0x5F, 0x96, 0x75, 0x42, 0x6C, 0x46,
- 0xE4, 0x55, 0xD6, 0x3B, 0xE1, 0xD1, 0xB0, 0xB5,
- 0x45, 0x29, 0xC0, 0x94, 0x9F, 0xD4, 0x15, 0x17,
- 0x3C, 0x47, 0xC8, 0xD9, 0xC6, 0x76, 0xB9, 0x02,
- 0xE0, 0xC9, 0xB2, 0x01, 0xC1, 0x5D, 0x4E, 0x14,
- 0xF4, 0xAD, 0xB6, 0x00, 0x72, 0xF0, 0x49, 0x0D,
- 0xD8, 0x5E, 0x6F, 0x2B, 0x8C, 0x51, 0x83, 0xC5,
- 0x0A, 0x85, 0xE5, 0x38, 0x7E, 0x26, 0xEA, 0x22,
- 0x6B, 0x06, 0xD5, 0x8B, 0xBF, 0xC7, 0x35, 0x1D,
- 0xF6, 0x24, 0x28, 0xCE, 0x9B, 0x77, 0x20, 0x60,
- 0xF5, 0x87, 0x3D, 0x65, 0x86, 0x0C, 0xDF, 0xBA,
- 0x12, 0xA4, 0x3A, 0x34, 0xD7, 0xA0, 0xF8, 0x63,
- 0x52, 0x27, 0xB8, 0x18, 0xA7, 0x13, 0x91, 0x09,
- 0x93, 0x5C, 0x10, 0x9A, 0xB4, 0xE9, 0x44, 0xC4,
- 0x21, 0x57, 0x1C, 0x0B, 0xA2, 0x74, 0x4D, 0xBE,
- 0xD2, 0x1F, 0xCD, 0xE3, 0x6E, 0x7C, 0x40, 0x50,
- 0x39, 0x80, 0x98, 0xFA, 0x25, 0x92, 0x30, 0x5B,
- 0x05, 0x95, 0xBB, 0x79, 0x61, 0x3E, 0x81, 0xF7 };
-
-static const unsigned char table_2[32] = {
- 0x19, 0x05, 0x09, 0x1C, 0x0B, 0x1A, 0x12, 0x03,
- 0x06, 0x04, 0x0D, 0x1D, 0x15, 0x0E, 0x1B, 0x18,
- 0x00, 0x07, 0x08, 0x02, 0x13, 0x1F, 0x0C, 0x1E,
- 0x16, 0x0A, 0x10, 0x0F, 0x01, 0x14, 0x11, 0x17 };
-
-static const unsigned char table_3[256] = {
- 0xBC, 0x1B, 0xCC, 0x1E, 0x5B, 0x59, 0x4F, 0xA8,
- 0x62, 0xC6, 0xC1, 0xBB, 0x83, 0x2D, 0xA3, 0xA6,
- 0x5A, 0xDC, 0xE5, 0x93, 0xFB, 0x5C, 0xD6, 0x2A,
- 0x97, 0xC7, 0x1C, 0x73, 0x08, 0x45, 0xD2, 0x89,
- 0x4A, 0xD4, 0xCF, 0x0C, 0x1D, 0xD8, 0xCD, 0x26,
- 0x8F, 0x11, 0x55, 0x8B, 0xD3, 0x53, 0xCE, 0x00,
- 0xB5, 0x3B, 0x2E, 0x39, 0x88, 0x7B, 0x85, 0x46,
- 0x54, 0xA5, 0x31, 0x40, 0x3E, 0x0A, 0x4C, 0x68,
- 0x70, 0x0F, 0xBA, 0x0E, 0x75, 0x8A, 0xEB, 0x44,
- 0x60, 0x6C, 0x05, 0xC9, 0xF0, 0xDD, 0x0D, 0x66,
- 0xAB, 0xA1, 0xAD, 0xF2, 0x12, 0x6A, 0xE6, 0x27,
- 0xF6, 0x9F, 0xDB, 0xB8, 0xF4, 0x56, 0x5E, 0x2C,
- 0xDA, 0xFE, 0x34, 0x86, 0xF5, 0xC2, 0xB0, 0xF1,
- 0xCB, 0xF3, 0x78, 0x9B, 0x7F, 0xB4, 0xD7, 0x58,
- 0x74, 0x07, 0x72, 0x96, 0x02, 0xCA, 0xAC, 0xE8,
- 0x5D, 0xA7, 0x32, 0xBD, 0x81, 0x43, 0x18, 0xF8,
- 0x15, 0x0B, 0xE9, 0x76, 0x30, 0xBF, 0x3A, 0x22,
- 0x9E, 0xD1, 0x79, 0x37, 0xBE, 0x8C, 0x7A, 0x98,
- 0x21, 0x95, 0x10, 0x8D, 0xDF, 0xC0, 0x69, 0xC8,
- 0x03, 0x6E, 0x4B, 0x36, 0xFC, 0x6F, 0xA9, 0x48,
- 0x63, 0xE1, 0xB9, 0x24, 0x87, 0x13, 0xB2, 0xA4,
- 0x84, 0x06, 0x14, 0x61, 0x3D, 0x92, 0xB1, 0x41,
- 0xE2, 0x71, 0xAF, 0x16, 0xDE, 0x25, 0x82, 0xD9,
- 0x2B, 0x33, 0x51, 0xA2, 0x4E, 0x7D, 0x94, 0xFF,
- 0xFD, 0x5F, 0x80, 0xED, 0x64, 0xE7, 0x50, 0x6D,
- 0xD0, 0x3C, 0x6B, 0x65, 0x77, 0x17, 0x1A, 0xEC,
- 0xD5, 0xAA, 0xF9, 0xC4, 0x9C, 0x35, 0xE3, 0x42,
- 0xE4, 0x19, 0x52, 0x67, 0xB7, 0x9D, 0x28, 0xC5,
- 0x47, 0x38, 0x91, 0x57, 0xAE, 0x3F, 0x29, 0x9A,
- 0x2F, 0xF7, 0x90, 0x04, 0xEE, 0xFA, 0x20, 0xB6,
- 0xEA, 0x49, 0x23, 0x4D, 0xB3, 0x8E, 0xC3, 0x1F,
- 0x7C, 0xEF, 0xE0, 0x99, 0x09, 0xA0, 0x01, 0x7E };
-
-static const unsigned char table_4[32] = {
- 0x1F, 0x0B, 0x00, 0x1E, 0x03, 0x0E, 0x15, 0x01,
- 0x1A, 0x17, 0x1D, 0x1B, 0x11, 0x0F, 0x0A, 0x12,
- 0x13, 0x18, 0x02, 0x04, 0x09, 0x06, 0x0D, 0x07,
- 0x08, 0x05, 0x10, 0x19, 0x0C, 0x14, 0x16, 0x1C };
-
-static const unsigned char table_5[256] = {
- 0x9A, 0xAB, 0x61, 0x28, 0x0A, 0x23, 0xFC, 0xBA,
- 0x90, 0x22, 0xB7, 0x62, 0xD9, 0x09, 0x91, 0xF4,
- 0x7B, 0x5D, 0x6B, 0x80, 0xAC, 0x9E, 0x21, 0x72,
- 0x64, 0x2D, 0xFF, 0x66, 0xEB, 0x5B, 0x05, 0xC8,
- 0x1B, 0xD1, 0x55, 0xF5, 0x97, 0x08, 0xAE, 0xC7,
- 0x00, 0xDE, 0xE1, 0x78, 0xD8, 0xB6, 0xF0, 0x17,
- 0xE4, 0x32, 0xCD, 0x76, 0x07, 0x14, 0x7F, 0x7A,
- 0xBF, 0xB4, 0x1D, 0x94, 0x48, 0x75, 0xFA, 0xA7,
- 0x99, 0x7E, 0x65, 0x38, 0x29, 0x51, 0xC3, 0x83,
- 0x7C, 0x0D, 0xA0, 0xCC, 0xF1, 0xDD, 0xE2, 0x49,
- 0xF8, 0xD2, 0x25, 0x54, 0x9B, 0x0E, 0xB9, 0xFE,
- 0x67, 0xC4, 0xCE, 0x13, 0xD4, 0xE7, 0xB8, 0x41,
- 0x77, 0xDB, 0xA6, 0xB0, 0x11, 0x6A, 0x5E, 0x68,
- 0x8D, 0xF9, 0x36, 0xD3, 0xC2, 0x3A, 0xAA, 0x59,
- 0x03, 0xE0, 0xE3, 0xF3, 0x42, 0x2C, 0x04, 0x47,
- 0xE6, 0x93, 0xCB, 0x6E, 0x20, 0xCA, 0x01, 0xA1,
- 0x40, 0x2B, 0x2F, 0x5F, 0x87, 0xD0, 0xEC, 0x88,
- 0x27, 0x58, 0xC6, 0x3E, 0xDF, 0x26, 0x5C, 0xE9,
- 0x1F, 0x0F, 0x95, 0x1C, 0xFB, 0xA5, 0x12, 0x39,
- 0x1E, 0x3C, 0x33, 0x43, 0x56, 0xE8, 0x82, 0xF7,
- 0x7D, 0x89, 0xF2, 0xD7, 0x50, 0x92, 0x60, 0x4C,
- 0x2A, 0x86, 0x16, 0x6C, 0x37, 0xC0, 0xAD, 0xB3,
- 0x24, 0x45, 0xB1, 0xA2, 0x71, 0xA4, 0xA3, 0xED,
- 0xC9, 0x5A, 0x4D, 0x84, 0x0C, 0x3F, 0xC5, 0x9D,
- 0x63, 0x19, 0x79, 0x57, 0x96, 0x30, 0x74, 0xBB,
- 0xDA, 0x1A, 0x9F, 0x44, 0xC1, 0x98, 0xE5, 0x81,
- 0xD6, 0x18, 0x8F, 0xFD, 0x8E, 0x06, 0x6F, 0xF6,
- 0x2E, 0x3B, 0xB5, 0x85, 0x8A, 0x9C, 0x53, 0x4A,
- 0xA9, 0x52, 0x3D, 0x4E, 0xBE, 0xAF, 0xBC, 0xA8,
- 0x4F, 0x6D, 0x15, 0x35, 0x8C, 0xBD, 0x34, 0x8B,
- 0xDC, 0x0B, 0xCF, 0x31, 0xEA, 0xB2, 0x70, 0x4B,
- 0x46, 0x73, 0x69, 0xD5, 0x10, 0xEE, 0x02, 0xEF };
-
-static const unsigned char table_6[32] = {
- 0x1A, 0x1C, 0x0F, 0x0C, 0x00, 0x02, 0x13, 0x09,
- 0x11, 0x05, 0x0D, 0x12, 0x18, 0x0B, 0x04, 0x10,
- 0x14, 0x1B, 0x1E, 0x16, 0x07, 0x08, 0x03, 0x17,
- 0x19, 0x1F, 0x01, 0x0E, 0x15, 0x06, 0x0A, 0x1D };
-
-static const unsigned char table_7[256] = {
- 0x52, 0x11, 0x72, 0xD0, 0x76, 0xD7, 0xAE, 0x03,
- 0x7F, 0x19, 0xF4, 0xB8, 0xB3, 0x5D, 0xCA, 0x2D,
- 0x5C, 0x30, 0x53, 0x1A, 0x57, 0xF6, 0xAD, 0x83,
- 0x29, 0x79, 0xD5, 0xF0, 0x0F, 0xC3, 0x8B, 0xD3,
- 0x8E, 0x37, 0x01, 0xA6, 0xF1, 0x10, 0x04, 0x71,
- 0xCC, 0xC6, 0xE7, 0xC2, 0x85, 0x94, 0xBD, 0x6F,
- 0xCB, 0xEA, 0xFC, 0xA1, 0x38, 0x5E, 0x08, 0x2E,
- 0x35, 0x42, 0x67, 0xD4, 0x56, 0x6D, 0x7C, 0xE5,
- 0x0E, 0x7D, 0x12, 0x65, 0xF5, 0x33, 0x82, 0xC4,
- 0x1D, 0xD2, 0x16, 0x58, 0xEC, 0xCD, 0xA8, 0xBF,
- 0xAB, 0x07, 0x45, 0x55, 0xB7, 0x6A, 0x70, 0xF2,
- 0xBE, 0x05, 0x6B, 0x9D, 0xEB, 0x13, 0x0D, 0x9F,
- 0xE8, 0xA7, 0xC8, 0x31, 0x3C, 0xB6, 0x21, 0xC0,
- 0x20, 0x60, 0x6C, 0xE2, 0xCE, 0x8C, 0xFD, 0x95,
- 0xE3, 0x4A, 0xB5, 0xB2, 0x40, 0xB1, 0xF3, 0x17,
- 0xF9, 0x24, 0x06, 0x22, 0x2F, 0x25, 0x93, 0x8A,
- 0x2A, 0x7E, 0x28, 0x3D, 0x47, 0xF8, 0x89, 0xA5,
- 0x7B, 0x9B, 0xC5, 0x84, 0x59, 0x46, 0x90, 0x74,
- 0x69, 0xC7, 0xAA, 0xEE, 0x6E, 0xD6, 0xB0, 0x18,
- 0x66, 0xA0, 0x7A, 0x1E, 0xFB, 0xDB, 0x4E, 0x51,
- 0x92, 0xE4, 0xE0, 0x3E, 0xB4, 0xD8, 0x23, 0x3B,
- 0xC1, 0x5F, 0xFE, 0x98, 0x99, 0x73, 0x09, 0xA9,
- 0xA3, 0xDF, 0x14, 0x5A, 0x26, 0x8F, 0x0B, 0xAF,
- 0x4C, 0x97, 0x54, 0xE1, 0x63, 0x48, 0xED, 0xBA,
- 0xCF, 0xBB, 0x1F, 0xDC, 0xA4, 0xFA, 0x64, 0x75,
- 0xDE, 0x81, 0x9A, 0xFF, 0x49, 0x41, 0x27, 0x62,
- 0x02, 0x15, 0xD9, 0x86, 0xAC, 0x3F, 0x0C, 0x61,
- 0xD1, 0x77, 0x2B, 0x1B, 0x96, 0xDA, 0x68, 0x1C,
- 0x44, 0x32, 0xBC, 0xA2, 0x87, 0xF7, 0x91, 0x8D,
- 0x80, 0xDD, 0x0A, 0x50, 0x34, 0x4B, 0x00, 0xB9,
- 0x36, 0xE6, 0x78, 0x4F, 0xC9, 0xE9, 0x2C, 0x43,
- 0x88, 0x9E, 0x9C, 0x5B, 0x4D, 0x3A, 0x39, 0xEF };
-
-static const unsigned char table_8[32] = {
- 0x13, 0x08, 0x1E, 0x1D, 0x17, 0x16, 0x07, 0x1F,
- 0x0E, 0x03, 0x1A, 0x19, 0x01, 0x12, 0x11, 0x10,
- 0x09, 0x0C, 0x0F, 0x14, 0x0B, 0x05, 0x00, 0x04,
- 0x1C, 0x18, 0x0A, 0x15, 0x02, 0x1B, 0x06, 0x0D };
-
-static const unsigned char table_9[256] = {
- 0x20, 0x2A, 0xDA, 0xFE, 0x76, 0x0D, 0xED, 0x39,
- 0x51, 0x4C, 0x46, 0x9A, 0xF1, 0xB0, 0x10, 0xC7,
- 0xD1, 0x6F, 0x18, 0x24, 0xB9, 0x7A, 0x4F, 0x47,
- 0xE0, 0x4E, 0x88, 0x09, 0x8A, 0xBA, 0x60, 0xBD,
- 0xC2, 0x27, 0x93, 0x7D, 0x94, 0x40, 0xCB, 0x80,
- 0xB8, 0x41, 0x84, 0x5D, 0xC1, 0x0F, 0x5E, 0x78,
- 0x2B, 0x48, 0x28, 0x29, 0xEE, 0x81, 0x90, 0x86,
- 0x50, 0x9C, 0xF3, 0xB2, 0x35, 0x52, 0x0C, 0x9D,
- 0xFC, 0x69, 0xD6, 0xA6, 0x06, 0xD7, 0xC6, 0xFF,
- 0x1C, 0x14, 0x57, 0x33, 0xE2, 0x1F, 0x83, 0xA8,
- 0xF7, 0x99, 0xC5, 0xDC, 0x70, 0x9E, 0xF4, 0x6B,
- 0x0A, 0x77, 0x95, 0x4A, 0x2E, 0x53, 0xF2, 0x62,
- 0x98, 0xF8, 0x96, 0xDB, 0xE6, 0x32, 0x3C, 0x58,
- 0xD5, 0x6D, 0xE7, 0x4B, 0xCE, 0x91, 0x43, 0xD8,
- 0xFA, 0xE3, 0x4D, 0xD9, 0x68, 0xDE, 0xEC, 0x01,
- 0x08, 0xD3, 0x8F, 0x19, 0xC4, 0xA7, 0x6E, 0x3E,
- 0x63, 0x12, 0x72, 0x42, 0x9F, 0xB4, 0x04, 0x1B,
- 0x7E, 0x11, 0x17, 0x73, 0xB5, 0x22, 0x56, 0xA1,
- 0x89, 0xDD, 0xF5, 0x3F, 0x49, 0x26, 0x8D, 0x15,
- 0x85, 0x75, 0x5F, 0x65, 0x82, 0xB6, 0xF6, 0xD2,
- 0xA4, 0x55, 0x37, 0xC8, 0xA0, 0xCC, 0x66, 0x5C,
- 0xC9, 0x25, 0x36, 0x67, 0x7C, 0xE1, 0xA3, 0xCF,
- 0xA9, 0x59, 0x2F, 0xFB, 0xBB, 0x07, 0x87, 0xA2,
- 0x44, 0x92, 0x13, 0x00, 0x16, 0x61, 0x38, 0xEB,
- 0xAE, 0xD4, 0x1E, 0x64, 0x6A, 0xE4, 0xCA, 0x1D,
- 0x6C, 0xDF, 0xAB, 0x5B, 0x03, 0x7B, 0x9B, 0x8C,
- 0x5A, 0xFD, 0xC3, 0xB3, 0x0B, 0xAA, 0xAC, 0x8B,
- 0xBE, 0xBC, 0x3D, 0x97, 0xCD, 0x05, 0x21, 0x8E,
- 0xAD, 0xEA, 0x54, 0x30, 0xAF, 0x02, 0xB1, 0x34,
- 0x0E, 0xA5, 0x3B, 0x45, 0x1A, 0x23, 0xE8, 0x7F,
- 0xEF, 0xB7, 0x31, 0xD0, 0xBF, 0x3A, 0x79, 0xE5,
- 0xF9, 0xF0, 0x2C, 0x74, 0xE9, 0x71, 0xC0, 0x2D };
-
-static const unsigned char table_10[32] = {
- 0x1D, 0x12, 0x11, 0x0D, 0x1E, 0x19, 0x16, 0x1B,
- 0x18, 0x13, 0x07, 0x17, 0x0C, 0x02, 0x00, 0x15,
- 0x0E, 0x08, 0x05, 0x01, 0x10, 0x06, 0x04, 0x0F,
- 0x1F, 0x1A, 0x0B, 0x09, 0x0A, 0x14, 0x1C, 0x03 };
-
-static const unsigned char table_11[256] = {
- 0x6B, 0x1D, 0xC6, 0x0A, 0xB7, 0xAC, 0xB2, 0x11,
- 0x29, 0xD3, 0xA2, 0x4D, 0xCB, 0x03, 0xEF, 0xA6,
- 0xC1, 0x5D, 0x75, 0x48, 0x35, 0x6C, 0xE2, 0x84,
- 0xAB, 0xAA, 0xD8, 0x2C, 0x0E, 0x95, 0x25, 0x27,
- 0x7D, 0x0B, 0xD0, 0xFB, 0x14, 0xE5, 0xF2, 0x4E,
- 0x7F, 0x2A, 0x63, 0x3C, 0xC9, 0xF6, 0xDC, 0x07,
- 0x26, 0x55, 0xCF, 0x2B, 0xCD, 0xA7, 0x17, 0xD2,
- 0x9A, 0x7B, 0x93, 0x78, 0x9E, 0xE6, 0x2F, 0x49,
- 0x1E, 0xFD, 0xF0, 0xFE, 0x7C, 0x33, 0x92, 0xA3,
- 0xC8, 0xA0, 0xA9, 0xC4, 0xA1, 0x94, 0x6D, 0x44,
- 0x0C, 0x90, 0x3A, 0x8C, 0x8E, 0x85, 0xAF, 0x40,
- 0x36, 0xA4, 0xD1, 0xB9, 0x19, 0x6F, 0xF4, 0xBA,
- 0x1A, 0x73, 0xD9, 0xB5, 0xB4, 0x7A, 0xF9, 0x83,
- 0x58, 0xAD, 0xCE, 0x60, 0x98, 0xDB, 0x1C, 0x1B,
- 0x52, 0xB8, 0xF3, 0x96, 0xED, 0xDE, 0xB3, 0xEE,
- 0x4F, 0xBD, 0x10, 0xD4, 0x43, 0xEA, 0xE7, 0x37,
- 0x12, 0x3D, 0xA8, 0x22, 0x65, 0xEC, 0x5B, 0x08,
- 0x9D, 0x0D, 0x5C, 0xB6, 0x8A, 0x79, 0x3F, 0x04,
- 0xD6, 0x01, 0xE1, 0xBE, 0xDD, 0x50, 0xFA, 0x41,
- 0x13, 0x91, 0xF7, 0xDA, 0x18, 0xB0, 0x45, 0x81,
- 0x4C, 0xF5, 0x32, 0x23, 0x56, 0x5A, 0xEB, 0x97,
- 0x34, 0x00, 0x77, 0x71, 0x4B, 0x70, 0xD5, 0x31,
- 0x72, 0x05, 0xDF, 0xE8, 0x15, 0x3B, 0x54, 0x16,
- 0x89, 0xE4, 0xF1, 0xD7, 0x80, 0x82, 0x4A, 0xE3,
- 0x39, 0x06, 0x47, 0x28, 0xC2, 0x86, 0x87, 0xB1,
- 0x62, 0x74, 0x53, 0x21, 0x67, 0x38, 0x42, 0xCA,
- 0x9B, 0xC3, 0x51, 0x99, 0x8B, 0x1F, 0x24, 0x8D,
- 0xF8, 0x68, 0x3E, 0x59, 0xBB, 0x61, 0x5F, 0xBC,
- 0x09, 0x6E, 0x8F, 0x0F, 0x2D, 0xC0, 0xE0, 0x46,
- 0x66, 0x69, 0xA5, 0xE9, 0x30, 0x9C, 0x5E, 0xAE,
- 0xBF, 0xC7, 0x20, 0x7E, 0x6A, 0xC5, 0x88, 0xFC,
- 0x64, 0x76, 0xFF, 0x9F, 0x2E, 0x02, 0xCC, 0x57 };
-
-static const unsigned char table_12[32] = {
- 0x14, 0x1B, 0x18, 0x00, 0x1F, 0x15, 0x17, 0x07,
- 0x11, 0x1A, 0x0E, 0x13, 0x12, 0x06, 0x01, 0x03,
- 0x1C, 0x0C, 0x0B, 0x1D, 0x10, 0x0F, 0x09, 0x19,
- 0x0D, 0x1E, 0x04, 0x05, 0x08, 0x16, 0x0A, 0x02 };
-
-static const unsigned char table_13[256] = {
- 0x37, 0x8A, 0x1B, 0x91, 0xA5, 0x2B, 0x2D, 0x88,
- 0x8E, 0xFE, 0x0E, 0xD3, 0xF3, 0xE9, 0x7D, 0xD1,
- 0x24, 0xEA, 0xB1, 0x8B, 0x5C, 0xA4, 0x44, 0x7E,
- 0x8C, 0x2C, 0x73, 0xD5, 0x50, 0x3E, 0xD7, 0x18,
- 0xB9, 0xD6, 0xBA, 0x94, 0x0C, 0xFC, 0xCB, 0xB4,
- 0x0D, 0x63, 0x4C, 0xDE, 0x77, 0x16, 0xFD, 0x81,
- 0x3C, 0x11, 0x45, 0x36, 0xF6, 0x67, 0x95, 0x6D,
- 0x6A, 0x1A, 0xA3, 0xC5, 0x92, 0x10, 0x28, 0x84,
- 0x48, 0xA6, 0x23, 0xE3, 0x4B, 0xE1, 0xF5, 0x19,
- 0xE0, 0x2E, 0x00, 0x61, 0x74, 0xCC, 0xF7, 0xB0,
- 0x68, 0xC8, 0x40, 0x6F, 0x59, 0x52, 0x26, 0x99,
- 0xC9, 0xF9, 0xC4, 0x53, 0x9B, 0xEC, 0x03, 0x17,
- 0xE2, 0x06, 0x30, 0x7B, 0xBE, 0xCD, 0x1D, 0x3B,
- 0xD2, 0x5B, 0x65, 0x21, 0x49, 0xB7, 0x79, 0xCF,
- 0x82, 0x86, 0xC7, 0x62, 0xEE, 0x8D, 0xFF, 0xD4,
- 0xC3, 0x85, 0xA7, 0xFA, 0xA9, 0x6B, 0xF2, 0x69,
- 0x9C, 0x38, 0x78, 0xBD, 0x7F, 0xDD, 0xCE, 0xA1,
- 0x33, 0xC2, 0x43, 0xEB, 0xD8, 0xE6, 0x2A, 0xE4,
- 0x76, 0x6C, 0xAA, 0x46, 0x05, 0xE7, 0xA0, 0x0A,
- 0x71, 0x98, 0x41, 0x5F, 0x0F, 0xEF, 0x51, 0xAD,
- 0xF0, 0xED, 0x96, 0x5A, 0x42, 0x3F, 0xBF, 0x6E,
- 0xBC, 0x5D, 0xC1, 0x15, 0x70, 0x54, 0x4D, 0x14,
- 0xB5, 0xCA, 0x27, 0x80, 0x87, 0x39, 0x60, 0x47,
- 0x9D, 0x2F, 0x56, 0x1F, 0xBB, 0x31, 0xF1, 0xE8,
- 0xB3, 0x9E, 0x5E, 0x7C, 0xD0, 0xC6, 0xB2, 0x57,
- 0x83, 0xAC, 0x09, 0x8F, 0xA2, 0x90, 0x13, 0x25,
- 0x01, 0x08, 0x64, 0xB6, 0x02, 0xDB, 0x55, 0x32,
- 0xAF, 0x9A, 0xC0, 0x1C, 0x12, 0x29, 0x0B, 0x72,
- 0x4F, 0xDA, 0xAB, 0x35, 0xF8, 0x22, 0xD9, 0x4E,
- 0x3D, 0x1E, 0xDC, 0x58, 0x20, 0x34, 0xAE, 0x66,
- 0x75, 0x93, 0x9F, 0x3A, 0x07, 0xE5, 0x89, 0xDF,
- 0x97, 0x4A, 0xB8, 0x7A, 0xF4, 0xFB, 0x04, 0xA8 };
-
-static const unsigned char table_14[32] = {
- 0x04, 0x14, 0x13, 0x15, 0x1A, 0x1B, 0x0F, 0x16,
- 0x02, 0x0D, 0x0C, 0x06, 0x10, 0x17, 0x01, 0x0B,
- 0x1E, 0x08, 0x1C, 0x18, 0x19, 0x0A, 0x1F, 0x05,
- 0x11, 0x09, 0x1D, 0x07, 0x0E, 0x12, 0x03, 0x00 };
-
-static const unsigned char table_15[256] = {
- 0x61, 0x48, 0x58, 0x41, 0x7F, 0x88, 0x43, 0x42,
- 0xD9, 0x80, 0x81, 0xFE, 0xC6, 0x49, 0xD7, 0x2C,
- 0xE6, 0x5B, 0xEE, 0xFF, 0x2A, 0x6F, 0xBF, 0x98,
- 0xD6, 0x20, 0xB9, 0xB1, 0x5D, 0x95, 0x72, 0x1E,
- 0x82, 0x96, 0xDE, 0xC1, 0x40, 0xD8, 0x70, 0xA3,
- 0xD1, 0x1F, 0xF0, 0x9F, 0x2D, 0xDC, 0x3F, 0xF9,
- 0x5E, 0x0D, 0x15, 0x2F, 0x67, 0x31, 0x9D, 0x84,
- 0x97, 0x0C, 0xF6, 0x79, 0xC2, 0xA7, 0xC0, 0x32,
- 0xB3, 0xEB, 0xED, 0x71, 0x30, 0xCC, 0x4B, 0xA0,
- 0xF5, 0xC4, 0xCD, 0x27, 0xFA, 0x11, 0x25, 0xDB,
- 0x4F, 0xE2, 0x7E, 0xA6, 0xAF, 0x34, 0x69, 0x63,
- 0x8F, 0x08, 0x1C, 0x85, 0xF1, 0x57, 0x78, 0xC8,
- 0xA2, 0x83, 0xB5, 0x68, 0xF7, 0x64, 0x45, 0x26,
- 0x3B, 0x03, 0xAD, 0x3C, 0x50, 0xD5, 0x77, 0xFC,
- 0xFB, 0x18, 0xC9, 0xD2, 0x9C, 0xBB, 0xBA, 0x76,
- 0x23, 0x55, 0xD3, 0x5A, 0x01, 0xE9, 0x87, 0x07,
- 0x19, 0x09, 0x39, 0x8A, 0x91, 0x93, 0x12, 0xDF,
- 0x22, 0xA8, 0xCF, 0x4E, 0x4D, 0x65, 0xB0, 0x0F,
- 0x13, 0x53, 0x21, 0x8C, 0xE5, 0xB7, 0x0B, 0x0E,
- 0x6C, 0x44, 0xCA, 0x7B, 0xC5, 0x6E, 0xCE, 0xE3,
- 0x14, 0x29, 0xAC, 0x2E, 0xE7, 0x59, 0xE8, 0x0A,
- 0xEA, 0x66, 0x7C, 0x94, 0x6D, 0x05, 0x9E, 0x9A,
- 0x2B, 0x38, 0x6A, 0xCB, 0x51, 0xEF, 0x06, 0xDA,
- 0xFD, 0x47, 0x92, 0x1D, 0xA5, 0x37, 0x33, 0xEC,
- 0xB4, 0x52, 0x56, 0xC3, 0xF4, 0xF8, 0x8B, 0xD0,
- 0xA4, 0x5F, 0x28, 0x89, 0x75, 0xC7, 0x04, 0x00,
- 0xE4, 0x86, 0x36, 0x3A, 0x99, 0x16, 0x7D, 0xE0,
- 0x7A, 0x4C, 0x54, 0x46, 0x73, 0xB2, 0xF3, 0xE1,
- 0x62, 0xBE, 0x90, 0x4A, 0x24, 0x6B, 0x3E, 0xAA,
- 0x1B, 0xF2, 0x60, 0xD4, 0xA9, 0x9B, 0x1A, 0xB8,
- 0xA1, 0x35, 0xAE, 0xB6, 0x10, 0x5C, 0x17, 0xBC,
- 0xAB, 0x8D, 0x02, 0x74, 0xBD, 0x3D, 0x8E, 0xDD };
-
-static const unsigned char table_16[256] = {
- 0x3F, 0x9C, 0x17, 0xC1, 0x59, 0xC6, 0x23, 0x93,
- 0x4B, 0xDF, 0xCB, 0x55, 0x2B, 0xDE, 0xCD, 0xAD,
- 0xB3, 0xE7, 0x42, 0x2F, 0x02, 0x5A, 0x7B, 0x5C,
- 0x8F, 0xD1, 0x11, 0xCE, 0xEC, 0xF6, 0xA4, 0xE6,
- 0x58, 0x98, 0x6A, 0x99, 0xFB, 0x9B, 0x53, 0x21,
- 0x8A, 0x09, 0x2E, 0x3C, 0x22, 0x38, 0xAC, 0x07,
- 0x91, 0x46, 0xA9, 0x95, 0xC3, 0x14, 0x84, 0xDB,
- 0x36, 0x68, 0x1D, 0xDD, 0xF9, 0x12, 0xE0, 0x3D,
- 0x8D, 0x4D, 0x05, 0x86, 0x69, 0xC0, 0xD3, 0xD5,
- 0xA5, 0xC9, 0xE5, 0x67, 0x6D, 0xE2, 0x7F, 0xFE,
- 0xB2, 0x0F, 0x62, 0xCF, 0x37, 0x35, 0xF3, 0x28,
- 0x16, 0xA6, 0x50, 0x76, 0x80, 0x00, 0x31, 0x97,
- 0x39, 0x7C, 0x25, 0x0C, 0x64, 0xF2, 0x52, 0x1A,
- 0x92, 0x4F, 0x2A, 0x56, 0x03, 0x4C, 0xBD, 0x10,
- 0xB7, 0x2C, 0x8C, 0xAE, 0x73, 0xB9, 0xE9, 0xF7,
- 0xA7, 0xE1, 0x75, 0xBC, 0xC5, 0x1C, 0x3A, 0x63,
- 0x7A, 0x4A, 0x29, 0xD2, 0x71, 0xE8, 0x08, 0xA1,
- 0xD4, 0xFD, 0x13, 0xFA, 0xA0, 0x27, 0x41, 0x72,
- 0x82, 0x18, 0x51, 0x60, 0x5E, 0x66, 0x0D, 0xAA,
- 0xD8, 0x1F, 0xAF, 0x45, 0xD0, 0xF1, 0x9F, 0x6B,
- 0xE4, 0x44, 0x89, 0xEE, 0xC4, 0x0B, 0x6C, 0xCC,
- 0x83, 0x77, 0xA2, 0x87, 0x0A, 0xA8, 0xED, 0x90,
- 0x74, 0x6E, 0xF5, 0xAB, 0xA3, 0xB6, 0x5F, 0x0E,
- 0x04, 0x9A, 0xB4, 0x8E, 0xF0, 0xFF, 0x88, 0xB5,
- 0xF8, 0xBF, 0x8B, 0x6F, 0x4E, 0x79, 0x40, 0xCA,
- 0x24, 0x26, 0xDC, 0x33, 0xEB, 0x2D, 0x5B, 0x1B,
- 0x9D, 0xC7, 0x49, 0x48, 0x54, 0x85, 0xEF, 0xD7,
- 0xC2, 0xB8, 0xC8, 0x5D, 0xD9, 0x3B, 0x15, 0xBB,
- 0x65, 0xE3, 0xD6, 0x30, 0x3E, 0x1E, 0x32, 0x9E,
- 0x57, 0x81, 0x34, 0x06, 0xFC, 0xBA, 0x7D, 0x20,
- 0x70, 0xDA, 0x7E, 0x47, 0x94, 0x61, 0xB0, 0x78,
- 0xF4, 0xBE, 0xEA, 0x19, 0x43, 0x01, 0xB1, 0x96 };
-
-static const unsigned char table_17[256] = {
- 0x7E, 0xF1, 0xD3, 0x75, 0x87, 0xA6, 0xED, 0x9E,
- 0xA9, 0xD5, 0xC6, 0xBF, 0xE6, 0x6A, 0xEE, 0x4B,
- 0x34, 0xDF, 0x4C, 0x7D, 0xDD, 0xFE, 0x3F, 0xAF,
- 0x66, 0x2D, 0x74, 0x6F, 0xFC, 0x4F, 0x5F, 0x88,
- 0x29, 0x7B, 0xC7, 0x2A, 0x70, 0xE8, 0x1D, 0xDE,
- 0xD0, 0x55, 0x71, 0x81, 0xC4, 0x0D, 0x50, 0x4E,
- 0x58, 0x00, 0x96, 0x97, 0xBB, 0xD7, 0x53, 0x15,
- 0x6C, 0x40, 0x17, 0xC9, 0xFF, 0x8F, 0x94, 0xFB,
- 0x19, 0x9A, 0x3E, 0xB5, 0x5A, 0x5E, 0x86, 0x24,
- 0xB8, 0x77, 0xBA, 0x85, 0x51, 0x18, 0xBE, 0x59,
- 0x79, 0xF3, 0xD4, 0xC3, 0xAB, 0x28, 0xFD, 0x25,
- 0x41, 0x91, 0x07, 0x8D, 0xAE, 0x49, 0xF5, 0x80,
- 0x35, 0xA1, 0x9C, 0x3C, 0xE2, 0x65, 0xB3, 0xE0,
- 0x16, 0xCB, 0x12, 0x6B, 0xF7, 0xB1, 0x93, 0x8A,
- 0xCE, 0x54, 0x4D, 0xF8, 0x13, 0xA2, 0x95, 0x46,
- 0xEA, 0x61, 0x57, 0x9D, 0x27, 0x8B, 0x3D, 0x60,
- 0x36, 0x68, 0x06, 0x56, 0xB6, 0x1B, 0xD2, 0x89,
- 0x10, 0xA7, 0xC5, 0x1A, 0x0B, 0x2C, 0xBD, 0x14,
- 0x0A, 0xDC, 0x23, 0xA8, 0xE1, 0x04, 0x02, 0xC0,
- 0xB2, 0x9B, 0xE3, 0x2E, 0x33, 0x7C, 0x32, 0xAC,
- 0x7A, 0x39, 0xB0, 0xF9, 0x98, 0x5B, 0x3A, 0x48,
- 0x21, 0x90, 0xB9, 0x20, 0xF0, 0xA0, 0x09, 0x1F,
- 0x2F, 0xEF, 0xEB, 0x22, 0x78, 0x82, 0x37, 0xD6,
- 0xD1, 0x84, 0x76, 0x01, 0xDB, 0x43, 0xC2, 0xB7,
- 0x7F, 0xA4, 0xE5, 0xC1, 0x1C, 0x69, 0x05, 0xEC,
- 0xD8, 0x38, 0x67, 0x42, 0x72, 0xBC, 0x73, 0xAD,
- 0xA3, 0xE9, 0x4A, 0x8E, 0x47, 0x1E, 0xC8, 0x6E,
- 0xDA, 0x5D, 0x2B, 0xF6, 0x30, 0x63, 0xCC, 0xF4,
- 0xCD, 0x8C, 0x0F, 0x3B, 0xE7, 0xD9, 0xCF, 0xB4,
- 0x03, 0x92, 0x0E, 0x31, 0xE4, 0x08, 0xF2, 0x45,
- 0xCA, 0x83, 0x26, 0x5C, 0xA5, 0x44, 0x64, 0x6D,
- 0x9F, 0x99, 0x62, 0xAA, 0xFA, 0x11, 0x0C, 0x52 };
-
-static const unsigned char table_18[256] = {
- 0x0F, 0x42, 0x3D, 0x86, 0x3E, 0x66, 0xFE, 0x5C,
- 0x52, 0xE2, 0xA3, 0xB3, 0xCE, 0x16, 0xCC, 0x95,
- 0xB0, 0x8B, 0x82, 0x3B, 0x93, 0x7D, 0x62, 0x08,
- 0x1C, 0x6E, 0xBB, 0xCB, 0x1D, 0x88, 0x69, 0xD4,
- 0xC9, 0x40, 0x1F, 0xBE, 0x27, 0xBC, 0xDB, 0x38,
- 0xE5, 0xA1, 0x71, 0xBA, 0x8A, 0x5E, 0xFD, 0x36,
- 0x8F, 0x26, 0x6B, 0xE4, 0x20, 0x6D, 0xC5, 0xDE,
- 0xE0, 0x83, 0x7C, 0xD5, 0xD9, 0x4D, 0xDC, 0xE3,
- 0x0D, 0x32, 0xED, 0x0E, 0x2F, 0x21, 0xA7, 0x79,
- 0xA0, 0xD3, 0x8C, 0x14, 0x6F, 0xB7, 0xF8, 0x85,
- 0x5D, 0x37, 0x24, 0xD6, 0x25, 0xD2, 0x8E, 0xA5,
- 0xB8, 0xCD, 0x5A, 0x9F, 0x05, 0xAD, 0x65, 0x9E,
- 0x4F, 0x5B, 0x56, 0xF0, 0xAA, 0xC2, 0x28, 0xA8,
- 0x6A, 0x01, 0x99, 0x2E, 0xA6, 0x77, 0x74, 0x64,
- 0x76, 0x15, 0x90, 0x75, 0xAF, 0xE8, 0x39, 0x48,
- 0x09, 0x11, 0xE1, 0x2D, 0xEC, 0xB5, 0x7A, 0xB1,
- 0x94, 0x13, 0x41, 0x4C, 0x02, 0xA9, 0x97, 0xDF,
- 0xC3, 0x8D, 0xEA, 0x3A, 0x9C, 0xD1, 0xA2, 0x9A,
- 0xD7, 0x59, 0xD8, 0x18, 0xDA, 0x47, 0x89, 0x81,
- 0xC7, 0xF5, 0xFC, 0x98, 0xCA, 0x91, 0x06, 0x68,
- 0xC8, 0x07, 0x4A, 0x84, 0x0A, 0xE7, 0x33, 0x2C,
- 0xEB, 0xDD, 0x5F, 0xAC, 0x23, 0x1A, 0x35, 0x70,
- 0x43, 0x80, 0x61, 0xAE, 0xC1, 0xD0, 0x7B, 0x92,
- 0x49, 0x51, 0x53, 0xC4, 0x34, 0x30, 0x0C, 0x4B,
- 0x00, 0x04, 0x10, 0xFF, 0x63, 0x44, 0xB4, 0x0B,
- 0x57, 0x72, 0xF1, 0x9D, 0x19, 0xF6, 0xB2, 0x87,
- 0x1B, 0xEE, 0x46, 0x2A, 0xF3, 0xBF, 0x12, 0x96,
- 0x58, 0x2B, 0xF9, 0xB6, 0xCF, 0x22, 0x3C, 0xAB,
- 0x1E, 0x6C, 0x31, 0xC6, 0xF7, 0x78, 0x45, 0x17,
- 0xE9, 0x7E, 0x73, 0xF2, 0x55, 0xFB, 0x3F, 0x9B,
- 0xF4, 0xBD, 0xA4, 0x29, 0x60, 0x03, 0xB9, 0x50,
- 0xFA, 0x4E, 0xEF, 0x54, 0xE6, 0x7F, 0xC0, 0x67 };
-
-static const unsigned char table_19[256] = {
- 0xEA, 0xE7, 0x13, 0x14, 0xB9, 0xC0, 0xC4, 0x42,
- 0x49, 0x6E, 0x2A, 0xA6, 0x65, 0x3C, 0x6A, 0x40,
- 0x07, 0xCD, 0x4F, 0xFE, 0xF2, 0x2D, 0xC8, 0x30,
- 0x9D, 0xBE, 0x1B, 0x9B, 0x4A, 0x7E, 0x9F, 0xA7,
- 0x78, 0xAB, 0x4D, 0x1D, 0xF1, 0x96, 0x32, 0x84,
- 0xFB, 0x80, 0x88, 0xE8, 0x41, 0x97, 0xDC, 0xD0,
- 0x4E, 0x33, 0xA4, 0x3B, 0xE0, 0xDD, 0x36, 0xC9,
- 0x72, 0x48, 0x8A, 0x2F, 0x35, 0xF0, 0xDF, 0x21,
- 0xE1, 0xE5, 0x6C, 0x9A, 0x60, 0x8F, 0xB7, 0x24,
- 0xE4, 0x9E, 0x8C, 0x0F, 0x3D, 0x28, 0xBB, 0xD6,
- 0x69, 0xA0, 0x66, 0xC7, 0xE3, 0xD8, 0x11, 0x27,
- 0xD9, 0x37, 0xF4, 0xF5, 0x8E, 0xD4, 0x76, 0xE2,
- 0xDB, 0x15, 0xA2, 0x5C, 0x9C, 0xEE, 0x44, 0xED,
- 0x2B, 0xB3, 0x75, 0x74, 0x71, 0x8B, 0x3A, 0x91,
- 0x06, 0x19, 0xC1, 0x57, 0x89, 0xCC, 0x82, 0x10,
- 0x17, 0xB2, 0x08, 0x70, 0x39, 0xCA, 0xBA, 0xB5,
- 0xAA, 0xBF, 0x02, 0xBD, 0x26, 0x58, 0x04, 0x54,
- 0x23, 0x4B, 0x90, 0x51, 0x6D, 0x98, 0xD5, 0xB0,
- 0xAF, 0x22, 0xDA, 0xB4, 0x87, 0xFC, 0x7D, 0x18,
- 0x6F, 0x64, 0x59, 0x09, 0x0C, 0xA5, 0x5D, 0x03,
- 0x0A, 0xD3, 0xCE, 0x99, 0x8D, 0xC2, 0xC3, 0x62,
- 0xD2, 0x83, 0x1A, 0xAC, 0x7C, 0x93, 0xD7, 0xA9,
- 0x16, 0xF7, 0x77, 0xE6, 0x3E, 0x05, 0x73, 0x55,
- 0x43, 0x95, 0x7A, 0x6B, 0x38, 0x67, 0x3F, 0xC6,
- 0xAD, 0x0E, 0x29, 0x46, 0x45, 0xFA, 0xBC, 0xEC,
- 0x5B, 0x7F, 0x0B, 0x1C, 0x01, 0x12, 0x85, 0x50,
- 0xF9, 0xEF, 0x25, 0x34, 0x79, 0x2E, 0xEB, 0x00,
- 0x5F, 0x86, 0xF8, 0x4C, 0xA8, 0x56, 0xB6, 0x5A,
- 0xF3, 0x31, 0x94, 0x92, 0xB1, 0xB8, 0x52, 0xD1,
- 0xCF, 0xCB, 0xA1, 0x81, 0x68, 0x47, 0xFF, 0xC5,
- 0xFD, 0x1F, 0xDE, 0x53, 0xA3, 0x2C, 0x20, 0xF6,
- 0x1E, 0x0D, 0xAE, 0x7B, 0x5E, 0x61, 0xE9, 0x63 };
-
-static const unsigned char table_20[32] = {
- 0x0D, 0x0B, 0x11, 0x02, 0x05, 0x1B, 0x08, 0x1D,
- 0x04, 0x14, 0x01, 0x09, 0x00, 0x19, 0x1E, 0x15,
- 0x1F, 0x0A, 0x0F, 0x1C, 0x10, 0x16, 0x0C, 0x07,
- 0x13, 0x1A, 0x06, 0x17, 0x0E, 0x12, 0x18, 0x03 };
-
-static const unsigned char table_21[256] = {
- 0x4C, 0x94, 0xAD, 0x66, 0x9E, 0x69, 0x04, 0xA8,
- 0x61, 0xE0, 0xE1, 0x3D, 0xFD, 0x9C, 0xFB, 0x19,
- 0x1E, 0x80, 0x8C, 0xA0, 0xFC, 0x27, 0x26, 0x3B,
- 0x48, 0x6D, 0x07, 0xE4, 0xEA, 0x17, 0x64, 0x9B,
- 0xD0, 0xE2, 0xD1, 0x13, 0x39, 0xF5, 0x73, 0xD3,
- 0x0C, 0x3A, 0x6E, 0x77, 0xFA, 0xE3, 0x2F, 0x44,
- 0x7E, 0x72, 0x30, 0x43, 0xD4, 0x7F, 0x36, 0xD9,
- 0xBD, 0x3E, 0x3F, 0x91, 0xBE, 0x54, 0x79, 0xA6,
- 0x7C, 0x0E, 0xC5, 0x7A, 0x70, 0xC4, 0xD7, 0xCE,
- 0xDA, 0xAA, 0x68, 0x8F, 0xBC, 0x96, 0x1B, 0x16,
- 0xA2, 0xC6, 0x67, 0x09, 0x45, 0x9F, 0xCF, 0x41,
- 0xC8, 0x60, 0x74, 0x99, 0x5D, 0x85, 0x5F, 0x50,
- 0x33, 0x52, 0x22, 0xA9, 0xB5, 0x2D, 0x98, 0x87,
- 0x15, 0x9A, 0xAC, 0x2C, 0xDE, 0xC0, 0xB8, 0x37,
- 0x88, 0x1F, 0xC1, 0x4F, 0x65, 0x0F, 0x3C, 0x84,
- 0x4B, 0x1A, 0xAB, 0xA4, 0x23, 0xCB, 0xB1, 0xC7,
- 0xDB, 0xEF, 0x40, 0x0D, 0x46, 0xE8, 0xF4, 0x71,
- 0x38, 0x01, 0x5C, 0x0B, 0x5E, 0xC9, 0xAF, 0xC3,
- 0xF6, 0xB6, 0x10, 0x1D, 0xE5, 0x8A, 0x90, 0xA7,
- 0xA3, 0x05, 0x4E, 0x14, 0x63, 0x25, 0x34, 0xEC,
- 0x6B, 0x95, 0x21, 0x55, 0xF2, 0xF0, 0x47, 0x9D,
- 0xF8, 0x8E, 0x02, 0x0A, 0xED, 0x97, 0xAE, 0x00,
- 0x2A, 0xEB, 0xB2, 0xA5, 0x32, 0x06, 0x2E, 0xFE,
- 0x8D, 0x7B, 0x7D, 0x35, 0x5A, 0xD2, 0xF1, 0xE9,
- 0xF9, 0x62, 0xB7, 0xB9, 0x53, 0x75, 0x5B, 0x8B,
- 0xCC, 0x6C, 0x18, 0x49, 0x89, 0x31, 0xB0, 0x92,
- 0x6F, 0xDF, 0x03, 0x57, 0xF3, 0x58, 0xCA, 0x2B,
- 0x93, 0xA1, 0xD6, 0x24, 0x29, 0xCD, 0x59, 0x1C,
- 0x83, 0xB3, 0x42, 0xBF, 0x82, 0xB4, 0x11, 0x4A,
- 0x08, 0xEE, 0x76, 0x4D, 0x12, 0xDC, 0xE6, 0xC2,
- 0x56, 0xBA, 0x86, 0x28, 0x6A, 0x20, 0x51, 0xF7,
- 0xFF, 0xD8, 0xE7, 0xDD, 0xBB, 0x78, 0xD5, 0x81 };
-
-static const unsigned char table_22[32] = {
- 0x0B, 0x15, 0x1C, 0x0C, 0x06, 0x0A, 0x1D, 0x16,
- 0x12, 0x0E, 0x04, 0x11, 0x1F, 0x0F, 0x07, 0x02,
- 0x17, 0x13, 0x19, 0x18, 0x0D, 0x10, 0x1A, 0x05,
- 0x03, 0x00, 0x01, 0x08, 0x09, 0x14, 0x1B, 0x1E };
-
-static const unsigned char table_23[256] = {
- 0x36, 0x53, 0x2D, 0xD0, 0x7A, 0xF0, 0xD5, 0x1C,
- 0x50, 0x61, 0x9A, 0x90, 0x0B, 0x29, 0x20, 0x77,
- 0xF1, 0x82, 0xFE, 0xC1, 0xA7, 0xB6, 0x78, 0x87,
- 0x02, 0x05, 0xCB, 0x28, 0xAE, 0xD6, 0x17, 0x1A,
- 0x91, 0x5D, 0xB9, 0xE2, 0xDE, 0x6A, 0x4E, 0x07,
- 0xAC, 0x38, 0x13, 0x3B, 0x46, 0xFD, 0xB7, 0xD1,
- 0x79, 0xFB, 0x58, 0x76, 0x08, 0x47, 0x95, 0xA6,
- 0x99, 0x9E, 0x12, 0x67, 0xC2, 0xED, 0x9C, 0x1B,
- 0x89, 0x71, 0xB5, 0x4A, 0xAA, 0x5F, 0x34, 0x85,
- 0x40, 0x2B, 0x9F, 0x37, 0x7C, 0x0F, 0xD4, 0x75,
- 0x48, 0x27, 0x2E, 0xC9, 0xEB, 0x06, 0xDF, 0x8C,
- 0x14, 0xAF, 0xEE, 0xA2, 0x74, 0x45, 0x8D, 0x70,
- 0x6B, 0xD7, 0x56, 0xCF, 0xBC, 0x7B, 0x01, 0xC8,
- 0x54, 0xB0, 0x3C, 0x39, 0xFA, 0x81, 0xDC, 0xBB,
- 0x0D, 0xB2, 0xAD, 0x93, 0xC7, 0x8A, 0x73, 0x6C,
- 0xC3, 0x04, 0x2F, 0xEF, 0x52, 0x33, 0x9D, 0x1E,
- 0xC5, 0x65, 0x23, 0xD8, 0xB1, 0xD2, 0xE5, 0x25,
- 0x2C, 0xE6, 0x92, 0xB4, 0xF7, 0xF4, 0x8F, 0x6E,
- 0xE8, 0x5A, 0x8E, 0x7D, 0x4C, 0xB3, 0xFF, 0x41,
- 0x26, 0xE3, 0x30, 0x69, 0xF8, 0x80, 0x57, 0x4F,
- 0xA0, 0x7F, 0x66, 0x68, 0xE1, 0x7E, 0x0E, 0x31,
- 0xE7, 0xEA, 0x3E, 0x8B, 0x4B, 0x94, 0xE9, 0xCD,
- 0x19, 0x35, 0xA3, 0x98, 0xD9, 0x5B, 0x44, 0x2A,
- 0xE0, 0x6D, 0xF3, 0xE4, 0x72, 0x18, 0x03, 0x59,
- 0x84, 0x09, 0xA1, 0x9B, 0xBD, 0xDA, 0x4D, 0x63,
- 0xCC, 0x3A, 0x10, 0xFC, 0x3F, 0x0A, 0x88, 0x24,
- 0xF5, 0x21, 0xC4, 0x6F, 0x1F, 0x42, 0x62, 0x64,
- 0x51, 0xDD, 0xCA, 0xF9, 0x22, 0xCE, 0xA8, 0x86,
- 0xBA, 0xB8, 0x5C, 0xAB, 0x32, 0x00, 0x0C, 0xF2,
- 0x83, 0xDB, 0xF6, 0x60, 0x3D, 0x16, 0xEC, 0x11,
- 0xA4, 0xBE, 0x96, 0x5E, 0x97, 0xD3, 0xA5, 0x55,
- 0x1D, 0x15, 0xC6, 0xBF, 0xA9, 0x43, 0xC0, 0x49 };
-
-static const unsigned char table_24[256] = {
- 0xDC, 0x5A, 0xE6, 0x59, 0x64, 0xDA, 0x58, 0x40,
- 0x95, 0xF8, 0x2A, 0xE0, 0x39, 0x7E, 0x32, 0x89,
- 0x09, 0x93, 0xED, 0x55, 0xC3, 0x5B, 0x1A, 0xD1,
- 0xA5, 0x8B, 0x0F, 0x13, 0xC9, 0xE1, 0x34, 0xD0,
- 0xB6, 0xA2, 0xD9, 0x52, 0x57, 0x83, 0xFD, 0xE9,
- 0xAC, 0x73, 0x6E, 0x21, 0xF1, 0x0E, 0x25, 0xCC,
- 0x36, 0xFB, 0xF7, 0x92, 0x15, 0x30, 0x54, 0x91,
- 0xD6, 0x9E, 0xAA, 0x35, 0x70, 0xB2, 0xC0, 0x27,
- 0xFE, 0x04, 0xBC, 0xC7, 0x02, 0xFA, 0x7D, 0xE3,
- 0xBE, 0x62, 0x79, 0x2B, 0x31, 0x6A, 0x8F, 0x7F,
- 0x56, 0xF0, 0xB4, 0x0C, 0x1F, 0x68, 0xB7, 0xB9,
- 0x0B, 0x14, 0x3E, 0xA9, 0x4B, 0x03, 0x10, 0xEE,
- 0x2C, 0xAB, 0x8A, 0x77, 0xB1, 0xE7, 0xCA, 0xD4,
- 0x98, 0x01, 0xAD, 0x1E, 0x50, 0x26, 0x82, 0x44,
- 0xF3, 0xBF, 0xD3, 0x6B, 0x33, 0x0A, 0x3C, 0x5D,
- 0xCE, 0x81, 0xC5, 0x78, 0x9F, 0xB8, 0x23, 0xDB,
- 0x4E, 0xA1, 0x41, 0x76, 0xAE, 0x51, 0x86, 0x06,
- 0x7A, 0x66, 0xA0, 0x5E, 0x29, 0x17, 0x84, 0x4A,
- 0xB0, 0x3B, 0x3D, 0x71, 0x07, 0x7B, 0x0D, 0x9A,
- 0x6F, 0x9B, 0x5C, 0x88, 0xB3, 0xD7, 0x24, 0xD5,
- 0x48, 0xF5, 0xE8, 0xE4, 0xCF, 0x16, 0xA4, 0xC8,
- 0xEF, 0x42, 0x22, 0xEC, 0x47, 0x69, 0x90, 0x63,
- 0xE2, 0x1B, 0x87, 0x85, 0x3F, 0xDE, 0x8C, 0x60,
- 0x99, 0xE5, 0x8E, 0x4F, 0xF4, 0xBA, 0xB5, 0x9C,
- 0x37, 0x67, 0xBD, 0xA6, 0x97, 0xDD, 0xCB, 0x43,
- 0x45, 0x19, 0x49, 0x1C, 0x75, 0xC1, 0xBB, 0xF2,
- 0x46, 0xFC, 0x53, 0x9D, 0xD8, 0xA3, 0xDF, 0x2F,
- 0xEB, 0x72, 0x94, 0xA8, 0x6D, 0xC6, 0x28, 0x4C,
- 0x00, 0x38, 0xC2, 0x65, 0x05, 0x2E, 0xD2, 0x12,
- 0xFF, 0x18, 0x61, 0x6C, 0x7C, 0x11, 0xAF, 0x96,
- 0xCD, 0x20, 0x74, 0x08, 0x1D, 0xC4, 0xF9, 0x4D,
- 0xEA, 0x8D, 0x2D, 0x5F, 0xF6, 0xA7, 0x80, 0x3A };
-
-static const unsigned char table_25[32] = {
- 0x0A, 0x11, 0x17, 0x03, 0x05, 0x0B, 0x18, 0x13,
- 0x09, 0x02, 0x00, 0x1C, 0x0C, 0x08, 0x1B, 0x14,
- 0x06, 0x0E, 0x01, 0x0D, 0x16, 0x1E, 0x1D, 0x19,
- 0x0F, 0x1A, 0x10, 0x04, 0x12, 0x15, 0x07, 0x1F };
-
-static const unsigned char table_26[32] = {
- 0x19, 0x13, 0x1B, 0x01, 0x1C, 0x0D, 0x0C, 0x15,
- 0x0B, 0x00, 0x1A, 0x0F, 0x12, 0x16, 0x08, 0x0A,
- 0x03, 0x06, 0x14, 0x10, 0x18, 0x04, 0x11, 0x1D,
- 0x1F, 0x07, 0x17, 0x05, 0x02, 0x0E, 0x1E, 0x09 };
-
-static const unsigned char table_27[256] = {
- 0x72, 0xF0, 0x14, 0xCB, 0x61, 0xA5, 0xB2, 0x02,
- 0x75, 0x22, 0xC3, 0x9D, 0x5A, 0x63, 0xFA, 0x5F,
- 0xD9, 0x55, 0x58, 0x43, 0x24, 0x7D, 0x77, 0x93,
- 0xBA, 0x50, 0x1D, 0xF7, 0x49, 0x18, 0xB0, 0x42,
- 0xBB, 0xEC, 0x52, 0x38, 0xDC, 0xC8, 0x16, 0x54,
- 0x17, 0x19, 0x89, 0x67, 0x33, 0x3C, 0x0A, 0xAD,
- 0xC9, 0xDE, 0x81, 0xED, 0xBD, 0x0E, 0x0B, 0x6D,
- 0x46, 0x30, 0x35, 0x2B, 0x8C, 0xA0, 0x1C, 0x0D,
- 0xFD, 0xA1, 0x70, 0xC6, 0xD8, 0x41, 0xB3, 0xC0,
- 0x44, 0xEB, 0x92, 0xBE, 0x6B, 0x98, 0x1A, 0x76,
- 0x71, 0xC5, 0x51, 0x56, 0x80, 0xFC, 0x01, 0x53,
- 0x4B, 0xD0, 0x8B, 0xD2, 0x7B, 0xE7, 0x15, 0x5D,
- 0xE5, 0xA6, 0x8A, 0xD3, 0x9B, 0xF4, 0x69, 0x23,
- 0xE8, 0xB6, 0xC7, 0xE2, 0x73, 0x9F, 0x88, 0xDF,
- 0xB4, 0x28, 0xEE, 0xC2, 0x94, 0xB8, 0xF9, 0x7F,
- 0x4A, 0x57, 0x06, 0xF6, 0xBF, 0xC1, 0xAB, 0xFB,
- 0xA4, 0x8E, 0xD1, 0xD7, 0xF5, 0x7C, 0xA3, 0x1E,
- 0x3B, 0x32, 0x03, 0xAA, 0x90, 0x5C, 0x48, 0xE0,
- 0xE3, 0xCF, 0xD4, 0xEF, 0x59, 0xD5, 0x1B, 0x34,
- 0x1F, 0x95, 0xCE, 0x7A, 0x20, 0x26, 0x87, 0xB7,
- 0x78, 0x9C, 0x4F, 0xA2, 0x12, 0x97, 0x27, 0x3F,
- 0xFF, 0x07, 0x84, 0x96, 0x04, 0xAF, 0xA8, 0xEA,
- 0x2C, 0x6C, 0xAE, 0x37, 0x91, 0xA9, 0x10, 0xDB,
- 0xCD, 0xDA, 0x08, 0x99, 0xF1, 0x4D, 0xCC, 0x68,
- 0x79, 0x2E, 0xB1, 0x39, 0x9E, 0xE9, 0x2F, 0x6A,
- 0x3D, 0x0F, 0x85, 0x8D, 0xCA, 0x29, 0x86, 0xD6,
- 0xDD, 0x05, 0x25, 0x3A, 0x40, 0x21, 0x45, 0xAC,
- 0x11, 0xF3, 0xA7, 0x09, 0x2A, 0x31, 0xE4, 0x0C,
- 0xF8, 0x6E, 0x3E, 0xB5, 0x82, 0xFE, 0x74, 0x13,
- 0x65, 0xE1, 0x2D, 0x8F, 0xE6, 0xC4, 0x00, 0x5B,
- 0x4E, 0xB9, 0x66, 0xF2, 0x62, 0x36, 0x4C, 0x83,
- 0x5E, 0x6F, 0x47, 0x64, 0xBC, 0x9A, 0x60, 0x7E };
-
-static const unsigned char table_28[32] = {
- 0x15, 0x05, 0x08, 0x19, 0x02, 0x18, 0x1E, 0x07,
- 0x0D, 0x0C, 0x1A, 0x06, 0x17, 0x03, 0x10, 0x09,
- 0x01, 0x11, 0x1C, 0x04, 0x0F, 0x1F, 0x12, 0x0B,
- 0x1B, 0x13, 0x0A, 0x16, 0x0E, 0x00, 0x1D, 0x14 };
-
-static const unsigned char table_29[256] = {
- 0x34, 0x59, 0x05, 0x13, 0x09, 0x1D, 0xDF, 0x77,
- 0x11, 0xA5, 0x92, 0x27, 0xCD, 0x7B, 0x5E, 0x80,
- 0xF9, 0x50, 0x18, 0x24, 0xD4, 0x70, 0x4A, 0x39,
- 0x66, 0xA4, 0xDB, 0xE9, 0xED, 0x48, 0xD9, 0xE7,
- 0x32, 0xDA, 0x53, 0x8F, 0x72, 0xE1, 0xF6, 0xFE,
- 0xD3, 0xAD, 0xA6, 0x1F, 0xB9, 0xD1, 0x0F, 0x4C,
- 0x23, 0x90, 0x68, 0xBC, 0x4B, 0x9B, 0x3D, 0xAB,
- 0xF0, 0x94, 0x4F, 0x1C, 0x07, 0x65, 0x7F, 0x01,
- 0x5C, 0xD7, 0x21, 0x8C, 0xBF, 0x8E, 0xB8, 0x86,
- 0x6C, 0x33, 0x36, 0xC1, 0x06, 0x74, 0x37, 0x84,
- 0x41, 0xAE, 0x67, 0x29, 0xB4, 0x85, 0xCE, 0x2A,
- 0xCB, 0x1E, 0x61, 0x9E, 0x7A, 0x44, 0x3E, 0x89,
- 0x14, 0x20, 0x19, 0xBB, 0xE0, 0xAA, 0xCF, 0x83,
- 0xA8, 0x93, 0x43, 0xF2, 0xAC, 0x0E, 0xD2, 0xCC,
- 0xDD, 0x47, 0x58, 0xC9, 0xCA, 0x1B, 0x54, 0x6E,
- 0x8A, 0x79, 0xF8, 0xC4, 0xFB, 0xD5, 0x91, 0xDE,
- 0x12, 0x31, 0x99, 0xFA, 0x6D, 0xC8, 0x57, 0xEC,
- 0xB7, 0x28, 0x0C, 0x52, 0xF1, 0x0D, 0xB1, 0x9A,
- 0x26, 0x98, 0x16, 0x7D, 0xD0, 0x2E, 0x8B, 0xD8,
- 0xE6, 0xE8, 0x30, 0xFD, 0x7C, 0x64, 0x5A, 0xBD,
- 0x87, 0xE2, 0xA1, 0x3F, 0xC3, 0x38, 0x96, 0xA3,
- 0x2D, 0xF3, 0x3A, 0xEE, 0xC0, 0x10, 0xEA, 0x6F,
- 0x8D, 0x03, 0xF4, 0x51, 0x97, 0x7E, 0x56, 0x42,
- 0x3C, 0x5D, 0x5F, 0xF5, 0x6A, 0xAF, 0xE4, 0xBE,
- 0xBA, 0x78, 0xA0, 0x5B, 0x49, 0xA7, 0xC7, 0x9C,
- 0x63, 0x6B, 0x00, 0x17, 0x69, 0x75, 0x3B, 0x40,
- 0xEF, 0x45, 0xB5, 0x2B, 0x2F, 0x02, 0xC6, 0x22,
- 0x9F, 0xFC, 0x73, 0x08, 0x81, 0xB2, 0x2C, 0x71,
- 0x35, 0xA2, 0xE3, 0xB3, 0x9D, 0xC5, 0x0A, 0xC2,
- 0x25, 0x82, 0xDC, 0x88, 0xA9, 0xE5, 0xF7, 0xEB,
- 0xD6, 0x60, 0x76, 0x55, 0x0B, 0x4E, 0xFF, 0x1A,
- 0x46, 0x62, 0xB6, 0xB0, 0x15, 0x04, 0x95, 0x4D };
-
-static const unsigned char table_30[32] = {
- 0x00, 0x1C, 0x0E, 0x0C, 0x06, 0x16, 0x09, 0x12,
- 0x01, 0x13, 0x0B, 0x14, 0x11, 0x08, 0x04, 0x18,
- 0x10, 0x1B, 0x15, 0x03, 0x02, 0x19, 0x1A, 0x17,
- 0x1E, 0x1F, 0x0F, 0x07, 0x0D, 0x05, 0x1D, 0x0A };
-
-static const unsigned char table_31[256] = {
- 0xDF, 0xD8, 0x3F, 0xBC, 0x5F, 0xC9, 0x8E, 0x4C,
- 0x0B, 0x3C, 0xE5, 0xBF, 0x39, 0xD5, 0x30, 0xDD,
- 0x23, 0xC7, 0x72, 0x63, 0x1F, 0xF8, 0x96, 0x31,
- 0x70, 0xD6, 0x9E, 0xE8, 0x9D, 0xF5, 0xEF, 0x65,
- 0xC2, 0x50, 0x62, 0x77, 0xD3, 0x6C, 0x1A, 0x91,
- 0xBB, 0xFF, 0xCD, 0x9B, 0xB6, 0xBA, 0xB8, 0x7A,
- 0x14, 0xA7, 0x74, 0x89, 0xD4, 0x6E, 0x19, 0x69,
- 0xAB, 0x01, 0x15, 0x0E, 0x87, 0x55, 0x79, 0x1C,
- 0x18, 0xBE, 0xA8, 0xDB, 0x52, 0xD2, 0x8F, 0x7E,
- 0x81, 0xAF, 0xFD, 0x5C, 0x3E, 0x1B, 0xB9, 0xB2,
- 0xB7, 0x51, 0x57, 0x8C, 0xCF, 0x5B, 0xA4, 0x75,
- 0xDE, 0x22, 0x8B, 0x10, 0x12, 0xC8, 0x35, 0x2D,
- 0x45, 0xB5, 0xF0, 0x47, 0x88, 0x16, 0xEB, 0x67,
- 0xD9, 0x0C, 0xF1, 0xC1, 0x34, 0x33, 0xC6, 0x78,
- 0xB3, 0x26, 0xE3, 0xBD, 0x5D, 0x4E, 0x66, 0xE4,
- 0xD7, 0xC4, 0xE6, 0xA1, 0xB0, 0x95, 0x2B, 0x9A,
- 0x4A, 0x3A, 0xCB, 0x40, 0xE1, 0x60, 0x49, 0xCC,
- 0x03, 0xAC, 0xF4, 0x97, 0x32, 0x0F, 0x38, 0x17,
- 0xF9, 0xE0, 0xD1, 0xFB, 0x04, 0x5E, 0x68, 0x06,
- 0xAE, 0xFA, 0xAA, 0xED, 0x24, 0x0D, 0x00, 0x61,
- 0x20, 0xA3, 0x7B, 0x6B, 0x76, 0x27, 0xEA, 0xCE,
- 0x6A, 0x82, 0x9F, 0x6D, 0x9C, 0x64, 0xA2, 0x11,
- 0x37, 0x2A, 0xCA, 0x84, 0x25, 0x7C, 0x2F, 0x8D,
- 0x90, 0xE7, 0x09, 0x93, 0xF3, 0x43, 0x71, 0xEC,
- 0xA9, 0x7D, 0x94, 0xA6, 0x3D, 0x7F, 0x54, 0x44,
- 0x99, 0x80, 0x41, 0xC0, 0xA0, 0x8A, 0x1E, 0xDC,
- 0x08, 0xD0, 0x2E, 0x42, 0x05, 0x85, 0x86, 0xFE,
- 0x3B, 0x59, 0xC3, 0x58, 0x13, 0xB4, 0x36, 0xA5,
- 0x73, 0x28, 0x29, 0xDA, 0x4F, 0x1D, 0xB1, 0x53,
- 0x46, 0x2C, 0xF2, 0x4D, 0xAD, 0xFC, 0x83, 0x02,
- 0x6F, 0x07, 0xE9, 0xEE, 0x21, 0x98, 0x5A, 0xC5,
- 0x92, 0x48, 0xF7, 0x0A, 0xF6, 0xE2, 0x4B, 0x56 };
-
-static const unsigned char table_32[256] = {
- 0x7B, 0x0F, 0x56, 0x2F, 0x1E, 0x2A, 0x7A, 0xD1,
- 0x02, 0x91, 0x4E, 0x37, 0x6C, 0x10, 0xA7, 0xF2,
- 0x38, 0xAC, 0x9E, 0x2B, 0x5E, 0x23, 0xE3, 0x19,
- 0x9B, 0xF6, 0xB0, 0x59, 0x14, 0xB9, 0xA9, 0x46,
- 0x84, 0x1D, 0xC0, 0x98, 0xF3, 0xE1, 0xE8, 0x94,
- 0x52, 0x35, 0xBA, 0xD8, 0x07, 0xEF, 0x31, 0xF8,
- 0x03, 0x76, 0x9C, 0xD7, 0xE4, 0x8B, 0xAF, 0x60,
- 0xDD, 0x51, 0x00, 0xDF, 0x11, 0x7F, 0x1C, 0xED,
- 0x49, 0xC9, 0xF4, 0x87, 0x64, 0xFC, 0x5D, 0xAD,
- 0x88, 0x85, 0xF7, 0x5A, 0x92, 0xDB, 0x72, 0x1A,
- 0x83, 0x15, 0x30, 0x24, 0x9F, 0xFF, 0x5B, 0xF1,
- 0xD2, 0xFD, 0xC2, 0xB5, 0x25, 0x22, 0x18, 0x3D,
- 0xCD, 0x97, 0x8C, 0xCC, 0x78, 0x90, 0xAA, 0x5F,
- 0x0A, 0x57, 0x05, 0x61, 0xD4, 0xA0, 0x3A, 0xDE,
- 0x3B, 0xF9, 0x65, 0x68, 0x4F, 0x28, 0xFA, 0xEB,
- 0x63, 0x2D, 0x8D, 0xD0, 0xA1, 0xFE, 0x12, 0x96,
- 0x3C, 0x42, 0x29, 0xD6, 0xA4, 0x34, 0xBD, 0x70,
- 0x89, 0xBE, 0xF5, 0x79, 0xAB, 0x8F, 0x32, 0xB4,
- 0xEE, 0xE7, 0x2C, 0x04, 0x4B, 0xD5, 0xB1, 0x54,
- 0xF0, 0xDA, 0x16, 0x77, 0xA6, 0x53, 0xB2, 0xE2,
- 0x73, 0xBF, 0x17, 0xA8, 0x75, 0x26, 0xE0, 0xBC,
- 0x0C, 0x71, 0xFB, 0x6D, 0x7E, 0xC5, 0xEA, 0x21,
- 0x9D, 0x95, 0x8E, 0xA5, 0x48, 0xB8, 0x7D, 0xCB,
- 0x01, 0x99, 0xE5, 0xBB, 0x82, 0xC4, 0xCA, 0xC1,
- 0x58, 0x6E, 0x5C, 0x7C, 0xDC, 0x33, 0xB6, 0xC3,
- 0x09, 0xC7, 0x1F, 0x0D, 0x43, 0x6F, 0xE9, 0x86,
- 0x27, 0xC8, 0x44, 0xB3, 0xD3, 0xCF, 0x08, 0x66,
- 0x1B, 0x20, 0x4D, 0xD9, 0xC6, 0x36, 0x40, 0x74,
- 0x62, 0x6A, 0x55, 0xEC, 0x06, 0x2E, 0xE6, 0x80,
- 0x13, 0x93, 0x50, 0xCE, 0x69, 0x3E, 0x67, 0x4A,
- 0x81, 0x4C, 0x0B, 0x3F, 0xB7, 0x0E, 0x39, 0xAE,
- 0x47, 0x6B, 0x8A, 0xA2, 0x9A, 0xA3, 0x45, 0x41 };
-
-static const unsigned char table_33[256] = {
- 0xDE, 0xD3, 0x79, 0x67, 0x13, 0x5C, 0x04, 0xF2,
- 0xD9, 0x9F, 0x65, 0x56, 0xCC, 0x3B, 0xA4, 0x9A,
- 0x08, 0xBF, 0x26, 0xB2, 0xA7, 0x5E, 0xAA, 0xCA,
- 0xBB, 0x2B, 0x38, 0x3F, 0xD8, 0x87, 0xFA, 0x5D,
- 0x73, 0x8E, 0x1E, 0x93, 0x05, 0xAF, 0x3E, 0x4E,
- 0x90, 0xDB, 0x0B, 0x33, 0x0D, 0x2F, 0x86, 0x4F,
- 0xFD, 0xD0, 0x39, 0xB1, 0x8A, 0x1A, 0x20, 0xE6,
- 0xCF, 0xA2, 0x82, 0xDF, 0x42, 0x9C, 0x30, 0x40,
- 0xE3, 0xB0, 0x88, 0x5A, 0xEC, 0x25, 0xE2, 0xC4,
- 0x12, 0x54, 0x50, 0x97, 0x96, 0x21, 0x23, 0x7B,
- 0x1D, 0x61, 0x52, 0x34, 0x7D, 0x69, 0x16, 0xC3,
- 0x31, 0xF8, 0x48, 0x19, 0x95, 0x01, 0x29, 0x8C,
- 0x15, 0xAC, 0x84, 0x74, 0xAB, 0x70, 0xDA, 0x36,
- 0xD6, 0x8F, 0xFE, 0x35, 0xD7, 0x2E, 0x89, 0x07,
- 0x62, 0x17, 0xDC, 0x92, 0x45, 0x83, 0xB5, 0xE5,
- 0x8B, 0xC0, 0x27, 0x85, 0x7C, 0x9D, 0x55, 0x81,
- 0x71, 0xCD, 0xC9, 0x00, 0x02, 0xC1, 0x0A, 0x37,
- 0xED, 0xEA, 0xC2, 0x98, 0x49, 0x06, 0x1C, 0x78,
- 0x64, 0xCE, 0x9E, 0x4C, 0x7A, 0xB4, 0x43, 0x0F,
- 0xE0, 0x7E, 0xBC, 0x5B, 0x51, 0xE7, 0x18, 0xF9,
- 0x11, 0xA1, 0xF5, 0xC7, 0xCB, 0x4D, 0x6A, 0x0E,
- 0x57, 0xF1, 0xFB, 0xB3, 0x99, 0xF0, 0x32, 0xD5,
- 0xA9, 0x4B, 0x6F, 0x6D, 0xA8, 0xC5, 0xDD, 0x7F,
- 0xEB, 0xBE, 0xFC, 0x2C, 0x22, 0x58, 0x03, 0x9B,
- 0x77, 0xF7, 0xBD, 0xBA, 0xD2, 0x6B, 0xAD, 0x5F,
- 0x10, 0x6E, 0x09, 0xD1, 0x1B, 0x24, 0xEF, 0x72,
- 0x3D, 0x59, 0x28, 0xE1, 0xB7, 0x44, 0x8D, 0xB8,
- 0xAE, 0x2D, 0x60, 0xA6, 0xC8, 0x0C, 0xF4, 0x41,
- 0xA3, 0x68, 0x46, 0x6C, 0x76, 0xA0, 0xB6, 0x66,
- 0xE4, 0x1F, 0x75, 0x4A, 0xFF, 0x2A, 0x94, 0xD4,
- 0xF3, 0xE9, 0x91, 0x63, 0xA5, 0xB9, 0xE8, 0x14,
- 0x80, 0x3C, 0xEE, 0x47, 0xC6, 0x3A, 0x53, 0xF6 };
-
-static const unsigned char table_34[256] = {
- 0xF0, 0xE9, 0x3E, 0xD6, 0x89, 0xC8, 0xC7, 0x23,
- 0x75, 0x26, 0x5F, 0x9C, 0x57, 0xB8, 0x2A, 0x29,
- 0xE5, 0xB5, 0x68, 0xA4, 0x92, 0x46, 0x40, 0x7F,
- 0xF2, 0xBC, 0x6A, 0xE0, 0x8F, 0x0F, 0xE4, 0x3A,
- 0xE1, 0x30, 0x84, 0x6E, 0x82, 0x8E, 0x56, 0xC5,
- 0x32, 0x85, 0xFB, 0x59, 0x43, 0x41, 0xC2, 0xF6,
- 0x67, 0x5A, 0x7C, 0x34, 0xA1, 0xD0, 0x4B, 0xAC,
- 0x61, 0x72, 0x6B, 0xAF, 0xC4, 0x20, 0x9A, 0xD4,
- 0x74, 0x8D, 0x87, 0x83, 0xE2, 0x62, 0x6D, 0xE6,
- 0xE7, 0xF9, 0x76, 0xCB, 0x18, 0x90, 0x4F, 0xFF,
- 0xD3, 0x3C, 0x08, 0x79, 0x93, 0x2D, 0x95, 0xA3,
- 0xDD, 0x5B, 0xDA, 0x7A, 0x39, 0x4D, 0xC1, 0x2E,
- 0xCC, 0x53, 0xE8, 0xA2, 0xCF, 0x15, 0x78, 0x1C,
- 0xEB, 0x9B, 0x7B, 0xAD, 0x31, 0x2F, 0xE3, 0xC9,
- 0x3B, 0xEC, 0x2C, 0x49, 0x02, 0x52, 0x28, 0xBA,
- 0x0C, 0x19, 0x24, 0xF7, 0x97, 0x09, 0xA6, 0xA0,
- 0xDF, 0xD1, 0xD2, 0xDC, 0x51, 0xA5, 0x94, 0xFD,
- 0x71, 0xF5, 0x50, 0x0A, 0x69, 0x25, 0x88, 0x5C,
- 0x91, 0xD5, 0x47, 0x0B, 0x27, 0x13, 0x96, 0xD9,
- 0xF1, 0xA9, 0x70, 0xC3, 0xBE, 0x42, 0x4E, 0x4A,
- 0xB1, 0x07, 0xA7, 0x54, 0xFE, 0x48, 0x9F, 0x63,
- 0x17, 0xAE, 0xB9, 0x58, 0x21, 0x35, 0xED, 0x5D,
- 0x9D, 0x3D, 0xB4, 0xFC, 0xEA, 0x8C, 0x80, 0xA8,
- 0x1E, 0xB0, 0xDE, 0x0D, 0x11, 0x6F, 0x04, 0x12,
- 0xF4, 0x10, 0x64, 0x0E, 0xD7, 0x2B, 0xB3, 0x8B,
- 0xB7, 0x01, 0x86, 0xCA, 0xFA, 0x9E, 0xEE, 0x66,
- 0x37, 0x65, 0x81, 0x38, 0x1F, 0xAA, 0x73, 0xAB,
- 0xBD, 0xDB, 0x14, 0xCD, 0x00, 0xBB, 0x98, 0x44,
- 0x45, 0xB6, 0x99, 0x5E, 0xD8, 0x1D, 0x36, 0xF8,
- 0x55, 0x6C, 0x16, 0x7E, 0x77, 0x3F, 0x22, 0xEF,
- 0xF3, 0x7D, 0xC6, 0xCE, 0x8A, 0xB2, 0x33, 0x4C,
- 0x03, 0x05, 0xBF, 0x06, 0x1B, 0xC0, 0x1A, 0x60 };
-
-static const unsigned char table_35[256] = {
- 0xCC, 0x40, 0xEF, 0x1F, 0xDB, 0xE5, 0x71, 0x51,
- 0x3B, 0x0F, 0x7D, 0x9C, 0x83, 0x17, 0x6F, 0x8F,
- 0x13, 0xDC, 0x7F, 0xA9, 0xA5, 0xA2, 0x9D, 0xDF,
- 0xE7, 0x97, 0x2A, 0x30, 0xF2, 0x73, 0xCF, 0x87,
- 0x29, 0xB3, 0x86, 0x43, 0x09, 0xB0, 0x2E, 0x10,
- 0x8E, 0xBC, 0x57, 0xBA, 0x68, 0xF5, 0xCB, 0x89,
- 0x32, 0xC1, 0x6B, 0x1E, 0xAC, 0xB2, 0x2D, 0x6A,
- 0x50, 0xEB, 0x18, 0x06, 0xD8, 0xC7, 0x36, 0x31,
- 0xC5, 0xAF, 0x12, 0x15, 0xB7, 0x37, 0x4E, 0x01,
- 0x14, 0x21, 0x44, 0x5E, 0xF4, 0xB4, 0xE4, 0x65,
- 0xFE, 0x8A, 0xEA, 0x0D, 0xBB, 0x45, 0x8B, 0x25,
- 0x80, 0x35, 0x61, 0xA8, 0x4A, 0x47, 0xAB, 0x91,
- 0x1B, 0x1C, 0x05, 0x4D, 0x5A, 0xD4, 0xF1, 0x9B,
- 0x0E, 0x98, 0xCA, 0x96, 0x42, 0x7E, 0x03, 0x5F,
- 0xE2, 0x90, 0xBF, 0x82, 0xC9, 0x3D, 0xE0, 0x5C,
- 0xFA, 0x3E, 0x41, 0x11, 0x79, 0x58, 0x24, 0x2C,
- 0xC0, 0x28, 0x5D, 0xA3, 0xDE, 0x67, 0xFF, 0xA4,
- 0x63, 0xB1, 0x22, 0x04, 0xFD, 0x70, 0x39, 0x46,
- 0xAA, 0x0A, 0x34, 0x6C, 0xD7, 0x92, 0xA1, 0x3C,
- 0x19, 0xD5, 0xFC, 0xAD, 0x85, 0x07, 0x00, 0x23,
- 0xF8, 0x69, 0x56, 0x53, 0x55, 0x7A, 0xB8, 0xC8,
- 0xDA, 0xCE, 0xF3, 0x5B, 0x49, 0xE1, 0xBE, 0xEC,
- 0x1A, 0x88, 0x02, 0xBD, 0xF7, 0x1D, 0x64, 0xA0,
- 0x4F, 0xD9, 0xE3, 0x95, 0xC6, 0x48, 0x2B, 0xED,
- 0x9A, 0x9E, 0x26, 0x6E, 0xD1, 0x94, 0xB9, 0x93,
- 0xDD, 0xF6, 0xA6, 0xFB, 0xC2, 0xB6, 0x0C, 0xE9,
- 0x77, 0xF9, 0xCD, 0x08, 0xEE, 0x3F, 0xE6, 0x75,
- 0xD6, 0x84, 0x76, 0x8C, 0xF0, 0xAE, 0xD2, 0x78,
- 0x2F, 0x4B, 0x16, 0x4C, 0x27, 0x81, 0x6D, 0x99,
- 0x38, 0xD3, 0x54, 0x62, 0x74, 0x20, 0x60, 0xC3,
- 0x7C, 0x8D, 0x72, 0x0B, 0x52, 0xE8, 0xA7, 0x3A,
- 0x59, 0xC4, 0x9F, 0xD0, 0x66, 0x7B, 0x33, 0xB5 };
-
-static const unsigned char table_36[256] = {
- 0xDB, 0x6F, 0xFE, 0xB3, 0x5C, 0x1F, 0xB8, 0xBF,
- 0xA3, 0x71, 0x11, 0x56, 0x90, 0xE2, 0x63, 0x18,
- 0x83, 0x51, 0x21, 0xEB, 0x66, 0x08, 0xA6, 0xA5,
- 0x1C, 0xF5, 0x14, 0x24, 0x41, 0x33, 0xA7, 0xB5,
- 0xC7, 0x79, 0x57, 0x50, 0x85, 0xE1, 0x6D, 0xF7,
- 0x0E, 0xDE, 0x67, 0xAB, 0xA1, 0x0B, 0xD9, 0x4A,
- 0xCA, 0x36, 0xEA, 0xDA, 0x16, 0xEF, 0x9F, 0x0A,
- 0x09, 0x9A, 0x1D, 0xC5, 0xD7, 0x5F, 0x19, 0xDC,
- 0x15, 0x06, 0xE8, 0x94, 0x0C, 0x0D, 0xC9, 0x7C,
- 0xD6, 0x62, 0xBB, 0x49, 0xF9, 0x61, 0x07, 0x9B,
- 0x28, 0xC3, 0x9E, 0xF4, 0x38, 0x78, 0x20, 0x03,
- 0xA2, 0x7F, 0xC2, 0x9D, 0x5E, 0x65, 0x52, 0x17,
- 0x2E, 0x1B, 0xB0, 0x42, 0xBC, 0xFD, 0xF1, 0xD2,
- 0xF6, 0x60, 0xD3, 0x29, 0x97, 0x3D, 0x0F, 0xB1,
- 0x2F, 0x22, 0xDD, 0x80, 0x32, 0xF8, 0xAD, 0x70,
- 0xB9, 0x8F, 0x37, 0xCE, 0x46, 0x58, 0xB7, 0x30,
- 0xED, 0x7A, 0xE9, 0xC0, 0x7D, 0x13, 0x64, 0x23,
- 0x4E, 0xC8, 0xF0, 0xCC, 0x3B, 0x45, 0x68, 0x8D,
- 0xBE, 0x8B, 0xD8, 0x43, 0x02, 0x27, 0xE4, 0xAA,
- 0x10, 0xF2, 0x59, 0x72, 0x40, 0x26, 0x69, 0xE5,
- 0x05, 0x84, 0x4F, 0xE0, 0x6B, 0xC1, 0xAC, 0x4C,
- 0xFB, 0x31, 0x77, 0x8E, 0xD4, 0x12, 0xA9, 0xB4,
- 0xEC, 0x00, 0x76, 0x1E, 0x25, 0xAE, 0xE7, 0x3C,
- 0x35, 0x93, 0x9C, 0xC4, 0xFC, 0x2D, 0x91, 0x04,
- 0xAF, 0x53, 0x3F, 0xE6, 0xA4, 0xD0, 0x1A, 0xDF,
- 0x3A, 0x55, 0x99, 0x01, 0xCB, 0x6C, 0x82, 0x3E,
- 0x5D, 0xA8, 0x88, 0x54, 0x5B, 0x95, 0xCD, 0x8C,
- 0x81, 0x34, 0xD1, 0x39, 0xFF, 0xEE, 0xFA, 0x8A,
- 0x6E, 0x86, 0x92, 0x89, 0xF3, 0x6A, 0xBA, 0x2C,
- 0xD5, 0x44, 0xC6, 0x96, 0xBD, 0xB2, 0x2B, 0x87,
- 0x74, 0xA0, 0x73, 0x5A, 0x2A, 0x98, 0x75, 0x47,
- 0x4B, 0xB6, 0x7B, 0x4D, 0xCF, 0x7E, 0x48, 0xE3 };
-
-static const unsigned char table_37[256] = {
- 0x1F, 0xD6, 0xB1, 0xB3, 0x40, 0xAD, 0xDE, 0xB7,
- 0x19, 0xB4, 0xE7, 0x0B, 0x9C, 0x2D, 0xE0, 0xF5,
- 0xCF, 0x2C, 0x30, 0x65, 0x2F, 0xCD, 0x02, 0x91,
- 0xCE, 0x2B, 0xBF, 0x78, 0xE6, 0xFA, 0x51, 0x48,
- 0xFB, 0x4D, 0xBE, 0x71, 0x1A, 0x56, 0xFD, 0x81,
- 0x33, 0x75, 0x89, 0x96, 0x37, 0x82, 0x9E, 0x93,
- 0x41, 0x18, 0x5B, 0x2E, 0x22, 0x0F, 0xAF, 0x4B,
- 0xB9, 0xD5, 0xEE, 0x6C, 0xE4, 0x05, 0xCC, 0x99,
- 0xE5, 0x3B, 0x62, 0xBD, 0x7B, 0xAA, 0x4A, 0xE2,
- 0x34, 0x43, 0xF7, 0x39, 0xFE, 0x14, 0x1D, 0xE3,
- 0xF0, 0xA7, 0x77, 0xDF, 0xA0, 0xD3, 0xAC, 0xD9,
- 0xEA, 0x76, 0xDD, 0xA4, 0xC5, 0xC9, 0x61, 0xF3,
- 0xA8, 0xB0, 0x35, 0xE8, 0x68, 0xD4, 0x15, 0xF9,
- 0x97, 0xED, 0x25, 0x0A, 0x88, 0x8F, 0x06, 0xA3,
- 0x16, 0x36, 0x32, 0xA2, 0xC6, 0x64, 0xD7, 0x94,
- 0xD2, 0x6D, 0x74, 0xFC, 0x44, 0x27, 0x5C, 0xFF,
- 0x60, 0x1E, 0x58, 0x8B, 0x5E, 0xC7, 0x90, 0x17,
- 0x63, 0xAE, 0xC3, 0x12, 0x13, 0x84, 0xEC, 0x49,
- 0xA5, 0x9B, 0x31, 0x8D, 0xE1, 0x79, 0xF1, 0x00,
- 0x28, 0x3D, 0xC2, 0x55, 0x20, 0x52, 0x95, 0x7E,
- 0x42, 0x1C, 0x66, 0x92, 0x7D, 0xB6, 0xC4, 0xF4,
- 0x80, 0xB2, 0x72, 0x6E, 0x11, 0xF6, 0x0D, 0x5A,
- 0xEF, 0x9D, 0x69, 0x9A, 0x45, 0x67, 0x3F, 0xDA,
- 0x8E, 0x57, 0x09, 0x7C, 0x38, 0xA6, 0x83, 0x87,
- 0x7A, 0x08, 0x4C, 0x5F, 0x85, 0x7F, 0xD0, 0x04,
- 0x50, 0xCB, 0xB8, 0x07, 0x24, 0x26, 0x29, 0x46,
- 0x01, 0x03, 0xC1, 0xD8, 0xDC, 0x0E, 0x3C, 0x4F,
- 0x53, 0x4E, 0xB5, 0xF8, 0xC0, 0x8A, 0xF2, 0xBB,
- 0xE9, 0x5D, 0x2A, 0xBA, 0x0C, 0x1B, 0x3A, 0xA9,
- 0x21, 0x6A, 0x70, 0xBC, 0xEB, 0xA1, 0x54, 0x10,
- 0x98, 0x9F, 0x23, 0xD1, 0x6B, 0x59, 0x3E, 0xCA,
- 0x73, 0xC8, 0x86, 0x47, 0xDB, 0xAB, 0x6F, 0x8C };
-
-static const unsigned char table_38[256] = {
- 0xAA, 0x8D, 0x37, 0x94, 0x99, 0xDD, 0x70, 0x77,
- 0x78, 0xC9, 0x0F, 0xFA, 0xE2, 0x05, 0xC2, 0x16,
- 0x02, 0x4D, 0x44, 0x65, 0xAC, 0xB0, 0x39, 0xF8,
- 0x06, 0x60, 0xD8, 0xE1, 0x19, 0xB4, 0x36, 0x20,
- 0x59, 0x1D, 0xAD, 0xE4, 0xE8, 0xFF, 0x9D, 0x0D,
- 0x51, 0x28, 0xE7, 0x8C, 0x0E, 0x97, 0xE3, 0xAE,
- 0x6A, 0x27, 0x98, 0xDB, 0x26, 0xF6, 0xEC, 0xC6,
- 0xC0, 0xBD, 0x68, 0x61, 0x83, 0x86, 0xE0, 0x2C,
- 0xEE, 0x47, 0xF9, 0x5F, 0x6D, 0xBA, 0xE9, 0x72,
- 0x8A, 0xBB, 0x08, 0x29, 0xAF, 0x1C, 0xD3, 0x5D,
- 0xF7, 0x87, 0x6F, 0x9A, 0x2F, 0x11, 0xD9, 0x90,
- 0x66, 0x8E, 0xEB, 0xB1, 0x2E, 0xEA, 0xA3, 0x55,
- 0x2B, 0xCC, 0x4C, 0x4B, 0x48, 0x71, 0x3B, 0xFC,
- 0xA4, 0x45, 0x0A, 0x8F, 0x7A, 0x13, 0x01, 0x22,
- 0xC1, 0xF1, 0xA2, 0xB8, 0x7C, 0xF4, 0xB3, 0xB7,
- 0x5B, 0xE5, 0x07, 0x50, 0x7E, 0x18, 0xEF, 0x91,
- 0x5C, 0x15, 0x69, 0xBE, 0x0C, 0x93, 0x56, 0x35,
- 0x7B, 0xCF, 0x34, 0x74, 0x3E, 0x5E, 0x31, 0x21,
- 0x12, 0x63, 0x7F, 0x2A, 0x9B, 0xD4, 0x6B, 0xBC,
- 0x33, 0x62, 0x30, 0x75, 0x17, 0x23, 0xB2, 0xF0,
- 0x57, 0x67, 0x95, 0x3D, 0xCD, 0x10, 0xE6, 0xC8,
- 0x8B, 0xA9, 0x73, 0xC4, 0x43, 0xBF, 0xA7, 0xCA,
- 0xB5, 0xD5, 0xD6, 0x3F, 0x1A, 0x7D, 0x82, 0xA8,
- 0x40, 0x64, 0xAB, 0x04, 0xC3, 0x1F, 0xA0, 0x5A,
- 0x85, 0xF3, 0xDE, 0xFE, 0xDA, 0x1E, 0x81, 0x92,
- 0x9C, 0x2D, 0x9F, 0x32, 0xB9, 0xA1, 0x96, 0xD0,
- 0x4F, 0x38, 0x80, 0xCB, 0x6C, 0x14, 0x84, 0x1B,
- 0xD7, 0xC5, 0xED, 0xD2, 0x3A, 0x0B, 0x88, 0xFD,
- 0xDC, 0x49, 0x9E, 0xF5, 0xF2, 0x52, 0xA6, 0x24,
- 0xC7, 0xB6, 0x03, 0x3C, 0xD1, 0x54, 0x41, 0xDF,
- 0x89, 0x58, 0x79, 0xFB, 0x6E, 0xA5, 0x42, 0x25,
- 0x09, 0x76, 0x00, 0x46, 0x4E, 0x53, 0xCE, 0x4A };
-
-static const unsigned char table_39[32] = {
- 0x12, 0x18, 0x0E, 0x08, 0x16, 0x05, 0x06, 0x00,
- 0x11, 0x17, 0x15, 0x1B, 0x14, 0x01, 0x1F, 0x19,
- 0x04, 0x0D, 0x0A, 0x0F, 0x10, 0x07, 0x1D, 0x03,
- 0x0B, 0x13, 0x0C, 0x09, 0x1E, 0x02, 0x1A, 0x1C };
-
-static const unsigned char table_40[32] = {
- 0x16, 0x02, 0x06, 0x0E, 0x0D, 0x1C, 0x08, 0x0A,
- 0x0F, 0x13, 0x0B, 0x18, 0x07, 0x04, 0x14, 0x01,
- 0x1B, 0x05, 0x17, 0x1E, 0x11, 0x1A, 0x10, 0x1F,
- 0x12, 0x19, 0x1D, 0x03, 0x0C, 0x00, 0x09, 0x15 };
-
-static const unsigned char table_41[32] = {
- 0x13, 0x18, 0x04, 0x1F, 0x1D, 0x11, 0x03, 0x00,
- 0x10, 0x12, 0x06, 0x0A, 0x1C, 0x07, 0x15, 0x0E,
- 0x08, 0x05, 0x0C, 0x09, 0x01, 0x02, 0x16, 0x0B,
- 0x1A, 0x17, 0x14, 0x1E, 0x0D, 0x0F, 0x19, 0x1B };
-
-static const unsigned char table_42[32] = {
- 0x00, 0x08, 0x15, 0x1D, 0x05, 0x18, 0x06, 0x07,
- 0x1F, 0x01, 0x0B, 0x03, 0x19, 0x13, 0x02, 0x1C,
- 0x17, 0x11, 0x0E, 0x1E, 0x0C, 0x0F, 0x09, 0x1A,
- 0x1B, 0x16, 0x10, 0x0D, 0x0A, 0x14, 0x12, 0x04 };
-
-static const unsigned char table_43[256] = {
- 0x34, 0xB7, 0x36, 0x85, 0x5F, 0x93, 0x98, 0x70,
- 0x1E, 0x59, 0x83, 0x60, 0x6F, 0xBF, 0xF9, 0xD0,
- 0xB3, 0x22, 0x12, 0x38, 0xF5, 0x01, 0xC9, 0x5B,
- 0xEF, 0x1D, 0x81, 0x64, 0xFA, 0x8F, 0x7F, 0xBC,
- 0x05, 0x08, 0xE0, 0x8B, 0xE8, 0x86, 0x95, 0xCB,
- 0xCA, 0x5A, 0xEB, 0x10, 0x92, 0xE2, 0x7E, 0x28,
- 0xD9, 0xC7, 0x0D, 0x24, 0xA7, 0x02, 0x0B, 0xF1,
- 0x7B, 0xD3, 0xFE, 0x2B, 0x89, 0x0E, 0xAE, 0xAD,
- 0xC8, 0x82, 0x79, 0x43, 0x96, 0xDE, 0x0C, 0x9A,
- 0x57, 0x84, 0xB4, 0x19, 0xF8, 0xF0, 0xAF, 0xBE,
- 0x99, 0x9F, 0x46, 0xE4, 0x31, 0xDF, 0x30, 0x51,
- 0xD4, 0xE5, 0xFC, 0x32, 0x04, 0x56, 0x7D, 0x33,
- 0xF7, 0x18, 0x23, 0x4E, 0xC2, 0x7C, 0x6C, 0xD2,
- 0xB1, 0x9B, 0x40, 0xA2, 0x88, 0x00, 0xA1, 0xAB,
- 0xC6, 0x5C, 0x87, 0x3B, 0xD7, 0x27, 0x2E, 0x45,
- 0xDA, 0x8E, 0x61, 0x5E, 0xFB, 0x09, 0x5D, 0x6B,
- 0xA3, 0x29, 0x4F, 0xAC, 0xD1, 0x77, 0x4A, 0xA9,
- 0xC4, 0x7A, 0x15, 0xD8, 0xAA, 0x17, 0xB9, 0x2D,
- 0xE7, 0xBD, 0x2C, 0x62, 0x2F, 0xB2, 0xED, 0x3F,
- 0x48, 0x26, 0x1B, 0x35, 0x20, 0x72, 0x4D, 0xFF,
- 0xBB, 0x78, 0x1F, 0xCC, 0xEC, 0xA8, 0x9D, 0x90,
- 0x4B, 0x13, 0xE1, 0xBA, 0xF3, 0x3C, 0x42, 0x65,
- 0x14, 0xDD, 0x75, 0xE3, 0x4C, 0x74, 0x94, 0xCD,
- 0xF2, 0x66, 0x06, 0xE9, 0x49, 0xB8, 0x71, 0x41,
- 0xA0, 0x25, 0x55, 0x47, 0x97, 0x9E, 0x11, 0x54,
- 0x1A, 0xB0, 0x3E, 0x37, 0x39, 0x1C, 0x8D, 0x03,
- 0x6E, 0xF6, 0x80, 0x6D, 0x8C, 0x9C, 0xB6, 0xCF,
- 0xC3, 0x91, 0x63, 0xC0, 0x07, 0x67, 0xE6, 0xF4,
- 0xCE, 0x3D, 0xDB, 0x16, 0xFD, 0xEA, 0xD6, 0x68,
- 0xD5, 0xA6, 0x0F, 0x58, 0x44, 0x52, 0xB5, 0xDC,
- 0x0A, 0x69, 0xC5, 0xA5, 0xC1, 0x8A, 0x2A, 0xEE,
- 0x73, 0x76, 0x3A, 0x21, 0x53, 0xA4, 0x50, 0x6A };
-
-static const unsigned char table_44[32] = {
- 0x1A, 0x0E, 0x0A, 0x17, 0x1F, 0x08, 0x10, 0x14,
- 0x0C, 0x0F, 0x09, 0x1C, 0x06, 0x18, 0x1E, 0x12,
- 0x15, 0x00, 0x11, 0x13, 0x0D, 0x01, 0x0B, 0x03,
- 0x16, 0x19, 0x05, 0x1D, 0x02, 0x07, 0x04, 0x1B };
-
-static const unsigned char table_45[256] = {
- 0x5E, 0xD6, 0xE2, 0x54, 0x35, 0xC2, 0xAC, 0x9D,
- 0x92, 0x64, 0x57, 0x65, 0xC8, 0xAE, 0x21, 0xA9,
- 0x89, 0x48, 0x12, 0x59, 0xEC, 0xEF, 0x9F, 0xF7,
- 0x19, 0x03, 0x83, 0xC0, 0x79, 0x5D, 0x4A, 0x10,
- 0x8C, 0xEB, 0xFF, 0xB5, 0x3B, 0x51, 0x2D, 0xD1,
- 0x6B, 0xC5, 0x24, 0x5C, 0xE6, 0x11, 0x94, 0x3F,
- 0xD0, 0x2F, 0x0E, 0x95, 0x3C, 0xFE, 0x5B, 0x20,
- 0x23, 0xE0, 0x91, 0x6F, 0xCA, 0x56, 0x0C, 0x73,
- 0xDA, 0x67, 0x37, 0xA3, 0xA5, 0x70, 0x93, 0x1C,
- 0x18, 0xD9, 0x42, 0x5F, 0x44, 0xF0, 0xF2, 0x14,
- 0x58, 0x8A, 0x1D, 0x40, 0x4E, 0x0B, 0x74, 0x84,
- 0x52, 0xCB, 0x60, 0xED, 0xAD, 0x66, 0x43, 0x6C,
- 0x81, 0xA1, 0x27, 0xB9, 0xBA, 0x4D, 0xF5, 0x04,
- 0xB8, 0x96, 0xA6, 0xA2, 0x7D, 0xD4, 0xEA, 0x45,
- 0x4F, 0x55, 0xD3, 0x3E, 0x8E, 0x4C, 0xBF, 0x8B,
- 0x9A, 0x06, 0x7A, 0xF4, 0x02, 0x88, 0x80, 0x22,
- 0xF3, 0xBD, 0x78, 0xEE, 0xAF, 0xF8, 0x15, 0x09,
- 0x0F, 0xB0, 0xDD, 0x99, 0x72, 0xE7, 0x90, 0xE1,
- 0x25, 0x62, 0x8D, 0x9C, 0x13, 0x08, 0xC9, 0x28,
- 0x2A, 0x47, 0x69, 0xDE, 0x77, 0x87, 0xBB, 0xE9,
- 0xAA, 0x33, 0x05, 0x29, 0x34, 0x97, 0xFD, 0xA0,
- 0x1E, 0xFC, 0xBE, 0xB1, 0x71, 0x9B, 0x50, 0xDC,
- 0xB7, 0x31, 0x63, 0x3A, 0xDF, 0xC3, 0x1B, 0x7C,
- 0x0A, 0xD7, 0xF6, 0xDB, 0x49, 0x53, 0x7F, 0xD2,
- 0x30, 0xA4, 0xB3, 0x6E, 0xB2, 0x6D, 0xCD, 0x7E,
- 0x26, 0xE8, 0x76, 0xCF, 0xE5, 0xCE, 0x16, 0xF1,
- 0xC6, 0x68, 0x36, 0x46, 0x1F, 0x38, 0x0D, 0x41,
- 0x17, 0xBC, 0x86, 0x9E, 0x6A, 0x7B, 0xB4, 0x01,
- 0xCC, 0x2C, 0xE3, 0x5A, 0xB6, 0xFA, 0x00, 0x75,
- 0x39, 0xA7, 0xC1, 0xD5, 0x98, 0xAB, 0x1A, 0x85,
- 0xD8, 0xE4, 0xC4, 0xA8, 0x4B, 0x61, 0x2E, 0x3D,
- 0xF9, 0x2B, 0x32, 0x8F, 0xFB, 0xC7, 0x07, 0x82 };
-
-static const unsigned char table_46[256] = {
- 0x85, 0x78, 0xFE, 0x6C, 0x61, 0xA0, 0x71, 0xCC,
- 0x45, 0x54, 0x7A, 0xE6, 0x82, 0x1D, 0xA6, 0x02,
- 0x47, 0xD0, 0x23, 0x55, 0x62, 0xFA, 0x76, 0x3E,
- 0xE3, 0x66, 0x74, 0x10, 0x5D, 0x49, 0x69, 0x0B,
- 0x75, 0x12, 0x8D, 0x9F, 0xEE, 0x93, 0x50, 0x70,
- 0x32, 0xBC, 0x1E, 0xD3, 0xEF, 0x7B, 0xB4, 0x92,
- 0xFD, 0x16, 0xC2, 0xD8, 0xDE, 0x68, 0xD1, 0x64,
- 0xC3, 0xA3, 0xB3, 0xC9, 0x08, 0xFB, 0x84, 0xC1,
- 0x28, 0x53, 0xCF, 0xD2, 0x35, 0xD7, 0x4A, 0x01,
- 0x44, 0xA4, 0x07, 0xAC, 0x98, 0xF1, 0xB2, 0x9A,
- 0x94, 0x2D, 0xD4, 0x34, 0x27, 0x60, 0x1A, 0xB9,
- 0xAF, 0x89, 0xEB, 0x8F, 0x6A, 0x13, 0x05, 0xF0,
- 0x77, 0x5F, 0x4F, 0x58, 0x2C, 0xE7, 0xCE, 0xED,
- 0xC0, 0x0D, 0x3A, 0xA7, 0xE2, 0x38, 0x5B, 0xE9,
- 0x3D, 0xF2, 0xDF, 0x86, 0xE0, 0x72, 0xF7, 0x88,
- 0xAD, 0xB7, 0x11, 0xDB, 0x73, 0x87, 0xC5, 0x22,
- 0xE1, 0x5C, 0xD6, 0x57, 0x7E, 0x7D, 0xA2, 0xF9,
- 0xF5, 0x9C, 0x25, 0x6F, 0x26, 0x51, 0xC8, 0x80,
- 0x2B, 0xA8, 0x19, 0xD9, 0x65, 0xCD, 0x97, 0xEA,
- 0xFF, 0x5E, 0x24, 0x3B, 0x4D, 0xB1, 0x1C, 0x79,
- 0x39, 0x6B, 0xA5, 0x2A, 0x09, 0xCA, 0x04, 0xEC,
- 0xBA, 0x18, 0x31, 0x46, 0x20, 0xBE, 0x1F, 0x3C,
- 0x6D, 0xAA, 0xF6, 0xDD, 0xF4, 0x96, 0x03, 0x0A,
- 0x9E, 0x83, 0xA1, 0x9D, 0xD5, 0xB0, 0x17, 0xBF,
- 0x56, 0xAB, 0xAE, 0x1B, 0x52, 0xC6, 0x81, 0x4B,
- 0xDC, 0x90, 0x5A, 0x9B, 0xB6, 0x0F, 0xF3, 0x67,
- 0x30, 0x63, 0x7C, 0x40, 0x0E, 0x7F, 0x95, 0x36,
- 0xC4, 0x4E, 0x43, 0xCB, 0x15, 0xB8, 0x00, 0x91,
- 0x8A, 0x4C, 0x8E, 0x14, 0x06, 0x6E, 0xA9, 0x2E,
- 0x3F, 0x48, 0x2F, 0x0C, 0xB5, 0x21, 0xBB, 0xDA,
- 0x8B, 0x42, 0x29, 0x8C, 0x33, 0x59, 0xE8, 0xF8,
- 0xC7, 0xE4, 0x37, 0xE5, 0xFC, 0xBD, 0x99, 0x41 };
-
-static const unsigned char table_47[32] = {
- 0x18, 0x1D, 0x16, 0x10, 0x11, 0x04, 0x1E, 0x08,
- 0x19, 0x0E, 0x0F, 0x02, 0x14, 0x1C, 0x07, 0x17,
- 0x0D, 0x09, 0x12, 0x1A, 0x05, 0x01, 0x0B, 0x0A,
- 0x13, 0x15, 0x0C, 0x00, 0x06, 0x1F, 0x03, 0x1B };
-
-static const unsigned char table_48[32] = {
- 0x13, 0x08, 0x15, 0x01, 0x17, 0x10, 0x0F, 0x1F,
- 0x1D, 0x0D, 0x12, 0x03, 0x06, 0x0A, 0x1C, 0x19,
- 0x1A, 0x04, 0x1B, 0x02, 0x16, 0x1E, 0x11, 0x00,
- 0x14, 0x09, 0x0C, 0x18, 0x05, 0x07, 0x0E, 0x0B };
-
-static const unsigned char table_49[32] = {
- 0x1F, 0x0F, 0x19, 0x07, 0x18, 0x05, 0x1E, 0x1D,
- 0x15, 0x08, 0x17, 0x10, 0x0A, 0x0E, 0x0C, 0x1B,
- 0x02, 0x13, 0x03, 0x0D, 0x04, 0x1A, 0x06, 0x09,
- 0x12, 0x1C, 0x0B, 0x16, 0x14, 0x01, 0x11, 0x00 };
-
-static const unsigned char table_50[32] = {
- 0x16, 0x18, 0x1C, 0x0E, 0x12, 0x00, 0x04, 0x1B,
- 0x1F, 0x13, 0x17, 0x0A, 0x1E, 0x03, 0x0C, 0x01,
- 0x0F, 0x10, 0x02, 0x08, 0x14, 0x09, 0x19, 0x15,
- 0x06, 0x0D, 0x0B, 0x1D, 0x05, 0x07, 0x11, 0x1A };
-
-static const unsigned char table_51[32] = {
- 0x1C, 0x0D, 0x1B, 0x07, 0x17, 0x0E, 0x06, 0x01,
- 0x12, 0x19, 0x03, 0x0B, 0x10, 0x08, 0x00, 0x1E,
- 0x0A, 0x04, 0x1A, 0x1D, 0x0C, 0x18, 0x02, 0x13,
- 0x0F, 0x11, 0x05, 0x09, 0x15, 0x16, 0x1F, 0x14 };
-
-static const unsigned char table_52[256] = {
- 0x34, 0x0B, 0x47, 0xA3, 0x56, 0x30, 0x73, 0xD4,
- 0x4B, 0xF6, 0xA6, 0x80, 0x22, 0x95, 0xA5, 0xBB,
- 0xFE, 0xCD, 0x27, 0x88, 0x87, 0x18, 0x86, 0x6E,
- 0xB9, 0x07, 0x37, 0x52, 0x0A, 0x28, 0x2C, 0xC4,
- 0x75, 0xA1, 0x29, 0x54, 0x84, 0x08, 0x72, 0x51,
- 0xDD, 0xF1, 0x4E, 0x1A, 0x90, 0x57, 0x20, 0xAD,
- 0x68, 0x61, 0xAF, 0x50, 0x6B, 0x1B, 0x71, 0xEB,
- 0x63, 0xC9, 0xB0, 0x58, 0x26, 0x40, 0xC7, 0xD9,
- 0x70, 0xA2, 0x9A, 0x09, 0x3F, 0x92, 0x0D, 0x8C,
- 0xC1, 0x96, 0x9F, 0x77, 0x4D, 0x5A, 0xEA, 0x11,
- 0xD7, 0xF3, 0x33, 0x93, 0x10, 0xF2, 0x9D, 0x83,
- 0xFF, 0x7E, 0xD2, 0x41, 0x24, 0xB4, 0x8D, 0x5C,
- 0xCF, 0xEF, 0xE9, 0x64, 0x76, 0xD1, 0xDE, 0xE4,
- 0x91, 0x35, 0x89, 0x19, 0x02, 0x0E, 0xF4, 0x2A,
- 0x0F, 0xE1, 0xA8, 0x2D, 0x21, 0x23, 0xAA, 0x7C,
- 0x78, 0x45, 0xA9, 0xDC, 0x06, 0xF9, 0xDF, 0xF7,
- 0x03, 0xAB, 0xB5, 0x1C, 0x36, 0x7B, 0x97, 0xFA,
- 0xE5, 0x3B, 0x2F, 0x1F, 0x9E, 0xED, 0xA7, 0x55,
- 0x42, 0x6F, 0x1E, 0xB7, 0xE6, 0xFB, 0x12, 0xD5,
- 0x99, 0xC6, 0x66, 0x4A, 0xE8, 0x48, 0x60, 0xB1,
- 0x05, 0x53, 0x8A, 0xB6, 0x25, 0x8F, 0xA4, 0xD8,
- 0x9C, 0xC0, 0x59, 0x3A, 0xBD, 0xDB, 0x44, 0x5E,
- 0xE3, 0xDA, 0x1D, 0x32, 0xF5, 0xBA, 0x43, 0x13,
- 0x82, 0x4C, 0xE7, 0x17, 0x15, 0x3E, 0x69, 0x2E,
- 0xC3, 0xF0, 0x5F, 0xFD, 0xCE, 0xD3, 0xCA, 0x39,
- 0xD6, 0x79, 0x3D, 0xC8, 0x67, 0x8B, 0x31, 0x4F,
- 0xB3, 0xBC, 0x65, 0x00, 0x7A, 0x98, 0xC5, 0x6C,
- 0x2B, 0x94, 0x6D, 0x74, 0x14, 0xAC, 0xCC, 0xA0,
- 0x5B, 0xF8, 0xCB, 0x7F, 0xB2, 0xEC, 0xBF, 0x3C,
- 0xE0, 0xAE, 0xFC, 0x62, 0x04, 0x8E, 0x85, 0x49,
- 0x9B, 0xC2, 0x38, 0xD0, 0xEE, 0x81, 0x46, 0xE2,
- 0x01, 0x0C, 0x5D, 0x7D, 0xB8, 0xBE, 0x6A, 0x16 };
-
-static const unsigned char table_53[256] = {
- 0xE3, 0xF4, 0x8D, 0x72, 0x45, 0x32, 0x9D, 0xCE,
- 0x1F, 0x6B, 0xBC, 0xDC, 0xF1, 0xEC, 0x5A, 0x3B,
- 0xA5, 0xA2, 0x2B, 0xDD, 0x8A, 0xA3, 0x76, 0xE4,
- 0xAF, 0xE9, 0xE1, 0x21, 0xDB, 0x9F, 0x19, 0xD3,
- 0x26, 0x80, 0x15, 0xC2, 0x46, 0xB8, 0x17, 0x56,
- 0x99, 0x81, 0x08, 0xD7, 0xEF, 0x8E, 0x04, 0x05,
- 0x97, 0x2F, 0x78, 0xAD, 0xA1, 0x52, 0x36, 0x58,
- 0x53, 0x68, 0x22, 0x70, 0x0B, 0x79, 0xE6, 0xFA,
- 0xC3, 0x91, 0xE2, 0xF7, 0xF6, 0x75, 0x2D, 0x0A,
- 0x90, 0xEB, 0xA6, 0x35, 0xA7, 0x10, 0xB5, 0xFB,
- 0xE7, 0xAA, 0x1E, 0x43, 0xBB, 0x3C, 0x65, 0x25,
- 0x2C, 0x59, 0x62, 0x2A, 0xF9, 0x4B, 0x95, 0x5E,
- 0x20, 0x11, 0x42, 0x27, 0x44, 0xE8, 0x14, 0x6F,
- 0xD1, 0xD8, 0x00, 0x3A, 0x5B, 0x18, 0x89, 0x02,
- 0x61, 0xD6, 0xC5, 0x98, 0xD0, 0x5F, 0x34, 0x29,
- 0xFD, 0x31, 0x1A, 0xCD, 0x0F, 0x9E, 0xCA, 0x7B,
- 0xEA, 0x93, 0x71, 0x5C, 0x0E, 0x57, 0x33, 0xC4,
- 0x37, 0xF5, 0x83, 0xB0, 0xDF, 0x49, 0x74, 0x54,
- 0x1D, 0x24, 0xB9, 0x16, 0x1C, 0x28, 0xDE, 0x4A,
- 0xF0, 0x01, 0x86, 0x82, 0xCC, 0x12, 0x8C, 0x06,
- 0x30, 0xA8, 0x7A, 0x73, 0x66, 0x7C, 0xC6, 0xB6,
- 0xF2, 0x13, 0xBF, 0x40, 0x85, 0x77, 0x09, 0x3D,
- 0x67, 0x63, 0x3F, 0x7F, 0xF3, 0x87, 0x8F, 0xFF,
- 0x92, 0xC7, 0x4C, 0x23, 0xBA, 0xCB, 0xB1, 0xED,
- 0x0C, 0x60, 0x47, 0xFE, 0x38, 0x5D, 0xCF, 0x8B,
- 0x4D, 0xA9, 0x2E, 0xE5, 0xA4, 0x1B, 0x88, 0x3E,
- 0x7D, 0xF8, 0xC0, 0xD5, 0x6D, 0x6C, 0x48, 0xAC,
- 0x9B, 0x51, 0x7E, 0x6E, 0x50, 0x0D, 0x9A, 0xB3,
- 0xEE, 0x07, 0x4F, 0x69, 0x9C, 0x03, 0xD9, 0xD4,
- 0xB4, 0xD2, 0xAE, 0x4E, 0x55, 0xB7, 0xC9, 0x41,
- 0x39, 0x6A, 0xC8, 0xA0, 0xB2, 0xC1, 0x84, 0xFC,
- 0xAB, 0x64, 0xE0, 0xBE, 0xDA, 0xBD, 0x96, 0x94 };
-
-static const unsigned char table_54[32] = {
- 0x01, 0x02, 0x1D, 0x10, 0x0E, 0x11, 0x08, 0x14,
- 0x12, 0x09, 0x15, 0x17, 0x16, 0x04, 0x06, 0x1B,
- 0x07, 0x1A, 0x18, 0x13, 0x0A, 0x1E, 0x1C, 0x1F,
- 0x0C, 0x0B, 0x0D, 0x05, 0x0F, 0x00, 0x19, 0x03 };
-
-static const unsigned char table_55[32] = {
- 0x01, 0x12, 0x13, 0x09, 0x0B, 0x19, 0x03, 0x0E,
- 0x02, 0x1F, 0x1D, 0x1B, 0x1E, 0x11, 0x06, 0x05,
- 0x00, 0x16, 0x07, 0x0C, 0x15, 0x0D, 0x1A, 0x08,
- 0x18, 0x10, 0x0F, 0x17, 0x1C, 0x0A, 0x04, 0x14 };
-
-static const unsigned char table_56[256] = {
- 0xEF, 0x06, 0x5F, 0x11, 0x4B, 0x60, 0x13, 0xBB,
- 0x79, 0xD7, 0xE4, 0x6D, 0x22, 0xB4, 0x15, 0x50,
- 0x29, 0x17, 0xD2, 0xE3, 0x37, 0x8C, 0x46, 0x7C,
- 0xA2, 0xF5, 0x65, 0x16, 0xCB, 0x04, 0x3E, 0xDF,
- 0x8E, 0xDE, 0x53, 0xF1, 0xF4, 0xD1, 0x3B, 0xEE,
- 0x9A, 0x09, 0x9B, 0x6C, 0xF6, 0xCC, 0xFB, 0x40,
- 0xE0, 0xFD, 0x2B, 0x1D, 0x73, 0x18, 0xCD, 0x31,
- 0x3F, 0x9E, 0xAD, 0xC9, 0x43, 0x4E, 0x99, 0x3A,
- 0x8F, 0x92, 0x85, 0xFC, 0x12, 0x41, 0x20, 0xE8,
- 0x2A, 0xC0, 0x1C, 0x38, 0x74, 0x0B, 0xF3, 0x05,
- 0x0D, 0x1F, 0x94, 0x9C, 0xAC, 0x00, 0x59, 0x0C,
- 0xB3, 0x8D, 0xA8, 0x75, 0xB7, 0x68, 0x2F, 0x27,
- 0x6F, 0x69, 0x76, 0xD8, 0xEC, 0xA5, 0xB2, 0x6A,
- 0x19, 0x72, 0x1A, 0xB6, 0xE5, 0x77, 0xC6, 0x44,
- 0x9D, 0xCA, 0x82, 0x35, 0x36, 0x5E, 0xA9, 0x25,
- 0xFA, 0x5C, 0x24, 0x30, 0x39, 0x0E, 0x2C, 0x7D,
- 0xE6, 0x88, 0xA0, 0x63, 0xB8, 0x6B, 0x01, 0xDD,
- 0xDA, 0x9F, 0x45, 0x83, 0xE2, 0x7F, 0x1B, 0x56,
- 0xAF, 0x14, 0xC3, 0x49, 0xBF, 0x78, 0x70, 0x58,
- 0x23, 0xA3, 0xBD, 0x34, 0x47, 0x2D, 0x0A, 0xD4,
- 0x33, 0x03, 0x1E, 0xC1, 0x87, 0xAE, 0x3C, 0x95,
- 0xB0, 0x42, 0x91, 0xB9, 0x5A, 0x61, 0xAA, 0xCF,
- 0xF2, 0x51, 0xA6, 0xF8, 0xDC, 0x71, 0xAB, 0x48,
- 0x66, 0x90, 0x97, 0xC4, 0x08, 0xF9, 0xD0, 0x7B,
- 0xDB, 0xBA, 0x8B, 0xC2, 0xC5, 0x2E, 0xF7, 0x5B,
- 0xFF, 0x21, 0x81, 0x54, 0xD3, 0x62, 0x57, 0x4C,
- 0x6E, 0x02, 0x98, 0xFE, 0x7E, 0xE7, 0xBC, 0x07,
- 0x28, 0x5D, 0x86, 0xCE, 0xEA, 0x84, 0xF0, 0xE1,
- 0x93, 0x80, 0xE9, 0xC7, 0x4A, 0xED, 0xB1, 0x26,
- 0x89, 0x3D, 0x4F, 0xA7, 0xA1, 0xD6, 0xB5, 0x4D,
- 0x67, 0xA4, 0x55, 0x10, 0x0F, 0xD9, 0x52, 0x32,
- 0x96, 0xD5, 0xEB, 0x64, 0x8A, 0xC8, 0x7A, 0xBE };
-
-static const unsigned char table_57[256] = {
- 0xD1, 0x9B, 0x15, 0x06, 0xB4, 0xF6, 0x97, 0xF0,
- 0xC6, 0x5B, 0x88, 0x12, 0x25, 0xFA, 0x7B, 0x79,
- 0xD6, 0xAB, 0xDC, 0x47, 0x85, 0x61, 0x67, 0x0B,
- 0xF3, 0x20, 0x44, 0x53, 0x2A, 0x3B, 0x2D, 0xE8,
- 0x17, 0x71, 0xC3, 0xB7, 0x7F, 0x35, 0xEB, 0x10,
- 0x03, 0x0D, 0x60, 0x96, 0x27, 0xBB, 0x39, 0x50,
- 0x95, 0x55, 0xCC, 0xD4, 0x2F, 0x51, 0xB3, 0x05,
- 0xA5, 0xAD, 0xBC, 0x18, 0xE2, 0xAE, 0x07, 0x87,
- 0xC4, 0x8D, 0xBE, 0x77, 0xC2, 0x16, 0xFC, 0x33,
- 0x4C, 0x4F, 0xE6, 0xA6, 0x57, 0x9F, 0x37, 0x91,
- 0xED, 0x4A, 0xF7, 0xB5, 0x52, 0x7C, 0xBD, 0x30,
- 0xA0, 0x2C, 0x8C, 0xB0, 0x0C, 0xDA, 0x6F, 0x9E,
- 0xEE, 0x43, 0x40, 0x8F, 0x8B, 0x76, 0xA4, 0x68,
- 0xFF, 0x6D, 0x58, 0xC9, 0xF9, 0x6E, 0x3F, 0x56,
- 0xCA, 0x49, 0xC8, 0x5D, 0xCD, 0xC7, 0x99, 0xEC,
- 0x72, 0x38, 0x0A, 0xA9, 0xC5, 0x04, 0x64, 0xBF,
- 0xB6, 0x29, 0x80, 0x2E, 0x19, 0x0E, 0x82, 0x45,
- 0xBA, 0xD7, 0x1E, 0x86, 0xA8, 0xD8, 0x24, 0xDB,
- 0xCF, 0xE1, 0x54, 0xB2, 0x3E, 0x4D, 0x90, 0x42,
- 0x5F, 0x59, 0x0F, 0xCE, 0x8E, 0xA2, 0xA7, 0x1D,
- 0x22, 0xFD, 0x81, 0x63, 0xE5, 0x6A, 0xE7, 0x93,
- 0x41, 0x46, 0x66, 0x89, 0x13, 0xEA, 0x69, 0x1C,
- 0x83, 0xF2, 0x08, 0xB8, 0x01, 0x23, 0x26, 0xFB,
- 0x78, 0xAA, 0x31, 0x11, 0x1B, 0x98, 0xDD, 0xAC,
- 0xB9, 0xFE, 0x94, 0x74, 0xAF, 0x32, 0xD0, 0x5A,
- 0xA1, 0xF4, 0x6B, 0x8A, 0xE3, 0x65, 0xDE, 0xCB,
- 0x73, 0x3D, 0xA3, 0x7E, 0xDF, 0xD2, 0x6C, 0x7A,
- 0x36, 0xD9, 0x62, 0x4B, 0xEF, 0xC1, 0x1F, 0x00,
- 0x34, 0xB1, 0xF8, 0xE4, 0xD5, 0x09, 0x1A, 0x9A,
- 0x70, 0x48, 0x9D, 0xF1, 0xE0, 0x9C, 0xD3, 0x5C,
- 0x75, 0x02, 0x2B, 0x92, 0x21, 0x7D, 0xF5, 0x5E,
- 0x4E, 0x3C, 0x84, 0x14, 0x28, 0x3A, 0xE9, 0xC0 };
-
-static const unsigned char table_58[256] = {
- 0xE9, 0x81, 0x60, 0xA7, 0x18, 0xA0, 0x0F, 0x55,
- 0x2B, 0x52, 0xE0, 0x8B, 0x9D, 0x85, 0xD2, 0xA3,
- 0x3F, 0x6E, 0xB1, 0xAF, 0xE3, 0x36, 0xE2, 0x19,
- 0x56, 0xB0, 0x09, 0xB5, 0x79, 0x43, 0xE1, 0x06,
- 0x45, 0xB6, 0xC0, 0x22, 0xEE, 0x41, 0xEC, 0x01,
- 0x66, 0x2D, 0x87, 0x38, 0x16, 0x37, 0xFA, 0x29,
- 0x96, 0xA4, 0xC3, 0x23, 0x59, 0x7E, 0x92, 0x78,
- 0x10, 0x2A, 0x4C, 0x0E, 0x9B, 0x4A, 0x35, 0xF4,
- 0x42, 0x0C, 0xD8, 0xD7, 0x24, 0x2C, 0xDD, 0x8E,
- 0x5B, 0xF5, 0x33, 0x48, 0xEF, 0xDE, 0x4B, 0xBC,
- 0x51, 0xAB, 0x7C, 0xE4, 0x63, 0x70, 0x9A, 0xAC,
- 0x54, 0x1D, 0x25, 0xC5, 0xEA, 0xB3, 0x05, 0xF7,
- 0xC1, 0x1F, 0xE8, 0x97, 0xBB, 0x32, 0x6D, 0xC7,
- 0x28, 0x61, 0xDB, 0x4D, 0x77, 0x72, 0x65, 0x8C,
- 0x80, 0x3A, 0x76, 0x47, 0xA8, 0x03, 0x04, 0x12,
- 0xCE, 0xA9, 0x75, 0x3C, 0x49, 0xF8, 0x64, 0xDF,
- 0x57, 0xA2, 0x69, 0x44, 0xAD, 0x3E, 0x4F, 0x0B,
- 0x74, 0x67, 0xC9, 0x1A, 0x17, 0xAA, 0x02, 0x6F,
- 0xDA, 0xF2, 0xC6, 0x27, 0x53, 0xD6, 0xFD, 0xCA,
- 0x8D, 0x93, 0x89, 0xD5, 0x6B, 0x4E, 0x90, 0x82,
- 0x30, 0xE7, 0xC4, 0xD9, 0x8A, 0x7F, 0xB4, 0xFC,
- 0xCF, 0xA1, 0xAE, 0x1C, 0x39, 0x1B, 0x7B, 0x5E,
- 0x88, 0x7D, 0xD3, 0x71, 0x2E, 0x98, 0x13, 0x8F,
- 0xCC, 0x84, 0x73, 0xCD, 0x21, 0x0D, 0x5C, 0xA5,
- 0x3D, 0x9E, 0x99, 0xC2, 0xF3, 0x34, 0x14, 0x62,
- 0x46, 0x0A, 0x07, 0x08, 0xFF, 0xFB, 0xB7, 0xBF,
- 0x5D, 0x91, 0xB8, 0x83, 0xBE, 0x94, 0xBA, 0xF9,
- 0xEB, 0xE5, 0xCB, 0x95, 0x40, 0x31, 0xE6, 0x86,
- 0xD4, 0xFE, 0xD0, 0x7A, 0x26, 0xB9, 0xDC, 0x2F,
- 0xBD, 0xF0, 0x5F, 0x00, 0x9C, 0x6A, 0x5A, 0x3B,
- 0xF1, 0xC8, 0x9F, 0xED, 0x50, 0x20, 0x15, 0x11,
- 0x68, 0x1E, 0xF6, 0xA6, 0x6C, 0xB2, 0xD1, 0x58 };
-
-static const unsigned char table_59[256] = {
- 0x4C, 0x85, 0x2B, 0x14, 0xCC, 0x4D, 0x5F, 0xD7,
- 0xCE, 0x28, 0xC5, 0x0B, 0xA1, 0x99, 0x08, 0xDE,
- 0x42, 0xD1, 0x82, 0x5C, 0xC9, 0x8F, 0x72, 0x12,
- 0xCB, 0x0D, 0x04, 0xFA, 0xCD, 0xE5, 0x9A, 0x6F,
- 0xCF, 0x92, 0xB5, 0x88, 0x87, 0xBF, 0x90, 0x7C,
- 0xAC, 0xBE, 0x36, 0x21, 0x7D, 0x7F, 0xC7, 0x9F,
- 0x75, 0xBB, 0x61, 0x16, 0x17, 0x63, 0xAE, 0xC4,
- 0x23, 0x89, 0xE0, 0x37, 0x91, 0x5E, 0xC8, 0xE4,
- 0xFD, 0xD5, 0xA2, 0xC6, 0x5A, 0xEF, 0x9B, 0xD6,
- 0x27, 0xEE, 0x60, 0x1C, 0xDF, 0xDA, 0xF1, 0xD2,
- 0x1E, 0x01, 0x9D, 0x44, 0x03, 0xD8, 0x11, 0x53,
- 0x4F, 0x6C, 0x8B, 0xB7, 0x40, 0xF2, 0x79, 0x20,
- 0x74, 0x97, 0x3E, 0x3D, 0x05, 0xD4, 0x70, 0x30,
- 0x54, 0x59, 0xE7, 0x15, 0xE1, 0xEB, 0x71, 0x83,
- 0xFE, 0x66, 0xB1, 0xA6, 0xF7, 0x8E, 0x6A, 0xEA,
- 0x65, 0x7E, 0xA3, 0xCA, 0x2D, 0x4B, 0xB8, 0x9C,
- 0x35, 0xC3, 0xB6, 0x49, 0x32, 0x25, 0xB3, 0xB0,
- 0x76, 0xC0, 0xF5, 0x00, 0x8A, 0xAF, 0x19, 0xDB,
- 0xDD, 0x47, 0xDC, 0x07, 0xB2, 0x4A, 0x55, 0xE6,
- 0x69, 0xEC, 0xED, 0x06, 0x94, 0xB9, 0xA7, 0x56,
- 0x2C, 0xAA, 0xE3, 0x22, 0x3B, 0x98, 0x77, 0x52,
- 0x3C, 0x64, 0xF8, 0x13, 0x78, 0xFC, 0xFB, 0xF3,
- 0xD3, 0xF9, 0x29, 0x45, 0x51, 0x8C, 0xA0, 0x38,
- 0xD9, 0xA5, 0x62, 0x3A, 0x6E, 0xD0, 0xE8, 0x7A,
- 0x33, 0x1D, 0xB4, 0x73, 0x02, 0xFF, 0x10, 0x80,
- 0x6B, 0xF0, 0xA4, 0xBA, 0xF6, 0xC2, 0x0E, 0xE2,
- 0x81, 0x43, 0x84, 0x86, 0x1F, 0x31, 0x2F, 0xA9,
- 0x1B, 0x2A, 0x4E, 0xF4, 0x95, 0x5B, 0x3F, 0x34,
- 0x39, 0x7B, 0x0A, 0x26, 0x6D, 0x57, 0x50, 0x09,
- 0x9E, 0xA8, 0xBC, 0x24, 0x93, 0x67, 0x41, 0x96,
- 0x0C, 0x46, 0xBD, 0xE9, 0x68, 0x18, 0xAB, 0x2E,
- 0x5D, 0x1A, 0x8D, 0xC1, 0x58, 0x48, 0xAD, 0x0F };
-
-static const unsigned char table_60[32] = {
- 0x1C, 0x06, 0x1E, 0x10, 0x1D, 0x05, 0x00, 0x0E,
- 0x0C, 0x02, 0x11, 0x19, 0x15, 0x18, 0x16, 0x07,
- 0x1F, 0x0B, 0x14, 0x01, 0x0F, 0x09, 0x0D, 0x13,
- 0x03, 0x08, 0x12, 0x04, 0x1B, 0x0A, 0x17, 0x1A };
-
-static const unsigned char table_61[256] = {
- 0xC5, 0xA6, 0xF2, 0x6B, 0x4B, 0x58, 0xE0, 0x41,
- 0xC6, 0x2F, 0x13, 0xFE, 0xC1, 0x34, 0x3F, 0x24,
- 0x10, 0xBF, 0x8B, 0xC9, 0x26, 0x2E, 0x68, 0xBE,
- 0x28, 0x54, 0x93, 0x11, 0x21, 0x03, 0xFF, 0x50,
- 0x31, 0x71, 0x2C, 0x6C, 0x91, 0x8F, 0x3B, 0x40,
- 0x3E, 0xE5, 0xA5, 0x80, 0xEA, 0x7C, 0x9D, 0x18,
- 0x84, 0x5A, 0x73, 0x3A, 0x33, 0x43, 0xA1, 0x47,
- 0xB1, 0xEE, 0xFB, 0x79, 0x5E, 0xAF, 0xB9, 0x48,
- 0x0F, 0x88, 0x65, 0x67, 0x6F, 0xDB, 0x25, 0xE4,
- 0xB0, 0x87, 0xD0, 0x46, 0xB5, 0xB7, 0x53, 0xD4,
- 0x1E, 0x76, 0xB4, 0x90, 0xDD, 0xA3, 0xF7, 0x57,
- 0xD2, 0xCC, 0x5D, 0xE3, 0xB3, 0xD8, 0x5F, 0x2B,
- 0x69, 0x4A, 0x9B, 0x39, 0x1A, 0x8D, 0x05, 0x8A,
- 0x44, 0x15, 0xAE, 0xF3, 0xA8, 0x92, 0x02, 0xAB,
- 0xB8, 0xDA, 0x0A, 0x0C, 0xED, 0xD7, 0x77, 0x98,
- 0x3D, 0x19, 0x95, 0x36, 0xE7, 0x7F, 0x66, 0xEF,
- 0x86, 0xDC, 0xCB, 0x9C, 0x63, 0xE6, 0x1D, 0x14,
- 0x9A, 0x22, 0xBD, 0xD6, 0x89, 0x2D, 0xD1, 0xF9,
- 0xA2, 0xDE, 0xF5, 0x5C, 0x8E, 0x2A, 0x29, 0xCA,
- 0x7A, 0x8C, 0x38, 0x9F, 0xBB, 0xDF, 0xEC, 0x30,
- 0x00, 0xFC, 0xAC, 0x81, 0xB2, 0xE8, 0xC0, 0xA7,
- 0x7B, 0x07, 0x52, 0x74, 0x70, 0x0E, 0x51, 0x6A,
- 0x62, 0x0D, 0x85, 0x1B, 0x4F, 0x96, 0x55, 0x1C,
- 0x32, 0x6E, 0x01, 0xF6, 0x08, 0xFD, 0x17, 0x35,
- 0xF0, 0x16, 0xC8, 0x23, 0xE9, 0x59, 0x3C, 0x37,
- 0x5B, 0x42, 0xD3, 0x49, 0x7D, 0x83, 0x78, 0xAD,
- 0x94, 0x9E, 0x56, 0xB6, 0xF1, 0xC3, 0x75, 0xF8,
- 0xFA, 0x09, 0x4C, 0xD9, 0x97, 0xF4, 0x7E, 0x6D,
- 0xBC, 0x4D, 0x64, 0xCD, 0x12, 0x99, 0x45, 0xCE,
- 0x61, 0x20, 0x0B, 0xA0, 0x82, 0xD5, 0xE1, 0x72,
- 0xA9, 0x1F, 0x06, 0x27, 0xC7, 0x04, 0xE2, 0xBA,
- 0xCF, 0x60, 0xAA, 0xA4, 0xEB, 0xC4, 0x4E, 0xC2 };
-
-static const unsigned char table_62[256] = {
- 0x01, 0x59, 0xEC, 0xFC, 0x51, 0xD2, 0xE4, 0x9D,
- 0xAA, 0x61, 0xD5, 0xCA, 0x63, 0x5D, 0xCE, 0x36,
- 0xB9, 0x49, 0x76, 0xA9, 0x14, 0x4C, 0x90, 0x28,
- 0x66, 0x17, 0x4F, 0x1E, 0x1A, 0x47, 0x30, 0xE8,
- 0xFD, 0x86, 0x2E, 0x7B, 0x7E, 0xCC, 0x34, 0x13,
- 0x94, 0x45, 0x38, 0x74, 0x29, 0xB0, 0x37, 0xC3,
- 0x26, 0x6C, 0x39, 0xA3, 0x89, 0xEB, 0xA2, 0x20,
- 0x00, 0xE0, 0x73, 0xE7, 0xB5, 0xCB, 0xED, 0x3E,
- 0x79, 0x09, 0xFA, 0x32, 0x54, 0xBA, 0x05, 0x96,
- 0xDE, 0x23, 0xD0, 0xA1, 0xAB, 0xFE, 0xF2, 0x22,
- 0xB2, 0x9B, 0x7D, 0x44, 0x12, 0x3D, 0x40, 0x82,
- 0xA0, 0xA8, 0x33, 0xDC, 0xF7, 0xFB, 0xAC, 0x41,
- 0x8A, 0x9C, 0x60, 0x11, 0xC8, 0xF0, 0xEA, 0x57,
- 0x3A, 0x42, 0xCD, 0x1D, 0x3C, 0xC6, 0x97, 0x62,
- 0x55, 0x9F, 0xF3, 0x93, 0x91, 0xDA, 0x6A, 0xE5,
- 0x27, 0x8E, 0x4E, 0xFF, 0xA4, 0x80, 0x04, 0xE1,
- 0x2B, 0x5E, 0xC0, 0x64, 0xC2, 0xD8, 0x46, 0x8C,
- 0xD4, 0x0F, 0xC4, 0x43, 0xD9, 0x9E, 0x4B, 0x5C,
- 0x0A, 0x8B, 0xBF, 0xD7, 0x7A, 0x81, 0x3B, 0x4A,
- 0x58, 0xB6, 0x21, 0x1F, 0xC1, 0xBD, 0xB1, 0x77,
- 0x72, 0x1C, 0x4D, 0xBC, 0xA5, 0x65, 0xC7, 0xF5,
- 0xB4, 0x2D, 0x69, 0x71, 0xE6, 0x8F, 0xBB, 0x03,
- 0xAF, 0xD6, 0x08, 0x75, 0xB7, 0x31, 0xF4, 0x2A,
- 0x48, 0x70, 0x0C, 0x8D, 0xD1, 0x87, 0x2F, 0x16,
- 0x5A, 0x5B, 0x98, 0xA6, 0xC5, 0x99, 0x50, 0x07,
- 0xDD, 0x92, 0x25, 0x68, 0x0D, 0xBE, 0x78, 0x0B,
- 0xAD, 0x84, 0x6B, 0x19, 0x52, 0x7C, 0xF6, 0xB3,
- 0x56, 0x83, 0x88, 0xEE, 0x2C, 0x1B, 0x6E, 0x53,
- 0x67, 0xE2, 0x6F, 0x15, 0x06, 0x10, 0x18, 0x85,
- 0xF1, 0x6D, 0xF9, 0xC9, 0xAE, 0x3F, 0xB8, 0x95,
- 0x35, 0xDF, 0xEF, 0xA7, 0x7F, 0x24, 0xF8, 0xE3,
- 0xCF, 0xE9, 0xDB, 0xD3, 0x02, 0x9A, 0x0E, 0x5F };
-
-static const unsigned char table_63[256] = {
- 0x0C, 0x02, 0xEE, 0x94, 0x2D, 0x76, 0x96, 0x75,
- 0x21, 0xDC, 0x37, 0x03, 0xC0, 0xF7, 0xDF, 0xEF,
- 0xB1, 0x1D, 0xCF, 0x15, 0x5A, 0xB4, 0xCC, 0x81,
- 0x89, 0x6B, 0xA5, 0x2E, 0x6D, 0xD4, 0x08, 0x44,
- 0x2A, 0x60, 0x50, 0xBF, 0x40, 0x7D, 0x5F, 0x64,
- 0x93, 0x70, 0xA4, 0x7F, 0xC9, 0xEB, 0x0A, 0xF8,
- 0x9F, 0xA8, 0xBC, 0x25, 0xE5, 0xF3, 0x1B, 0xD7,
- 0x29, 0x13, 0x0D, 0x69, 0x20, 0x5C, 0x0F, 0x91,
- 0x4F, 0x62, 0x06, 0x26, 0x41, 0xED, 0xDA, 0x53,
- 0x65, 0xFF, 0xCD, 0x3F, 0xF6, 0x01, 0xCE, 0xA2,
- 0x04, 0xDE, 0x27, 0x87, 0xBA, 0x86, 0x24, 0x78,
- 0xAF, 0xE1, 0x3D, 0xD0, 0xC8, 0x1F, 0x4A, 0x2C,
- 0x9A, 0xF0, 0xCB, 0xAD, 0x0B, 0x59, 0xC5, 0x58,
- 0xEA, 0x8A, 0xA1, 0x45, 0xB7, 0x5D, 0xB5, 0x77,
- 0x2B, 0x47, 0x05, 0x00, 0xAC, 0x61, 0xFA, 0x33,
- 0x74, 0x31, 0xCA, 0x22, 0x42, 0x8B, 0xFE, 0x09,
- 0xB2, 0x6E, 0x1A, 0xBE, 0xAA, 0x7B, 0xEC, 0xF4,
- 0x51, 0x66, 0x28, 0x12, 0xFC, 0x5E, 0x67, 0xF5,
- 0xB9, 0x82, 0x90, 0x8E, 0x8D, 0x17, 0xE7, 0xE8,
- 0xB0, 0xC3, 0x16, 0xA0, 0x4B, 0xB6, 0xFB, 0x7E,
- 0xC4, 0x85, 0x4C, 0x1E, 0xC7, 0x39, 0x4E, 0xA9,
- 0xE3, 0x4D, 0x32, 0x72, 0x35, 0x80, 0xE0, 0x34,
- 0xB8, 0x73, 0x98, 0x49, 0x92, 0x30, 0xD5, 0xD2,
- 0xA3, 0x54, 0x7A, 0x84, 0x8F, 0x6C, 0xFD, 0x43,
- 0x3A, 0x36, 0x3B, 0xD9, 0x48, 0x6A, 0x14, 0x79,
- 0xD1, 0x57, 0x88, 0xDB, 0xE4, 0x9B, 0xF9, 0x99,
- 0x10, 0x71, 0xC1, 0x68, 0x9E, 0x11, 0xAB, 0xBD,
- 0x7C, 0x3E, 0x3C, 0x18, 0x9D, 0x97, 0xF2, 0xE6,
- 0xA6, 0xF1, 0x46, 0xC2, 0x19, 0xBB, 0x52, 0xD8,
- 0x95, 0xD3, 0x23, 0xAE, 0x07, 0x2F, 0xE9, 0x63,
- 0x1C, 0x55, 0x6F, 0x9C, 0x56, 0x38, 0xC6, 0x5B,
- 0x8C, 0xE2, 0x83, 0xA7, 0xD6, 0x0E, 0xB3, 0xDD };
-
-static const unsigned char table_64[32] = {
- 0x03, 0x05, 0x0D, 0x09, 0x1A, 0x16, 0x08, 0x10,
- 0x06, 0x1E, 0x1C, 0x15, 0x02, 0x04, 0x17, 0x0C,
- 0x18, 0x0B, 0x19, 0x11, 0x1B, 0x14, 0x13, 0x0A,
- 0x0E, 0x00, 0x1D, 0x1F, 0x01, 0x0F, 0x07, 0x12 };
-
-static const unsigned char table_65[32] = {
- 0x01, 0x0A, 0x1E, 0x14, 0x10, 0x1D, 0x0D, 0x17,
- 0x0E, 0x0C, 0x0F, 0x12, 0x04, 0x1A, 0x05, 0x02,
- 0x08, 0x1C, 0x09, 0x1F, 0x0B, 0x13, 0x19, 0x1B,
- 0x11, 0x00, 0x16, 0x06, 0x03, 0x18, 0x15, 0x07 };
-
-static const unsigned char table_66[32] = {
- 0x1C, 0x18, 0x0C, 0x09, 0x05, 0x03, 0x15, 0x12,
- 0x0D, 0x02, 0x08, 0x0E, 0x19, 0x07, 0x13, 0x17,
- 0x1E, 0x1D, 0x1F, 0x11, 0x06, 0x0A, 0x0B, 0x14,
- 0x0F, 0x10, 0x01, 0x1B, 0x00, 0x04, 0x1A, 0x16 };
-
-static const unsigned char table_67[256] = {
- 0x6B, 0x49, 0xC8, 0x86, 0xFF, 0xC0, 0x5D, 0xEF,
- 0xF7, 0x06, 0xE0, 0x98, 0xA9, 0x72, 0x71, 0xD5,
- 0xBA, 0x7F, 0x10, 0xD1, 0xBE, 0x41, 0x9C, 0x40,
- 0x28, 0x8E, 0xE5, 0x74, 0x47, 0x9E, 0x3E, 0x7C,
- 0xB5, 0xCD, 0x3F, 0x20, 0xF2, 0xA6, 0xDC, 0x97,
- 0x32, 0x6D, 0x52, 0xF5, 0x16, 0x05, 0xFE, 0x04,
- 0x3D, 0x53, 0x50, 0x23, 0x39, 0x77, 0x08, 0x60,
- 0x75, 0x18, 0x4A, 0xC6, 0xBB, 0xE7, 0xF1, 0xAB,
- 0xEB, 0x88, 0xB6, 0x82, 0x6E, 0x91, 0xF3, 0x34,
- 0x3A, 0x42, 0x1A, 0xDF, 0xA1, 0xB3, 0x92, 0xBF,
- 0xB7, 0x00, 0xD4, 0xDE, 0x31, 0xF0, 0x1C, 0xDA,
- 0x4F, 0x61, 0x67, 0x2C, 0x07, 0xF9, 0x15, 0xA4,
- 0x7A, 0x26, 0x45, 0x2A, 0x12, 0x9F, 0xF4, 0x14,
- 0x8C, 0x90, 0xFC, 0xC5, 0x4B, 0x87, 0xE2, 0xC7,
- 0xD0, 0x8A, 0xE8, 0xDD, 0xEE, 0x3C, 0x2F, 0x22,
- 0x6A, 0x54, 0x37, 0x9B, 0x84, 0x25, 0x8F, 0xE3,
- 0xD7, 0xD8, 0x4E, 0xAD, 0x0F, 0x4C, 0x56, 0xA2,
- 0xD3, 0xB0, 0x73, 0x0B, 0xAE, 0xEA, 0x1D, 0x01,
- 0x36, 0xB4, 0x2D, 0xC4, 0x19, 0x58, 0x1E, 0x62,
- 0xE9, 0xB2, 0x5B, 0x5A, 0xBD, 0xD6, 0x65, 0x94,
- 0x9A, 0x55, 0xCC, 0x99, 0x1B, 0x85, 0x2B, 0xBC,
- 0x8D, 0x46, 0x81, 0xB8, 0xA3, 0x29, 0x5F, 0x35,
- 0x5C, 0xB1, 0x1F, 0x13, 0x17, 0xCB, 0x51, 0x02,
- 0x09, 0x7E, 0xA7, 0x69, 0x6F, 0x95, 0x30, 0x7B,
- 0xCA, 0x48, 0xAF, 0xAA, 0x0E, 0x44, 0x38, 0xB9,
- 0x0D, 0x11, 0xA0, 0xD9, 0x0C, 0xDB, 0xF8, 0x68,
- 0x33, 0x79, 0x59, 0x66, 0x4D, 0x03, 0xE1, 0x89,
- 0xE4, 0x3B, 0x78, 0xC2, 0x64, 0x6C, 0x27, 0xC9,
- 0xCF, 0xAC, 0xED, 0xFA, 0x5E, 0x2E, 0x76, 0x57,
- 0x93, 0xEC, 0x80, 0xA8, 0xE6, 0xCE, 0xC1, 0xA5,
- 0x9D, 0xD2, 0xC3, 0x0A, 0x7D, 0x70, 0xF6, 0x63,
- 0x24, 0x43, 0x21, 0x83, 0xFB, 0xFD, 0x8B, 0x96 };
-
-static const unsigned char table_68[256] = {
- 0x93, 0xFF, 0x83, 0x70, 0x12, 0x2D, 0x1C, 0xD6,
- 0xF9, 0xEE, 0xCF, 0x94, 0x7B, 0xB5, 0xA4, 0x84,
- 0x99, 0xF7, 0x67, 0x32, 0xFC, 0x8A, 0xE3, 0xE4,
- 0xCE, 0xC6, 0x77, 0x7E, 0xDA, 0x42, 0x85, 0xF0,
- 0x7D, 0x48, 0x28, 0x79, 0xDE, 0x5B, 0xE2, 0x0F,
- 0x75, 0xC5, 0x2C, 0x4F, 0xF3, 0xEC, 0x14, 0x10,
- 0x9C, 0x6E, 0x59, 0x4A, 0x20, 0x34, 0xA3, 0x89,
- 0xE0, 0x4E, 0x52, 0x88, 0x81, 0x5F, 0x6F, 0x71,
- 0x17, 0x3B, 0x21, 0xB4, 0xCB, 0x9B, 0x18, 0x13,
- 0xE8, 0xE1, 0x02, 0x2E, 0xED, 0x00, 0xA7, 0x1B,
- 0x06, 0xF4, 0x27, 0xDC, 0x35, 0x2F, 0x08, 0x9D,
- 0x7C, 0xC0, 0x36, 0xA6, 0x6B, 0xDF, 0x4C, 0xBC,
- 0xFE, 0xDB, 0xA5, 0xA8, 0x8D, 0x73, 0x7F, 0xC7,
- 0x8E, 0x60, 0x31, 0x61, 0x4B, 0x29, 0xD7, 0xE9,
- 0xBD, 0xAB, 0xCC, 0xFA, 0xD9, 0xEF, 0xC2, 0xD4,
- 0x19, 0x11, 0x15, 0xC9, 0xB1, 0xD5, 0x64, 0x97,
- 0xE7, 0x8F, 0x05, 0x44, 0xF8, 0xF1, 0x58, 0x47,
- 0x2A, 0x03, 0x1F, 0xAF, 0x0D, 0x04, 0x23, 0xB8,
- 0x24, 0x51, 0xB2, 0x54, 0x41, 0x53, 0x5C, 0xAE,
- 0xB7, 0xB3, 0xB6, 0x3D, 0x37, 0x39, 0x55, 0xBF,
- 0x0B, 0x7A, 0x57, 0x3C, 0x0E, 0x40, 0x6A, 0xF5,
- 0x72, 0xDD, 0xBB, 0x8B, 0xAA, 0x46, 0xA0, 0x30,
- 0x56, 0x78, 0x38, 0xBA, 0x9E, 0x92, 0x87, 0xFB,
- 0x66, 0x90, 0x1E, 0xB9, 0x96, 0x65, 0xA2, 0x50,
- 0x1D, 0xC3, 0x26, 0x22, 0xD0, 0x0A, 0x43, 0xF2,
- 0xB0, 0xEB, 0xAC, 0x62, 0x98, 0x3F, 0xD3, 0x69,
- 0xA1, 0x9F, 0x16, 0x95, 0xE6, 0xF6, 0x2B, 0x25,
- 0x1A, 0xD2, 0xBE, 0x09, 0x5D, 0x45, 0xC4, 0xFD,
- 0x5A, 0x07, 0x0C, 0x82, 0x3E, 0x49, 0x74, 0x6C,
- 0x68, 0x5E, 0xCA, 0xEA, 0xCD, 0x9A, 0xAD, 0xD1,
- 0x33, 0x86, 0x76, 0x80, 0xE5, 0xC8, 0xD8, 0xA9,
- 0x8C, 0x6D, 0x91, 0x63, 0x3A, 0x4D, 0xC1, 0x01 };
-
-static const unsigned char table_69[256] = {
- 0x21, 0x6B, 0x9B, 0xAE, 0x11, 0x5A, 0x91, 0xC2,
- 0x47, 0x8E, 0x87, 0x86, 0x4F, 0xFC, 0x8F, 0x66,
- 0x97, 0x2F, 0x61, 0x9C, 0x5B, 0x4C, 0xB3, 0x14,
- 0x77, 0x48, 0x62, 0xE1, 0x54, 0x64, 0xDD, 0xCD,
- 0x30, 0xB7, 0x2D, 0xD2, 0xC3, 0xC0, 0x0B, 0xD8,
- 0x53, 0x98, 0x16, 0x56, 0x7A, 0x35, 0x50, 0xD9,
- 0xE8, 0x2C, 0x32, 0x55, 0x17, 0x5D, 0x79, 0xEB,
- 0xC8, 0x75, 0x67, 0xE2, 0x4B, 0xBA, 0xFE, 0x57,
- 0x10, 0xF4, 0x70, 0x2A, 0xBB, 0xA6, 0x72, 0x36,
- 0xAF, 0x8D, 0xAB, 0x90, 0xE3, 0x2B, 0xB2, 0x26,
- 0x93, 0x01, 0xBD, 0x71, 0xF9, 0x05, 0xC7, 0x80,
- 0x29, 0xCC, 0x3B, 0x22, 0xF2, 0x12, 0x81, 0x34,
- 0xF6, 0x1A, 0x8B, 0xDF, 0x28, 0x46, 0x9E, 0x6A,
- 0x23, 0x85, 0x74, 0xE7, 0xE6, 0x52, 0xA0, 0x49,
- 0xF0, 0x19, 0x25, 0xAC, 0x78, 0x42, 0xD6, 0xA2,
- 0x37, 0x65, 0x4D, 0x94, 0x02, 0x6F, 0xB4, 0xC6,
- 0x99, 0xD3, 0x9A, 0x33, 0xB8, 0x00, 0xCA, 0xE4,
- 0x45, 0xAD, 0x1B, 0x6C, 0x03, 0xA8, 0x07, 0x8A,
- 0x60, 0x69, 0xFF, 0xF7, 0xA7, 0x27, 0x95, 0xF5,
- 0x82, 0xCB, 0xEC, 0xED, 0x4E, 0xFB, 0xA4, 0x59,
- 0xDA, 0xCF, 0x2E, 0x20, 0xFA, 0x31, 0xD1, 0xEA,
- 0x4A, 0xE9, 0x5E, 0xA9, 0xA1, 0x08, 0x1C, 0x96,
- 0x38, 0xB9, 0xEE, 0x7F, 0xAA, 0xF1, 0x7D, 0x3A,
- 0xA5, 0x43, 0xC5, 0xE0, 0x24, 0x39, 0x0D, 0xDE,
- 0xB0, 0xF8, 0xBE, 0x58, 0x7E, 0x51, 0xD4, 0x89,
- 0x15, 0x40, 0x3E, 0xB1, 0x1F, 0x5F, 0x68, 0x63,
- 0x84, 0x3D, 0x88, 0xBC, 0x41, 0xEF, 0xB5, 0xBF,
- 0x06, 0x6E, 0x9D, 0x3F, 0x0E, 0x76, 0x5C, 0xDC,
- 0x13, 0xF3, 0xE5, 0x8C, 0x7C, 0x04, 0x0A, 0xD5,
- 0x18, 0xC4, 0x44, 0x09, 0xC9, 0x1D, 0x9F, 0xFD,
- 0xD0, 0x0F, 0x6D, 0xD7, 0x92, 0x7B, 0x0C, 0xA3,
- 0x73, 0xDB, 0xB6, 0x83, 0xCE, 0x1E, 0xC1, 0x3C };
-
-static const unsigned char table_70[256] = {
- 0x54, 0x23, 0xF1, 0x09, 0x9D, 0xEB, 0x26, 0xD9,
- 0x6C, 0xC1, 0xBC, 0x3D, 0x6E, 0xB0, 0x5F, 0xE2,
- 0x59, 0x4D, 0x95, 0xFA, 0xD8, 0x29, 0xAA, 0x8E,
- 0xF5, 0xEF, 0x43, 0x76, 0xFD, 0x0D, 0x4F, 0xAD,
- 0xB7, 0xFC, 0xA8, 0x9F, 0x62, 0xC2, 0x7B, 0x10,
- 0x0B, 0xF2, 0x73, 0xA9, 0x46, 0x4C, 0x53, 0xD7,
- 0x0A, 0x50, 0x89, 0x63, 0x48, 0xD6, 0xA2, 0x44,
- 0xE6, 0x8D, 0x69, 0x2C, 0xF9, 0xC0, 0x35, 0x06,
- 0x66, 0x21, 0x9E, 0xD2, 0x98, 0xF7, 0x9B, 0xE7,
- 0x12, 0xB8, 0xA5, 0xBA, 0xE0, 0x79, 0x71, 0x7E,
- 0x8C, 0x24, 0xED, 0x7C, 0x60, 0x81, 0xC3, 0x5C,
- 0x2B, 0xE5, 0xEE, 0xB5, 0xA4, 0x05, 0x03, 0x34,
- 0x16, 0x2A, 0xA3, 0x2D, 0x3F, 0xDF, 0x07, 0x5B,
- 0xAE, 0x47, 0x61, 0x08, 0x18, 0xDB, 0x6D, 0x3C,
- 0x96, 0xD5, 0xAB, 0x78, 0x94, 0x45, 0x20, 0x9A,
- 0xE4, 0x13, 0x68, 0xDD, 0xDE, 0x31, 0x14, 0x57,
- 0x02, 0x52, 0x56, 0x1C, 0x1B, 0xE9, 0xD0, 0xA1,
- 0x22, 0x64, 0xB2, 0x7A, 0xCF, 0x5D, 0x00, 0x0F,
- 0xF8, 0x5E, 0x36, 0x58, 0x40, 0xAF, 0x19, 0x32,
- 0x2E, 0xB3, 0x72, 0xBE, 0xB9, 0xD3, 0xCD, 0x7D,
- 0x4A, 0x1D, 0x33, 0x2F, 0xAC, 0x27, 0x41, 0xE8,
- 0x55, 0xCB, 0x0E, 0x5A, 0x77, 0xFB, 0x8B, 0x86,
- 0x75, 0x8A, 0x51, 0xEC, 0xDA, 0xC6, 0xA6, 0xCC,
- 0x91, 0x4B, 0x11, 0xF6, 0xEA, 0xD1, 0xB6, 0x4E,
- 0x82, 0x04, 0x92, 0x30, 0xF4, 0x25, 0x88, 0x1E,
- 0x9C, 0xA0, 0xC8, 0x6A, 0x93, 0x87, 0x1F, 0xB4,
- 0xB1, 0x8F, 0x65, 0xCA, 0xFE, 0xFF, 0x97, 0x15,
- 0x99, 0x28, 0x80, 0x42, 0x70, 0x85, 0x0C, 0x3B,
- 0xBD, 0xE1, 0xA7, 0x17, 0xC9, 0x3A, 0xBB, 0x6B,
- 0x37, 0xF0, 0xC5, 0x39, 0x6F, 0x01, 0x83, 0x67,
- 0x74, 0xCE, 0xDC, 0x90, 0x3E, 0xF3, 0x7F, 0xC4,
- 0x49, 0x84, 0x38, 0xC7, 0xE3, 0xD4, 0x1A, 0xBF };
-
-static const unsigned char table_71[32] = {
- 0x17, 0x13, 0x0E, 0x1A, 0x0D, 0x18, 0x19, 0x10,
- 0x14, 0x11, 0x16, 0x05, 0x04, 0x00, 0x12, 0x0A,
- 0x02, 0x07, 0x03, 0x0B, 0x09, 0x1F, 0x1C, 0x0F,
- 0x0C, 0x06, 0x1B, 0x08, 0x1D, 0x01, 0x15, 0x1E };
-
-static const unsigned char table_72[256] = {
- 0xC9, 0xA7, 0x1B, 0xEC, 0x2B, 0x8B, 0xB0, 0xEB,
- 0x7F, 0x39, 0x25, 0xD9, 0x1D, 0xD5, 0x67, 0xA0,
- 0xB3, 0xAC, 0x3B, 0xC8, 0x82, 0xC0, 0xE3, 0x9E,
- 0x4C, 0x9B, 0xAF, 0xFD, 0x91, 0x86, 0x5F, 0x92,
- 0xB4, 0x42, 0x3C, 0x45, 0x12, 0xC4, 0xE2, 0xE1,
- 0x6C, 0x1F, 0xC6, 0x40, 0x93, 0x2A, 0xC2, 0x72,
- 0x2E, 0x14, 0x51, 0xA5, 0x70, 0xBD, 0xA2, 0xC7,
- 0x7D, 0xF1, 0x9F, 0x64, 0xC1, 0xF7, 0x80, 0xFF,
- 0x50, 0x49, 0x8C, 0x66, 0x13, 0x48, 0x6A, 0x0A,
- 0x26, 0x94, 0x83, 0x1E, 0x84, 0xBB, 0x57, 0x27,
- 0x44, 0x5B, 0x62, 0xF6, 0x09, 0x4F, 0x77, 0x76,
- 0x2D, 0x7E, 0xCD, 0x0B, 0x24, 0xFE, 0x81, 0xB8,
- 0x21, 0x85, 0xCF, 0xA8, 0x75, 0x56, 0x37, 0x17,
- 0xAA, 0x23, 0xE5, 0xE8, 0x9A, 0x9D, 0x2F, 0x04,
- 0x31, 0x4A, 0x7C, 0xFC, 0xD6, 0xE4, 0x29, 0xC3,
- 0xFB, 0x36, 0x1C, 0x0C, 0xCE, 0xEE, 0x0D, 0xF3,
- 0x46, 0xF8, 0x41, 0x0E, 0x68, 0xAB, 0x2C, 0x69,
- 0x96, 0x90, 0x28, 0xED, 0x02, 0x63, 0x07, 0xAD,
- 0xB2, 0xDC, 0x05, 0xE6, 0x78, 0x03, 0xA4, 0x7A,
- 0x5C, 0x52, 0x95, 0x5D, 0x88, 0x01, 0xDF, 0x35,
- 0x5E, 0xB6, 0x06, 0x4D, 0x15, 0x89, 0x59, 0x3F,
- 0xF0, 0xA1, 0xA3, 0x99, 0x19, 0xEA, 0xDB, 0xE0,
- 0x6B, 0x71, 0x6E, 0xB7, 0x65, 0x54, 0x9C, 0xBC,
- 0x98, 0xDD, 0x4B, 0x60, 0x3D, 0xBF, 0xF5, 0xD1,
- 0xD7, 0xF9, 0x55, 0x61, 0xA9, 0xB1, 0x6D, 0xDE,
- 0x79, 0xAE, 0x1A, 0x34, 0x3A, 0x4E, 0xCB, 0x38,
- 0xBA, 0x97, 0x00, 0x74, 0xEF, 0xD8, 0x18, 0x33,
- 0x7B, 0xFA, 0x22, 0x32, 0x20, 0xCA, 0x8A, 0xBE,
- 0xA6, 0x43, 0x11, 0x10, 0xD0, 0xD3, 0x87, 0x73,
- 0x6F, 0xF4, 0x8D, 0xCC, 0x30, 0x0F, 0x16, 0xDA,
- 0xB5, 0xC5, 0xD4, 0x47, 0x8E, 0xE7, 0x58, 0x8F,
- 0x08, 0x53, 0xF2, 0xB9, 0x5A, 0x3E, 0xE9, 0xD2 };
-
-static const unsigned char table_73[256] = {
- 0x36, 0x37, 0xED, 0xD8, 0xBF, 0xD7, 0x12, 0xB7,
- 0x40, 0x32, 0x19, 0x4A, 0x44, 0x2A, 0xCE, 0xA5,
- 0x29, 0x13, 0x43, 0x51, 0x5C, 0xD0, 0x76, 0x6E,
- 0x41, 0xD6, 0xE2, 0x4F, 0xB8, 0x27, 0x2E, 0xCF,
- 0xD9, 0xE0, 0x69, 0xC0, 0x59, 0x77, 0x62, 0x6F,
- 0x53, 0xE7, 0x93, 0xD4, 0xAD, 0xC8, 0x4C, 0xC2,
- 0x2C, 0xBE, 0xAA, 0xA0, 0x22, 0x78, 0x14, 0xB3,
- 0xB0, 0xEA, 0xBA, 0x9A, 0x33, 0x1B, 0x31, 0x6C,
- 0xFC, 0x0A, 0x0B, 0xA1, 0xE4, 0x75, 0x7C, 0xE3,
- 0x65, 0x21, 0xA9, 0xA4, 0x4E, 0x3C, 0x5F, 0x39,
- 0x74, 0xA2, 0x9E, 0x03, 0x70, 0xD2, 0xFD, 0x1D,
- 0x25, 0x72, 0x73, 0x8E, 0x7B, 0xB2, 0x6A, 0x92,
- 0x81, 0xF3, 0xF0, 0x46, 0x08, 0x85, 0xE6, 0x30,
- 0x05, 0x7E, 0xEC, 0x0D, 0xDD, 0x42, 0x2F, 0x5B,
- 0xB9, 0xCB, 0x84, 0x0C, 0x16, 0xC7, 0x24, 0xFA,
- 0xF9, 0x8F, 0x20, 0xAC, 0x10, 0x55, 0xC3, 0x1A,
- 0x8B, 0x94, 0x3D, 0xDB, 0xC9, 0x04, 0xB5, 0xCC,
- 0xC6, 0x98, 0xB6, 0x8D, 0x0F, 0x3A, 0x06, 0x4B,
- 0xEF, 0x35, 0x68, 0x3F, 0xEE, 0xE5, 0x63, 0xC5,
- 0x60, 0x88, 0x52, 0x2D, 0x6D, 0xAB, 0xCD, 0xC4,
- 0x1F, 0xF4, 0xCA, 0x67, 0x7D, 0x1C, 0xDA, 0x34,
- 0xDE, 0x86, 0xAE, 0xF1, 0x61, 0x09, 0xF5, 0xF6,
- 0x49, 0xE9, 0xF2, 0x48, 0x1E, 0xD3, 0x56, 0x18,
- 0x9B, 0xB1, 0x57, 0x9D, 0xBB, 0x5E, 0xAF, 0x87,
- 0x9F, 0x8A, 0xC1, 0x79, 0xA7, 0xA8, 0xFB, 0xDC,
- 0x47, 0x3E, 0x97, 0x80, 0x91, 0xA6, 0x7A, 0xA3,
- 0x9C, 0x11, 0x02, 0x2B, 0x58, 0xD1, 0xF7, 0x00,
- 0x83, 0x01, 0xE8, 0xFE, 0x50, 0x23, 0x66, 0x4D,
- 0xD5, 0x82, 0x89, 0x3B, 0xEB, 0xE1, 0xF8, 0x5A,
- 0x15, 0x7F, 0x8C, 0x17, 0x96, 0x28, 0x5D, 0x64,
- 0x26, 0x38, 0x71, 0x0E, 0x45, 0xDF, 0xB4, 0x99,
- 0xFF, 0x90, 0x6B, 0xBC, 0x54, 0x95, 0xBD, 0x07 };
-
-static const unsigned char table_74[256] = {
- 0xA7, 0xCF, 0x99, 0x1A, 0x13, 0xC7, 0xE9, 0xC4,
- 0xB6, 0x0E, 0x15, 0x09, 0xFF, 0xDF, 0xBE, 0x03,
- 0xAD, 0xF1, 0xB0, 0x3C, 0x4A, 0x9B, 0xF5, 0x12,
- 0xA1, 0x2C, 0xDB, 0x51, 0x5E, 0x6F, 0xE6, 0x49,
- 0x27, 0xBB, 0xAE, 0x56, 0xC0, 0x0C, 0x77, 0x60,
- 0x5B, 0x69, 0xA2, 0xF0, 0x24, 0x8E, 0xE1, 0xA4,
- 0xBC, 0x9F, 0x50, 0xD4, 0x61, 0x19, 0x67, 0x00,
- 0x7B, 0xAB, 0xDD, 0x26, 0xCD, 0x6C, 0xE8, 0xA8,
- 0x7A, 0x93, 0xEF, 0x20, 0x52, 0x1F, 0x1B, 0x46,
- 0x25, 0x3B, 0x1E, 0x65, 0xC2, 0xF9, 0x10, 0xB2,
- 0xB3, 0xD9, 0x21, 0xD2, 0x11, 0x94, 0xE2, 0xFC,
- 0x38, 0x9E, 0x36, 0x87, 0xAA, 0x53, 0x45, 0x68,
- 0x2B, 0xE7, 0x07, 0xFA, 0xD3, 0x8D, 0x3F, 0x17,
- 0xC1, 0x06, 0x72, 0x62, 0x8C, 0x55, 0x73, 0x8A,
- 0xC9, 0x2E, 0x5A, 0x7D, 0x02, 0x6D, 0xF8, 0x4B,
- 0xE4, 0xBF, 0xEC, 0xB7, 0x31, 0xDC, 0xF4, 0xB8,
- 0x47, 0x64, 0x0A, 0x33, 0x48, 0xAC, 0xFB, 0x05,
- 0x3E, 0x34, 0x1C, 0x97, 0x1D, 0x63, 0x37, 0x2D,
- 0xB1, 0x92, 0xED, 0x9D, 0x4C, 0xD5, 0x4E, 0x9A,
- 0x0D, 0x79, 0x0F, 0xBD, 0x95, 0xBA, 0x08, 0x2A,
- 0xC6, 0x7E, 0x88, 0xCB, 0xA6, 0x29, 0x70, 0x35,
- 0x66, 0xCA, 0x89, 0x75, 0x6A, 0x4F, 0xB5, 0x6B,
- 0x74, 0xDE, 0x01, 0x04, 0x81, 0x91, 0x90, 0x18,
- 0x32, 0x0B, 0x7F, 0x44, 0xB4, 0xAF, 0xF2, 0xEB,
- 0x22, 0xFD, 0x14, 0xA0, 0xFE, 0x8B, 0xB9, 0x16,
- 0x86, 0xE3, 0xD7, 0xDA, 0xC5, 0x3A, 0x41, 0x83,
- 0xD1, 0x28, 0x54, 0x30, 0xE0, 0x40, 0xA5, 0x57,
- 0x8F, 0x84, 0xD6, 0x96, 0x39, 0xE5, 0x42, 0x80,
- 0xA9, 0x58, 0xCE, 0x5D, 0xEE, 0x5F, 0xA3, 0xD0,
- 0xC8, 0x59, 0x43, 0x4D, 0x5C, 0xF7, 0xCC, 0x76,
- 0x6E, 0xF3, 0x23, 0x3D, 0x85, 0x82, 0x78, 0xF6,
- 0x2F, 0xD8, 0xC3, 0x7C, 0x9C, 0x98, 0xEA, 0x71 };
-
-static const unsigned char table_75[256] = {
- 0xE7, 0xA5, 0x30, 0xE1, 0x9D, 0x81, 0xBE, 0x83,
- 0xB2, 0x1E, 0xE4, 0x69, 0x2F, 0x2B, 0x0D, 0xEB,
- 0x7C, 0x59, 0x2D, 0xAA, 0x01, 0x0C, 0xDB, 0xED,
- 0xC4, 0xEE, 0x5D, 0x38, 0x72, 0xD8, 0x70, 0xCE,
- 0x0B, 0xF6, 0x7F, 0x48, 0x26, 0x9E, 0xA3, 0x44,
- 0xD6, 0xCF, 0x0F, 0x6B, 0xFD, 0x23, 0x98, 0xAB,
- 0x11, 0xD4, 0x92, 0x91, 0x5E, 0x08, 0x4D, 0xC6,
- 0xF0, 0xA8, 0x7E, 0x8A, 0x1D, 0xA1, 0x97, 0x76,
- 0x3E, 0x64, 0x07, 0x24, 0xDE, 0x75, 0xA4, 0xCC,
- 0x1A, 0x04, 0x4B, 0x6C, 0xFA, 0xB0, 0xC7, 0x35,
- 0xE2, 0x56, 0x61, 0xA0, 0xE9, 0x27, 0xDF, 0xC3,
- 0xE5, 0xF4, 0x8D, 0xB4, 0xD3, 0x52, 0xD7, 0x49,
- 0xCD, 0x31, 0x6E, 0x3F, 0x4E, 0x6A, 0x5B, 0x65,
- 0xCA, 0x14, 0x71, 0x53, 0xD9, 0x47, 0x28, 0x7D,
- 0x17, 0x06, 0x5C, 0xFE, 0xBA, 0xB8, 0xAC, 0x15,
- 0xE8, 0xE0, 0x9A, 0xDD, 0x1F, 0xBC, 0x95, 0x42,
- 0xCB, 0x58, 0x00, 0x85, 0xD5, 0x62, 0xC9, 0xB6,
- 0x05, 0x80, 0x4C, 0x3C, 0x1C, 0xF5, 0x03, 0xF8,
- 0x96, 0x77, 0x02, 0x19, 0xF2, 0xFB, 0x5F, 0xC2,
- 0xAE, 0x60, 0x1B, 0xAD, 0x8F, 0xC1, 0x33, 0xA6,
- 0x20, 0xBF, 0xA7, 0xC8, 0x74, 0x18, 0x90, 0xE3,
- 0x68, 0x09, 0x7A, 0x79, 0xB5, 0xDA, 0xF3, 0x0E,
- 0x66, 0x84, 0xB3, 0xBB, 0xE6, 0xF7, 0xB7, 0x7B,
- 0x39, 0x4A, 0x12, 0x4F, 0xC5, 0x41, 0x54, 0xD0,
- 0xFF, 0x87, 0x63, 0x40, 0x99, 0x21, 0x29, 0xD2,
- 0x3D, 0x37, 0x3A, 0x93, 0xFC, 0x25, 0xF1, 0xD1,
- 0x2C, 0x6D, 0x8C, 0x5A, 0x8E, 0x9B, 0xBD, 0xAF,
- 0x10, 0x55, 0xF9, 0x9F, 0x43, 0x0A, 0x50, 0x16,
- 0x57, 0xB1, 0xC0, 0x73, 0x82, 0xEF, 0x88, 0x6F,
- 0xEA, 0x2A, 0xEC, 0x2E, 0x86, 0x45, 0x51, 0x22,
- 0xA9, 0x34, 0x94, 0x3B, 0xB9, 0x9C, 0xA2, 0x13,
- 0x89, 0x46, 0x78, 0xDC, 0x32, 0x8B, 0x67, 0x36 };
-
-static const unsigned char table_76[256] = {
- 0x3D, 0x66, 0x40, 0xC5, 0x1D, 0xF5, 0xE7, 0xB7,
- 0x2C, 0x23, 0x09, 0xC2, 0x68, 0xE6, 0xD3, 0x8D,
- 0x35, 0x94, 0x93, 0xF0, 0x43, 0x97, 0x2B, 0x4B,
- 0x1A, 0xEB, 0x00, 0x4C, 0x6F, 0xE4, 0x92, 0xEA,
- 0xB8, 0xA3, 0xA6, 0xEC, 0x11, 0x5E, 0x61, 0x81,
- 0xE1, 0x48, 0xC9, 0xCB, 0xDB, 0x2E, 0x3B, 0xED,
- 0x36, 0x52, 0x3A, 0xD2, 0x4F, 0x4E, 0x22, 0x96,
- 0x57, 0x2D, 0x62, 0x53, 0xCF, 0xD9, 0x5B, 0x9F,
- 0x8E, 0x78, 0xC6, 0x07, 0x7D, 0xA1, 0x02, 0xB4,
- 0xF4, 0xB6, 0x34, 0x98, 0xDA, 0xA9, 0xD4, 0x54,
- 0x99, 0x82, 0x0A, 0xD8, 0x88, 0x5D, 0x3C, 0xD0,
- 0xAB, 0x31, 0xFB, 0x03, 0x17, 0x46, 0xE8, 0xE2,
- 0xA4, 0xFF, 0xB0, 0xAA, 0xAD, 0x7C, 0x55, 0x49,
- 0x75, 0x6B, 0x10, 0x24, 0xC0, 0x04, 0xB1, 0xBF,
- 0x6A, 0xF6, 0x15, 0xEF, 0x5C, 0x60, 0x27, 0x3E,
- 0x38, 0x63, 0xC1, 0x76, 0xFD, 0x84, 0xE0, 0xCD,
- 0xFE, 0x30, 0xCE, 0xBB, 0xDC, 0x1E, 0x1B, 0xBC,
- 0xB5, 0xE9, 0x9E, 0x8F, 0x0D, 0x3F, 0x91, 0x19,
- 0x28, 0x37, 0x26, 0x42, 0x08, 0x9A, 0x0C, 0x83,
- 0x90, 0x6D, 0x74, 0x65, 0xF2, 0x4A, 0xDE, 0x8B,
- 0x67, 0x0E, 0x8C, 0x5F, 0xF9, 0x7F, 0x5A, 0x86,
- 0x69, 0x45, 0x44, 0xD5, 0xF7, 0xE5, 0x8A, 0xA8,
- 0xC8, 0x7E, 0x05, 0x64, 0xEE, 0x79, 0xBE, 0x7A,
- 0x14, 0xD6, 0x50, 0x18, 0x25, 0xBD, 0x85, 0xE3,
- 0xA2, 0x70, 0xCC, 0x59, 0x71, 0x77, 0xFA, 0x47,
- 0x9B, 0x1F, 0x9D, 0xBA, 0x29, 0x4D, 0xF8, 0xDF,
- 0xC4, 0x72, 0x2F, 0xAE, 0x06, 0x51, 0x41, 0xAF,
- 0xF3, 0xDD, 0x87, 0xB2, 0x9C, 0xC7, 0x12, 0x16,
- 0x20, 0xA7, 0x21, 0x73, 0xF1, 0x58, 0xD7, 0x7B,
- 0xB9, 0xB3, 0x32, 0x01, 0x80, 0x1C, 0x39, 0x0B,
- 0x13, 0x56, 0x6C, 0x89, 0x33, 0x6E, 0x2A, 0xA5,
- 0xD1, 0x95, 0xC3, 0xA0, 0x0F, 0xCA, 0xAC, 0xFC };
-
-static const unsigned char table_77[32] = {
- 0x1C, 0x0D, 0x1E, 0x01, 0x06, 0x16, 0x18, 0x17,
- 0x0B, 0x1F, 0x04, 0x0F, 0x00, 0x19, 0x08, 0x0A,
- 0x11, 0x03, 0x05, 0x07, 0x09, 0x0C, 0x15, 0x14,
- 0x1A, 0x12, 0x13, 0x0E, 0x1D, 0x10, 0x02, 0x1B };
-
-static const unsigned char table_78[32] = {
- 0x0E, 0x02, 0x17, 0x12, 0x1E, 0x09, 0x15, 0x03,
- 0x01, 0x0B, 0x0F, 0x11, 0x10, 0x0A, 0x16, 0x06,
- 0x07, 0x00, 0x1C, 0x1D, 0x1F, 0x0C, 0x18, 0x04,
- 0x13, 0x0D, 0x1B, 0x08, 0x19, 0x14, 0x05, 0x1A };
-
-static const unsigned char table_79[32] = {
- 0x12, 0x0B, 0x11, 0x01, 0x07, 0x0E, 0x1A, 0x0D,
- 0x1E, 0x18, 0x14, 0x1F, 0x0A, 0x17, 0x19, 0x1B,
- 0x00, 0x10, 0x0C, 0x08, 0x13, 0x02, 0x0F, 0x1D,
- 0x09, 0x06, 0x04, 0x16, 0x15, 0x1C, 0x05, 0x03 };
-
-static const unsigned char table_80[256] = {
- 0x14, 0xE7, 0x31, 0x0F, 0xD1, 0x5F, 0xED, 0x1E,
- 0xA6, 0x77, 0x20, 0x57, 0x34, 0x64, 0x33, 0x0B,
- 0x5A, 0xB4, 0x83, 0x62, 0xFD, 0x8E, 0xE4, 0xF3,
- 0xBD, 0xA5, 0xC8, 0x6D, 0x3E, 0x4F, 0x01, 0x7A,
- 0xD3, 0x45, 0x3C, 0xF2, 0x68, 0xFF, 0xE6, 0x84,
- 0xC2, 0xC1, 0x53, 0x72, 0x8C, 0xA1, 0xC7, 0x00,
- 0x89, 0x97, 0x69, 0xA4, 0xF8, 0xAA, 0xAD, 0x8F,
- 0x24, 0xC6, 0x9A, 0xAC, 0xE5, 0xAB, 0x6B, 0x79,
- 0x99, 0x60, 0x28, 0x2B, 0x3B, 0xAF, 0x1C, 0x80,
- 0xA3, 0x8A, 0x1A, 0xB5, 0xE1, 0x9F, 0xDA, 0x78,
- 0xD7, 0xC4, 0x87, 0x5D, 0xE9, 0x27, 0xFB, 0x18,
- 0x94, 0x3A, 0xCE, 0x3F, 0xF6, 0x12, 0x75, 0x37,
- 0x6E, 0x9E, 0x29, 0x6C, 0xF7, 0x7D, 0x92, 0x08,
- 0x42, 0xB2, 0xBF, 0x0C, 0xB6, 0x25, 0xE0, 0x49,
- 0x43, 0x91, 0x98, 0xBB, 0xDC, 0x63, 0xEA, 0xA8,
- 0x74, 0x38, 0x35, 0xCD, 0x07, 0x70, 0x81, 0x41,
- 0xC9, 0x51, 0xBC, 0xA9, 0x59, 0xD4, 0xB8, 0x2C,
- 0x7C, 0x2D, 0xB3, 0x6F, 0x11, 0x86, 0x9D, 0x46,
- 0xF0, 0x65, 0x76, 0x04, 0x0E, 0xCA, 0xBE, 0x5C,
- 0xF9, 0x71, 0x9C, 0x21, 0x4C, 0x02, 0xFE, 0x8D,
- 0xD5, 0x26, 0x40, 0xC3, 0x32, 0x9B, 0xB0, 0x5E,
- 0x48, 0xC5, 0x85, 0x4B, 0x0A, 0xCC, 0x58, 0x52,
- 0x61, 0x13, 0xEF, 0x4A, 0xEE, 0x03, 0xD9, 0xDE,
- 0xA7, 0x19, 0x09, 0x7F, 0x5B, 0x96, 0xBA, 0x0D,
- 0xCF, 0xD2, 0x06, 0x1F, 0xD8, 0xDB, 0xEC, 0xA0,
- 0xDD, 0x66, 0x10, 0xA2, 0xDF, 0x30, 0xF4, 0x88,
- 0xCB, 0x36, 0x82, 0xE3, 0x73, 0x17, 0x55, 0x15,
- 0xF5, 0xB7, 0x23, 0xB1, 0xD6, 0xE2, 0x47, 0x7E,
- 0x67, 0xE8, 0x1D, 0x16, 0x8B, 0xEB, 0xD0, 0x3D,
- 0x6A, 0x54, 0x2A, 0x4E, 0x93, 0xFA, 0x44, 0x05,
- 0x2F, 0x50, 0x2E, 0x95, 0xAE, 0x1B, 0x56, 0x7B,
- 0x39, 0xB9, 0xC0, 0x22, 0xF1, 0x4D, 0x90, 0xFC };
-
-static const unsigned char table_81[32] = {
- 0x03, 0x02, 0x1D, 0x0E, 0x09, 0x1A, 0x0C, 0x11,
- 0x1C, 0x0D, 0x08, 0x12, 0x19, 0x10, 0x04, 0x17,
- 0x15, 0x05, 0x0A, 0x00, 0x13, 0x16, 0x1B, 0x18,
- 0x1E, 0x0B, 0x0F, 0x01, 0x07, 0x14, 0x1F, 0x06 };
-
-static const unsigned char table_82[256] = {
- 0x53, 0xD3, 0x64, 0x89, 0x7D, 0xA5, 0x66, 0xA4,
- 0x09, 0x46, 0x17, 0x2C, 0xAF, 0x8C, 0x21, 0x5F,
- 0x3B, 0x22, 0xE3, 0x05, 0x07, 0x28, 0x2F, 0xAB,
- 0xF4, 0x8E, 0x51, 0x31, 0x02, 0xC7, 0x48, 0x13,
- 0x24, 0x12, 0xB8, 0xE5, 0xBD, 0xAE, 0x7E, 0xCC,
- 0xC9, 0x98, 0x08, 0xEE, 0xDB, 0x1B, 0xE8, 0x3D,
- 0x8F, 0xF2, 0xFB, 0x36, 0x4D, 0x94, 0x9C, 0x16,
- 0xF7, 0x42, 0x9B, 0x2B, 0xFD, 0x7B, 0x77, 0x3F,
- 0xC3, 0xFC, 0x23, 0x93, 0x50, 0x0C, 0x79, 0x18,
- 0x47, 0xE1, 0xCB, 0xA7, 0xB6, 0x85, 0xE6, 0x61,
- 0x2D, 0xD8, 0x9F, 0x80, 0xE9, 0x14, 0x0B, 0x1C,
- 0x40, 0x76, 0x2A, 0x25, 0x0E, 0x99, 0xAC, 0xC4,
- 0xEB, 0x29, 0x41, 0x8A, 0x73, 0x06, 0x57, 0xC6,
- 0x8D, 0xFA, 0x5A, 0xCD, 0x67, 0xB2, 0xD9, 0x0A,
- 0x1E, 0xEF, 0x3E, 0xA0, 0x45, 0x03, 0x27, 0xF1,
- 0x38, 0x54, 0xC1, 0x7A, 0xFE, 0x52, 0x75, 0xD4,
- 0x74, 0x7C, 0xD2, 0x68, 0xEA, 0x4C, 0x97, 0xF9,
- 0xF5, 0x8B, 0x0F, 0x84, 0xA8, 0x6E, 0x9E, 0x11,
- 0x6B, 0xBC, 0x4B, 0x6C, 0x9A, 0xF0, 0xA3, 0x1F,
- 0x92, 0x19, 0xA2, 0x3A, 0x15, 0x04, 0xC5, 0x62,
- 0xD5, 0x96, 0x90, 0x32, 0xAA, 0xD6, 0xCF, 0x35,
- 0xB4, 0x81, 0x2E, 0x01, 0x10, 0x49, 0x70, 0xDE,
- 0xDD, 0x88, 0xB9, 0x6D, 0x60, 0xBB, 0x44, 0xF8,
- 0x3C, 0xEC, 0x34, 0x82, 0x95, 0x72, 0x58, 0x4E,
- 0xE4, 0x0D, 0xBE, 0xDA, 0x83, 0x4A, 0x00, 0xBF,
- 0xD0, 0xC8, 0x26, 0xB3, 0x65, 0x1A, 0x69, 0xCA,
- 0xF3, 0xD7, 0x6F, 0x55, 0xE2, 0xFF, 0x5D, 0xDC,
- 0x20, 0xF6, 0x63, 0xED, 0xE0, 0x59, 0x9D, 0xB1,
- 0x1D, 0xAD, 0x91, 0xA1, 0xB7, 0xA9, 0xDF, 0xC0,
- 0x39, 0xD1, 0x43, 0xCE, 0x4F, 0x5C, 0xE7, 0x37,
- 0x5E, 0x33, 0x5B, 0xA6, 0xC2, 0xB0, 0xBA, 0x30,
- 0x6A, 0x78, 0xB5, 0x71, 0x56, 0x87, 0x7F, 0x86 };
-
-static const unsigned char table_83[32] = {
- 0x1B, 0x0A, 0x1F, 0x01, 0x10, 0x08, 0x0E, 0x18,
- 0x06, 0x04, 0x00, 0x1C, 0x0C, 0x19, 0x0D, 0x16,
- 0x02, 0x03, 0x09, 0x07, 0x13, 0x0F, 0x05, 0x12,
- 0x17, 0x1E, 0x1A, 0x1D, 0x0B, 0x11, 0x14, 0x15 };
-
-static const unsigned char table_84[32] = {
- 0x02, 0x1A, 0x0D, 0x15, 0x01, 0x16, 0x1E, 0x00,
- 0x08, 0x1B, 0x04, 0x10, 0x1C, 0x18, 0x19, 0x14,
- 0x0C, 0x11, 0x0B, 0x0E, 0x03, 0x0A, 0x07, 0x12,
- 0x1D, 0x17, 0x13, 0x06, 0x0F, 0x05, 0x09, 0x1F };
-
-static const unsigned char table_85[256] = {
- 0xC6, 0x7C, 0xCE, 0xBD, 0x84, 0x3E, 0x0B, 0xD8,
- 0xFE, 0xCC, 0x46, 0x50, 0xD1, 0xFB, 0xA0, 0x6D,
- 0xEA, 0xE2, 0x40, 0x51, 0x13, 0xB0, 0xD6, 0xB1,
- 0xA8, 0xDF, 0x61, 0xA4, 0x80, 0x21, 0xB3, 0x33,
- 0x06, 0x6B, 0xE3, 0x8C, 0xA1, 0x18, 0xBA, 0x03,
- 0xD7, 0x8D, 0x54, 0x12, 0x4C, 0xEE, 0x9E, 0xCF,
- 0x04, 0x2A, 0x08, 0xBB, 0xC2, 0xD4, 0xC3, 0x4A,
- 0xD5, 0xFA, 0x36, 0x2F, 0x14, 0x3F, 0xED, 0x05,
- 0x17, 0x28, 0x75, 0xFC, 0xA2, 0x1F, 0x4B, 0x6F,
- 0x91, 0x7E, 0x4E, 0x96, 0x3B, 0xF3, 0x1D, 0x78,
- 0xEB, 0x68, 0xF1, 0xA7, 0x9F, 0xC7, 0x59, 0x6C,
- 0x92, 0xE6, 0x66, 0x07, 0x8A, 0x25, 0x26, 0x72,
- 0x30, 0x5A, 0x81, 0x2C, 0x58, 0x32, 0xCB, 0xE0,
- 0xF9, 0x48, 0x83, 0x9B, 0xA5, 0xE1, 0xA6, 0x64,
- 0xFF, 0xC9, 0x8F, 0x53, 0x3D, 0x24, 0xC8, 0xDE,
- 0x02, 0x7D, 0x09, 0xB4, 0x0A, 0x95, 0x0F, 0xE4,
- 0xDB, 0xB7, 0x71, 0x4D, 0x1C, 0xAC, 0x35, 0xCD,
- 0x29, 0xDD, 0xC1, 0xF2, 0xF4, 0xC0, 0x5C, 0x74,
- 0xDC, 0x87, 0xFD, 0x4F, 0x11, 0x0E, 0x5D, 0x3C,
- 0x01, 0x73, 0xE9, 0xD9, 0x10, 0x9A, 0x5B, 0xC5,
- 0x98, 0x34, 0x15, 0xAE, 0xF7, 0xAA, 0x67, 0x23,
- 0xBC, 0x8B, 0x7B, 0x65, 0xA9, 0xB6, 0x77, 0x00,
- 0x19, 0x0C, 0x5E, 0x99, 0xF0, 0x55, 0x86, 0x97,
- 0x69, 0xDA, 0x38, 0x9C, 0x16, 0xE8, 0x27, 0xAF,
- 0x2E, 0x47, 0x6A, 0xD0, 0x79, 0x44, 0x45, 0x2B,
- 0x5F, 0x85, 0xF5, 0x62, 0x70, 0x22, 0x7F, 0xF6,
- 0x88, 0x93, 0x60, 0x42, 0x3A, 0x39, 0x49, 0x6E,
- 0x89, 0x52, 0x20, 0xF8, 0xCA, 0xD2, 0x76, 0xB9,
- 0xAB, 0x7A, 0x9D, 0xD3, 0xBE, 0x1A, 0xAD, 0x41,
- 0x56, 0x31, 0x90, 0xB5, 0xB2, 0xEC, 0xA3, 0xE5,
- 0x8E, 0x1B, 0xEF, 0xBF, 0x94, 0xC4, 0x0D, 0xB8,
- 0x2D, 0x57, 0xE7, 0x82, 0x1E, 0x37, 0x63, 0x43 };
-
-static const unsigned char table_86[32] = {
- 0x11, 0x07, 0x0F, 0x0A, 0x19, 0x1D, 0x0B, 0x09,
- 0x1C, 0x1E, 0x14, 0x06, 0x0C, 0x16, 0x13, 0x04,
- 0x15, 0x18, 0x00, 0x0D, 0x12, 0x05, 0x08, 0x02,
- 0x10, 0x1A, 0x1F, 0x01, 0x17, 0x0E, 0x03, 0x1B };
-
-static const unsigned char table_87[32] = {
- 0x17, 0x0E, 0x1D, 0x13, 0x0B, 0x19, 0x03, 0x06,
- 0x09, 0x01, 0x0D, 0x15, 0x1C, 0x16, 0x18, 0x1B,
- 0x11, 0x10, 0x00, 0x1E, 0x1F, 0x08, 0x12, 0x0F,
- 0x02, 0x04, 0x07, 0x1A, 0x14, 0x0A, 0x0C, 0x05 };
-
-static const unsigned char table_88[32] = {
- 0x09, 0x08, 0x17, 0x10, 0x0A, 0x07, 0x1C, 0x1F,
- 0x04, 0x0E, 0x01, 0x0C, 0x0D, 0x1B, 0x03, 0x15,
- 0x02, 0x1E, 0x18, 0x19, 0x0F, 0x06, 0x1A, 0x0B,
- 0x05, 0x11, 0x14, 0x00, 0x16, 0x1D, 0x12, 0x13 };
-
-static const unsigned char table_89[32] = {
- 0x15, 0x1C, 0x1D, 0x14, 0x0F, 0x1A, 0x05, 0x02,
- 0x07, 0x09, 0x06, 0x08, 0x1F, 0x00, 0x10, 0x13,
- 0x0D, 0x03, 0x0C, 0x18, 0x0E, 0x16, 0x1B, 0x1E,
- 0x12, 0x04, 0x11, 0x0A, 0x01, 0x0B, 0x17, 0x19 };
-
-static const unsigned char table_90[256] = {
- 0x62, 0x36, 0x64, 0x0E, 0x4C, 0x6C, 0xBE, 0xCF,
- 0x25, 0x5A, 0x3D, 0x12, 0x54, 0x9F, 0xE7, 0xA5,
- 0xDE, 0xD7, 0xB2, 0x60, 0x18, 0x8D, 0x89, 0x70,
- 0x48, 0x66, 0x1C, 0xA6, 0x17, 0x9B, 0xDF, 0x9A,
- 0x82, 0xB9, 0x2E, 0xFA, 0x83, 0x5B, 0x7A, 0x61,
- 0xFC, 0x6B, 0x8B, 0x4E, 0x0F, 0xAD, 0x78, 0xE1,
- 0xE8, 0x15, 0x1A, 0xF7, 0xA3, 0x3A, 0x04, 0xE3,
- 0x30, 0x8C, 0x06, 0xC4, 0x05, 0x32, 0x1F, 0x6A,
- 0xB8, 0x37, 0x58, 0xF5, 0x74, 0x63, 0xD4, 0xAC,
- 0xA4, 0xF3, 0xEC, 0xBB, 0x8E, 0x65, 0xA0, 0xEE,
- 0x6D, 0x11, 0xDD, 0xEA, 0x68, 0x2B, 0xDA, 0x0B,
- 0xEF, 0xC3, 0x8F, 0x03, 0x77, 0x1B, 0xFB, 0x1E,
- 0x5C, 0xD9, 0xCB, 0x33, 0x55, 0xF1, 0xA1, 0xF9,
- 0x7C, 0x38, 0x95, 0x00, 0x6E, 0x85, 0xC2, 0x7F,
- 0xBF, 0x84, 0x2A, 0x13, 0x72, 0x81, 0xE9, 0x59,
- 0x41, 0x69, 0x3B, 0x0C, 0x90, 0xB4, 0x51, 0x2F,
- 0xA2, 0xFE, 0xF8, 0x49, 0x57, 0xE5, 0x96, 0xFF,
- 0xCD, 0xD5, 0xCE, 0xAA, 0x40, 0xB0, 0x4D, 0xBA,
- 0xDB, 0xC7, 0x46, 0x86, 0xD1, 0xCA, 0xC0, 0x67,
- 0x9C, 0x21, 0xAE, 0xB3, 0x7B, 0x87, 0xE2, 0x71,
- 0xE6, 0x39, 0xA8, 0x22, 0x07, 0x2C, 0x44, 0x52,
- 0xA7, 0xF0, 0x4A, 0x92, 0x56, 0x28, 0x43, 0x8A,
- 0x5E, 0x53, 0x93, 0x47, 0x97, 0x88, 0x76, 0x79,
- 0x91, 0x26, 0xC1, 0x3F, 0xB7, 0xF6, 0x3E, 0x80,
- 0xA9, 0xC6, 0x01, 0xD2, 0xEB, 0x9E, 0x4B, 0xBC,
- 0xC8, 0xB5, 0x02, 0x5F, 0x98, 0x9D, 0x5D, 0x35,
- 0xD0, 0x16, 0xB1, 0x23, 0x7D, 0xAF, 0x10, 0x3C,
- 0xAB, 0x14, 0x09, 0x2D, 0x0D, 0xC5, 0x1D, 0xD6,
- 0x42, 0xF2, 0x34, 0x73, 0xF4, 0xFD, 0xE0, 0x24,
- 0x6F, 0xD3, 0x75, 0xD8, 0xCC, 0xB6, 0x99, 0x4F,
- 0x29, 0x0A, 0x08, 0xE4, 0x27, 0x19, 0x31, 0xC9,
- 0x20, 0x94, 0x45, 0xED, 0xDC, 0xBD, 0x7E, 0x50 };
-
-static const unsigned char table_91[32] = {
- 0x03, 0x04, 0x0C, 0x18, 0x10, 0x0D, 0x13, 0x1B,
- 0x1F, 0x07, 0x11, 0x17, 0x1C, 0x1D, 0x05, 0x06,
- 0x0A, 0x12, 0x02, 0x1A, 0x0B, 0x01, 0x0E, 0x08,
- 0x14, 0x16, 0x00, 0x15, 0x19, 0x09, 0x0F, 0x1E };
-
-static const unsigned char table_92[32] = {
- 0x1E, 0x10, 0x01, 0x07, 0x11, 0x16, 0x15, 0x17,
- 0x1F, 0x14, 0x0C, 0x1C, 0x06, 0x03, 0x00, 0x18,
- 0x08, 0x0E, 0x02, 0x1B, 0x09, 0x0D, 0x19, 0x05,
- 0x0F, 0x12, 0x0B, 0x13, 0x0A, 0x04, 0x1D, 0x1A };
-
-static const unsigned char table_93[256] = {
- 0x76, 0x78, 0xA2, 0x94, 0x0E, 0x7F, 0xDF, 0xC1,
- 0xB9, 0xE1, 0x3D, 0x59, 0x6F, 0x1E, 0x53, 0x99,
- 0x80, 0xE3, 0x21, 0xF8, 0x65, 0xB8, 0x08, 0xBC,
- 0x29, 0x17, 0xFD, 0x33, 0x35, 0xF2, 0x70, 0xC7,
- 0x25, 0xD0, 0xCD, 0x7A, 0xB7, 0x9B, 0xA5, 0xC3,
- 0x00, 0x90, 0xDC, 0xB1, 0x0C, 0x20, 0x67, 0x8D,
- 0x43, 0x49, 0xF3, 0x96, 0x14, 0x1A, 0xC8, 0x19,
- 0x72, 0xD7, 0x8A, 0x38, 0x66, 0xDA, 0xDD, 0x2E,
- 0xBE, 0xD5, 0x91, 0x7C, 0x3A, 0x92, 0x8E, 0xE7,
- 0x51, 0xB5, 0xA8, 0xD9, 0x0B, 0x2A, 0xBA, 0x81,
- 0x41, 0x0F, 0xBD, 0x4E, 0x31, 0x23, 0x9C, 0x8B,
- 0x2B, 0x1D, 0x04, 0x3E, 0x8C, 0xF0, 0x45, 0xA0,
- 0x1C, 0x44, 0x55, 0x5E, 0xF1, 0x98, 0x54, 0x5D,
- 0x9D, 0x84, 0xAE, 0x09, 0xA9, 0xC5, 0x83, 0x60,
- 0x86, 0x95, 0xB4, 0xFA, 0x6B, 0xA7, 0x9A, 0xCA,
- 0x8F, 0x4F, 0x0A, 0x7B, 0xB0, 0x02, 0xEA, 0xA4,
- 0x18, 0xDB, 0xD3, 0x64, 0xEB, 0xFC, 0xC4, 0xC9,
- 0xF5, 0xD6, 0xCC, 0x75, 0x0D, 0x5C, 0x93, 0x4A,
- 0x6D, 0xC0, 0x1F, 0x50, 0xE6, 0x16, 0xEE, 0x07,
- 0xFB, 0x74, 0x56, 0x58, 0x52, 0x89, 0x79, 0x68,
- 0xB6, 0xFE, 0x01, 0xD4, 0x7E, 0x06, 0xBF, 0xCB,
- 0x5B, 0xC2, 0xC6, 0x32, 0xAC, 0x26, 0x22, 0xD2,
- 0x82, 0x46, 0x69, 0x15, 0x2C, 0xF7, 0xAD, 0x13,
- 0x4D, 0xA3, 0xF6, 0x2D, 0x48, 0x71, 0x57, 0x11,
- 0x63, 0x05, 0x5F, 0x9E, 0x4B, 0xAB, 0xA6, 0x61,
- 0xBB, 0xA1, 0x3C, 0x97, 0xF9, 0x03, 0x40, 0x12,
- 0xCF, 0x37, 0xE4, 0x10, 0x6A, 0xED, 0xFF, 0x62,
- 0x42, 0x4C, 0xAF, 0x9F, 0xE5, 0xE8, 0xD8, 0xD1,
- 0x28, 0x3F, 0x1B, 0xE9, 0xCE, 0x6C, 0x27, 0x88,
- 0xEF, 0x2F, 0xE0, 0x30, 0x87, 0x5A, 0x73, 0xB3,
- 0x6E, 0x3B, 0x7D, 0x77, 0x36, 0xAA, 0x39, 0xDE,
- 0x24, 0x34, 0xE2, 0xEC, 0x85, 0x47, 0xF4, 0xB2 };
-
-static const unsigned char table_94[32] = {
- 0x1C, 0x07, 0x05, 0x1A, 0x10, 0x1D, 0x14, 0x12,
- 0x08, 0x0F, 0x0C, 0x01, 0x04, 0x1B, 0x16, 0x0A,
- 0x11, 0x02, 0x1F, 0x13, 0x0D, 0x1E, 0x17, 0x06,
- 0x0E, 0x09, 0x15, 0x19, 0x03, 0x18, 0x00, 0x0B };
-
-static const unsigned char table_95[32] = {
- 0x12, 0x10, 0x11, 0x15, 0x03, 0x0A, 0x14, 0x05,
- 0x1D, 0x07, 0x17, 0x0D, 0x09, 0x08, 0x1B, 0x1F,
- 0x0B, 0x06, 0x19, 0x0E, 0x18, 0x04, 0x00, 0x02,
- 0x1E, 0x1C, 0x01, 0x0C, 0x1A, 0x0F, 0x13, 0x16 };
-
-static const unsigned char table_96[256] = {
- 0x1C, 0x6E, 0xCD, 0xB4, 0xB3, 0x93, 0xA8, 0x2E,
- 0x4F, 0x09, 0xE3, 0x72, 0x64, 0x13, 0x21, 0xF5,
- 0x89, 0xB2, 0xD2, 0x22, 0x5D, 0x63, 0x90, 0xC4,
- 0x42, 0x9B, 0x07, 0xCA, 0x16, 0x19, 0x5C, 0x2B,
- 0x3D, 0xA0, 0x69, 0x5F, 0x52, 0x41, 0x66, 0xC0,
- 0x55, 0xDA, 0x82, 0x40, 0x25, 0x02, 0x3C, 0xDD,
- 0xAE, 0xD7, 0xD6, 0xDB, 0x04, 0x78, 0x05, 0x4A,
- 0x4C, 0x81, 0x00, 0xBE, 0x45, 0xC5, 0x30, 0xB0,
- 0x65, 0x5A, 0xA9, 0x38, 0x75, 0x26, 0x85, 0x4E,
- 0xF0, 0xA2, 0x91, 0x8A, 0x54, 0xD0, 0x3E, 0x0D,
- 0xFE, 0xF2, 0x0A, 0x23, 0x24, 0x37, 0x32, 0x0B,
- 0xCB, 0xB5, 0x28, 0x6A, 0x95, 0x49, 0x53, 0x9A,
- 0xEE, 0x2C, 0x9D, 0xD4, 0x1D, 0x46, 0xC9, 0x79,
- 0xCC, 0xDF, 0x17, 0xE8, 0x6D, 0x29, 0x0E, 0x80,
- 0xE0, 0x62, 0xA1, 0xFA, 0x10, 0xF6, 0x03, 0xC1,
- 0x15, 0x14, 0x1F, 0x99, 0x97, 0xD5, 0x9E, 0x3F,
- 0x7B, 0x2F, 0xEF, 0x2A, 0x68, 0x83, 0xE2, 0x1B,
- 0xC8, 0x87, 0x12, 0x70, 0xC7, 0x36, 0xD3, 0x73,
- 0x8B, 0x7D, 0x47, 0x9F, 0xD9, 0xFB, 0x6C, 0x5B,
- 0xFC, 0xAA, 0xB9, 0xB1, 0x0C, 0x31, 0x8E, 0xF3,
- 0x92, 0xA3, 0x4B, 0xF1, 0xC2, 0x3A, 0x67, 0xEA,
- 0x77, 0x11, 0xB6, 0xE4, 0x1A, 0x33, 0xD1, 0xBA,
- 0xF9, 0xAC, 0x43, 0xE5, 0xC3, 0xC6, 0xFD, 0xF4,
- 0x44, 0x6F, 0xB7, 0x88, 0xA7, 0xF8, 0x34, 0x94,
- 0x6B, 0x27, 0xDE, 0x1E, 0xDC, 0x01, 0x61, 0x50,
- 0xAD, 0x74, 0x4D, 0x86, 0xF7, 0x8D, 0x9C, 0x0F,
- 0x5E, 0xBD, 0x08, 0x84, 0x18, 0xED, 0xA5, 0x39,
- 0xAB, 0x98, 0x48, 0xE6, 0x2D, 0x96, 0xCF, 0x7F,
- 0xFF, 0xBB, 0x8F, 0xEC, 0xBF, 0xE7, 0x56, 0xA4,
- 0x35, 0x76, 0xA6, 0xAF, 0xBC, 0x71, 0xE9, 0xB8,
- 0x7E, 0x7C, 0x06, 0x3B, 0xEB, 0x60, 0x7A, 0x8C,
- 0x59, 0xCE, 0xE1, 0x57, 0x20, 0x58, 0x51, 0xD8 };
-
-static const unsigned char table_97[256] = {
- 0x15, 0x2D, 0xAF, 0x36, 0xCF, 0xD3, 0xD0, 0xED,
- 0xB2, 0x1B, 0xFE, 0x92, 0xBD, 0xAD, 0x58, 0x0F,
- 0x76, 0x3C, 0x47, 0x03, 0x2E, 0x4C, 0x40, 0xF7,
- 0x39, 0xA7, 0x72, 0x22, 0x95, 0xF3, 0x8C, 0xE0,
- 0x79, 0xB6, 0x75, 0x82, 0x94, 0x8F, 0x44, 0xFC,
- 0xB0, 0x05, 0xE9, 0x10, 0x68, 0xE7, 0xF1, 0xA5,
- 0xA8, 0xE2, 0x6F, 0xBE, 0xE5, 0x54, 0xA2, 0xC6,
- 0xDB, 0x1C, 0x9E, 0x6D, 0x14, 0xA1, 0x26, 0x34,
- 0x1E, 0x1A, 0x06, 0x53, 0xEE, 0x67, 0xA9, 0x73,
- 0xD5, 0x59, 0x2F, 0x61, 0xE6, 0x74, 0xD6, 0x97,
- 0xC0, 0x0C, 0xB1, 0x6E, 0x6C, 0x33, 0xC8, 0x77,
- 0x8B, 0x49, 0x43, 0xE3, 0xB5, 0xDE, 0x6A, 0xA0,
- 0x78, 0x2A, 0xC9, 0xF9, 0x9A, 0xDC, 0x90, 0x55,
- 0xF4, 0x16, 0x5E, 0x3F, 0xC5, 0x7C, 0xFA, 0x09,
- 0x8E, 0x87, 0xF2, 0x9D, 0x70, 0x27, 0x9B, 0xC4,
- 0xCD, 0x91, 0x4B, 0xB4, 0x18, 0xE1, 0x3D, 0x5D,
- 0x7A, 0xEA, 0xF0, 0x65, 0xB9, 0xF6, 0xC3, 0x66,
- 0x21, 0x96, 0xD1, 0xB8, 0x56, 0x62, 0x48, 0x28,
- 0x3A, 0x86, 0x63, 0xD4, 0xD7, 0x41, 0x8D, 0x20,
- 0xC2, 0x98, 0x37, 0xD8, 0x85, 0x42, 0x0D, 0x31,
- 0x84, 0x4E, 0x11, 0x46, 0x2B, 0x19, 0xCC, 0xB7,
- 0x69, 0x13, 0x6B, 0x29, 0x38, 0x7E, 0x0E, 0xD2,
- 0x3B, 0x60, 0x89, 0x7F, 0xEF, 0x07, 0x08, 0xCA,
- 0xBF, 0x3E, 0xA3, 0xAA, 0x52, 0x4A, 0x45, 0x00,
- 0xC7, 0xF8, 0x57, 0xEB, 0x93, 0x9C, 0x4D, 0x7B,
- 0x2C, 0xBB, 0xFB, 0xFF, 0x35, 0x4F, 0x32, 0xA6,
- 0x23, 0x8A, 0xDD, 0x12, 0xA4, 0x81, 0x17, 0x1D,
- 0x1F, 0xCB, 0x0A, 0x71, 0x02, 0xAC, 0xDF, 0x24,
- 0xAB, 0x7D, 0x30, 0x5C, 0x01, 0x5A, 0xBA, 0xEC,
- 0x51, 0xF5, 0x0B, 0x64, 0xCE, 0xAE, 0x5B, 0x50,
- 0x80, 0x88, 0xE8, 0x5F, 0x04, 0xDA, 0xE4, 0xBC,
- 0x83, 0x25, 0x9F, 0xD9, 0x99, 0xC1, 0xFD, 0xB3 };
-
-static const unsigned char table_98[256] = {
- 0xC8, 0xE6, 0x38, 0x93, 0xE5, 0x03, 0x18, 0x1F,
- 0xE9, 0x5A, 0xB6, 0xAF, 0xC3, 0x95, 0x00, 0x51,
- 0xC0, 0xFD, 0x32, 0xE8, 0x96, 0x57, 0xF0, 0xAA,
- 0xDC, 0x71, 0xF8, 0x01, 0x40, 0x0A, 0x4F, 0xB0,
- 0x1B, 0x9D, 0x16, 0x92, 0xF3, 0x5E, 0xA9, 0x3C,
- 0xBE, 0x6A, 0xA7, 0xE3, 0x35, 0x0D, 0xAD, 0xDB,
- 0x48, 0xE0, 0x7E, 0xC6, 0xB4, 0x6D, 0x17, 0x41,
- 0x3E, 0xE2, 0x87, 0x12, 0xE1, 0x53, 0xD9, 0x8A,
- 0xAC, 0xA6, 0xD8, 0xFA, 0x36, 0x0B, 0x06, 0xDF,
- 0x6C, 0x4E, 0xA4, 0xBC, 0xC9, 0xEE, 0x44, 0x26,
- 0xF2, 0xE4, 0x9E, 0x34, 0xEF, 0x05, 0x0F, 0x7F,
- 0xD1, 0xCD, 0x67, 0x28, 0xC1, 0x8E, 0x7D, 0x90,
- 0x8F, 0x60, 0x1E, 0x19, 0xBD, 0x77, 0xB8, 0xD5,
- 0x3D, 0x8C, 0x31, 0x99, 0x08, 0xDD, 0x04, 0x30,
- 0x61, 0xFB, 0xEB, 0x98, 0x15, 0xFC, 0x10, 0xDE,
- 0x20, 0xBA, 0xA1, 0xB3, 0xD4, 0x91, 0x6F, 0x9F,
- 0x94, 0x5B, 0x42, 0xCB, 0x75, 0x1C, 0xBB, 0x5C,
- 0x5D, 0xD6, 0x66, 0x50, 0xB9, 0xF1, 0x82, 0x7B,
- 0x33, 0x23, 0x4A, 0xA5, 0x55, 0x97, 0xEA, 0x37,
- 0xF4, 0x64, 0x6E, 0xBF, 0x8B, 0xB1, 0x07, 0x9A,
- 0x43, 0x11, 0x65, 0xC2, 0x02, 0xDA, 0x9B, 0x25,
- 0xCA, 0x3B, 0x7A, 0xCE, 0xA8, 0xCF, 0xF7, 0x56,
- 0x6B, 0xF9, 0x47, 0x2A, 0x2E, 0x1D, 0x2D, 0xE7,
- 0x46, 0xD0, 0x62, 0x4C, 0x80, 0x4B, 0x2B, 0xF5,
- 0x69, 0x9C, 0x45, 0xED, 0x83, 0xAB, 0x74, 0x39,
- 0xA3, 0x85, 0xD7, 0x5F, 0xB2, 0x86, 0x22, 0x29,
- 0x89, 0x49, 0x1A, 0xC4, 0x52, 0xEC, 0x8D, 0x73,
- 0xD3, 0x7C, 0x79, 0xD2, 0x14, 0x4D, 0x84, 0xA2,
- 0x0E, 0x70, 0x78, 0x72, 0xB7, 0xA0, 0xC5, 0x81,
- 0x58, 0x0C, 0x68, 0x27, 0xFF, 0xF6, 0xAE, 0xCC,
- 0x88, 0xFE, 0x24, 0x2F, 0x76, 0x3F, 0x59, 0x21,
- 0x54, 0x3A, 0x13, 0x09, 0x2C, 0xB5, 0xC7, 0x63 };
-
-static const unsigned char table_99[32] = {
- 0x19, 0x00, 0x10, 0x18, 0x09, 0x11, 0x13, 0x1D,
- 0x08, 0x1A, 0x02, 0x05, 0x03, 0x17, 0x12, 0x01,
- 0x1F, 0x14, 0x06, 0x07, 0x15, 0x0D, 0x0F, 0x0B,
- 0x0E, 0x16, 0x1E, 0x04, 0x1B, 0x0A, 0x0C, 0x1C };
-
-static const unsigned char table_100[256] = {
- 0x9B, 0x3A, 0xAE, 0x60, 0x27, 0x67, 0x1E, 0x4E,
- 0x91, 0xDA, 0x85, 0x43, 0x5C, 0xCC, 0x89, 0x55,
- 0x75, 0x56, 0xF2, 0x86, 0xEB, 0xC4, 0x0D, 0xE6,
- 0x63, 0x88, 0x38, 0x59, 0x68, 0xD0, 0x18, 0xF0,
- 0xBA, 0x28, 0xF5, 0x80, 0x02, 0x5B, 0xE1, 0xA4,
- 0x7A, 0x4B, 0x8E, 0xF7, 0x9E, 0x99, 0x70, 0xEF,
- 0x66, 0x50, 0xB1, 0xCD, 0x9A, 0xAF, 0x5F, 0x21,
- 0xE5, 0x5D, 0x14, 0xD4, 0x34, 0x22, 0xC3, 0x0F,
- 0x44, 0xB6, 0x92, 0xCE, 0xB4, 0x6E, 0xB0, 0x00,
- 0xF9, 0xB5, 0x10, 0xEA, 0x45, 0x2F, 0x2B, 0xF4,
- 0xF6, 0xFE, 0xCB, 0x0A, 0x42, 0xF8, 0xE7, 0xFD,
- 0xC8, 0xC2, 0x6C, 0x9C, 0x57, 0xA1, 0x46, 0x04,
- 0xE9, 0x97, 0x40, 0x32, 0x19, 0xFA, 0x51, 0xD1,
- 0x6D, 0x4C, 0x2A, 0xD9, 0x95, 0x26, 0x72, 0x1B,
- 0x83, 0x93, 0x5A, 0x15, 0x33, 0xC5, 0x77, 0x13,
- 0xE0, 0x36, 0x37, 0xDB, 0xA7, 0xC7, 0x81, 0x62,
- 0xC1, 0x47, 0x64, 0x74, 0x1D, 0x84, 0x29, 0x39,
- 0x41, 0x35, 0x09, 0x90, 0x20, 0x9F, 0x8C, 0x7D,
- 0x3E, 0x07, 0xB9, 0x76, 0x06, 0xA3, 0x31, 0x7F,
- 0x49, 0x6F, 0x3D, 0xD5, 0x25, 0xAC, 0xDF, 0x0B,
- 0x3C, 0x79, 0x01, 0x8F, 0x82, 0x2E, 0xFC, 0x98,
- 0xA5, 0x58, 0xA0, 0x4A, 0x7C, 0x24, 0xDD, 0x05,
- 0x4D, 0x12, 0xBC, 0xAA, 0xE2, 0xAB, 0xD3, 0xBF,
- 0x94, 0x2D, 0x54, 0xBB, 0xAD, 0xB7, 0x6A, 0xE3,
- 0xBD, 0x5E, 0x8D, 0x08, 0x3B, 0xB8, 0x73, 0x8A,
- 0x16, 0xD2, 0x69, 0xE8, 0xEE, 0x53, 0xD8, 0xDC,
- 0x48, 0xCF, 0xC6, 0xA9, 0x1A, 0xCA, 0x17, 0x11,
- 0xED, 0xC0, 0xA6, 0x1F, 0x96, 0x8B, 0xFF, 0x78,
- 0x03, 0x61, 0x1C, 0xA8, 0x3F, 0x9D, 0x0E, 0xC9,
- 0xE4, 0xA2, 0x52, 0xEC, 0x4F, 0xD6, 0xF3, 0x6B,
- 0x87, 0xB3, 0x7E, 0xDE, 0xD7, 0x71, 0x65, 0xF1,
- 0x30, 0x0C, 0xB2, 0x7B, 0xBE, 0xFB, 0x23, 0x2C };
-
-static const unsigned char table_101[32] = {
- 0x18, 0x08, 0x14, 0x17, 0x03, 0x10, 0x19, 0x04,
- 0x0D, 0x1C, 0x06, 0x1D, 0x1E, 0x12, 0x11, 0x0B,
- 0x0F, 0x02, 0x0E, 0x1B, 0x13, 0x05, 0x07, 0x16,
- 0x15, 0x0A, 0x0C, 0x1A, 0x00, 0x01, 0x1F, 0x09 };
-
-static const unsigned char table_102[32] = {
- 0x17, 0x1F, 0x0E, 0x05, 0x13, 0x0C, 0x14, 0x1A,
- 0x0F, 0x01, 0x12, 0x1C, 0x00, 0x07, 0x0D, 0x02,
- 0x10, 0x16, 0x04, 0x11, 0x1D, 0x03, 0x1E, 0x18,
- 0x06, 0x15, 0x0A, 0x19, 0x09, 0x08, 0x1B, 0x0B };
-
-static const unsigned char table_103[32] = {
- 0x0F, 0x09, 0x1E, 0x11, 0x0D, 0x08, 0x10, 0x00,
- 0x01, 0x1F, 0x1D, 0x1C, 0x12, 0x04, 0x07, 0x05,
- 0x19, 0x14, 0x1B, 0x02, 0x1A, 0x15, 0x17, 0x16,
- 0x18, 0x0B, 0x0A, 0x13, 0x0C, 0x0E, 0x03, 0x06 };
-
-static const unsigned char table_104[256] = {
- 0xA4, 0x9F, 0x78, 0x39, 0x3D, 0x81, 0x51, 0x24,
- 0x46, 0x2A, 0x56, 0xE8, 0xDF, 0x73, 0xA8, 0xA2,
- 0x0D, 0xDC, 0xA5, 0x4F, 0xF0, 0x93, 0xC0, 0x76,
- 0x38, 0x70, 0xB0, 0x30, 0x98, 0x13, 0x8B, 0x14,
- 0x26, 0x45, 0x0F, 0x7D, 0x34, 0x72, 0x6B, 0x89,
- 0x43, 0xE2, 0x96, 0x5B, 0xEF, 0x2B, 0xF9, 0xDE,
- 0x82, 0xB5, 0x61, 0x4A, 0x17, 0xC2, 0x5A, 0xCB,
- 0xB2, 0x8D, 0xE4, 0xEC, 0xD9, 0x80, 0xBC, 0x62,
- 0x67, 0x11, 0xA9, 0x3A, 0xE1, 0xC4, 0xEA, 0xD2,
- 0x71, 0xD0, 0xDB, 0xE5, 0x7B, 0x08, 0x77, 0xD6,
- 0x10, 0x19, 0x48, 0xEB, 0xAA, 0x2C, 0x0C, 0x59,
- 0xBE, 0xF6, 0x28, 0x50, 0x90, 0x87, 0xCD, 0x04,
- 0x1F, 0x79, 0x99, 0x5C, 0x49, 0x06, 0x8A, 0x3E,
- 0x5F, 0x5E, 0x15, 0x23, 0x2D, 0xB6, 0xA6, 0x7A,
- 0x03, 0x20, 0xDA, 0xFB, 0x35, 0x75, 0xC7, 0x47,
- 0xB9, 0x7C, 0xA1, 0xCE, 0xC5, 0xDD, 0xFD, 0x6C,
- 0x05, 0xAC, 0x09, 0xB4, 0x95, 0xD1, 0xB1, 0x63,
- 0xFF, 0xAE, 0xD5, 0x25, 0x1E, 0x6E, 0x57, 0x18,
- 0x74, 0xE6, 0x2F, 0x9A, 0xE7, 0x42, 0x65, 0xF5,
- 0x58, 0x27, 0x33, 0x9C, 0xCF, 0xB7, 0xC3, 0xF1,
- 0x12, 0x1D, 0xB8, 0xF4, 0x64, 0x4D, 0xD4, 0xBD,
- 0xE3, 0xAB, 0x44, 0x60, 0xAF, 0xCC, 0x0A, 0xFC,
- 0xD3, 0x21, 0x0B, 0x1A, 0x6D, 0x83, 0xA7, 0x8E,
- 0x3C, 0xC1, 0xED, 0xF3, 0x2E, 0x86, 0xC9, 0x41,
- 0x02, 0xF7, 0xC8, 0x40, 0x1B, 0xF8, 0xF2, 0x07,
- 0x5D, 0x4E, 0xC6, 0x29, 0xD7, 0x4B, 0x7E, 0x31,
- 0x94, 0x32, 0x01, 0x92, 0xE9, 0x36, 0x0E, 0x7F,
- 0x85, 0x16, 0xFA, 0x00, 0x88, 0x3F, 0x68, 0x4C,
- 0x22, 0x55, 0xBF, 0x9D, 0xE0, 0x6A, 0xAD, 0xBA,
- 0x91, 0xCA, 0xA3, 0x1C, 0xEE, 0xD8, 0x3B, 0x66,
- 0x69, 0x9B, 0x84, 0xA0, 0xB3, 0x6F, 0xFE, 0x52,
- 0x97, 0xBB, 0x37, 0x8C, 0x54, 0x53, 0x9E, 0x8F };
-
-static const unsigned char table_105[256] = {
- 0x7B, 0x35, 0x11, 0x79, 0x07, 0x2F, 0xF6, 0x82,
- 0x8E, 0xB4, 0x6E, 0xD2, 0x6D, 0xC5, 0x8C, 0x1C,
- 0xE0, 0xD6, 0x34, 0xF0, 0x4F, 0x25, 0x59, 0xE8,
- 0xDF, 0x1D, 0xEB, 0x32, 0x86, 0x51, 0xA4, 0xF2,
- 0x5C, 0xD1, 0xC8, 0x41, 0xEC, 0x9D, 0x62, 0xAC,
- 0xDD, 0x3E, 0xB8, 0x65, 0x75, 0x89, 0x12, 0x6C,
- 0x40, 0x4E, 0xC7, 0x27, 0xE1, 0x37, 0xCF, 0x09,
- 0x16, 0x78, 0xAA, 0x58, 0x0D, 0xE6, 0x54, 0xFE,
- 0x8F, 0xFD, 0xF9, 0x61, 0x26, 0x3F, 0x2E, 0xCD,
- 0x2C, 0x04, 0xB2, 0x80, 0x0F, 0x14, 0x6F, 0xC6,
- 0xAB, 0xFB, 0x13, 0xDB, 0x9A, 0x21, 0xB3, 0xC0,
- 0xA9, 0x19, 0x70, 0xF3, 0x2B, 0xAE, 0x9B, 0x49,
- 0xB7, 0xA8, 0x24, 0x1B, 0x48, 0xEA, 0xED, 0xD9,
- 0x47, 0x9E, 0x9C, 0x69, 0x3C, 0x66, 0xBB, 0x06,
- 0x46, 0x38, 0x17, 0xB5, 0xCB, 0x05, 0x4A, 0x5E,
- 0x15, 0x20, 0xB9, 0xB6, 0x33, 0x4C, 0x7D, 0xA3,
- 0xD7, 0xB1, 0x23, 0x72, 0xC3, 0x4B, 0x63, 0xBE,
- 0xF7, 0x5B, 0x74, 0x64, 0x77, 0xCC, 0xD3, 0x85,
- 0xDE, 0x1A, 0x31, 0x97, 0xA2, 0x8B, 0xFC, 0x10,
- 0x5F, 0xDC, 0xD5, 0xB0, 0xBD, 0x55, 0xC1, 0xE7,
- 0x0C, 0x50, 0x43, 0x39, 0x71, 0x52, 0xE5, 0xAF,
- 0x8A, 0x60, 0x92, 0x2D, 0xD8, 0x03, 0xF5, 0x28,
- 0xCA, 0xEF, 0xD0, 0xC2, 0x53, 0x91, 0xA6, 0x73,
- 0x56, 0xA5, 0xF1, 0x57, 0x42, 0xF4, 0xD4, 0x36,
- 0x8D, 0xBC, 0xE9, 0x7E, 0x02, 0x76, 0x18, 0x0B,
- 0x84, 0x5A, 0xE2, 0xBF, 0x68, 0x95, 0x29, 0x98,
- 0xAD, 0x88, 0x1F, 0x81, 0x67, 0xA1, 0x3A, 0xA7,
- 0x22, 0xF8, 0x01, 0xA0, 0xCE, 0x7A, 0xDA, 0x30,
- 0xC4, 0xE4, 0xEE, 0x7C, 0x3B, 0x4D, 0x3D, 0xE3,
- 0xFA, 0x6A, 0x7F, 0x99, 0x00, 0x93, 0x0E, 0xFF,
- 0x90, 0x0A, 0x2A, 0x5D, 0x96, 0x08, 0x6B, 0x83,
- 0xBA, 0x1E, 0x44, 0x87, 0x45, 0x9F, 0xC9, 0x94 };
-
-static const unsigned char table_106[32] = {
- 0x03, 0x11, 0x07, 0x1B, 0x0F, 0x14, 0x0C, 0x01,
- 0x04, 0x02, 0x09, 0x0A, 0x05, 0x12, 0x06, 0x1F,
- 0x1C, 0x0E, 0x0D, 0x15, 0x18, 0x08, 0x00, 0x10,
- 0x1E, 0x1D, 0x17, 0x19, 0x13, 0x16, 0x0B, 0x1A };
-
-static const unsigned char table_107[32] = {
- 0x13, 0x1B, 0x06, 0x11, 0x1C, 0x07, 0x08, 0x0E,
- 0x10, 0x05, 0x09, 0x18, 0x04, 0x15, 0x1E, 0x0F,
- 0x1F, 0x12, 0x02, 0x00, 0x17, 0x19, 0x1A, 0x0D,
- 0x03, 0x0C, 0x0A, 0x1D, 0x14, 0x01, 0x16, 0x0B };
-
-static const unsigned char table_108[256] = {
- 0x99, 0xA3, 0x48, 0xE8, 0x5A, 0x7D, 0x97, 0xCA,
- 0x7F, 0x06, 0x9B, 0x04, 0xE0, 0xF3, 0x18, 0xAE,
- 0x59, 0xA0, 0x2B, 0x15, 0x85, 0x3E, 0x12, 0x93,
- 0x3D, 0x28, 0x32, 0xF5, 0x20, 0x5D, 0x86, 0x00,
- 0x1B, 0x2E, 0x36, 0x10, 0x5E, 0x6C, 0xD8, 0x29,
- 0xB6, 0x3F, 0x05, 0x1C, 0xCE, 0xC2, 0x34, 0x5F,
- 0x5C, 0x79, 0xD1, 0x1F, 0xA2, 0xEE, 0x8A, 0x69,
- 0xB5, 0x87, 0x96, 0x6D, 0x4D, 0xC1, 0x61, 0x2C,
- 0x11, 0xE7, 0x8E, 0xBF, 0x1E, 0x53, 0xD0, 0x58,
- 0x76, 0xA4, 0x60, 0xA9, 0xB0, 0xF9, 0xEA, 0x3C,
- 0x52, 0x9A, 0x24, 0xF1, 0x9F, 0xD3, 0x40, 0x0A,
- 0x63, 0x78, 0x6A, 0x8B, 0x08, 0x22, 0x16, 0x83,
- 0x6B, 0xD2, 0x49, 0x19, 0xBD, 0xFD, 0x62, 0x72,
- 0xA8, 0x55, 0xAB, 0x0C, 0xB9, 0x13, 0xD5, 0xF0,
- 0xF2, 0x84, 0xAF, 0x2F, 0x7B, 0x2A, 0x21, 0x0F,
- 0xDA, 0x30, 0x71, 0xD6, 0x81, 0xE6, 0xEC, 0x41,
- 0x90, 0x50, 0x66, 0x0E, 0xA7, 0xB8, 0xF7, 0x3A,
- 0xB2, 0xCF, 0x3B, 0xFC, 0x56, 0x6F, 0xC3, 0xA6,
- 0xC9, 0xA1, 0x8D, 0xBB, 0x9D, 0x75, 0xF6, 0xAA,
- 0x7E, 0xF8, 0x33, 0xEF, 0xBC, 0x7C, 0x23, 0x1A,
- 0x92, 0x6E, 0x2D, 0x8F, 0xED, 0xB7, 0xB1, 0x1D,
- 0x67, 0x39, 0xAC, 0x0D, 0x74, 0xDB, 0x7A, 0x94,
- 0x07, 0x09, 0xC0, 0xD7, 0xAD, 0xFE, 0x54, 0x91,
- 0xDE, 0x45, 0xA5, 0x77, 0xCB, 0x37, 0xC6, 0x38,
- 0x89, 0x88, 0x17, 0xD9, 0x4F, 0xDF, 0x25, 0xFB,
- 0xFA, 0x4C, 0x80, 0x35, 0x82, 0xF4, 0x95, 0xC8,
- 0xFF, 0xE9, 0x31, 0x01, 0x14, 0xB3, 0x02, 0x9E,
- 0x4E, 0x43, 0x46, 0xC7, 0xEB, 0x51, 0xE5, 0x47,
- 0xB4, 0xE3, 0xDC, 0x57, 0xC4, 0x98, 0x03, 0xE1,
- 0xBA, 0x68, 0xCD, 0x27, 0xC5, 0x0B, 0xD4, 0x64,
- 0x4B, 0x9C, 0x70, 0x65, 0x4A, 0xE4, 0x42, 0xDD,
- 0xCC, 0xE2, 0x44, 0x73, 0xBE, 0x26, 0x8C, 0x5B };
-
-static const unsigned char table_109[256] = {
- 0xE3, 0x95, 0xDB, 0x09, 0x82, 0x0A, 0x8F, 0x9E,
- 0xC9, 0xDC, 0x28, 0x35, 0x0F, 0x8B, 0xA8, 0xA5,
- 0x7F, 0x3D, 0x8C, 0xD1, 0x93, 0x57, 0x04, 0xAA,
- 0x6A, 0x98, 0x81, 0xDD, 0x16, 0x67, 0x2E, 0xDF,
- 0xED, 0xF7, 0xB2, 0xBD, 0x14, 0xB6, 0x76, 0xC8,
- 0x75, 0x9F, 0x48, 0xAE, 0xBB, 0xB0, 0xF3, 0xE2,
- 0xD4, 0x59, 0xD8, 0x9C, 0x64, 0xC1, 0x73, 0x21,
- 0x6D, 0x96, 0x7B, 0x62, 0x56, 0x55, 0xCC, 0xFD,
- 0xCE, 0x41, 0xA3, 0x43, 0x33, 0xAF, 0x23, 0x9D,
- 0x6F, 0x65, 0x19, 0x52, 0xAD, 0xC6, 0xD3, 0x3F,
- 0x66, 0xFF, 0xD0, 0x30, 0x6C, 0xC0, 0xEB, 0xCF,
- 0x51, 0x88, 0x38, 0x72, 0x69, 0x77, 0x3B, 0xFA,
- 0xBA, 0xB7, 0xA1, 0x91, 0xE0, 0x89, 0xAB, 0x44,
- 0x1B, 0x05, 0x5B, 0xB9, 0x71, 0x47, 0x7E, 0xFB,
- 0x02, 0xC7, 0x99, 0x6E, 0x42, 0x20, 0x90, 0x1F,
- 0x4A, 0x85, 0x1A, 0xEA, 0x0C, 0x0D, 0xB3, 0xDA,
- 0xE7, 0x13, 0xE6, 0xD7, 0x6B, 0x12, 0x46, 0x53,
- 0xB5, 0xF8, 0x1D, 0x83, 0x54, 0x49, 0x8A, 0x26,
- 0x4D, 0xDE, 0xF6, 0x03, 0xA2, 0x7D, 0x0E, 0xA0,
- 0x68, 0x79, 0xCA, 0x0B, 0x5D, 0x40, 0x4F, 0x80,
- 0xC2, 0xD6, 0x87, 0x70, 0xF0, 0xD2, 0x92, 0xEE,
- 0xBE, 0x74, 0x5F, 0xBC, 0xA4, 0x4B, 0xFE, 0x37,
- 0x60, 0xA9, 0x06, 0xA7, 0xE1, 0xF5, 0x2B, 0x10,
- 0xEF, 0x2C, 0x07, 0x86, 0x7A, 0x27, 0xE9, 0xC5,
- 0xAC, 0x32, 0x22, 0xF2, 0xE5, 0x8D, 0x31, 0x01,
- 0x34, 0xA6, 0xB8, 0xC3, 0x3C, 0xE4, 0x08, 0x94,
- 0x15, 0x4E, 0xB4, 0x39, 0x58, 0x00, 0x3E, 0x29,
- 0x45, 0x3A, 0x84, 0x36, 0xF1, 0x2A, 0x50, 0x11,
- 0xC4, 0x5A, 0xFC, 0xBF, 0xD9, 0xF9, 0x17, 0x9B,
- 0x8E, 0x18, 0x63, 0x4C, 0x2F, 0x78, 0x2D, 0x5E,
- 0x9A, 0xCD, 0x24, 0xEC, 0x7C, 0x97, 0x61, 0xCB,
- 0x1E, 0xF4, 0xD5, 0xB1, 0x5C, 0x25, 0xE8, 0x1C };
-
-static const unsigned char table_110[256] = {
- 0xC3, 0x06, 0x3C, 0xCB, 0xD2, 0x44, 0x9D, 0x48,
- 0x28, 0xAA, 0xA9, 0xD0, 0x64, 0x25, 0x56, 0xCA,
- 0xC2, 0xF8, 0x5C, 0xAE, 0x4E, 0x63, 0xB2, 0xE9,
- 0x35, 0x11, 0xA8, 0x1A, 0x76, 0x15, 0xE0, 0x26,
- 0x97, 0x99, 0xD4, 0x43, 0x80, 0xEE, 0xC1, 0x69,
- 0xA6, 0x1E, 0x7A, 0x42, 0x55, 0x38, 0xBF, 0x75,
- 0x0E, 0x29, 0xF5, 0xF3, 0x36, 0x7D, 0x51, 0xE8,
- 0xE5, 0xEB, 0x68, 0x60, 0x0C, 0x70, 0xFD, 0xCC,
- 0xE3, 0x23, 0x09, 0x6D, 0x2D, 0x6C, 0x5E, 0xB6,
- 0x98, 0x8B, 0x1F, 0x50, 0x34, 0x8D, 0x10, 0x92,
- 0x82, 0x85, 0xD5, 0x79, 0x02, 0xA4, 0x0A, 0xBC,
- 0x40, 0xC6, 0xA3, 0x72, 0x8F, 0xC4, 0xA5, 0xE4,
- 0x49, 0xD6, 0xCE, 0xA1, 0x12, 0x4F, 0x30, 0x31,
- 0xDE, 0x2A, 0xF7, 0x95, 0xB5, 0x96, 0x14, 0x08,
- 0xE6, 0x3D, 0x86, 0xF2, 0x47, 0x74, 0xB8, 0x5D,
- 0x1D, 0x2B, 0x3A, 0x93, 0x7C, 0x6A, 0x01, 0xA0,
- 0x9A, 0x4D, 0xB7, 0x71, 0xA7, 0x41, 0xC5, 0x65,
- 0xC8, 0x89, 0xD1, 0x3E, 0x0D, 0xD8, 0xFF, 0x6F,
- 0x7F, 0xA2, 0xFE, 0xD9, 0xF0, 0x4A, 0x07, 0x1C,
- 0x0F, 0x6E, 0x03, 0x81, 0x1B, 0x05, 0xDF, 0x52,
- 0xF1, 0x8A, 0xF9, 0xDD, 0x91, 0x3B, 0xD7, 0xE1,
- 0x54, 0xAD, 0x90, 0x5A, 0x7B, 0xC7, 0x32, 0x62,
- 0x16, 0x27, 0xB9, 0x66, 0x21, 0x88, 0xBD, 0x18,
- 0x77, 0x8E, 0x94, 0x8C, 0x9B, 0x46, 0x9C, 0xB1,
- 0xD3, 0x53, 0xB0, 0xBE, 0xAC, 0xAF, 0x73, 0x24,
- 0xDA, 0x58, 0xE2, 0xFC, 0x78, 0xEA, 0xCD, 0xFA,
- 0x37, 0xED, 0x13, 0x19, 0xC0, 0x59, 0x83, 0xBA,
- 0x3F, 0x57, 0x00, 0x7E, 0xC9, 0x2E, 0x17, 0x5B,
- 0x84, 0xF6, 0xE7, 0x22, 0xFB, 0x5F, 0x4C, 0x2C,
- 0x61, 0x9F, 0x45, 0x39, 0xB3, 0xEC, 0x04, 0x87,
- 0x67, 0xDC, 0x0B, 0xF4, 0x20, 0xAB, 0x6B, 0x9E,
- 0x4B, 0xCF, 0xB4, 0x2F, 0xBB, 0xEF, 0xDB, 0x33 };
-
-static const unsigned char table_111[32] = {
- 0x09, 0x0F, 0x00, 0x15, 0x12, 0x17, 0x1A, 0x0D,
- 0x1C, 0x0B, 0x01, 0x0A, 0x05, 0x1E, 0x1D, 0x0C,
- 0x1B, 0x08, 0x19, 0x18, 0x14, 0x07, 0x0E, 0x03,
- 0x10, 0x16, 0x11, 0x1F, 0x04, 0x06, 0x02, 0x13 };
-
-static const unsigned char table_112[256] = {
- 0xF9, 0x7D, 0xBE, 0xD5, 0x9F, 0xB8, 0x95, 0x43,
- 0xDB, 0xAE, 0x7E, 0xEC, 0x5B, 0x58, 0x18, 0x49,
- 0x4B, 0x9D, 0x1C, 0x3E, 0x61, 0xD1, 0xF6, 0x2F,
- 0x41, 0x82, 0x51, 0x37, 0x72, 0x79, 0x05, 0x2A,
- 0xC2, 0xB0, 0xE2, 0xE7, 0xB2, 0xF3, 0x1B, 0x92,
- 0x86, 0xBB, 0xDC, 0x90, 0x1A, 0x19, 0xD7, 0xBA,
- 0x2C, 0x7B, 0xEF, 0xC7, 0x8A, 0x81, 0xEB, 0xDE,
- 0x73, 0x4E, 0xB7, 0x97, 0xCA, 0x29, 0x85, 0xC1,
- 0xA5, 0x7F, 0xFE, 0x56, 0xE9, 0x9E, 0x21, 0x76,
- 0x3A, 0x88, 0x70, 0xC6, 0xD3, 0x8C, 0x47, 0xC8,
- 0x83, 0x48, 0xC3, 0x6A, 0x9C, 0x80, 0x53, 0xBD,
- 0xFD, 0x54, 0x09, 0x91, 0x94, 0xAA, 0x7A, 0x59,
- 0x71, 0xDD, 0xA8, 0x07, 0xCB, 0x0F, 0xE0, 0x9A,
- 0x36, 0x4C, 0x4D, 0x0D, 0xA4, 0x96, 0x6F, 0x14,
- 0x22, 0x38, 0xAD, 0x02, 0xF4, 0x0B, 0xEA, 0x93,
- 0x20, 0x04, 0xBC, 0xE8, 0x6C, 0xFB, 0x10, 0x6B,
- 0x40, 0xB6, 0x24, 0x17, 0x06, 0x31, 0xD9, 0x33,
- 0xF5, 0x99, 0x57, 0xCD, 0xAB, 0x67, 0x5C, 0x30,
- 0x1E, 0x34, 0xB4, 0x3F, 0x16, 0x42, 0xA2, 0x68,
- 0x27, 0xB3, 0x1D, 0xED, 0x5F, 0x52, 0xF7, 0x3C,
- 0x65, 0x5D, 0xE5, 0x23, 0x0C, 0x6D, 0x84, 0x6E,
- 0xDA, 0x77, 0xF8, 0x15, 0xFA, 0x69, 0xD0, 0xA7,
- 0x11, 0xAC, 0xA6, 0xA3, 0x1F, 0x2E, 0xBF, 0x4A,
- 0x8F, 0xFC, 0xEE, 0xC9, 0x26, 0x12, 0xC0, 0xB1,
- 0x45, 0x0E, 0x3D, 0x7C, 0xCE, 0x13, 0x8E, 0x98,
- 0x46, 0x2B, 0xC5, 0x66, 0x28, 0x32, 0xD2, 0x03,
- 0xE3, 0xC4, 0x9B, 0x89, 0x5E, 0xF0, 0xCF, 0x3B,
- 0x2D, 0x50, 0xB5, 0x00, 0x0A, 0xD6, 0x55, 0xE1,
- 0x62, 0x63, 0x64, 0x87, 0xAF, 0x78, 0xB9, 0xF2,
- 0x25, 0x44, 0xFF, 0x39, 0xF1, 0x08, 0x4F, 0x74,
- 0xA9, 0x8B, 0x75, 0x01, 0xA0, 0xE4, 0x35, 0x8D,
- 0xA1, 0xCC, 0xDF, 0x60, 0xD8, 0x5A, 0xE6, 0xD4 };
-
-static const unsigned char table_113[256] = {
- 0x46, 0x9D, 0x39, 0xB2, 0x8D, 0x3B, 0x59, 0x5A,
- 0xD0, 0x9C, 0xE4, 0x04, 0x01, 0xE2, 0xB3, 0xD2,
- 0xD7, 0x18, 0x40, 0xD8, 0xF1, 0xEF, 0x3A, 0x1D,
- 0x8E, 0xE5, 0xD9, 0xD3, 0xCB, 0x49, 0x4C, 0xCF,
- 0xC0, 0xD6, 0xB5, 0x73, 0x77, 0x82, 0x54, 0xA2,
- 0xB1, 0xB0, 0x84, 0x5D, 0xC7, 0xDE, 0x31, 0x2F,
- 0x50, 0x78, 0xBE, 0x94, 0x64, 0x44, 0x60, 0x7A,
- 0x1A, 0x6E, 0x09, 0x6F, 0xBF, 0x76, 0x81, 0x38,
- 0x22, 0xC3, 0xEE, 0x8F, 0xFB, 0x32, 0xED, 0x92,
- 0xAE, 0xE6, 0x5F, 0xAA, 0xAC, 0x0D, 0xA3, 0x47,
- 0x1F, 0x11, 0xC1, 0x29, 0xAF, 0xFD, 0x1C, 0xDB,
- 0x00, 0x23, 0xB9, 0xB8, 0x91, 0x41, 0x27, 0x37,
- 0x43, 0x02, 0x26, 0xF6, 0x7D, 0x0A, 0x85, 0x93,
- 0x97, 0x2E, 0x20, 0x55, 0x13, 0x4B, 0x6C, 0xE7,
- 0xFC, 0x25, 0xFA, 0x9E, 0x5B, 0xA1, 0xDF, 0x2C,
- 0x3E, 0xBC, 0xEA, 0x42, 0x7C, 0x36, 0x30, 0xEB,
- 0xBD, 0x8B, 0x87, 0x16, 0x3D, 0x5C, 0x07, 0xBA,
- 0xB4, 0x1B, 0xC2, 0xE3, 0x71, 0x9A, 0x5E, 0x4D,
- 0xF2, 0xCC, 0x0E, 0xE1, 0x34, 0x75, 0x58, 0x89,
- 0x17, 0xD4, 0x68, 0x80, 0x2B, 0x74, 0x70, 0x8A,
- 0x63, 0xE8, 0x56, 0x24, 0xD1, 0x57, 0x35, 0x6D,
- 0x3C, 0xA6, 0xC8, 0x7E, 0xA8, 0x4E, 0xC4, 0x33,
- 0xA9, 0x62, 0x61, 0x7F, 0x21, 0x98, 0x2A, 0xAD,
- 0xB6, 0xA7, 0xF5, 0x3F, 0x15, 0x45, 0xF8, 0xA4,
- 0x95, 0x88, 0xDC, 0x96, 0x90, 0x08, 0x9B, 0xF9,
- 0x06, 0x14, 0x05, 0xF0, 0xF7, 0xA0, 0xE0, 0x65,
- 0xCA, 0xA5, 0x9F, 0x79, 0xCD, 0x4F, 0x72, 0xB7,
- 0x4A, 0x0F, 0x66, 0xC5, 0x0C, 0x52, 0xF3, 0x69,
- 0x83, 0x03, 0x99, 0x1E, 0x2D, 0xDA, 0x8C, 0x53,
- 0x28, 0xDD, 0xE9, 0x0B, 0xC9, 0xF4, 0x48, 0x12,
- 0x6A, 0x19, 0xCE, 0xAB, 0x51, 0xD5, 0x6B, 0xBB,
- 0xFE, 0x7B, 0x67, 0xFF, 0x10, 0xEC, 0xC6, 0x86 };
-
-static const unsigned char table_114[32] = {
- 0x11, 0x10, 0x04, 0x1D, 0x08, 0x15, 0x1A, 0x1B,
- 0x14, 0x18, 0x0F, 0x17, 0x16, 0x07, 0x1E, 0x0E,
- 0x12, 0x0A, 0x13, 0x0B, 0x0C, 0x00, 0x06, 0x02,
- 0x1F, 0x19, 0x09, 0x1C, 0x01, 0x0D, 0x03, 0x05 };
-
-static const unsigned char table_115[256] = {
- 0xB7, 0xBB, 0x63, 0x0D, 0xF0, 0x33, 0x5A, 0x05,
- 0xF2, 0x7F, 0x64, 0xDB, 0x51, 0xC9, 0x2C, 0x85,
- 0x4F, 0x41, 0xA4, 0x42, 0xCF, 0xA6, 0x52, 0x2F,
- 0x26, 0xEF, 0xFB, 0x29, 0x40, 0x16, 0xF7, 0xED,
- 0x23, 0x69, 0x8A, 0xDF, 0x77, 0x28, 0x93, 0x14,
- 0x82, 0x0C, 0xBE, 0x3D, 0x20, 0xB4, 0x79, 0x94,
- 0x54, 0xF8, 0x07, 0xB1, 0xE1, 0x66, 0x73, 0xD3,
- 0x19, 0x15, 0xFF, 0x03, 0x6A, 0x9A, 0xDC, 0x1C,
- 0xB3, 0x5D, 0x76, 0x68, 0x47, 0x6C, 0xF9, 0xFD,
- 0xE9, 0xDD, 0x01, 0x65, 0xBD, 0x80, 0x0E, 0x7A,
- 0x8D, 0x99, 0x13, 0x7C, 0xA5, 0xA7, 0x1A, 0xCC,
- 0xB8, 0xE6, 0x2B, 0xB2, 0xB6, 0xD0, 0x62, 0x2D,
- 0x4D, 0xD2, 0xB9, 0x04, 0x46, 0xAE, 0xAA, 0x44,
- 0xDA, 0x92, 0x4B, 0x4E, 0xC4, 0xE2, 0xFE, 0xA2,
- 0x75, 0x7B, 0xC3, 0xFA, 0x9F, 0x37, 0x9D, 0x1E,
- 0x72, 0xD4, 0x1F, 0x4A, 0x9B, 0xE5, 0x6D, 0xEC,
- 0x5C, 0x7D, 0x98, 0xE8, 0xEE, 0x86, 0xD1, 0xC8,
- 0xEA, 0x55, 0xBF, 0xAF, 0xDE, 0x32, 0x09, 0x3A,
- 0x8F, 0x57, 0x83, 0x43, 0x61, 0xC6, 0x8E, 0x96,
- 0x22, 0xA3, 0x97, 0x91, 0x5F, 0x11, 0x3B, 0x5B,
- 0x1B, 0x34, 0x49, 0x95, 0xF1, 0x6F, 0x89, 0xA8,
- 0xC0, 0x36, 0x0A, 0x3F, 0x60, 0x50, 0xE7, 0x08,
- 0xCE, 0x25, 0xC1, 0x71, 0xF6, 0x59, 0x58, 0x56,
- 0x4C, 0xAB, 0x27, 0xAC, 0x06, 0xCB, 0x00, 0x30,
- 0x84, 0x3E, 0xC2, 0x1D, 0x02, 0xE0, 0xC5, 0xD6,
- 0x18, 0x70, 0xA9, 0x88, 0xD9, 0x39, 0x8B, 0x6E,
- 0xF4, 0x24, 0xA0, 0x48, 0x45, 0x21, 0x87, 0x78,
- 0x38, 0x90, 0xE3, 0xCA, 0xF5, 0xD7, 0x2A, 0x53,
- 0x9C, 0xCD, 0x31, 0x35, 0xAD, 0x74, 0xD8, 0x12,
- 0xBC, 0x9E, 0x6B, 0x67, 0xB0, 0xBA, 0xE4, 0x10,
- 0x5E, 0xFC, 0xC7, 0x0F, 0x2E, 0x81, 0x7E, 0xA1,
- 0x8C, 0x17, 0xB5, 0xEB, 0xD5, 0xF3, 0x0B, 0x3C };
-
-static const unsigned char table_116[32] = {
- 0x00, 0x05, 0x10, 0x1C, 0x0C, 0x1A, 0x04, 0x1B,
- 0x0A, 0x0D, 0x14, 0x0B, 0x07, 0x03, 0x12, 0x1E,
- 0x06, 0x11, 0x01, 0x08, 0x15, 0x09, 0x1F, 0x0F,
- 0x19, 0x18, 0x16, 0x02, 0x13, 0x0E, 0x17, 0x1D };
-
-static const unsigned char table_117[256] = {
- 0xD0, 0x9A, 0xAB, 0xA8, 0xA7, 0xDF, 0x28, 0xCE,
- 0x3E, 0x51, 0xBF, 0x76, 0x03, 0xA0, 0x53, 0x3F,
- 0x90, 0x93, 0x87, 0x67, 0x98, 0x3D, 0xEA, 0x8B,
- 0x55, 0xCF, 0x10, 0xF3, 0x25, 0xFC, 0x9F, 0x41,
- 0x6B, 0x54, 0x6E, 0x0B, 0x83, 0x35, 0x69, 0x7D,
- 0xE0, 0x88, 0x4B, 0xE9, 0x1E, 0x96, 0x91, 0x57,
- 0xBD, 0x72, 0x21, 0x3C, 0xA6, 0x99, 0x6C, 0xF6,
- 0x13, 0xFA, 0x29, 0xED, 0xDB, 0x16, 0x4D, 0x07,
- 0x45, 0xA5, 0xE3, 0x0E, 0x31, 0xBC, 0x56, 0x5C,
- 0xB2, 0x23, 0xDA, 0x74, 0xFF, 0x02, 0x8F, 0xF4,
- 0x2A, 0xC9, 0x89, 0xAA, 0x05, 0xB1, 0xD1, 0x1F,
- 0x4F, 0xB0, 0x7A, 0x2C, 0x14, 0xD9, 0xE7, 0x66,
- 0x62, 0x1A, 0x4C, 0xC0, 0xC6, 0x63, 0x7F, 0xB4,
- 0xF1, 0x43, 0xFE, 0x61, 0xA3, 0xCC, 0xE8, 0x6D,
- 0xBA, 0x65, 0x42, 0x2B, 0xCA, 0xD5, 0x52, 0x3A,
- 0xCD, 0x1D, 0x24, 0xD7, 0x47, 0xDE, 0x9E, 0x95,
- 0x85, 0x48, 0x86, 0xE1, 0xC5, 0xD2, 0x34, 0xAF,
- 0x40, 0xFB, 0xE6, 0x4E, 0xC8, 0xF5, 0x7B, 0x5A,
- 0xCB, 0xD4, 0x97, 0x6F, 0x0C, 0x79, 0x9C, 0x20,
- 0x59, 0x19, 0x68, 0x2E, 0x09, 0x64, 0x73, 0x50,
- 0xC2, 0x2F, 0x0D, 0xEF, 0x9D, 0x94, 0x00, 0x81,
- 0xE2, 0x46, 0x5F, 0xB8, 0x0A, 0x12, 0x75, 0x1C,
- 0x8C, 0xB6, 0x71, 0xAC, 0x04, 0x60, 0xA9, 0x5B,
- 0xF8, 0x30, 0x49, 0x44, 0x4A, 0xBE, 0x6A, 0xEB,
- 0xD3, 0xD8, 0x36, 0xB3, 0x3B, 0x17, 0x80, 0xA4,
- 0xEC, 0x26, 0x82, 0xB5, 0x37, 0x5D, 0x1B, 0x2D,
- 0xE5, 0xA2, 0x0F, 0xB7, 0xC4, 0xF2, 0x70, 0x39,
- 0xF9, 0xC7, 0xBB, 0x8A, 0x32, 0x78, 0xC3, 0x5E,
- 0xD6, 0xE4, 0x22, 0x9B, 0x18, 0x8E, 0xEE, 0x27,
- 0x8D, 0x33, 0x11, 0x77, 0x01, 0x06, 0x38, 0xF0,
- 0x7E, 0x08, 0x15, 0xB9, 0x7C, 0xAD, 0x84, 0xDD,
- 0xC1, 0xFD, 0x92, 0xA1, 0xF7, 0xAE, 0xDC, 0x58 };
-
-static const unsigned char table_118[256] = {
- 0x38, 0xA0, 0xA6, 0xFC, 0x7C, 0x5A, 0x97, 0x1D,
- 0xFD, 0x00, 0x20, 0xA2, 0x72, 0x10, 0x1F, 0x48,
- 0x98, 0x7E, 0xDF, 0x2D, 0x80, 0x0A, 0x27, 0xDC,
- 0xCF, 0xBF, 0x92, 0x94, 0x53, 0xCC, 0x0E, 0x74,
- 0xA7, 0x60, 0x08, 0x15, 0x87, 0x6F, 0xB3, 0xA3,
- 0xED, 0x59, 0x09, 0x4F, 0x9E, 0x9A, 0xEE, 0x83,
- 0x56, 0x32, 0x34, 0xC7, 0x24, 0xE7, 0x96, 0x4D,
- 0xAE, 0xE3, 0xBD, 0xE2, 0x36, 0x4A, 0xB6, 0x8B,
- 0xF2, 0xC1, 0xD7, 0x40, 0x31, 0x4B, 0xDA, 0xF1,
- 0xB1, 0x70, 0xA8, 0xC3, 0xC6, 0x8A, 0xE6, 0x77,
- 0x21, 0x7D, 0xD5, 0x0C, 0x43, 0xC4, 0xF0, 0x1B,
- 0x18, 0xA1, 0x85, 0xE1, 0xFF, 0x8D, 0xE5, 0x6E,
- 0x9B, 0x51, 0x1C, 0xA4, 0x5C, 0x8E, 0x69, 0x49,
- 0x23, 0xCD, 0x52, 0xF8, 0x3E, 0x91, 0x5E, 0x1E,
- 0x25, 0xB4, 0x93, 0xCB, 0xE0, 0x47, 0xBC, 0x4E,
- 0x33, 0xB7, 0x75, 0x1A, 0x11, 0x9C, 0x3F, 0xEC,
- 0xD1, 0x46, 0xDD, 0xAA, 0xB8, 0x99, 0x86, 0x67,
- 0x58, 0xF9, 0x16, 0x17, 0x6D, 0x5F, 0x2B, 0xA5,
- 0xD3, 0x8F, 0x55, 0x71, 0xD2, 0xBA, 0x5B, 0x3C,
- 0x82, 0xB5, 0x41, 0xE4, 0x90, 0x45, 0x6C, 0xF6,
- 0xDE, 0xA9, 0x84, 0x62, 0x19, 0x3B, 0xB9, 0xC8,
- 0x2C, 0xB0, 0x76, 0x57, 0xD8, 0x26, 0x9D, 0x89,
- 0xC9, 0x54, 0xFB, 0x07, 0xCE, 0x22, 0x5D, 0x64,
- 0x65, 0xAD, 0x01, 0xDB, 0x14, 0x4C, 0x37, 0x03,
- 0x6B, 0xAF, 0xD0, 0x7F, 0x9F, 0xBB, 0xEB, 0xC0,
- 0x50, 0x66, 0x68, 0x0B, 0x42, 0x2A, 0xD4, 0xF5,
- 0x61, 0x63, 0xF3, 0x39, 0xBE, 0xC5, 0xEF, 0x28,
- 0x3A, 0xAB, 0x79, 0x05, 0xE9, 0x12, 0x73, 0x3D,
- 0xB2, 0x8C, 0xCA, 0x29, 0x0F, 0xF4, 0x7B, 0x13,
- 0x88, 0x44, 0xC2, 0x2E, 0xFA, 0xFE, 0x04, 0x35,
- 0xE8, 0x06, 0x7A, 0x78, 0x0D, 0x81, 0xF7, 0xEA,
- 0xD9, 0x2F, 0x02, 0xAC, 0x30, 0x6A, 0xD6, 0x95 };
-
-static const unsigned char table_119[32] = {
- 0x14, 0x0A, 0x1C, 0x00, 0x0C, 0x1F, 0x1E, 0x0B,
- 0x12, 0x1D, 0x17, 0x08, 0x07, 0x04, 0x09, 0x10,
- 0x03, 0x1B, 0x0E, 0x1A, 0x05, 0x0D, 0x11, 0x15,
- 0x18, 0x02, 0x06, 0x01, 0x19, 0x16, 0x13, 0x0F };
-
-static const unsigned char table_120[256] = {
- 0xCE, 0x89, 0xB2, 0x72, 0x04, 0x77, 0x64, 0xAE,
- 0x80, 0x99, 0xB5, 0x00, 0x7B, 0x50, 0x9D, 0xE3,
- 0x87, 0x37, 0x6D, 0x3D, 0x32, 0xBA, 0x20, 0xF0,
- 0xDC, 0xBD, 0x61, 0x26, 0xD4, 0xA6, 0x70, 0x54,
- 0xC1, 0x7D, 0x82, 0xFF, 0x81, 0x83, 0x2F, 0xF5,
- 0x3B, 0x42, 0x08, 0x5C, 0x30, 0x59, 0xBB, 0xC2,
- 0x33, 0x5D, 0xEE, 0xB7, 0xF7, 0x2B, 0x76, 0xD0,
- 0x43, 0x1C, 0x48, 0xFC, 0x01, 0xCD, 0x27, 0x1D,
- 0x5A, 0x96, 0x95, 0x03, 0xC6, 0x1F, 0x09, 0xCB,
- 0xF6, 0x47, 0xA9, 0x93, 0xA7, 0xD2, 0xDB, 0x51,
- 0xB0, 0x7A, 0xE6, 0x62, 0x0F, 0x12, 0x57, 0xF4,
- 0x35, 0xFE, 0xA4, 0xDF, 0x5B, 0xF3, 0x67, 0x85,
- 0x98, 0xE4, 0xAB, 0x75, 0x4C, 0xE2, 0x25, 0x74,
- 0x3A, 0x45, 0xDE, 0xEF, 0x4A, 0x97, 0x86, 0x24,
- 0xE9, 0x8F, 0xD8, 0xD7, 0x60, 0xAD, 0x36, 0x8E,
- 0x1E, 0xB9, 0x4F, 0x6B, 0x8C, 0x06, 0x23, 0x94,
- 0x0E, 0xD3, 0x49, 0x14, 0x90, 0xAF, 0x65, 0xEC,
- 0xF9, 0x0D, 0xED, 0x6C, 0xBE, 0x7F, 0xA5, 0xC5,
- 0xEA, 0x78, 0x2E, 0xBC, 0xD5, 0xDA, 0x18, 0xE1,
- 0x10, 0x2D, 0xB4, 0x16, 0x4B, 0xE8, 0xC4, 0x8D,
- 0x19, 0x1B, 0x02, 0x66, 0xB6, 0xE7, 0x9C, 0x7C,
- 0xC9, 0xA0, 0x2A, 0x53, 0x13, 0xDD, 0xF8, 0xA8,
- 0x0A, 0x6E, 0xCF, 0x6F, 0x7E, 0xE0, 0x3E, 0xE5,
- 0x07, 0xCC, 0x38, 0xD1, 0xF2, 0x2C, 0x9A, 0xAC,
- 0x88, 0x79, 0xB8, 0xC8, 0xBF, 0x63, 0x71, 0x69,
- 0x52, 0x39, 0x9F, 0x22, 0x3F, 0x9E, 0x44, 0xFA,
- 0x73, 0x6A, 0x8B, 0xA2, 0xD6, 0x1A, 0x9B, 0xB1,
- 0x8A, 0x4D, 0x58, 0xA1, 0x46, 0x5F, 0x55, 0x56,
- 0x21, 0x05, 0x15, 0x92, 0xAA, 0xEB, 0x31, 0x68,
- 0xFB, 0x41, 0xC3, 0x4E, 0xB3, 0x40, 0x34, 0x17,
- 0xD9, 0x29, 0x3C, 0x0C, 0xF1, 0x0B, 0x28, 0x84,
- 0x5E, 0xCA, 0xFD, 0x11, 0xA3, 0xC7, 0xC0, 0x91 };
-
-static const unsigned char table_121[32] = {
- 0x1E, 0x12, 0x06, 0x1D, 0x15, 0x1F, 0x13, 0x0B,
- 0x10, 0x0D, 0x1C, 0x01, 0x0A, 0x0E, 0x02, 0x19,
- 0x04, 0x1A, 0x03, 0x11, 0x00, 0x16, 0x0C, 0x17,
- 0x14, 0x08, 0x18, 0x05, 0x09, 0x0F, 0x1B, 0x07 };
-
-static const unsigned char table_122[256] = {
- 0x85, 0xDF, 0x7F, 0x7C, 0x56, 0xF0, 0x0C, 0x7D,
- 0x76, 0xA8, 0x58, 0x31, 0x25, 0x8A, 0x0D, 0x23,
- 0x05, 0x0F, 0x12, 0x64, 0x8E, 0x5D, 0xF4, 0x2C,
- 0x18, 0xFA, 0x4B, 0xFE, 0x91, 0xBF, 0x95, 0x0B,
- 0xF1, 0x88, 0x10, 0xD8, 0x3E, 0x53, 0x96, 0xB5,
- 0x75, 0x24, 0x8F, 0xD6, 0x68, 0x5C, 0x93, 0x1F,
- 0x6B, 0xC2, 0xAB, 0xED, 0x1E, 0xC0, 0xBC, 0x47,
- 0xE9, 0xD1, 0xDE, 0xCA, 0xF6, 0x62, 0x43, 0xEB,
- 0xA2, 0xB4, 0x08, 0xE6, 0x74, 0x0E, 0xA1, 0x72,
- 0x66, 0x61, 0x21, 0x2E, 0x32, 0x63, 0x29, 0xD7,
- 0x1C, 0x22, 0xAC, 0xE7, 0x54, 0xF3, 0x65, 0x17,
- 0x9F, 0x78, 0x79, 0x4C, 0xDD, 0x27, 0x90, 0x36,
- 0x19, 0x44, 0x03, 0xD9, 0x4A, 0x5A, 0x34, 0xF9,
- 0x97, 0xA6, 0x70, 0x39, 0x28, 0x77, 0x6E, 0xB7,
- 0x8C, 0x02, 0x5E, 0x9B, 0x8D, 0x59, 0x6F, 0xA5,
- 0x07, 0xE2, 0x41, 0x51, 0xC9, 0x3C, 0xE8, 0xE1,
- 0xB3, 0x16, 0x50, 0x04, 0xE3, 0x1D, 0x3B, 0xD2,
- 0x4D, 0x35, 0x71, 0xDA, 0x9E, 0xA7, 0xE4, 0xE0,
- 0xB6, 0x2B, 0xEA, 0x84, 0x55, 0xF8, 0x57, 0x3D,
- 0x73, 0x42, 0xC6, 0x0A, 0x92, 0x6A, 0xAE, 0xF5,
- 0xFC, 0xD5, 0x15, 0x52, 0x7E, 0x14, 0x81, 0x13,
- 0xE5, 0x49, 0x38, 0x2A, 0x94, 0x5B, 0xA3, 0x11,
- 0x8B, 0x80, 0xBB, 0x01, 0x9C, 0xA4, 0xDB, 0xF7,
- 0xA9, 0x20, 0xF2, 0x1A, 0xDC, 0x33, 0x3A, 0xEF,
- 0xD3, 0xFD, 0x30, 0xB0, 0x1B, 0xC4, 0x06, 0xD4,
- 0x6D, 0x87, 0x2F, 0x60, 0x5F, 0xC5, 0x09, 0x37,
- 0xAF, 0x00, 0xCB, 0x9D, 0xA0, 0xB9, 0x45, 0x86,
- 0x4F, 0x6C, 0x67, 0xFB, 0x40, 0x3F, 0xCC, 0xB8,
- 0xC8, 0x82, 0x98, 0x99, 0x7B, 0xB1, 0xCD, 0xD0,
- 0xBD, 0x48, 0xAD, 0x26, 0x7A, 0x9A, 0x46, 0xFF,
- 0x89, 0xC7, 0xC1, 0xCF, 0xBE, 0xAA, 0xEC, 0xBA,
- 0xCE, 0x2D, 0x4E, 0x83, 0xC3, 0x69, 0xEE, 0xB2 };
-
-static const unsigned char table_123[256] = {
- 0x9D, 0xFB, 0x3C, 0x81, 0xAA, 0x05, 0xB2, 0xBE,
- 0xD1, 0x5F, 0x4C, 0xE0, 0xA3, 0xF4, 0xDE, 0x35,
- 0xFE, 0x1B, 0x37, 0x99, 0x94, 0x7A, 0x10, 0xAB,
- 0xC0, 0xA4, 0xB5, 0xFF, 0x8F, 0x3B, 0xB4, 0x51,
- 0x04, 0xE9, 0xB9, 0xC1, 0x98, 0xC5, 0x82, 0x38,
- 0x4D, 0x71, 0xFC, 0x33, 0xC4, 0x50, 0x5D, 0x88,
- 0xB8, 0x5C, 0x32, 0xE2, 0xBB, 0xCD, 0x60, 0x2C,
- 0xD4, 0x7E, 0x27, 0x59, 0x2B, 0x1F, 0x53, 0xF6,
- 0x25, 0x86, 0xAE, 0x21, 0xFA, 0x31, 0xD7, 0x0F,
- 0x17, 0xDA, 0x7F, 0xC9, 0x46, 0x19, 0x08, 0xA8,
- 0xCF, 0x13, 0xCC, 0x03, 0x3F, 0x22, 0x6E, 0xEB,
- 0x4A, 0x63, 0x73, 0xBD, 0x36, 0xED, 0x30, 0x57,
- 0x65, 0xF8, 0x41, 0x61, 0x1E, 0xA0, 0xC6, 0x45,
- 0x3E, 0x75, 0x28, 0x87, 0xCB, 0xD6, 0x16, 0xD8,
- 0xDF, 0xEF, 0xEA, 0xA7, 0x58, 0xB0, 0x1D, 0xE6,
- 0x47, 0x76, 0xD9, 0x96, 0xE7, 0xDC, 0x00, 0x80,
- 0xDD, 0xB7, 0x9A, 0xE1, 0xF5, 0x9C, 0x4B, 0xE3,
- 0xBC, 0x8D, 0xF2, 0x2F, 0x9F, 0x6C, 0x93, 0xAF,
- 0xA9, 0xC2, 0x5E, 0x24, 0x15, 0xD2, 0x09, 0x0D,
- 0xDB, 0x4F, 0x91, 0x0E, 0x64, 0x34, 0x4E, 0xAD,
- 0x62, 0x44, 0x23, 0x85, 0xB6, 0xAC, 0xC7, 0xCA,
- 0x84, 0xF9, 0x8C, 0xBF, 0x14, 0x7C, 0x8E, 0x92,
- 0xF0, 0x0B, 0xCE, 0x90, 0x7D, 0x70, 0x9E, 0x54,
- 0x39, 0x5B, 0x6D, 0x52, 0xEE, 0xA2, 0x6F, 0x78,
- 0x2D, 0x95, 0x8B, 0x02, 0x3D, 0x7B, 0x69, 0xC3,
- 0x49, 0xA5, 0x1A, 0x26, 0xD5, 0x6B, 0xE8, 0xFD,
- 0xB3, 0xD3, 0x20, 0x55, 0x18, 0x06, 0xF3, 0xB1,
- 0x0C, 0xC8, 0x07, 0x12, 0xF7, 0x01, 0x2E, 0x72,
- 0x97, 0xA6, 0x11, 0x89, 0x56, 0x5A, 0x29, 0xBA,
- 0x67, 0x42, 0x83, 0x6A, 0x2A, 0xF1, 0xA1, 0x9B,
- 0xE5, 0xE4, 0x74, 0x66, 0x1C, 0x68, 0xEC, 0x40,
- 0x48, 0x77, 0xD0, 0x0A, 0x8A, 0x3A, 0x43, 0x79 };
-
-static const unsigned char table_124[256] = {
- 0x6C, 0xC3, 0x28, 0x2F, 0x42, 0x4B, 0x7C, 0x3C,
- 0xCE, 0x24, 0xC8, 0x51, 0x25, 0x3F, 0x49, 0x8D,
- 0x1E, 0x5C, 0x89, 0x3A, 0x98, 0x47, 0x0B, 0x12,
- 0xA9, 0xB1, 0xD7, 0xB6, 0x5D, 0xF9, 0x5A, 0xBC,
- 0xFA, 0x06, 0x7D, 0x08, 0xFC, 0x37, 0x54, 0x4F,
- 0xD4, 0xCD, 0xA7, 0x5E, 0xE0, 0x92, 0x82, 0x56,
- 0xF1, 0x2B, 0xC4, 0xE2, 0x29, 0xEA, 0x35, 0x57,
- 0x33, 0x4E, 0x1A, 0x17, 0x8B, 0x85, 0xBF, 0xD5,
- 0x18, 0xB3, 0x0D, 0x71, 0x45, 0x81, 0xB4, 0x27,
- 0xD1, 0xE1, 0xFF, 0x44, 0x9E, 0xA4, 0x15, 0x9A,
- 0x90, 0xC7, 0x79, 0xE3, 0x4C, 0xE9, 0x3D, 0x6B,
- 0xF5, 0xF4, 0xEE, 0xAA, 0xDB, 0x07, 0x09, 0xCF,
- 0x7B, 0x95, 0xA0, 0x53, 0x8F, 0xA1, 0x9D, 0xBE,
- 0x6F, 0xAE, 0x96, 0x46, 0x59, 0x01, 0x84, 0xCC,
- 0x3B, 0x8E, 0xF7, 0x4D, 0x6E, 0xDC, 0xE8, 0x36,
- 0x7A, 0xE5, 0xBD, 0xE7, 0x9F, 0x2C, 0x52, 0xAB,
- 0x55, 0x13, 0x1D, 0xFB, 0x58, 0x9C, 0xDF, 0xC0,
- 0x30, 0x73, 0x67, 0x39, 0x74, 0xD3, 0x11, 0xD2,
- 0x0E, 0x20, 0xB7, 0x02, 0xB9, 0x1C, 0x86, 0x76,
- 0x10, 0x68, 0x9B, 0x63, 0x48, 0x8A, 0xB2, 0xB8,
- 0xAF, 0x26, 0x99, 0x04, 0xB0, 0xE4, 0xEF, 0xEB,
- 0xEC, 0x6D, 0x61, 0xC1, 0xD0, 0x38, 0xC9, 0x19,
- 0x60, 0xA8, 0xA6, 0xF8, 0x80, 0xC5, 0x03, 0x0F,
- 0x22, 0x2D, 0x88, 0x32, 0x77, 0x70, 0xFE, 0x0C,
- 0x31, 0x40, 0x5F, 0xED, 0xA5, 0x93, 0x43, 0xF0,
- 0x8C, 0xE6, 0x34, 0x21, 0xD9, 0xC2, 0xD8, 0xC6,
- 0x6A, 0xD6, 0xCB, 0xAC, 0x75, 0xB5, 0x78, 0x0A,
- 0xA3, 0x69, 0x16, 0xBA, 0x50, 0x2A, 0x41, 0x83,
- 0xF6, 0x64, 0x00, 0x65, 0x7E, 0xDD, 0x5B, 0xDA,
- 0x14, 0xFD, 0x3E, 0x7F, 0xCA, 0x66, 0x4A, 0x1F,
- 0xA2, 0xAD, 0xF2, 0x23, 0xBB, 0x72, 0xF3, 0x94,
- 0x62, 0x1B, 0xDE, 0x91, 0x87, 0x97, 0x05, 0x2E };
-
-static const unsigned char table_125[32] = {
- 0x1A, 0x18, 0x12, 0x15, 0x00, 0x1C, 0x01, 0x0B,
- 0x19, 0x1B, 0x1F, 0x11, 0x07, 0x10, 0x1E, 0x06,
- 0x17, 0x04, 0x0A, 0x0E, 0x0D, 0x0C, 0x16, 0x08,
- 0x02, 0x03, 0x13, 0x14, 0x09, 0x1D, 0x05, 0x0F };
-
-static const unsigned char table_126[32] = {
- 0x1C, 0x1D, 0x07, 0x12, 0x18, 0x1A, 0x19, 0x09,
- 0x0F, 0x14, 0x1F, 0x0B, 0x13, 0x04, 0x0E, 0x1E,
- 0x0C, 0x0D, 0x01, 0x17, 0x1B, 0x16, 0x0A, 0x05,
- 0x15, 0x10, 0x11, 0x08, 0x00, 0x03, 0x06, 0x02 };
-
-static const unsigned char table_127[256] = {
- 0xA0, 0x66, 0xD8, 0x08, 0xEA, 0x39, 0x78, 0xAB,
- 0x61, 0x4E, 0xC7, 0xD1, 0xA3, 0x1C, 0x9F, 0xCB,
- 0x19, 0x51, 0x15, 0x92, 0x23, 0xFD, 0x7D, 0x1D,
- 0x95, 0xAE, 0x0E, 0x8B, 0xE6, 0x7F, 0x86, 0x6D,
- 0x06, 0xBD, 0x20, 0x1F, 0x3A, 0xE4, 0x54, 0x91,
- 0x69, 0xD3, 0xE3, 0x3D, 0x4D, 0x31, 0x49, 0xA4,
- 0x41, 0xF3, 0xE0, 0x11, 0x14, 0x9B, 0x96, 0x5A,
- 0xC4, 0x8E, 0x34, 0xDB, 0xBA, 0x83, 0xD9, 0x81,
- 0xAF, 0x58, 0x8A, 0x79, 0x13, 0xBC, 0x85, 0x37,
- 0x9E, 0x6C, 0x57, 0x71, 0x8D, 0x97, 0x5F, 0x6F,
- 0x1E, 0x74, 0x27, 0xFC, 0x5C, 0x7A, 0x64, 0x87,
- 0xF5, 0xC6, 0xF2, 0x4F, 0xDE, 0x80, 0xAA, 0x84,
- 0x2E, 0xDC, 0xE7, 0x40, 0x75, 0xC5, 0xB3, 0xC8,
- 0xCE, 0x21, 0x02, 0x67, 0xB7, 0x10, 0x47, 0x6A,
- 0xEE, 0x53, 0x2C, 0x16, 0x05, 0xC0, 0x63, 0x4C,
- 0x0D, 0xBB, 0xC3, 0x38, 0x46, 0x68, 0x7E, 0xF9,
- 0xB8, 0xB4, 0x3E, 0x36, 0xD5, 0xEC, 0x0B, 0xF6,
- 0x33, 0x0A, 0x0F, 0x5B, 0xFB, 0x45, 0xEB, 0xA9,
- 0x6E, 0x6B, 0xCF, 0x55, 0x99, 0xAC, 0x22, 0xBE,
- 0xB1, 0xA2, 0x3F, 0x25, 0x77, 0x8F, 0x7C, 0xF1,
- 0xD4, 0x59, 0xA8, 0xE5, 0xD7, 0xCA, 0xA1, 0x93,
- 0xE9, 0xAD, 0xF7, 0x94, 0xEF, 0xED, 0x3C, 0x2A,
- 0x88, 0xB5, 0x35, 0x9D, 0x9C, 0x32, 0x5E, 0xB6,
- 0x48, 0x9A, 0x7B, 0x26, 0x50, 0x90, 0x04, 0xA7,
- 0xDD, 0x09, 0xB9, 0x98, 0xB2, 0xFE, 0xDF, 0x44,
- 0x89, 0x29, 0x5D, 0xE2, 0x72, 0xC9, 0x28, 0x03,
- 0x43, 0x8C, 0x52, 0x18, 0xC1, 0x56, 0x1B, 0x1A,
- 0x01, 0x65, 0xDA, 0xBF, 0x07, 0xFF, 0x76, 0xE8,
- 0x30, 0xA5, 0x4A, 0xA6, 0x12, 0x62, 0x24, 0x60,
- 0x4B, 0x73, 0x0C, 0xF0, 0xFA, 0x42, 0xF4, 0x00,
- 0xD2, 0xD0, 0xD6, 0x3B, 0xC2, 0x2F, 0xE1, 0x2B,
- 0x70, 0xF8, 0x17, 0xCD, 0xB0, 0xCC, 0x82, 0x2D };
-
-static const unsigned char table_128[32] = {
- 0x1A, 0x1C, 0x09, 0x17, 0x1B, 0x0B, 0x16, 0x1E,
- 0x14, 0x0C, 0x12, 0x0E, 0x05, 0x03, 0x1F, 0x15,
- 0x19, 0x0D, 0x10, 0x13, 0x0A, 0x01, 0x00, 0x11,
- 0x02, 0x08, 0x0F, 0x18, 0x07, 0x04, 0x1D, 0x06 };
-
-static const unsigned char table_129[256] = {
- 0x9D, 0x5F, 0xE8, 0x99, 0x57, 0x07, 0x16, 0xA6,
- 0x9F, 0xB6, 0xDE, 0xED, 0x2D, 0xB3, 0xC0, 0x8E,
- 0xCC, 0x49, 0xCE, 0xB0, 0x1B, 0xB1, 0x7A, 0xE0,
- 0xEB, 0x28, 0xDB, 0x7D, 0x88, 0xC8, 0x06, 0x6C,
- 0x02, 0xD0, 0x85, 0x7E, 0xDF, 0xF5, 0x78, 0xE5,
- 0xA9, 0x71, 0xD9, 0xDD, 0xDC, 0xEE, 0x8C, 0x54,
- 0xA0, 0x86, 0xFE, 0x0E, 0x55, 0xF7, 0x41, 0x47,
- 0x1D, 0x15, 0xD6, 0xA4, 0xFF, 0x1F, 0x25, 0xF8,
- 0x12, 0xE9, 0x74, 0x7B, 0x04, 0xE6, 0x4C, 0x31,
- 0xA2, 0xBE, 0x0C, 0xB9, 0x17, 0xBD, 0x3D, 0xF0,
- 0x9E, 0x4D, 0x4E, 0xB2, 0xE7, 0x40, 0xC9, 0x8A,
- 0x67, 0x5E, 0x19, 0x0F, 0xB7, 0x22, 0x8D, 0xBA,
- 0xFC, 0x93, 0x14, 0xEA, 0xFD, 0x0D, 0xD5, 0x38,
- 0xA1, 0x84, 0x1C, 0x35, 0x60, 0x37, 0x43, 0x9C,
- 0xCF, 0xEF, 0x3A, 0x72, 0xF2, 0x61, 0x75, 0x6A,
- 0x42, 0xAC, 0xD3, 0x48, 0x77, 0xC5, 0x29, 0xF6,
- 0x58, 0x79, 0xFA, 0x5D, 0xC7, 0x70, 0x53, 0x9A,
- 0x6F, 0xC1, 0x0A, 0x90, 0x8F, 0x3E, 0x3B, 0x8B,
- 0xEC, 0xBC, 0x20, 0x27, 0xC3, 0x66, 0x3F, 0x33,
- 0xA5, 0x44, 0x2E, 0x32, 0x65, 0x18, 0xFB, 0x59,
- 0x52, 0x50, 0xE2, 0x63, 0x2B, 0xCD, 0x64, 0xCB,
- 0xD2, 0x68, 0x10, 0xA7, 0xAE, 0x11, 0xA8, 0x96,
- 0x69, 0xAF, 0xC2, 0x34, 0x5C, 0x56, 0xE3, 0xF9,
- 0xDA, 0x51, 0x81, 0x4A, 0x05, 0x00, 0xB8, 0x7C,
- 0x30, 0x2F, 0x46, 0xB4, 0xC6, 0x87, 0x4B, 0x94,
- 0x80, 0xF4, 0x7F, 0x3C, 0x26, 0xF1, 0x5B, 0xAB,
- 0x91, 0x6E, 0x08, 0x76, 0x98, 0xD1, 0xE1, 0x36,
- 0x21, 0xCA, 0xD8, 0x24, 0x9B, 0x39, 0xBB, 0xAD,
- 0x13, 0x62, 0x97, 0x1A, 0x6D, 0x2C, 0x5A, 0xC4,
- 0xD4, 0xA3, 0x03, 0xBF, 0x1E, 0xE4, 0xF3, 0x95,
- 0x23, 0x73, 0x92, 0xB5, 0x01, 0x83, 0x82, 0xAA,
- 0x09, 0x45, 0x6B, 0xD7, 0x0B, 0x89, 0x4F, 0x2A };
-
-static const unsigned char table_130[32] = {
- 0x07, 0x03, 0x15, 0x0B, 0x02, 0x11, 0x17, 0x14,
- 0x05, 0x10, 0x0A, 0x0F, 0x01, 0x1C, 0x1D, 0x0E,
- 0x12, 0x06, 0x18, 0x16, 0x1A, 0x09, 0x13, 0x19,
- 0x1B, 0x00, 0x08, 0x0D, 0x0C, 0x1E, 0x04, 0x1F };
-
-static const unsigned char table_131[32] = {
- 0x1D, 0x13, 0x1B, 0x10, 0x07, 0x03, 0x0A, 0x02,
- 0x00, 0x0C, 0x0E, 0x0B, 0x0D, 0x18, 0x12, 0x1F,
- 0x1A, 0x04, 0x15, 0x11, 0x1E, 0x08, 0x1C, 0x14,
- 0x19, 0x05, 0x0F, 0x17, 0x06, 0x01, 0x09, 0x16 };
-
-static const unsigned char table_132[256] = {
- 0x33, 0x8D, 0x45, 0x6F, 0xFF, 0xF5, 0xB6, 0x53,
- 0x3B, 0xF3, 0x07, 0xA4, 0x97, 0xEB, 0x6B, 0xA5,
- 0xD3, 0xDC, 0x7B, 0x79, 0x93, 0xE7, 0xF7, 0x67,
- 0x9C, 0x4F, 0x88, 0xF9, 0x3A, 0x2B, 0x27, 0x48,
- 0x47, 0x18, 0xF4, 0xAD, 0xB4, 0x8F, 0x2A, 0x76,
- 0x17, 0xE9, 0x1F, 0x40, 0x0C, 0x59, 0xD1, 0x4C,
- 0x20, 0x31, 0x73, 0x54, 0xCD, 0x68, 0x08, 0x52,
- 0x10, 0x62, 0x3D, 0xD2, 0x77, 0xF2, 0xD7, 0x30,
- 0xCA, 0x16, 0x01, 0x50, 0x9F, 0x3F, 0x75, 0xED,
- 0x90, 0x6A, 0x34, 0xCE, 0x05, 0x78, 0x5E, 0xD6,
- 0x85, 0xCC, 0x29, 0xB8, 0xC1, 0x0D, 0xCB, 0x80,
- 0x2E, 0x04, 0x00, 0x44, 0x32, 0x95, 0xBF, 0xFE,
- 0x6E, 0x7C, 0xFD, 0xA7, 0x3C, 0x5C, 0xF0, 0xEC,
- 0xAC, 0xF8, 0xB9, 0xC0, 0x1B, 0x3E, 0xE8, 0x66,
- 0x5D, 0xDE, 0x49, 0x71, 0xAA, 0xAF, 0x21, 0x64,
- 0x28, 0x8A, 0x4E, 0x98, 0x58, 0xA2, 0x23, 0xCF,
- 0x9E, 0x63, 0x61, 0x91, 0x12, 0xC6, 0x8C, 0x19,
- 0xA8, 0xD4, 0xC7, 0xDD, 0xFC, 0xBD, 0x38, 0xDF,
- 0xEA, 0x2D, 0x7E, 0x7D, 0xE3, 0xE0, 0xC3, 0xD9,
- 0x8B, 0x11, 0xF1, 0x4D, 0xC8, 0xB5, 0x55, 0xAE,
- 0xE1, 0x89, 0xE5, 0xB3, 0xBC, 0x69, 0x9D, 0xA6,
- 0x09, 0x9A, 0x74, 0x35, 0x1A, 0xFB, 0x24, 0xB7,
- 0x13, 0x14, 0x94, 0x0A, 0x86, 0x0F, 0x60, 0x51,
- 0xB0, 0x84, 0x22, 0x5B, 0x87, 0x43, 0x57, 0x0B,
- 0x2F, 0x5F, 0x02, 0xD0, 0xBB, 0xA3, 0xC9, 0x7A,
- 0xBE, 0xC2, 0x26, 0x46, 0xDB, 0x1E, 0x1D, 0x92,
- 0xE2, 0xB2, 0x37, 0x6D, 0xD5, 0x4A, 0x0E, 0x4B,
- 0x8E, 0xC5, 0x42, 0x99, 0xEE, 0xE4, 0xB1, 0x06,
- 0xAB, 0x5A, 0x56, 0x41, 0x65, 0xBA, 0xFA, 0x83,
- 0x15, 0xDA, 0x72, 0xA1, 0x81, 0x1C, 0xA9, 0x36,
- 0x25, 0x96, 0x6C, 0x39, 0x82, 0xE6, 0x2C, 0x9B,
- 0xC4, 0x7F, 0xA0, 0xD8, 0xEF, 0x03, 0x70, 0xF6 };
-
-static const unsigned char table_133[256] = {
- 0x02, 0xF0, 0xED, 0xC4, 0xE4, 0x67, 0x60, 0x8B,
- 0xF3, 0x77, 0x92, 0xE0, 0x85, 0x93, 0x1E, 0x8E,
- 0x9A, 0x38, 0x61, 0x20, 0xB7, 0x68, 0xE1, 0x5E,
- 0xD5, 0x63, 0xA9, 0xA5, 0xBE, 0x36, 0x12, 0x4D,
- 0x86, 0x16, 0xD6, 0xB1, 0x23, 0x64, 0x4F, 0x62,
- 0xFC, 0xA3, 0xD3, 0x04, 0x7D, 0x8C, 0xE2, 0xFF,
- 0x5D, 0x30, 0xF5, 0x95, 0x1B, 0x5F, 0x73, 0xAA,
- 0xE8, 0x07, 0x87, 0xDC, 0x54, 0x7C, 0xEE, 0x00,
- 0xB8, 0xDE, 0x55, 0xBA, 0xD0, 0x50, 0xBB, 0x89,
- 0x1C, 0xCC, 0x0E, 0xC0, 0x42, 0x11, 0xD8, 0xA2,
- 0x2E, 0x33, 0xFE, 0x26, 0xD4, 0x10, 0xDA, 0xC5,
- 0xFB, 0xAF, 0x98, 0x78, 0xB5, 0xBD, 0xC8, 0x8D,
- 0x46, 0xA0, 0xD1, 0x7B, 0xBC, 0x75, 0xAB, 0x25,
- 0xB2, 0x43, 0x57, 0xB6, 0xEC, 0xF4, 0x66, 0x05,
- 0x9C, 0x08, 0x53, 0x80, 0xEA, 0x21, 0x2C, 0x6C,
- 0x17, 0x71, 0xD2, 0x70, 0x76, 0x9E, 0x6B, 0x7A,
- 0x58, 0xA7, 0xBF, 0x29, 0x03, 0x1F, 0x06, 0xC1,
- 0xDD, 0x2F, 0x5C, 0x0B, 0x0D, 0x8A, 0x0A, 0xCB,
- 0xCA, 0x6F, 0x19, 0x6A, 0xFA, 0xF7, 0xA8, 0xA1,
- 0xEB, 0x88, 0x44, 0xAC, 0x01, 0x4E, 0x59, 0x94,
- 0x72, 0x2B, 0xE9, 0x0F, 0x22, 0x9B, 0x27, 0x37,
- 0x41, 0xF9, 0xF2, 0xE3, 0xEF, 0xB3, 0xD9, 0x2A,
- 0x31, 0xC2, 0x0C, 0x15, 0x90, 0x14, 0xF6, 0x83,
- 0xFD, 0x96, 0x9D, 0x7F, 0xA4, 0x39, 0xE7, 0x3F,
- 0xE6, 0xC7, 0xCD, 0x1A, 0xCF, 0x48, 0x3C, 0x51,
- 0x6D, 0x5B, 0x74, 0xC3, 0xC9, 0x09, 0x3D, 0x9F,
- 0xDB, 0x32, 0x40, 0x18, 0xD7, 0xCE, 0x69, 0x49,
- 0x3A, 0xF1, 0xB9, 0x56, 0x91, 0x99, 0x84, 0x24,
- 0x7E, 0x34, 0x4B, 0xA6, 0x47, 0xB4, 0x6E, 0xDF,
- 0x65, 0x3B, 0xAD, 0x45, 0x13, 0xC6, 0x81, 0xF8,
- 0x4A, 0x2D, 0x8F, 0x4C, 0x97, 0x28, 0x3E, 0xE5,
- 0x5A, 0x35, 0xB0, 0xAE, 0x82, 0x79, 0x1D, 0x52 };
-
-static const unsigned char table_134[32] = {
- 0x09, 0x0F, 0x10, 0x0C, 0x03, 0x15, 0x07, 0x17,
- 0x0E, 0x0B, 0x1D, 0x08, 0x19, 0x11, 0x00, 0x0A,
- 0x01, 0x06, 0x18, 0x16, 0x0D, 0x13, 0x14, 0x12,
- 0x02, 0x1B, 0x1A, 0x04, 0x05, 0x1F, 0x1C, 0x1E };
-
-static const unsigned char table_135[256] = {
- 0x14, 0x34, 0xEA, 0x02, 0x2B, 0x5A, 0x10, 0x51,
- 0xF3, 0x8F, 0x28, 0xB2, 0x50, 0x8B, 0x01, 0xCC,
- 0x80, 0x15, 0x29, 0x42, 0xF4, 0x1D, 0xFB, 0xBB,
- 0x1F, 0x43, 0x8C, 0x17, 0x1E, 0x81, 0x04, 0x98,
- 0x46, 0xD8, 0xD5, 0x65, 0x4C, 0x1C, 0xDB, 0x40,
- 0x5F, 0x1A, 0x31, 0x74, 0xF1, 0x64, 0x19, 0x05,
- 0xFC, 0xF0, 0x73, 0xB6, 0x23, 0x77, 0x9C, 0xCE,
- 0x70, 0xEF, 0xDA, 0xE0, 0xA2, 0x78, 0x84, 0xEB,
- 0x9E, 0xC5, 0x95, 0xA3, 0xF6, 0xCA, 0xAD, 0x52,
- 0xD0, 0x3F, 0x54, 0xA7, 0x33, 0xA9, 0x09, 0x6A,
- 0x89, 0x7E, 0x75, 0xA8, 0xD6, 0x79, 0x9F, 0xAB,
- 0x8E, 0x11, 0x0E, 0x3B, 0xAA, 0xE6, 0x85, 0x53,
- 0x0A, 0x59, 0xEC, 0x94, 0xD7, 0x41, 0x86, 0x7D,
- 0x2F, 0xC7, 0xDE, 0x06, 0xCB, 0x13, 0xBA, 0x58,
- 0xC8, 0xC9, 0x07, 0x67, 0x7F, 0xA5, 0xB4, 0x2C,
- 0x48, 0x6C, 0xB8, 0xD1, 0x30, 0xD3, 0x35, 0x4F,
- 0x88, 0x26, 0x93, 0x32, 0x71, 0x3E, 0x3D, 0xF7,
- 0x6D, 0x03, 0xED, 0x8A, 0x36, 0x55, 0x9B, 0x66,
- 0x8D, 0x27, 0x7C, 0xF9, 0xA6, 0xC3, 0x20, 0x69,
- 0x4A, 0xE3, 0x99, 0x5C, 0xBC, 0x45, 0x16, 0x6B,
- 0xB9, 0x49, 0x82, 0xFF, 0xBD, 0xDD, 0xE9, 0x0C,
- 0xD4, 0x44, 0xFD, 0x22, 0xE5, 0xAC, 0x61, 0xC4,
- 0x90, 0x47, 0x37, 0x72, 0xA4, 0x7A, 0x24, 0x4D,
- 0x5B, 0x12, 0x38, 0x92, 0x87, 0x1B, 0xE1, 0xA0,
- 0x91, 0x3C, 0xEE, 0x6F, 0xC1, 0x0F, 0x56, 0xC2,
- 0x9A, 0xF8, 0x18, 0xE8, 0xD2, 0xDC, 0x4B, 0xCF,
- 0x39, 0xF5, 0xFE, 0x2A, 0x2D, 0x9D, 0xA1, 0xFA,
- 0xE7, 0xBF, 0x6E, 0xE4, 0x2E, 0xB3, 0xCD, 0xE2,
- 0xAF, 0x7B, 0xC0, 0x68, 0x97, 0xB5, 0x5D, 0xB7,
- 0x21, 0x57, 0x83, 0x76, 0xB1, 0xAE, 0x5E, 0x0D,
- 0x96, 0x4E, 0x08, 0xC6, 0x0B, 0xDF, 0x3A, 0xB0,
- 0x00, 0x63, 0xD9, 0xBE, 0xF2, 0x60, 0x25, 0x62 };
-
-static const unsigned char table_136[256] = {
- 0xD3, 0x1A, 0x00, 0xED, 0x59, 0x24, 0xA3, 0xF2,
- 0xBA, 0x58, 0x4C, 0x5C, 0x75, 0x48, 0x98, 0xB0,
- 0xCF, 0xC3, 0xF7, 0x88, 0x70, 0xB3, 0x3D, 0x3E,
- 0x03, 0xF9, 0xC9, 0xFD, 0x80, 0x44, 0x7F, 0x3B,
- 0x95, 0x5F, 0x31, 0x47, 0x15, 0x07, 0xB8, 0x08,
- 0xCE, 0xDA, 0x71, 0x9F, 0x83, 0xB1, 0x55, 0x16,
- 0xE6, 0xB2, 0xC7, 0xBE, 0x54, 0xE7, 0x2E, 0x8D,
- 0x12, 0x21, 0x41, 0x69, 0xFE, 0x28, 0x11, 0x56,
- 0x5A, 0xDD, 0xB6, 0x87, 0x78, 0x82, 0x4D, 0x7B,
- 0x50, 0x9A, 0x9E, 0x62, 0xF8, 0x0A, 0x64, 0xF1,
- 0x4E, 0x33, 0xAD, 0xBB, 0x79, 0x76, 0xD8, 0xCD,
- 0x86, 0x34, 0x29, 0xD5, 0x7D, 0x72, 0xC5, 0xC1,
- 0xDF, 0x09, 0x4A, 0xB4, 0xD2, 0x7A, 0xF0, 0xCC,
- 0x0F, 0xA7, 0xD6, 0x2B, 0x20, 0x26, 0xEF, 0xAB,
- 0x74, 0x1E, 0xE3, 0x77, 0xCB, 0x7C, 0x73, 0x5E,
- 0x6B, 0x0D, 0x65, 0xA6, 0x30, 0xFB, 0xD0, 0xB7,
- 0xAA, 0x94, 0x9D, 0x85, 0x13, 0x18, 0xA8, 0xF3,
- 0xE0, 0xBC, 0x45, 0xCA, 0xC8, 0xDC, 0xE2, 0x3C,
- 0x23, 0xE5, 0xB9, 0x90, 0x49, 0xA5, 0xE4, 0x36,
- 0xFC, 0x53, 0xF6, 0xE8, 0xC6, 0x2C, 0x02, 0x25,
- 0xC0, 0x8F, 0x61, 0xA4, 0x39, 0x8C, 0x5D, 0xAE,
- 0x22, 0x1C, 0x2F, 0xD4, 0x6C, 0xD1, 0x51, 0xEA,
- 0x4F, 0x7E, 0xA0, 0xF5, 0x6A, 0x32, 0xA2, 0x01,
- 0xB5, 0x10, 0x2A, 0xAC, 0xA9, 0x06, 0xC4, 0x91,
- 0x68, 0xE1, 0xBD, 0x14, 0x38, 0xFA, 0x6E, 0x3F,
- 0x37, 0x66, 0xDB, 0x57, 0x43, 0x1B, 0x67, 0xAF,
- 0x1F, 0x0B, 0x6D, 0x2D, 0x89, 0x04, 0x4B, 0x52,
- 0xC2, 0xBF, 0xA1, 0x92, 0x99, 0x6F, 0x63, 0x81,
- 0x27, 0x05, 0x96, 0x3A, 0xEC, 0x0E, 0x97, 0xD9,
- 0xDE, 0x46, 0x35, 0x8B, 0x8E, 0x8A, 0xF4, 0xFF,
- 0x60, 0xD7, 0xE9, 0x17, 0xEB, 0x9C, 0x84, 0x0C,
- 0x93, 0x1D, 0x9B, 0x5B, 0x40, 0xEE, 0x42, 0x19 };
-
-static const unsigned char table_137[32] = {
- 0x0F, 0x09, 0x02, 0x06, 0x18, 0x0B, 0x1E, 0x05,
- 0x11, 0x1D, 0x16, 0x01, 0x13, 0x10, 0x0E, 0x1A,
- 0x1B, 0x00, 0x0D, 0x08, 0x15, 0x14, 0x19, 0x17,
- 0x03, 0x1F, 0x0A, 0x12, 0x0C, 0x07, 0x04, 0x1C };
-
-static const unsigned char table_138[32] = {
- 0x0D, 0x1C, 0x1F, 0x15, 0x0F, 0x14, 0x1B, 0x12,
- 0x09, 0x0B, 0x19, 0x07, 0x11, 0x16, 0x0C, 0x04,
- 0x13, 0x05, 0x1D, 0x03, 0x0E, 0x0A, 0x08, 0x1E,
- 0x01, 0x06, 0x18, 0x17, 0x10, 0x1A, 0x02, 0x00 };
-
-static const unsigned char table_139[32] = {
- 0x05, 0x15, 0x1D, 0x02, 0x0F, 0x03, 0x17, 0x1A,
- 0x0A, 0x00, 0x1F, 0x12, 0x0E, 0x11, 0x1B, 0x13,
- 0x0B, 0x0D, 0x09, 0x18, 0x1E, 0x08, 0x14, 0x07,
- 0x0C, 0x04, 0x16, 0x19, 0x1C, 0x06, 0x10, 0x01 };
-
-static const unsigned char table_140[32] = {
- 0x06, 0x1E, 0x0C, 0x11, 0x13, 0x08, 0x15, 0x01,
- 0x1D, 0x03, 0x0F, 0x19, 0x18, 0x04, 0x00, 0x14,
- 0x12, 0x1A, 0x0B, 0x0E, 0x02, 0x1B, 0x07, 0x05,
- 0x1F, 0x17, 0x09, 0x0A, 0x0D, 0x16, 0x10, 0x1C };
-
-static const unsigned char table_141[256] = {
- 0xE1, 0x0A, 0x28, 0xCD, 0x8A, 0x1E, 0x26, 0x10,
- 0xC0, 0x6F, 0x06, 0x2C, 0xF8, 0x51, 0x6C, 0x8F,
- 0xA8, 0x8C, 0x41, 0xF4, 0xED, 0x36, 0xAC, 0x89,
- 0xBD, 0x9D, 0x42, 0x50, 0x95, 0x07, 0x2A, 0x9B,
- 0x7E, 0xA3, 0x6B, 0x30, 0x72, 0x4E, 0xBE, 0xD8,
- 0x8B, 0x5B, 0x1A, 0x56, 0x05, 0xEF, 0xEE, 0x64,
- 0xFF, 0xFD, 0x93, 0xB5, 0xD6, 0x04, 0x57, 0xAE,
- 0x4D, 0x6D, 0x2F, 0xBA, 0x40, 0xE0, 0xDB, 0xF2,
- 0xCC, 0x08, 0x35, 0x02, 0xC4, 0x65, 0x66, 0x76,
- 0xA1, 0x97, 0x9F, 0x6A, 0x90, 0xA7, 0x34, 0x1B,
- 0x18, 0xB9, 0xA2, 0xDE, 0x23, 0x1F, 0xCB, 0xE6,
- 0xAB, 0xCF, 0xAD, 0x4A, 0xF7, 0x24, 0xD0, 0xE8,
- 0x8D, 0x49, 0xEA, 0x0F, 0x94, 0x22, 0xD3, 0x74,
- 0x71, 0x0D, 0x21, 0x14, 0x39, 0x4B, 0x16, 0x25,
- 0x5A, 0xB7, 0x17, 0x67, 0x59, 0x47, 0x27, 0x4F,
- 0x32, 0x3B, 0x63, 0x0C, 0xF0, 0xF3, 0x7B, 0xC7,
- 0xCA, 0x3A, 0x9A, 0xE2, 0xD5, 0xFA, 0x91, 0xFC,
- 0x86, 0x81, 0x99, 0xB4, 0xBC, 0x7C, 0xC5, 0xBF,
- 0xC1, 0xF5, 0x77, 0xA4, 0x79, 0x11, 0x8E, 0x75,
- 0x55, 0x3D, 0x78, 0x20, 0x37, 0x3E, 0x85, 0xE4,
- 0x2E, 0x82, 0xA9, 0x7A, 0x31, 0xC9, 0xB3, 0xFE,
- 0x4C, 0x7D, 0xC3, 0xA0, 0x0E, 0x96, 0x5C, 0xC6,
- 0x1C, 0x5F, 0xD7, 0xDD, 0x83, 0xC8, 0x9E, 0xEC,
- 0x3F, 0xAF, 0x38, 0x9C, 0xD9, 0xB6, 0xDA, 0xD4,
- 0x61, 0x44, 0x43, 0xAA, 0xB1, 0xCE, 0xE7, 0x84,
- 0x00, 0x0B, 0xFB, 0x68, 0xC2, 0x3C, 0x58, 0xB2,
- 0x69, 0x7F, 0x33, 0x2B, 0x80, 0x03, 0xE9, 0x88,
- 0x29, 0x12, 0x01, 0x6E, 0x62, 0xF1, 0xA6, 0xF9,
- 0x5D, 0xD2, 0xE3, 0x53, 0x09, 0x2D, 0xBB, 0x15,
- 0xEB, 0x13, 0xA5, 0xF6, 0x73, 0x19, 0x60, 0xB0,
- 0xD1, 0x48, 0x92, 0x1D, 0x52, 0x5E, 0x45, 0x70,
- 0x98, 0x54, 0xB8, 0xDC, 0x46, 0xDF, 0x87, 0xE5 };
-
-static const unsigned char table_142[256] = {
- 0x90, 0x94, 0xBE, 0x14, 0x99, 0xEB, 0x45, 0x0F,
- 0x34, 0x4A, 0xE3, 0x79, 0xD2, 0x64, 0x4D, 0x69,
- 0x91, 0xDE, 0xB9, 0x1C, 0x59, 0x20, 0x6C, 0x0B,
- 0x16, 0xC7, 0x1D, 0x18, 0x02, 0x7D, 0x13, 0xB2,
- 0x7B, 0x81, 0xCF, 0x61, 0xA3, 0x33, 0x00, 0x73,
- 0x5A, 0x8A, 0xA1, 0xA8, 0x31, 0xAC, 0xF0, 0x67,
- 0xAE, 0xA5, 0x2A, 0x96, 0x58, 0xF4, 0xB7, 0x0E,
- 0xE1, 0x54, 0x27, 0x83, 0x09, 0x85, 0xF8, 0x84,
- 0xEA, 0xAD, 0x06, 0xED, 0x43, 0xFF, 0xA2, 0x6E,
- 0x68, 0x46, 0x74, 0x47, 0x3C, 0xAA, 0xBC, 0x55,
- 0xA7, 0xC3, 0x82, 0xDC, 0xBF, 0x38, 0x80, 0x15,
- 0xF6, 0xB3, 0x92, 0x7C, 0x93, 0x3F, 0xE9, 0x4C,
- 0x35, 0x30, 0x32, 0xF3, 0x88, 0xC0, 0x49, 0x6D,
- 0xCE, 0x42, 0xDF, 0xFD, 0x78, 0x6A, 0x24, 0xCA,
- 0xB8, 0xFC, 0xA6, 0x5F, 0x29, 0xFE, 0x0C, 0x5C,
- 0x0D, 0x23, 0x8B, 0x9D, 0xD4, 0x03, 0x2C, 0x9C,
- 0x77, 0xD8, 0x39, 0x8C, 0x57, 0xD5, 0xE0, 0x8F,
- 0xC6, 0xB0, 0xCD, 0x48, 0xC9, 0xA0, 0xDA, 0xC8,
- 0xD1, 0x5B, 0xAB, 0x37, 0x5D, 0x63, 0xAF, 0xF9,
- 0x17, 0x1B, 0xE5, 0xF1, 0x36, 0xC1, 0x04, 0x26,
- 0x6F, 0x9E, 0xD9, 0x2F, 0x7F, 0xB5, 0x3A, 0xD6,
- 0xE6, 0x40, 0x07, 0xCB, 0x7E, 0x3E, 0xC5, 0x22,
- 0xEC, 0xE2, 0xD3, 0x4E, 0x65, 0x2D, 0x70, 0xE7,
- 0x10, 0x19, 0xD0, 0xEF, 0xBD, 0xC2, 0x44, 0xB4,
- 0xF7, 0xA4, 0x53, 0x9F, 0x86, 0xFA, 0xE8, 0x4B,
- 0x28, 0x3D, 0x9B, 0x56, 0x89, 0x6B, 0x25, 0x71,
- 0x60, 0x11, 0x9A, 0x5E, 0x1A, 0x52, 0x08, 0x4F,
- 0xB1, 0xDD, 0xBB, 0x98, 0xFB, 0x12, 0x3B, 0x0A,
- 0x2E, 0xDB, 0x62, 0x8D, 0xC4, 0x75, 0xA9, 0x2B,
- 0xE4, 0x97, 0x72, 0xF5, 0xEE, 0xF2, 0xB6, 0x21,
- 0xBA, 0x7A, 0x76, 0x41, 0x50, 0x66, 0x05, 0x8E,
- 0xCC, 0x1E, 0x87, 0xD7, 0x01, 0x1F, 0x51, 0x95 };
-
-static const unsigned char table_143[32] = {
- 0x0E, 0x16, 0x18, 0x11, 0x0C, 0x01, 0x12, 0x1F,
- 0x08, 0x15, 0x0A, 0x06, 0x1C, 0x1E, 0x02, 0x1A,
- 0x17, 0x03, 0x07, 0x13, 0x05, 0x19, 0x10, 0x0F,
- 0x0D, 0x14, 0x09, 0x0B, 0x1B, 0x00, 0x1D, 0x04 };
-
-static const unsigned char table_144[32] = {
- 0x00, 0x1B, 0x17, 0x19, 0x1D, 0x11, 0x0D, 0x1A,
- 0x13, 0x03, 0x1E, 0x09, 0x10, 0x0E, 0x15, 0x05,
- 0x0B, 0x1C, 0x1F, 0x08, 0x0A, 0x06, 0x01, 0x0F,
- 0x16, 0x14, 0x02, 0x04, 0x07, 0x18, 0x12, 0x0C };
-
-static const unsigned char table_145[256] = {
- 0xF9, 0x2C, 0x38, 0x74, 0xDA, 0x65, 0x85, 0x0E,
- 0xBA, 0x64, 0xDB, 0xE3, 0xB6, 0x8B, 0x0B, 0x5E,
- 0x01, 0x0F, 0x12, 0x8C, 0xD4, 0xCC, 0xB1, 0x7B,
- 0xE7, 0xBC, 0x2E, 0x87, 0x84, 0x3B, 0xF8, 0x4C,
- 0x8E, 0x59, 0x2D, 0xAA, 0xCE, 0x28, 0x1B, 0xEE,
- 0x7F, 0x5C, 0xFB, 0x62, 0x05, 0xD9, 0xDD, 0x9D,
- 0x49, 0x66, 0x82, 0x71, 0xD2, 0xC7, 0xEB, 0xCF,
- 0x5B, 0x41, 0x25, 0xC8, 0x6C, 0xFF, 0x78, 0x97,
- 0x0C, 0xA2, 0x50, 0x7A, 0xAF, 0x2F, 0xB0, 0x7E,
- 0xBB, 0x73, 0xA0, 0x9B, 0x09, 0xDE, 0x35, 0xE9,
- 0x5A, 0x70, 0x56, 0xC5, 0x81, 0x19, 0x55, 0xAB,
- 0xC1, 0xB4, 0x2A, 0x30, 0x54, 0x6F, 0x3E, 0x46,
- 0x5D, 0x37, 0xF5, 0x57, 0x6B, 0x7C, 0x43, 0xE1,
- 0x4A, 0x3F, 0xB2, 0x4B, 0x77, 0xB5, 0x44, 0xD6,
- 0x91, 0x11, 0x72, 0xE8, 0xBE, 0xA5, 0xA8, 0xD3,
- 0x9A, 0x17, 0x86, 0x88, 0x16, 0x3C, 0x36, 0xD8,
- 0x6E, 0x07, 0x8D, 0x5F, 0xFA, 0xF1, 0x24, 0x7D,
- 0x20, 0x60, 0x0D, 0x89, 0xC9, 0x29, 0xA7, 0x2B,
- 0x4E, 0x10, 0x9F, 0xE5, 0x61, 0x32, 0x3A, 0xBF,
- 0x93, 0xE6, 0xF3, 0x52, 0x80, 0xC4, 0x02, 0x22,
- 0xA4, 0xBD, 0xF0, 0x48, 0x51, 0xF2, 0xD7, 0x33,
- 0x00, 0x53, 0x98, 0xEC, 0x47, 0x39, 0xB9, 0x90,
- 0x76, 0x4F, 0x68, 0x3D, 0x9C, 0x92, 0xD5, 0xB8,
- 0xAE, 0xD0, 0xF4, 0x67, 0x58, 0xC0, 0x06, 0x08,
- 0x14, 0x31, 0xDC, 0xA1, 0x15, 0xDF, 0xCA, 0xE2,
- 0x23, 0xFE, 0xE4, 0x8F, 0x0A, 0xFC, 0x8A, 0xA3,
- 0xC6, 0xCD, 0x6A, 0x75, 0xFD, 0x42, 0xB7, 0x79,
- 0x96, 0x1D, 0x63, 0x18, 0xA9, 0x1C, 0x83, 0x6D,
- 0xE0, 0x34, 0x04, 0xA6, 0x13, 0xAC, 0xD1, 0xF7,
- 0x26, 0xC3, 0x1F, 0x27, 0x45, 0x95, 0xCB, 0x21,
- 0xED, 0x1A, 0x9E, 0x99, 0xEA, 0x40, 0x94, 0x4D,
- 0x69, 0xF6, 0xEF, 0xC2, 0xAD, 0x03, 0xB3, 0x1E };
-
-static const unsigned char table_146[256] = {
- 0x1C, 0xF5, 0x16, 0xD2, 0xCC, 0xDC, 0x1E, 0x29,
- 0xE3, 0x17, 0x3B, 0x66, 0x6A, 0xF7, 0x03, 0xB2,
- 0x92, 0x45, 0x4D, 0xD6, 0x0C, 0x5E, 0xE6, 0x01,
- 0xDE, 0xCE, 0x83, 0xFA, 0x35, 0x02, 0x85, 0xC4,
- 0x2E, 0x89, 0x8D, 0xE7, 0x30, 0x93, 0xDD, 0x70,
- 0x80, 0xD9, 0x6D, 0x81, 0x07, 0x8E, 0xA9, 0xA6,
- 0x5F, 0xC9, 0xF3, 0x9D, 0x65, 0xE8, 0x88, 0x0B,
- 0x49, 0xAA, 0xB7, 0x6C, 0x11, 0xFC, 0x6F, 0xA3,
- 0xF8, 0x52, 0x0E, 0xD4, 0x08, 0x25, 0x27, 0x33,
- 0x2F, 0xF0, 0x2B, 0x47, 0xDA, 0x4C, 0x39, 0x54,
- 0xB9, 0xC1, 0xEA, 0x7C, 0x44, 0xEB, 0x06, 0xE1,
- 0x8C, 0x9B, 0x74, 0x42, 0x4F, 0x0A, 0x69, 0x2A,
- 0x2D, 0xA1, 0x19, 0xD5, 0xC3, 0x87, 0x68, 0xFF,
- 0xEC, 0xE4, 0x86, 0xCF, 0xF6, 0x79, 0x34, 0xA8,
- 0x72, 0xF4, 0x8B, 0xAF, 0xA5, 0x00, 0xBA, 0x5C,
- 0x23, 0xB8, 0xC8, 0x59, 0xBF, 0x6E, 0xCB, 0x20,
- 0x1F, 0x53, 0x97, 0x4B, 0xD0, 0x55, 0x5B, 0xDF,
- 0x8A, 0xED, 0x9A, 0x62, 0xC5, 0xD7, 0x18, 0x82,
- 0xC7, 0x12, 0x15, 0x1B, 0xC0, 0x38, 0xCA, 0x26,
- 0xDB, 0xAE, 0xF9, 0x90, 0x1A, 0xF2, 0x56, 0x32,
- 0x21, 0x3C, 0x43, 0xEE, 0xA4, 0x13, 0x94, 0xA2,
- 0x46, 0x77, 0xBC, 0xB6, 0x9C, 0x0D, 0xCD, 0x37,
- 0x63, 0x60, 0x6B, 0x3A, 0x3E, 0xA7, 0xD8, 0xFE,
- 0xFB, 0xEF, 0x67, 0xFD, 0xAD, 0xF1, 0x09, 0x1D,
- 0xE9, 0x51, 0xB4, 0x95, 0x75, 0x0F, 0xB3, 0xD3,
- 0xAB, 0x22, 0xBB, 0x61, 0x7F, 0x5A, 0x58, 0x7B,
- 0x73, 0xC2, 0x05, 0xE0, 0x14, 0xE2, 0xAC, 0x91,
- 0xBE, 0x4E, 0xC6, 0x7A, 0x84, 0x50, 0x28, 0x3F,
- 0xB0, 0x04, 0x7E, 0xD1, 0x40, 0xBD, 0xE5, 0x71,
- 0xB1, 0x78, 0x41, 0x9E, 0x57, 0x64, 0x8F, 0x24,
- 0x4A, 0x9F, 0x3D, 0x31, 0x36, 0x5D, 0xA0, 0x2C,
- 0x7D, 0x96, 0x76, 0x99, 0xB5, 0x48, 0x98, 0x10 };
-
-static const unsigned char table_147[32] = {
- 0x17, 0x07, 0x0D, 0x16, 0x00, 0x1B, 0x1F, 0x09,
- 0x10, 0x11, 0x14, 0x0A, 0x02, 0x06, 0x13, 0x0C,
- 0x08, 0x1E, 0x0F, 0x12, 0x05, 0x15, 0x19, 0x01,
- 0x1C, 0x1A, 0x03, 0x18, 0x04, 0x0B, 0x1D, 0x0E };
-
-static const unsigned char table_148[256] = {
- 0xFB, 0x23, 0xBC, 0x5A, 0x8C, 0x02, 0x42, 0x3B,
- 0x95, 0x0C, 0x21, 0x0E, 0x14, 0xDF, 0x11, 0xC0,
- 0xDB, 0x5E, 0xD3, 0xEA, 0xCE, 0xB4, 0x32, 0x12,
- 0x70, 0x68, 0xA3, 0x25, 0x5B, 0x4B, 0x47, 0xA5,
- 0x84, 0x9B, 0xFA, 0xD1, 0xE1, 0x3C, 0x20, 0x93,
- 0x41, 0x26, 0x81, 0x39, 0x17, 0xA4, 0xCF, 0xB9,
- 0xC5, 0x5F, 0x1C, 0xB3, 0x88, 0xC2, 0x92, 0x30,
- 0x0A, 0xB8, 0xA0, 0xE2, 0x50, 0x2B, 0x48, 0x1E,
- 0xD5, 0x13, 0xC7, 0x46, 0x9E, 0x2A, 0xF7, 0x7E,
- 0xE8, 0x82, 0x60, 0x7A, 0x36, 0x97, 0x0F, 0x8F,
- 0x8B, 0x80, 0xE0, 0xEB, 0xB1, 0xC6, 0x6E, 0xAE,
- 0x90, 0x76, 0xA7, 0x31, 0xBE, 0x9C, 0x18, 0x6D,
- 0xAB, 0x6C, 0x7B, 0xFE, 0x62, 0x05, 0xE9, 0x66,
- 0x2E, 0x38, 0xB5, 0xB2, 0xFD, 0xFC, 0x7F, 0xE3,
- 0xA1, 0xF1, 0x99, 0x4D, 0x79, 0x22, 0xD2, 0x37,
- 0x29, 0x01, 0x54, 0x00, 0xBD, 0x51, 0x1B, 0x07,
- 0x0B, 0x4A, 0xEE, 0x57, 0xDA, 0x1A, 0x06, 0xCA,
- 0xCB, 0x9A, 0xC9, 0x7D, 0xE4, 0xDC, 0xE5, 0x8D,
- 0x75, 0x4F, 0xF6, 0xA2, 0x65, 0x7C, 0xD9, 0x9D,
- 0x03, 0x27, 0x2D, 0x4C, 0x49, 0xD4, 0x5D, 0x3E,
- 0xBA, 0x1D, 0xD8, 0x91, 0x74, 0x10, 0xF8, 0xDE,
- 0xEF, 0xF0, 0x6A, 0x04, 0x72, 0x08, 0x78, 0x3A,
- 0x53, 0xC4, 0x34, 0xF2, 0x64, 0xAF, 0x86, 0xC3,
- 0xF3, 0x73, 0x67, 0xCC, 0x58, 0xF4, 0x96, 0xAC,
- 0x3D, 0xE7, 0x15, 0x8E, 0x19, 0x61, 0xF9, 0xB6,
- 0xCD, 0x87, 0xAA, 0xB0, 0x1F, 0x6F, 0xAD, 0x28,
- 0xC8, 0x69, 0x56, 0xC1, 0x71, 0xED, 0xE6, 0x98,
- 0x6B, 0x59, 0xB7, 0xF5, 0x2C, 0xEC, 0xA8, 0x94,
- 0x89, 0xBB, 0xA9, 0xD7, 0x2F, 0x8A, 0x4E, 0xD6,
- 0x33, 0x16, 0x0D, 0x83, 0x5C, 0x52, 0x85, 0xA6,
- 0x40, 0x45, 0x9F, 0x44, 0x63, 0x35, 0x77, 0xFF,
- 0x09, 0x43, 0xBF, 0xD0, 0x55, 0xDD, 0x3F, 0x24 };
-
-static const unsigned char table_149[32] = {
- 0x1B, 0x0B, 0x0C, 0x06, 0x1F, 0x17, 0x04, 0x1A,
- 0x1E, 0x02, 0x0F, 0x16, 0x0E, 0x09, 0x10, 0x01,
- 0x13, 0x19, 0x11, 0x00, 0x0A, 0x05, 0x03, 0x1C,
- 0x18, 0x1D, 0x14, 0x0D, 0x07, 0x08, 0x15, 0x12 };
-
-static const unsigned char table_150[256] = {
- 0x57, 0xBC, 0x9D, 0x46, 0x14, 0xD0, 0x94, 0x95,
- 0x1B, 0x12, 0xB8, 0xD4, 0x53, 0x73, 0x83, 0xE6,
- 0x75, 0xE1, 0xD1, 0x0D, 0xDF, 0x23, 0x13, 0x40,
- 0xF1, 0x0C, 0xA0, 0xC1, 0x22, 0xDA, 0xE8, 0xFB,
- 0xE5, 0xC4, 0x16, 0x9C, 0x3F, 0xC3, 0x78, 0x3A,
- 0x06, 0xC7, 0xA8, 0x79, 0xA4, 0xB3, 0x55, 0x88,
- 0xA9, 0x82, 0xE3, 0x68, 0xFC, 0x3B, 0x26, 0x81,
- 0xB4, 0x0A, 0x7D, 0x96, 0xDB, 0x2C, 0xE2, 0xCD,
- 0x92, 0x5C, 0xED, 0x0E, 0x42, 0x98, 0xBE, 0xB7,
- 0x63, 0x25, 0x7B, 0xD9, 0xEF, 0x11, 0xB9, 0xA3,
- 0xFA, 0x00, 0x2A, 0x91, 0x71, 0xBF, 0xB2, 0x3D,
- 0x20, 0x4C, 0xB0, 0x8C, 0x3C, 0x27, 0xAF, 0x09,
- 0x10, 0x5D, 0x2B, 0x1D, 0xBD, 0x4B, 0x54, 0xD3,
- 0xAB, 0x1A, 0xE7, 0xF8, 0x56, 0x65, 0xA5, 0xAD,
- 0xEC, 0x17, 0x45, 0x28, 0xCA, 0xEA, 0x01, 0xF5,
- 0x34, 0x84, 0x43, 0x8B, 0x03, 0x02, 0x90, 0x6B,
- 0x60, 0xCE, 0x19, 0x86, 0x4F, 0x08, 0x35, 0x9A,
- 0xAE, 0x07, 0xE0, 0xB6, 0xD6, 0x2D, 0xD2, 0x89,
- 0x5F, 0xA6, 0x72, 0x05, 0x36, 0xB5, 0xC0, 0x5A,
- 0x4D, 0xD7, 0x30, 0x37, 0x87, 0x50, 0xA2, 0x48,
- 0x29, 0xAC, 0xDE, 0x93, 0x24, 0x6E, 0x1E, 0xF7,
- 0x52, 0x5E, 0x41, 0xC8, 0xEB, 0x31, 0x7E, 0xE9,
- 0x67, 0x7A, 0x47, 0x85, 0x8D, 0x74, 0x9E, 0x64,
- 0x38, 0x9B, 0xBA, 0xCC, 0x9F, 0x8E, 0xEE, 0x0F,
- 0xB1, 0x7C, 0x6A, 0xBB, 0x2E, 0x58, 0x70, 0x7F,
- 0x4E, 0x4A, 0x1C, 0x5B, 0xF0, 0xA1, 0x61, 0xF6,
- 0x15, 0x33, 0xE4, 0xF9, 0x2F, 0x62, 0x1F, 0x76,
- 0x32, 0xCB, 0x49, 0xFE, 0x8F, 0xD5, 0xDC, 0x66,
- 0x0B, 0x3E, 0xC5, 0x21, 0xC6, 0x6C, 0x18, 0xC2,
- 0x6D, 0xFF, 0x51, 0x99, 0xCF, 0xFD, 0x59, 0xA7,
- 0xAA, 0x8A, 0xF2, 0x69, 0x39, 0x6F, 0x77, 0xDD,
- 0x97, 0xC9, 0xF3, 0x04, 0xD8, 0xF4, 0x80, 0x44 };
-
-static const unsigned char table_151[256] = {
- 0x78, 0x6C, 0xC5, 0x0C, 0x2D, 0xA7, 0x97, 0x9C,
- 0x22, 0x76, 0x3E, 0x81, 0x51, 0x47, 0x59, 0x71,
- 0xB1, 0xA2, 0x4A, 0x3C, 0xB5, 0x16, 0x06, 0x95,
- 0xB9, 0x01, 0xE6, 0x91, 0x96, 0x1C, 0x1B, 0xAD,
- 0x61, 0x64, 0xB2, 0xE7, 0x29, 0x19, 0x52, 0x3B,
- 0xFA, 0xAF, 0x30, 0xDB, 0xD4, 0x0B, 0xFE, 0x75,
- 0x1F, 0xBE, 0xCB, 0xF6, 0xEA, 0x31, 0xF8, 0xD8,
- 0xA3, 0x82, 0x73, 0x1D, 0x99, 0xF0, 0xCC, 0xB6,
- 0x46, 0x26, 0xAA, 0x8C, 0x87, 0x90, 0x24, 0x8F,
- 0x7A, 0x13, 0xEE, 0xD1, 0xA9, 0x05, 0xB3, 0xF7,
- 0x02, 0x7C, 0x4C, 0x1E, 0xFF, 0xE5, 0x77, 0xAB,
- 0xD6, 0x98, 0x20, 0x4D, 0xC4, 0x23, 0xF4, 0xA4,
- 0x85, 0x9A, 0x8E, 0x1A, 0x0E, 0xF5, 0x15, 0x60,
- 0x38, 0x72, 0xE9, 0xF1, 0xC3, 0x68, 0xF2, 0x93,
- 0xD3, 0x2A, 0x48, 0x74, 0xC2, 0x57, 0xA1, 0x7D,
- 0x94, 0x37, 0x92, 0x5C, 0xE1, 0x41, 0x83, 0xD5,
- 0x65, 0x14, 0xA6, 0xDC, 0x44, 0x27, 0xEF, 0xD7,
- 0x25, 0x10, 0x2C, 0x7F, 0x40, 0xA5, 0x55, 0xBD,
- 0x2B, 0x0D, 0xD0, 0xFC, 0xDF, 0xA0, 0x04, 0x00,
- 0x62, 0xB4, 0x5A, 0xEB, 0x6B, 0x84, 0x7E, 0x6A,
- 0xDE, 0xED, 0x66, 0x03, 0xFB, 0x2E, 0x4F, 0x4E,
- 0xBB, 0x36, 0x5B, 0x18, 0xE3, 0x69, 0x3F, 0xEC,
- 0xE4, 0xD2, 0x0A, 0x34, 0x63, 0xCF, 0xA8, 0xF9,
- 0x9B, 0x7B, 0x6F, 0xE8, 0x49, 0xC1, 0x09, 0x54,
- 0xF3, 0x50, 0x67, 0x79, 0xC0, 0x9F, 0x8D, 0x5F,
- 0x17, 0x70, 0x11, 0xC8, 0xBC, 0xC6, 0xE0, 0x35,
- 0x39, 0xC7, 0x6E, 0x21, 0xBF, 0xDA, 0x6D, 0x28,
- 0x0F, 0xDD, 0x33, 0xAC, 0x8A, 0x12, 0xC9, 0xCD,
- 0xB8, 0x45, 0xAE, 0x32, 0xCE, 0xE2, 0x56, 0xFD,
- 0x42, 0x89, 0x86, 0xCA, 0x4B, 0x3D, 0x5E, 0xBA,
- 0x8B, 0x5D, 0xB0, 0xB7, 0xD9, 0x58, 0x2F, 0x08,
- 0x43, 0x3A, 0x53, 0x9E, 0x80, 0x88, 0x07, 0x9D };
-
-static const unsigned char table_152[32] = {
- 0x02, 0x1A, 0x17, 0x1D, 0x01, 0x03, 0x13, 0x1E,
- 0x05, 0x18, 0x06, 0x0A, 0x0C, 0x04, 0x1B, 0x00,
- 0x1C, 0x09, 0x1F, 0x16, 0x07, 0x0F, 0x0B, 0x0E,
- 0x14, 0x12, 0x0D, 0x10, 0x19, 0x11, 0x08, 0x15 };
-
-static const unsigned char table_153[32] = {
- 0x0E, 0x14, 0x12, 0x1E, 0x1C, 0x02, 0x06, 0x16,
- 0x18, 0x0D, 0x17, 0x0C, 0x1D, 0x11, 0x08, 0x19,
- 0x07, 0x0F, 0x13, 0x04, 0x03, 0x1B, 0x0B, 0x1F,
- 0x1A, 0x0A, 0x05, 0x10, 0x00, 0x01, 0x15, 0x09 };
-
-static const unsigned char table_154[256] = {
- 0x27, 0x5A, 0x08, 0x5B, 0xF4, 0x39, 0x13, 0x6F,
- 0x67, 0xEA, 0x22, 0xCA, 0x5C, 0xCF, 0x18, 0x7C,
- 0x05, 0x87, 0x60, 0xCC, 0x40, 0xC6, 0xE8, 0x6D,
- 0xF5, 0x2A, 0x2D, 0xA2, 0x8C, 0x82, 0xE9, 0xDC,
- 0xD6, 0x65, 0x74, 0x8E, 0x42, 0x4F, 0x3E, 0x55,
- 0xFF, 0xC7, 0x9D, 0x0F, 0x81, 0xE2, 0x4C, 0xE6,
- 0xEB, 0x4D, 0x70, 0xD1, 0x49, 0x43, 0x3D, 0x69,
- 0x0C, 0x45, 0x28, 0x00, 0x99, 0xAE, 0xEC, 0xB8,
- 0xC3, 0x17, 0x93, 0x8D, 0x36, 0x3C, 0x46, 0x2B,
- 0x29, 0xC5, 0xB4, 0xB1, 0xD0, 0x0D, 0xAD, 0xFE,
- 0xE5, 0xA8, 0x3B, 0x1A, 0x2C, 0xDF, 0x07, 0x86,
- 0xB0, 0xD3, 0x7A, 0x59, 0x79, 0x8B, 0xC1, 0x9A,
- 0x30, 0xDB, 0x24, 0xF3, 0xD8, 0x04, 0x25, 0xC2,
- 0xA3, 0x98, 0x96, 0x7B, 0x71, 0x4E, 0x5E, 0x58,
- 0xA5, 0x51, 0x88, 0xDA, 0xF8, 0xC0, 0x7D, 0xF6,
- 0x31, 0x5F, 0x09, 0x16, 0x21, 0x62, 0x01, 0x64,
- 0x9B, 0x3A, 0x2F, 0x61, 0x19, 0xA1, 0xB7, 0xE0,
- 0xB9, 0x12, 0xA0, 0xBA, 0x6E, 0x8A, 0xFB, 0xD9,
- 0x38, 0x1B, 0xD5, 0xB3, 0x10, 0xED, 0xE4, 0x6A,
- 0x32, 0xBD, 0x75, 0xD4, 0x1C, 0xFD, 0x73, 0x77,
- 0x54, 0xC8, 0x97, 0x47, 0x35, 0x94, 0xE3, 0xCD,
- 0x6B, 0xBB, 0xF9, 0xAC, 0x11, 0x14, 0xAF, 0x78,
- 0x3F, 0xCE, 0x26, 0x44, 0xEE, 0xFC, 0x15, 0x66,
- 0x4B, 0xA6, 0x20, 0x23, 0xBE, 0x84, 0x1D, 0x7E,
- 0x0B, 0x56, 0x92, 0x0A, 0xFA, 0xF7, 0x48, 0x33,
- 0x9E, 0x8F, 0xAB, 0x5D, 0x41, 0x50, 0xA4, 0x7F,
- 0x80, 0x4A, 0x68, 0x06, 0x2E, 0x6C, 0xC4, 0x02,
- 0x0E, 0x63, 0xF0, 0xC9, 0x91, 0xB2, 0xD2, 0x03,
- 0x37, 0xEF, 0x9C, 0x90, 0x83, 0x76, 0x1E, 0xA9,
- 0x85, 0xB6, 0x57, 0xD7, 0xF2, 0xF1, 0xE7, 0xDE,
- 0xCB, 0xAA, 0xBF, 0x89, 0x1F, 0xA7, 0xBC, 0x9F,
- 0x53, 0xE1, 0xDD, 0x72, 0x95, 0x52, 0x34, 0xB5 };
-
-static const unsigned char table_155[256] = {
- 0x75, 0x58, 0xC5, 0xA5, 0x83, 0x16, 0xF3, 0x7F,
- 0x94, 0xDE, 0xA0, 0xF6, 0xFD, 0x89, 0xA8, 0x06,
- 0x98, 0x01, 0xD9, 0x69, 0xB7, 0x0F, 0xEA, 0x73,
- 0x32, 0xF0, 0x49, 0xBF, 0x02, 0xE7, 0x22, 0x3F,
- 0xDB, 0x30, 0x5F, 0x20, 0x6A, 0x93, 0x07, 0xBC,
- 0x09, 0x0D, 0x37, 0x24, 0x90, 0x15, 0x80, 0xAF,
- 0x8F, 0x59, 0x28, 0xFF, 0x6D, 0x1E, 0x52, 0x62,
- 0xE2, 0xDD, 0x85, 0x48, 0xB5, 0xAB, 0x68, 0xAC,
- 0x7E, 0x26, 0x2C, 0xF9, 0x2A, 0xBE, 0x5B, 0xCE,
- 0x87, 0x1D, 0x96, 0xBD, 0xEF, 0x29, 0xA9, 0xC3,
- 0x9D, 0x57, 0x79, 0x6B, 0x7A, 0x82, 0x78, 0x0A,
- 0x91, 0xF2, 0x7C, 0xC2, 0x25, 0x88, 0xE3, 0x47,
- 0x64, 0x46, 0x8D, 0x19, 0xF4, 0xE6, 0xF1, 0x53,
- 0x9C, 0x54, 0x23, 0xAD, 0xA3, 0x86, 0x3A, 0x04,
- 0x67, 0x1C, 0xF5, 0x43, 0x05, 0x42, 0xD6, 0x4B,
- 0xFB, 0xD4, 0x2B, 0x08, 0x45, 0xD8, 0xCD, 0xEB,
- 0x31, 0x4A, 0x5A, 0x34, 0x9B, 0xEC, 0x4D, 0xB4,
- 0xC6, 0xFE, 0xD5, 0x5E, 0xC1, 0x39, 0x81, 0xCF,
- 0x03, 0x6E, 0x95, 0x50, 0xA1, 0x3B, 0xB3, 0xE5,
- 0x3D, 0xB1, 0xB2, 0x41, 0x17, 0x2F, 0x2E, 0xE4,
- 0x1F, 0xDC, 0xB0, 0xB6, 0x18, 0x6F, 0x44, 0x12,
- 0x0B, 0xCC, 0x4E, 0xC0, 0x51, 0x14, 0x76, 0x3C,
- 0xB9, 0x9F, 0xA4, 0xD3, 0xA7, 0xE8, 0x13, 0x55,
- 0xC8, 0x8C, 0xD2, 0xEE, 0x65, 0xB8, 0xAA, 0x6C,
- 0x2D, 0x4F, 0x56, 0xFA, 0x61, 0x4C, 0xE0, 0x5C,
- 0xA6, 0x1A, 0xD1, 0x38, 0xD7, 0x72, 0x60, 0x74,
- 0xE1, 0xBA, 0x84, 0x3E, 0x40, 0xF8, 0xC7, 0x36,
- 0x27, 0x0C, 0x70, 0x97, 0x9A, 0x7D, 0x35, 0x71,
- 0xCA, 0x1B, 0x99, 0x8E, 0xAE, 0x66, 0x63, 0xE9,
- 0xC9, 0x11, 0x8A, 0x21, 0x92, 0x5D, 0x77, 0x10,
- 0xD0, 0xC4, 0xF7, 0x7B, 0x9E, 0xCB, 0xED, 0x0E,
- 0x8B, 0x33, 0xFC, 0xBB, 0x00, 0xA2, 0xDF, 0xDA };
-
-static const unsigned char table_156[256] = {
- 0x31, 0x25, 0xB1, 0xD3, 0xAF, 0xAE, 0x84, 0x2C,
- 0x71, 0x5E, 0xD8, 0x80, 0x6F, 0x3E, 0x48, 0x86,
- 0xED, 0x54, 0x6A, 0xC3, 0xBC, 0xBF, 0x0E, 0xEA,
- 0x10, 0xA2, 0x9D, 0x91, 0x32, 0xE2, 0x7E, 0x1B,
- 0x49, 0x27, 0xFF, 0xDD, 0x8A, 0x2F, 0x8D, 0x38,
- 0xFA, 0x3C, 0x03, 0x14, 0x0F, 0x89, 0xCC, 0x07,
- 0x1A, 0xA0, 0x97, 0x37, 0xA6, 0xD6, 0x63, 0x87,
- 0xA1, 0xC2, 0x4B, 0x39, 0xCB, 0xCF, 0x69, 0x4E,
- 0xC9, 0x28, 0x1C, 0xBB, 0x42, 0x2B, 0xA9, 0x78,
- 0x5B, 0xF6, 0xE0, 0xD0, 0x5F, 0x46, 0x98, 0xCE,
- 0x1F, 0x7A, 0x34, 0x8B, 0xFD, 0x9B, 0xEF, 0x74,
- 0x05, 0xF2, 0x02, 0xC6, 0xDF, 0x73, 0x5C, 0x8E,
- 0xDE, 0x88, 0x57, 0x3B, 0x85, 0xBD, 0xC0, 0x3A,
- 0x45, 0x4D, 0x2D, 0x72, 0x0C, 0x60, 0xCA, 0x5D,
- 0x06, 0x04, 0x3D, 0x51, 0x15, 0xAD, 0xE8, 0x67,
- 0xBA, 0x43, 0x7D, 0xF8, 0xB2, 0xE6, 0xAB, 0xF4,
- 0x23, 0x6E, 0xF0, 0x6B, 0x0B, 0x2E, 0xC8, 0xC4,
- 0x4F, 0xA8, 0x6D, 0x26, 0xE9, 0x9C, 0x22, 0xB7,
- 0x00, 0xB3, 0x0A, 0x7C, 0x44, 0x55, 0x75, 0xD5,
- 0xAA, 0x66, 0x56, 0x24, 0x83, 0x90, 0xA4, 0xF5,
- 0xCD, 0xEC, 0x18, 0xDC, 0xFE, 0x96, 0xA3, 0xF7,
- 0xD2, 0xFB, 0xD1, 0x65, 0xC5, 0x08, 0x7B, 0x70,
- 0x16, 0x9A, 0x20, 0x09, 0x29, 0xDA, 0x52, 0x5A,
- 0x59, 0xB4, 0x77, 0x62, 0x9E, 0x19, 0x7F, 0x82,
- 0x4C, 0xB6, 0x0D, 0x58, 0xEE, 0x1D, 0xB9, 0x93,
- 0x50, 0xD9, 0x30, 0xE4, 0x13, 0x01, 0x36, 0x8F,
- 0x53, 0x3F, 0x64, 0xA5, 0xB5, 0xD7, 0x81, 0x41,
- 0x17, 0xE5, 0x94, 0xE3, 0xF9, 0x61, 0x76, 0xE1,
- 0x9F, 0xFC, 0x1E, 0x12, 0xDB, 0x21, 0x79, 0x2A,
- 0xAC, 0xF3, 0x6C, 0xC1, 0x95, 0x92, 0xEB, 0xA7,
- 0x11, 0xC7, 0xB8, 0x4A, 0x33, 0xB0, 0x99, 0xE7,
- 0xF1, 0x68, 0xBE, 0x35, 0x40, 0x8C, 0xD4, 0x47 };
-
-static const unsigned char table_157[32] = {
- 0x00, 0x0D, 0x03, 0x02, 0x11, 0x04, 0x18, 0x0B,
- 0x14, 0x1D, 0x1C, 0x13, 0x1B, 0x17, 0x10, 0x15,
- 0x01, 0x19, 0x07, 0x09, 0x1A, 0x16, 0x12, 0x1E,
- 0x08, 0x06, 0x0C, 0x0E, 0x1F, 0x0F, 0x0A, 0x05 };
-
-static const unsigned char table_158[256] = {
- 0x68, 0x26, 0x80, 0x0B, 0xB8, 0xD5, 0x8C, 0xB7,
- 0x65, 0xEF, 0xBC, 0x94, 0x28, 0xB9, 0xB2, 0xD2,
- 0x92, 0xA4, 0x55, 0x27, 0xE0, 0x40, 0x6C, 0x41,
- 0x25, 0xBD, 0xAF, 0xEA, 0xB1, 0x19, 0xA5, 0xC9,
- 0x0E, 0xED, 0xB4, 0xF9, 0x8B, 0x6A, 0xAE, 0xD8,
- 0x64, 0x83, 0xC1, 0xD3, 0x04, 0xF4, 0xFA, 0xC3,
- 0x46, 0x2C, 0xA8, 0xBB, 0x3A, 0x47, 0x33, 0x8F,
- 0x52, 0x86, 0x08, 0x9D, 0x1D, 0x59, 0x8E, 0x91,
- 0x32, 0xCF, 0x6B, 0x75, 0xB0, 0x7F, 0xC7, 0x24,
- 0x05, 0x6F, 0x00, 0x1C, 0x2D, 0xAC, 0xDA, 0x45,
- 0x73, 0xB3, 0x3E, 0xD6, 0x54, 0x61, 0x03, 0x77,
- 0xF8, 0xD9, 0xE2, 0x4B, 0xFF, 0xF2, 0x0C, 0x4F,
- 0x93, 0x71, 0xA7, 0x3D, 0x66, 0x88, 0x98, 0xF1,
- 0xB6, 0x7A, 0x2B, 0xCD, 0x44, 0x3C, 0x37, 0x5A,
- 0x96, 0x23, 0x9F, 0xBF, 0x7D, 0x5E, 0x2A, 0x35,
- 0x72, 0x79, 0xE1, 0xA3, 0x84, 0x99, 0x38, 0x49,
- 0xC8, 0xDB, 0x30, 0xDC, 0xAD, 0x3F, 0xF6, 0x09,
- 0x69, 0x95, 0xE5, 0x67, 0xA1, 0xFD, 0xF7, 0x1B,
- 0xEC, 0x17, 0xD4, 0xEB, 0x29, 0x36, 0x3B, 0x15,
- 0xDE, 0x2E, 0xC5, 0x70, 0x6D, 0x53, 0x56, 0xAB,
- 0xC0, 0x43, 0xC2, 0xE7, 0x31, 0xE6, 0xA6, 0x78,
- 0x5C, 0x7C, 0x48, 0x10, 0x87, 0xCC, 0x9E, 0x7E,
- 0x5F, 0xE9, 0x07, 0x5B, 0xF5, 0xEE, 0xB5, 0xCA,
- 0x62, 0x18, 0xBE, 0x20, 0x16, 0xDF, 0x13, 0x4E,
- 0x7B, 0x02, 0x11, 0x4C, 0x51, 0x85, 0x0D, 0x22,
- 0xF3, 0x14, 0x63, 0x76, 0xD0, 0x0F, 0xE4, 0xCB,
- 0xCE, 0xA0, 0x82, 0xE3, 0x01, 0xAA, 0x5D, 0x4A,
- 0x4D, 0xFB, 0x39, 0x8A, 0x2F, 0xDD, 0xE8, 0x06,
- 0x1A, 0x90, 0x81, 0x50, 0x8D, 0x89, 0x97, 0x1E,
- 0xFC, 0x60, 0x12, 0x42, 0x9C, 0xF0, 0x34, 0xD7,
- 0xD1, 0x1F, 0x0A, 0x21, 0xA9, 0x6E, 0xC4, 0xBA,
- 0x9A, 0x57, 0xA2, 0x74, 0xC6, 0xFE, 0x9B, 0x58 };
-
-static const unsigned char table_159[256] = {
- 0xE5, 0xBF, 0x84, 0x56, 0xD6, 0x43, 0x3E, 0xA5,
- 0x64, 0x87, 0x44, 0x63, 0x4A, 0x4C, 0x8D, 0x24,
- 0x1C, 0xDA, 0x89, 0x52, 0x80, 0x4F, 0xE4, 0xBC,
- 0xC5, 0xF4, 0x27, 0x75, 0x9C, 0xF0, 0xE1, 0x06,
- 0x99, 0x48, 0xF2, 0x57, 0x34, 0x9A, 0xA8, 0x62,
- 0xC9, 0xD5, 0x16, 0x6D, 0x55, 0xFA, 0x37, 0x5A,
- 0x2A, 0xC6, 0x45, 0xDD, 0x1B, 0x76, 0x50, 0xE2,
- 0x69, 0x41, 0x6C, 0xC4, 0x3C, 0x47, 0xA9, 0x92,
- 0x00, 0x3D, 0x6F, 0xE7, 0x7A, 0x3A, 0x33, 0x53,
- 0xF7, 0x03, 0xA7, 0xB1, 0x15, 0x78, 0x0B, 0x67,
- 0x2E, 0x21, 0xF1, 0xD4, 0xB3, 0x98, 0x60, 0x58,
- 0xBB, 0x82, 0x1E, 0x70, 0x0A, 0xA2, 0x02, 0x17,
- 0xFF, 0x9F, 0xD2, 0xAF, 0xC7, 0xDC, 0x68, 0x83,
- 0x42, 0xCA, 0x08, 0x39, 0x20, 0xEC, 0x77, 0x96,
- 0x5B, 0xAD, 0x09, 0x6B, 0x40, 0xC2, 0x91, 0x51,
- 0x10, 0xD9, 0xF9, 0xC1, 0xB5, 0xDF, 0xDB, 0xC0,
- 0x7D, 0xAB, 0xAE, 0x54, 0x35, 0xF3, 0xA1, 0xE6,
- 0xEA, 0x14, 0xBA, 0xFC, 0xE8, 0xEB, 0xF6, 0xBD,
- 0x8C, 0x72, 0x1F, 0xE9, 0xFB, 0x7C, 0xCF, 0x49,
- 0xE3, 0xA3, 0x22, 0x9D, 0x46, 0x71, 0x94, 0x31,
- 0x2D, 0x65, 0x2B, 0x32, 0x18, 0xB6, 0x90, 0xF8,
- 0x11, 0x5F, 0xA0, 0xEF, 0xED, 0x1A, 0x25, 0x2C,
- 0x3B, 0xFD, 0x2F, 0x73, 0xB9, 0x7E, 0xDE, 0xB4,
- 0x97, 0x0F, 0x7F, 0x86, 0x93, 0x07, 0x19, 0xCE,
- 0xE0, 0xB7, 0xEE, 0x26, 0xD1, 0x01, 0x59, 0x5C,
- 0xC3, 0x79, 0x8B, 0xD3, 0x4B, 0x04, 0xD0, 0x29,
- 0x0D, 0x3F, 0xB2, 0x30, 0xCC, 0x36, 0xFE, 0xB0,
- 0xF5, 0x8E, 0xA6, 0x8A, 0xC8, 0xD8, 0x05, 0xB8,
- 0x12, 0xBE, 0x81, 0x4D, 0x38, 0xAC, 0x1D, 0x9E,
- 0x66, 0x5E, 0x7B, 0x6E, 0x0C, 0xCD, 0x6A, 0x88,
- 0xAA, 0x0E, 0x61, 0x5D, 0x95, 0x4E, 0xD7, 0x74,
- 0xCB, 0x9B, 0x13, 0x8F, 0xA4, 0x28, 0x23, 0x85 };
-
-static const unsigned char table_160[256] = {
- 0x35, 0x44, 0x0E, 0x92, 0x75, 0x83, 0x9D, 0x53,
- 0xA5, 0x90, 0xF8, 0xF7, 0x54, 0x74, 0xDF, 0x3D,
- 0x5A, 0xAA, 0xC6, 0x26, 0x7A, 0xFC, 0x79, 0x6C,
- 0x56, 0xB3, 0x32, 0xE3, 0x1C, 0xF9, 0xDC, 0xE6,
- 0xA2, 0x93, 0x71, 0xFF, 0x1D, 0xEB, 0xB2, 0x04,
- 0x96, 0x46, 0x0C, 0x2B, 0x17, 0xEE, 0x28, 0x25,
- 0xD9, 0xAE, 0x11, 0xA7, 0x40, 0x45, 0xFB, 0x80,
- 0x18, 0xF1, 0xCB, 0x2E, 0x24, 0xF3, 0xEC, 0x4F,
- 0xAB, 0xD7, 0xD4, 0xC4, 0xFD, 0x4B, 0xAD, 0xC9,
- 0x4C, 0x08, 0xAC, 0xF4, 0xCD, 0xB7, 0xF2, 0x15,
- 0x02, 0x2F, 0x16, 0x34, 0x65, 0x8A, 0x87, 0xCC,
- 0x50, 0x0F, 0x9B, 0xC2, 0xC8, 0x7B, 0xEA, 0x8E,
- 0xE4, 0xD6, 0x97, 0x30, 0xA8, 0xA0, 0x94, 0xC5,
- 0xE8, 0x12, 0x27, 0xCE, 0x84, 0xDD, 0xB1, 0x47,
- 0x7E, 0xE7, 0xE1, 0x3A, 0x37, 0x21, 0x2D, 0x3B,
- 0x20, 0x60, 0x1E, 0x1B, 0x82, 0xBE, 0xA3, 0x70,
- 0x98, 0xBF, 0xA6, 0x4D, 0x76, 0x86, 0x42, 0x9F,
- 0xCF, 0xE0, 0x14, 0x4A, 0x0B, 0xB4, 0x36, 0xF5,
- 0x85, 0xB8, 0xC0, 0x6A, 0xE9, 0x7D, 0xBD, 0x4E,
- 0x8F, 0x51, 0x0D, 0x5B, 0x6B, 0x58, 0x5F, 0x03,
- 0x6F, 0xBC, 0x5D, 0x1F, 0x7F, 0xDB, 0x00, 0xC1,
- 0x13, 0xF0, 0xD1, 0xFA, 0xDA, 0x05, 0x39, 0xD3,
- 0x38, 0xD2, 0x89, 0xE2, 0x88, 0x5E, 0x5C, 0x6D,
- 0xCA, 0xB0, 0x01, 0x63, 0x8B, 0x59, 0xA4, 0xD0,
- 0x78, 0x19, 0xB5, 0x62, 0x1A, 0x69, 0x8D, 0x9C,
- 0x22, 0x3F, 0x9E, 0x33, 0x72, 0x2A, 0x41, 0x29,
- 0xFE, 0xF6, 0x64, 0x7C, 0x66, 0xB6, 0xAF, 0x23,
- 0x8C, 0x68, 0x6E, 0x49, 0x07, 0x99, 0x77, 0x3E,
- 0x9A, 0x73, 0xD8, 0x55, 0x0A, 0x3C, 0xBA, 0xA9,
- 0x52, 0xED, 0x91, 0x09, 0x95, 0xC7, 0x43, 0xD5,
- 0x57, 0x61, 0x81, 0xEF, 0x06, 0xDE, 0x48, 0x31,
- 0xBB, 0x2C, 0xE5, 0xC3, 0x67, 0xA1, 0x10, 0xB9 };
-
-static const unsigned char table_161[256] = {
- 0x8F, 0x1A, 0x81, 0xA2, 0x2C, 0x56, 0x6D, 0xCD,
- 0x4A, 0x33, 0x50, 0xE9, 0xE0, 0x12, 0x5A, 0x43,
- 0x2D, 0x4F, 0xEA, 0x95, 0xFD, 0x49, 0xAB, 0xA3,
- 0x79, 0x42, 0x0B, 0xB8, 0x89, 0x40, 0x71, 0x14,
- 0x80, 0x55, 0xAF, 0xCF, 0x3E, 0x64, 0x8B, 0x74,
- 0xBF, 0x9C, 0x24, 0x97, 0xD1, 0xBA, 0x48, 0xD2,
- 0x08, 0x1F, 0xDD, 0xA7, 0xDC, 0x92, 0x30, 0x75,
- 0x31, 0x37, 0x67, 0x06, 0x68, 0x72, 0x6F, 0x05,
- 0x8A, 0x7C, 0x4C, 0x3C, 0x19, 0x28, 0x86, 0x3D,
- 0x93, 0xDA, 0xF4, 0xC7, 0x17, 0x85, 0xAC, 0x02,
- 0x78, 0x04, 0xAD, 0x03, 0x8D, 0x11, 0xC5, 0x9D,
- 0x3A, 0x73, 0x82, 0x59, 0x51, 0x9F, 0x27, 0x47,
- 0xE7, 0xED, 0x1E, 0xFF, 0x34, 0x01, 0x5B, 0x4B,
- 0xCA, 0x6C, 0x69, 0xBB, 0x3B, 0xC4, 0x5F, 0xDF,
- 0x09, 0x6B, 0x7D, 0xC9, 0x88, 0x45, 0x57, 0xD3,
- 0x2A, 0x4E, 0xF1, 0xC2, 0xA9, 0xB6, 0x18, 0xD4,
- 0xA0, 0x1C, 0x4D, 0x0E, 0xE5, 0xE1, 0xD7, 0xB2,
- 0x0C, 0x3F, 0x00, 0x61, 0x16, 0x0D, 0x32, 0x62,
- 0x58, 0x63, 0xEE, 0xEF, 0x2F, 0x5D, 0xB0, 0x20,
- 0x7A, 0x10, 0xE6, 0xA1, 0xF9, 0xD8, 0x6E, 0xCB,
- 0xF0, 0x9B, 0x84, 0x8E, 0xF2, 0xFE, 0xC8, 0x7F,
- 0xBD, 0xF8, 0x07, 0xC6, 0x39, 0xBC, 0xCC, 0x22,
- 0x54, 0x15, 0x9A, 0xA4, 0xC1, 0x2B, 0x1B, 0x25,
- 0xDE, 0x6A, 0xDB, 0x90, 0xEB, 0xB7, 0xD0, 0x44,
- 0xA6, 0xB9, 0xB1, 0x23, 0x9E, 0x65, 0x83, 0xFA,
- 0x96, 0xB5, 0x0F, 0xF6, 0xD6, 0xE8, 0x53, 0x13,
- 0x76, 0xD5, 0x35, 0x87, 0xE3, 0x38, 0xF5, 0xAE,
- 0xB3, 0xCE, 0xE2, 0x70, 0xD9, 0x66, 0x5C, 0x26,
- 0xC3, 0xFC, 0xF7, 0x94, 0xF3, 0xEC, 0xFB, 0x99,
- 0x91, 0x77, 0xB4, 0x46, 0xA5, 0x98, 0x7B, 0x1D,
- 0x52, 0x2E, 0xA8, 0x60, 0x5E, 0x29, 0x21, 0x7E,
- 0xBE, 0x0A, 0x36, 0x41, 0xC0, 0x8C, 0xE4, 0xAA };
-
-static const unsigned char table_162[256] = {
- 0xF7, 0x1B, 0xC0, 0x31, 0x5A, 0x23, 0xEA, 0xE9,
- 0xFB, 0x14, 0x6A, 0xE8, 0x04, 0x65, 0x5B, 0x2C,
- 0x41, 0xD9, 0xEB, 0xE4, 0x8D, 0x1D, 0xCA, 0x8F,
- 0x5E, 0x43, 0xAF, 0x46, 0x0A, 0x01, 0x0C, 0xB4,
- 0x95, 0x52, 0x92, 0xE0, 0x10, 0x57, 0x0F, 0x71,
- 0xB1, 0x26, 0xD8, 0x05, 0x69, 0x3C, 0x54, 0xDF,
- 0xFF, 0x9D, 0x51, 0xA0, 0xA1, 0x0B, 0xC1, 0x20,
- 0x6D, 0xFA, 0x47, 0x15, 0x09, 0xD3, 0xE1, 0xA9,
- 0x66, 0x12, 0x5C, 0x49, 0x1E, 0x3B, 0xD0, 0x8B,
- 0x62, 0xBD, 0x06, 0xE5, 0x00, 0x98, 0x4E, 0x32,
- 0xB0, 0x2D, 0x2A, 0x7F, 0x03, 0xD5, 0x99, 0x7E,
- 0xAB, 0x22, 0xC6, 0xC3, 0x2F, 0x4C, 0x33, 0x45,
- 0xE3, 0x3F, 0xF9, 0xB2, 0xFE, 0x36, 0xE7, 0xF8,
- 0x55, 0x0D, 0x56, 0x1F, 0x4B, 0xE6, 0x50, 0x81,
- 0xCE, 0x80, 0xCD, 0x67, 0x6B, 0xCF, 0x2E, 0x9B,
- 0xBC, 0xBE, 0x11, 0x75, 0x4D, 0xAC, 0x59, 0x40,
- 0x85, 0x0E, 0xC9, 0x17, 0xA3, 0x60, 0xED, 0x16,
- 0xA4, 0xDD, 0xEE, 0x96, 0x77, 0x83, 0x34, 0xD2,
- 0xCB, 0xFC, 0x6C, 0x08, 0xEC, 0x35, 0xF2, 0x6F,
- 0x3A, 0x7B, 0x21, 0x4A, 0x70, 0xEF, 0xAD, 0xDE,
- 0x90, 0x9E, 0x7D, 0x64, 0x2B, 0x79, 0xF5, 0xF3,
- 0x13, 0x1C, 0x7A, 0x07, 0x4F, 0x78, 0x89, 0xB6,
- 0x97, 0xF1, 0xD7, 0x7C, 0x48, 0xAE, 0x39, 0xA8,
- 0xA6, 0x86, 0x3E, 0x27, 0x87, 0x73, 0x82, 0x24,
- 0x30, 0x74, 0x5F, 0xD1, 0x9F, 0x9C, 0x1A, 0x8C,
- 0x42, 0x6E, 0x28, 0xB9, 0xF0, 0xC4, 0x68, 0x25,
- 0xC5, 0xDC, 0xB8, 0x29, 0xD6, 0x84, 0x3D, 0xBB,
- 0x88, 0x76, 0xFD, 0x61, 0x94, 0x91, 0xDA, 0xB7,
- 0x72, 0xBA, 0xC2, 0xDB, 0xB5, 0xA5, 0xE2, 0x18,
- 0xF6, 0xAA, 0x8A, 0x19, 0x63, 0x9A, 0xA7, 0xC8,
- 0xD4, 0x02, 0x8E, 0x37, 0xF4, 0xB3, 0xA2, 0x53,
- 0x38, 0xCC, 0x58, 0x44, 0xBF, 0x93, 0x5D, 0xC7 };
-
-static const unsigned char table_163[32] = {
- 0x1B, 0x14, 0x12, 0x15, 0x11, 0x1D, 0x17, 0x19,
- 0x10, 0x09, 0x08, 0x06, 0x1A, 0x16, 0x07, 0x13,
- 0x1F, 0x0B, 0x1C, 0x05, 0x0E, 0x00, 0x18, 0x0A,
- 0x04, 0x01, 0x03, 0x0C, 0x0D, 0x1E, 0x02, 0x0F };
-
-static const unsigned char table_164[32] = {
- 0x15, 0x00, 0x10, 0x0B, 0x1D, 0x0A, 0x06, 0x1C,
- 0x0D, 0x1F, 0x17, 0x0F, 0x03, 0x14, 0x13, 0x12,
- 0x1B, 0x18, 0x08, 0x1E, 0x16, 0x09, 0x1A, 0x04,
- 0x02, 0x0C, 0x0E, 0x01, 0x07, 0x19, 0x11, 0x05 };
-
-static const unsigned char table_165[256] = {
- 0x98, 0xF5, 0x1D, 0xFB, 0x13, 0x20, 0x41, 0xA3,
- 0xE3, 0x76, 0x49, 0x7E, 0x60, 0xD8, 0x68, 0x30,
- 0x88, 0x45, 0xD5, 0x77, 0x00, 0xC3, 0x09, 0x31,
- 0x44, 0x18, 0xD4, 0x14, 0xC8, 0x1B, 0x8B, 0x38,
- 0x08, 0x52, 0xD1, 0xF3, 0x69, 0x9F, 0xDA, 0x61,
- 0x16, 0x1C, 0xE4, 0x7D, 0xEE, 0xD9, 0x5E, 0x4C,
- 0xA7, 0xAA, 0xA6, 0xF6, 0xCF, 0xA0, 0xBA, 0x10,
- 0xE2, 0xDE, 0x0F, 0xEA, 0xBC, 0x32, 0x63, 0xC0,
- 0x54, 0xC5, 0xBE, 0x71, 0x80, 0x56, 0x5C, 0xA4,
- 0xAD, 0x15, 0x9D, 0x11, 0x43, 0x67, 0x95, 0xAE,
- 0xC6, 0xC4, 0x91, 0x9C, 0xE5, 0x37, 0xE1, 0x7A,
- 0xDB, 0xEF, 0x03, 0x65, 0x86, 0x66, 0x2A, 0xB5,
- 0xBF, 0xB4, 0x0D, 0xB3, 0xD7, 0x2D, 0x01, 0xEB,
- 0x8C, 0xF2, 0x5A, 0x2E, 0x64, 0x25, 0x02, 0xCB,
- 0x4A, 0xB0, 0xCE, 0x35, 0xA8, 0x47, 0x85, 0x33,
- 0x34, 0x24, 0x23, 0x7B, 0xB6, 0x48, 0x83, 0x40,
- 0x87, 0x57, 0x3C, 0xD6, 0xCD, 0x2C, 0x6D, 0xE7,
- 0xBB, 0xED, 0x81, 0x5D, 0x55, 0x46, 0xDD, 0xD3,
- 0x70, 0xBD, 0xB8, 0x75, 0x53, 0x6E, 0xD0, 0x99,
- 0xCA, 0x58, 0xC7, 0x4B, 0x3D, 0xA5, 0x50, 0x7C,
- 0x93, 0x51, 0xB7, 0xFD, 0x05, 0x3A, 0xE8, 0x8F,
- 0x28, 0x74, 0x39, 0xF0, 0x7F, 0x4F, 0x06, 0x36,
- 0xB2, 0x19, 0x2F, 0x1F, 0x8D, 0x0C, 0xB9, 0xFC,
- 0x89, 0x21, 0x12, 0xF7, 0x3F, 0x94, 0x6F, 0xDC,
- 0x3E, 0x4E, 0x3B, 0xC9, 0x07, 0x9B, 0x17, 0x9A,
- 0x73, 0x6A, 0x5B, 0xA1, 0x1E, 0x8A, 0x04, 0x72,
- 0x6C, 0xA2, 0xEC, 0x96, 0xFE, 0xF8, 0x84, 0xC1,
- 0x79, 0x0E, 0x62, 0x90, 0x8E, 0xF4, 0x42, 0x29,
- 0x92, 0x9E, 0xAC, 0x82, 0x4D, 0xAF, 0x2B, 0x6B,
- 0xA9, 0xFF, 0x0A, 0xAB, 0x22, 0x5F, 0xDF, 0xD2,
- 0x0B, 0x78, 0xF1, 0xE6, 0x59, 0x27, 0xC2, 0xE0,
- 0x1A, 0x26, 0xCC, 0xB1, 0xF9, 0xFA, 0x97, 0xE9 };
-
-static const unsigned char table_166[256] = {
- 0xCB, 0xEA, 0x2A, 0x36, 0x6D, 0x93, 0x4E, 0xD5,
- 0xBC, 0x6A, 0xD4, 0x68, 0xF7, 0x18, 0xAB, 0x8B,
- 0x66, 0x95, 0x94, 0x64, 0xB7, 0x00, 0x4D, 0x97,
- 0x38, 0xB3, 0xFC, 0xE1, 0xBB, 0x63, 0xF3, 0x1F,
- 0x6B, 0x2C, 0x2F, 0x5E, 0xA4, 0x7E, 0xFB, 0xF4,
- 0xA8, 0x8A, 0x65, 0x53, 0x90, 0x58, 0x40, 0x60,
- 0x28, 0x8E, 0x35, 0x49, 0xED, 0xBD, 0x1B, 0x0B,
- 0xBA, 0xB8, 0x61, 0x50, 0xE9, 0x39, 0xEF, 0xC3,
- 0x74, 0xB6, 0x46, 0x8D, 0xD9, 0x32, 0x92, 0x9A,
- 0x30, 0x01, 0xF2, 0x41, 0xB9, 0xE7, 0x3A, 0xB0,
- 0x80, 0x15, 0xDE, 0x7D, 0x7F, 0x09, 0xC2, 0x76,
- 0xF8, 0x12, 0x59, 0xDD, 0x1D, 0xE6, 0x75, 0xBE,
- 0xA3, 0x04, 0xCA, 0x78, 0x7B, 0xAC, 0xD8, 0x70,
- 0xD3, 0xC1, 0x25, 0x6F, 0x03, 0x6C, 0x14, 0x45,
- 0xE5, 0x2B, 0x87, 0x83, 0xAA, 0x77, 0x5F, 0x4A,
- 0x9C, 0x27, 0x0C, 0x10, 0xAE, 0x56, 0x85, 0x0D,
- 0xE3, 0xFA, 0x71, 0xEE, 0x9F, 0x21, 0xC0, 0xCD,
- 0xFD, 0xDC, 0x5B, 0x11, 0x02, 0x0F, 0x96, 0x3D,
- 0x3C, 0x26, 0xEB, 0x08, 0x7A, 0x82, 0xA7, 0x19,
- 0xD7, 0xC5, 0xF6, 0x52, 0x57, 0x88, 0xFF, 0x47,
- 0x8F, 0xC6, 0x33, 0xB5, 0x2E, 0x8C, 0x81, 0x91,
- 0x44, 0xA6, 0x17, 0xF0, 0x4B, 0x9D, 0x34, 0x73,
- 0x72, 0x67, 0xD2, 0x0E, 0xA0, 0x99, 0xA5, 0xAF,
- 0xFE, 0x9E, 0x6E, 0xDA, 0x3B, 0xE2, 0x23, 0xD6,
- 0xD0, 0x13, 0x89, 0x5A, 0x42, 0x98, 0x5C, 0xD1,
- 0x86, 0x24, 0xDF, 0x37, 0xF9, 0xCC, 0xF5, 0xA9,
- 0x2D, 0xBF, 0x5D, 0xF1, 0x69, 0xE8, 0xA2, 0x06,
- 0x48, 0xC7, 0xDB, 0x29, 0xE4, 0xAD, 0x3E, 0xA1,
- 0xC9, 0x4C, 0x1A, 0xCE, 0x62, 0x4F, 0x7C, 0xC8,
- 0x05, 0xC4, 0xB1, 0x1E, 0x79, 0x55, 0x84, 0xB2,
- 0x20, 0x31, 0x9B, 0xEC, 0xB4, 0xCF, 0x54, 0x22,
- 0x1C, 0xE0, 0x51, 0x16, 0x43, 0x07, 0x0A, 0x3F };
-
-static const unsigned char table_167[256] = {
- 0x91, 0xEA, 0x4F, 0x6A, 0x6E, 0x2D, 0x27, 0x22,
- 0x44, 0xA5, 0x6D, 0xE3, 0x45, 0x06, 0xE2, 0x87,
- 0x9A, 0xC9, 0x2C, 0x4A, 0x93, 0x6F, 0x00, 0xEB,
- 0x7C, 0x7F, 0xA2, 0xFE, 0x40, 0x3C, 0x3F, 0xC0,
- 0xC7, 0xFB, 0x8B, 0xDF, 0xA3, 0x28, 0x78, 0x48,
- 0x46, 0xD5, 0x70, 0x5C, 0x35, 0x4E, 0xD7, 0x3A,
- 0x42, 0x47, 0x5B, 0x26, 0x8E, 0xE0, 0x21, 0xB1,
- 0x77, 0x1E, 0x53, 0x4B, 0xCC, 0xE5, 0x65, 0xF6,
- 0x66, 0x2A, 0xA0, 0x5E, 0x3E, 0xAD, 0xA8, 0x95,
- 0x1B, 0x0D, 0x8A, 0x05, 0x68, 0x59, 0x0C, 0x38,
- 0x18, 0xC3, 0x81, 0xA4, 0xFD, 0x13, 0x50, 0xCA,
- 0xE8, 0xDD, 0xD9, 0x76, 0x8C, 0xC5, 0xF4, 0x17,
- 0xB4, 0x3D, 0xEC, 0x0B, 0x67, 0xC6, 0x8D, 0xE1,
- 0xBB, 0x7E, 0xCB, 0x10, 0x99, 0xE9, 0x39, 0xF3,
- 0x75, 0xFA, 0xAC, 0x16, 0x54, 0x51, 0xBC, 0x24,
- 0x58, 0x08, 0xA7, 0x0F, 0x5D, 0xBF, 0xBA, 0xE7,
- 0x9D, 0x2B, 0xB5, 0x29, 0xE4, 0xCD, 0x37, 0x30,
- 0x55, 0xAE, 0x1D, 0x4D, 0x94, 0x34, 0x92, 0x1C,
- 0x6B, 0xBE, 0x52, 0x7B, 0x33, 0xB0, 0x0A, 0x5A,
- 0x03, 0x23, 0x41, 0x49, 0x61, 0x64, 0x73, 0x97,
- 0xC2, 0x9F, 0x5F, 0x07, 0x04, 0xF8, 0xC1, 0xFC,
- 0x74, 0x02, 0x0E, 0x60, 0x9E, 0xD4, 0x85, 0x88,
- 0xC4, 0xF5, 0x90, 0x31, 0xF7, 0xEE, 0x9B, 0xB9,
- 0x20, 0xE6, 0xA6, 0x63, 0x79, 0x56, 0x62, 0xF0,
- 0x2F, 0xD8, 0x4C, 0x83, 0xF9, 0x36, 0x3B, 0x84,
- 0xDE, 0x57, 0xB8, 0xB7, 0x11, 0xF2, 0xC8, 0xD3,
- 0xD1, 0x96, 0x19, 0x2E, 0x72, 0x9C, 0xDB, 0xB3,
- 0xA1, 0xAA, 0xCE, 0x09, 0x98, 0xED, 0xA9, 0xDA,
- 0xAF, 0x86, 0xD0, 0x12, 0xFF, 0xDC, 0x1F, 0xD6,
- 0x01, 0xF1, 0xD2, 0x80, 0x43, 0x7A, 0x71, 0x82,
- 0xB6, 0xAB, 0x89, 0xBD, 0x8F, 0xEF, 0x7D, 0xB2,
- 0x14, 0x15, 0x25, 0x32, 0x6C, 0x69, 0x1A, 0xCF };
-
-static const unsigned char table_168[256] = {
- 0x28, 0xEE, 0xB1, 0xFD, 0xB3, 0xEF, 0x36, 0x8E,
- 0x85, 0x5D, 0x1C, 0x53, 0x1E, 0xDA, 0xBA, 0x3C,
- 0xA8, 0x90, 0x99, 0x49, 0x45, 0xE0, 0x27, 0x8D,
- 0x22, 0xE4, 0x51, 0x3E, 0xAB, 0xE8, 0x70, 0xF5,
- 0x81, 0xE6, 0x34, 0x29, 0xF3, 0x11, 0x46, 0x5F,
- 0x5C, 0xA0, 0xD1, 0xE3, 0x15, 0x68, 0x3A, 0x01,
- 0xE9, 0xD7, 0x24, 0x5A, 0x18, 0x16, 0x88, 0x3B,
- 0x64, 0xA1, 0xDB, 0xBF, 0xAA, 0x43, 0xEA, 0x19,
- 0xA2, 0xD5, 0x7B, 0xBD, 0x2A, 0x0E, 0x4F, 0xB5,
- 0x4B, 0xB7, 0x5B, 0x73, 0xC9, 0xAC, 0x1B, 0x67,
- 0xC7, 0xB4, 0x69, 0x00, 0xBC, 0x6D, 0xC1, 0x04,
- 0xF4, 0x74, 0xD6, 0xD0, 0x60, 0xAE, 0x17, 0xFE,
- 0x63, 0xB6, 0x89, 0x41, 0x7C, 0x44, 0x8B, 0xDC,
- 0x50, 0xE5, 0x79, 0x77, 0x47, 0x9F, 0xA6, 0x3D,
- 0x09, 0x8A, 0x2F, 0xC0, 0x0F, 0xCD, 0x2B, 0x4D,
- 0x0D, 0xC2, 0x5E, 0xB0, 0x57, 0x62, 0xAF, 0x1A,
- 0x21, 0x82, 0x48, 0x9E, 0x38, 0xB9, 0xB8, 0xF2,
- 0x37, 0x07, 0xCA, 0xC5, 0x84, 0xDF, 0xF9, 0xEC,
- 0x42, 0x6B, 0x8F, 0x6C, 0x3F, 0xC4, 0x94, 0xED,
- 0x7A, 0x2D, 0xA3, 0x83, 0xD9, 0x55, 0x02, 0x9A,
- 0xA9, 0x75, 0x10, 0x2C, 0xCB, 0x95, 0xBB, 0x6E,
- 0x23, 0x65, 0x35, 0x97, 0x56, 0xAD, 0xCE, 0xF8,
- 0xF0, 0x0C, 0xE2, 0x52, 0x05, 0x91, 0xCC, 0xC8,
- 0x78, 0x06, 0x96, 0x4E, 0x03, 0xD3, 0x98, 0xA7,
- 0x13, 0x58, 0x93, 0xD4, 0xDD, 0xC6, 0xFC, 0x25,
- 0x9C, 0x86, 0x1F, 0xCF, 0x76, 0xA4, 0x6A, 0xFA,
- 0x0B, 0x4A, 0x54, 0x40, 0x59, 0xD8, 0x61, 0xFF,
- 0x7F, 0x80, 0x6F, 0x7D, 0xF1, 0x8C, 0x92, 0xDE,
- 0x9D, 0xC3, 0xB2, 0xE7, 0xFB, 0x20, 0x31, 0x72,
- 0x12, 0xBE, 0x1D, 0xF6, 0x9B, 0x14, 0x26, 0x0A,
- 0xEB, 0xF7, 0x71, 0x39, 0x30, 0xA5, 0x87, 0xD2,
- 0x66, 0x2E, 0x08, 0x32, 0x4C, 0x33, 0x7E, 0xE1 };
-
-static const unsigned char table_169[256] = {
- 0xA4, 0x31, 0xA9, 0x3F, 0x13, 0x4D, 0x1B, 0x29,
- 0x73, 0x43, 0xF1, 0xE7, 0x9C, 0xC2, 0xF6, 0xCD,
- 0xA1, 0x94, 0x0D, 0x27, 0xFE, 0x7B, 0x9B, 0x0B,
- 0x89, 0xBA, 0x23, 0xEC, 0x76, 0xC3, 0x6C, 0xD8,
- 0x8D, 0xF8, 0xF9, 0x7D, 0x68, 0x5B, 0x61, 0x87,
- 0x28, 0x14, 0x55, 0x0C, 0xFC, 0xD9, 0x07, 0xE8,
- 0x36, 0x88, 0x67, 0x4C, 0xEA, 0xBD, 0xF5, 0x9D,
- 0xB6, 0xC6, 0x24, 0x32, 0x93, 0x03, 0x79, 0x8C,
- 0x12, 0x84, 0xFF, 0x7E, 0x42, 0xE4, 0x3C, 0xF2,
- 0x50, 0xEB, 0x1F, 0x47, 0xB0, 0xA5, 0xB1, 0x71,
- 0x30, 0x5F, 0x5C, 0x53, 0xF7, 0x10, 0xC5, 0x6E,
- 0xE0, 0xDE, 0xC8, 0x58, 0xB7, 0x90, 0xA6, 0x95,
- 0x70, 0x8F, 0xFD, 0xC1, 0x48, 0xB5, 0x19, 0x92,
- 0xBC, 0x15, 0x4E, 0xE6, 0x11, 0xDD, 0x81, 0x0E,
- 0xBB, 0x75, 0x5D, 0x4A, 0xAB, 0x2D, 0x02, 0x54,
- 0x4B, 0x66, 0xD6, 0x2B, 0x2A, 0xE5, 0x26, 0xE1,
- 0xEE, 0xE9, 0x8B, 0x6A, 0x7A, 0xF4, 0x51, 0x39,
- 0x1C, 0xC9, 0xCF, 0x77, 0x00, 0xF3, 0x25, 0xCC,
- 0x08, 0xFB, 0x0F, 0x3E, 0xCE, 0xED, 0x3D, 0x56,
- 0xEF, 0x1D, 0x85, 0x96, 0x52, 0xA8, 0xD3, 0xCB,
- 0xE3, 0x33, 0x06, 0x7C, 0xAE, 0x72, 0x09, 0x04,
- 0x91, 0xC4, 0x5A, 0x69, 0x98, 0xB4, 0x40, 0xDF,
- 0x7F, 0x9F, 0xAA, 0x83, 0xE2, 0x78, 0x74, 0x20,
- 0xAD, 0x6D, 0xDC, 0xD4, 0xCA, 0x60, 0xF0, 0x35,
- 0x37, 0xD0, 0x18, 0x1A, 0x64, 0x3A, 0x99, 0xDB,
- 0x62, 0x44, 0x2C, 0x82, 0x8E, 0xD7, 0xD1, 0xFA,
- 0x16, 0xD5, 0x46, 0xBF, 0xA7, 0xC0, 0x2E, 0x3B,
- 0x01, 0x63, 0xB2, 0x1E, 0x05, 0x21, 0xB8, 0x17,
- 0x22, 0x97, 0xAF, 0x4F, 0x86, 0x34, 0xDA, 0xC7,
- 0xA3, 0xA0, 0xB3, 0x2F, 0xAC, 0x49, 0xD2, 0x57,
- 0x6F, 0x9A, 0x65, 0xB9, 0x41, 0xBE, 0x8A, 0xA2,
- 0x6B, 0x0A, 0x59, 0x9E, 0x5E, 0x38, 0x45, 0x80 };
-
-static const unsigned char table_170[256] = {
- 0xE3, 0x00, 0x99, 0x03, 0xF6, 0xDD, 0xD1, 0x41,
- 0x58, 0x7E, 0xD9, 0x46, 0x04, 0xAF, 0x5C, 0x43,
- 0xDE, 0x5E, 0xFC, 0x97, 0x3D, 0x68, 0xC8, 0x37,
- 0x3C, 0xFB, 0x0F, 0x5A, 0xBE, 0xFA, 0x4C, 0x82,
- 0x0C, 0xA0, 0x0A, 0xD4, 0x9D, 0xCE, 0x78, 0xA8,
- 0x55, 0x56, 0x60, 0xAA, 0xC9, 0x96, 0x62, 0xEA,
- 0x0D, 0xB8, 0xE2, 0x84, 0x17, 0xAE, 0x2B, 0x2C,
- 0x91, 0x57, 0x38, 0x01, 0xA9, 0xCD, 0x34, 0xBA,
- 0x8D, 0xC0, 0xD6, 0xFF, 0xF2, 0xD3, 0x5F, 0x26,
- 0xCA, 0x9B, 0x21, 0x75, 0x4E, 0x49, 0x20, 0x59,
- 0x39, 0xBF, 0x90, 0x6C, 0xFE, 0x8F, 0x2F, 0x18,
- 0x36, 0xD7, 0xB4, 0xAC, 0xBD, 0xF3, 0x1D, 0x4F,
- 0xA3, 0x74, 0x5B, 0x44, 0x05, 0x9C, 0x6D, 0x6B,
- 0x1E, 0xE8, 0x25, 0x16, 0x80, 0xCC, 0x29, 0xC7,
- 0x94, 0x4A, 0xF5, 0xF4, 0x27, 0x85, 0xBB, 0x24,
- 0xDA, 0xB5, 0x76, 0x69, 0xA5, 0x54, 0x23, 0x31,
- 0x11, 0xA4, 0x09, 0xE4, 0x64, 0x10, 0xC5, 0xC1,
- 0x7D, 0xE7, 0x92, 0xF8, 0x9E, 0x6A, 0x15, 0x8B,
- 0x98, 0x42, 0x52, 0x66, 0x0B, 0xA1, 0x35, 0x1A,
- 0x14, 0x7C, 0xE1, 0x9F, 0x28, 0xF1, 0x1B, 0xA6,
- 0x71, 0x73, 0x81, 0xAB, 0xE6, 0x95, 0x06, 0x1F,
- 0xC6, 0xB0, 0x51, 0x0E, 0xEE, 0x77, 0xF0, 0xD8,
- 0xC2, 0x89, 0x7B, 0x07, 0xA2, 0xB7, 0x19, 0x67,
- 0x2E, 0x8E, 0x47, 0xA7, 0xEF, 0x32, 0xD2, 0x93,
- 0xDC, 0x9A, 0xB2, 0xED, 0x45, 0xC4, 0x50, 0x3F,
- 0xE5, 0xCF, 0x88, 0x1C, 0x7A, 0x79, 0xEB, 0x70,
- 0x2A, 0x7F, 0xBC, 0xDB, 0xD0, 0xB1, 0xCB, 0x08,
- 0x86, 0x5D, 0x53, 0x72, 0xB6, 0x4B, 0xB3, 0x22,
- 0xC3, 0x6F, 0xB9, 0xD5, 0x3B, 0x13, 0x2D, 0xAD,
- 0x33, 0xFD, 0x02, 0x40, 0x8A, 0x3A, 0xF7, 0xE0,
- 0x8C, 0x3E, 0x61, 0x6E, 0xE9, 0x63, 0xF9, 0xEC,
- 0x48, 0x30, 0x87, 0x83, 0x12, 0x4D, 0x65, 0xDF };
-
-static const unsigned char table_171[32] = {
- 0x07, 0x06, 0x11, 0x08, 0x0C, 0x1F, 0x19, 0x02,
- 0x14, 0x04, 0x0D, 0x18, 0x1A, 0x05, 0x17, 0x13,
- 0x1C, 0x1B, 0x15, 0x03, 0x01, 0x0F, 0x16, 0x1E,
- 0x1D, 0x10, 0x00, 0x12, 0x0B, 0x0E, 0x09, 0x0A };
-
-static const unsigned char table_172[32] = {
- 0x11, 0x01, 0x1F, 0x06, 0x1A, 0x04, 0x02, 0x09,
- 0x05, 0x0D, 0x0B, 0x18, 0x0E, 0x12, 0x1B, 0x17,
- 0x07, 0x08, 0x1D, 0x1E, 0x14, 0x19, 0x16, 0x15,
- 0x03, 0x0C, 0x00, 0x10, 0x0A, 0x1C, 0x0F, 0x13 };
-
-static const unsigned char table_173[32] = {
- 0x1F, 0x0B, 0x13, 0x00, 0x16, 0x15, 0x14, 0x0A,
- 0x1D, 0x05, 0x1E, 0x1A, 0x0F, 0x04, 0x0E, 0x01,
- 0x19, 0x07, 0x02, 0x12, 0x0C, 0x17, 0x08, 0x09,
- 0x03, 0x11, 0x18, 0x10, 0x1C, 0x1B, 0x06, 0x0D };
-
-static const unsigned char table_174[32] = {
- 0x02, 0x1B, 0x0C, 0x17, 0x1F, 0x05, 0x15, 0x1E,
- 0x16, 0x09, 0x1A, 0x12, 0x0F, 0x1C, 0x18, 0x0A,
- 0x19, 0x10, 0x0D, 0x13, 0x04, 0x11, 0x08, 0x14,
- 0x1D, 0x0E, 0x06, 0x00, 0x01, 0x07, 0x0B, 0x03 };
-
-static const unsigned char table_175[32] = {
- 0x00, 0x06, 0x0B, 0x08, 0x0C, 0x04, 0x1A, 0x1C,
- 0x05, 0x1E, 0x14, 0x03, 0x0A, 0x18, 0x12, 0x1D,
- 0x16, 0x1F, 0x07, 0x09, 0x0F, 0x0E, 0x17, 0x13,
- 0x11, 0x19, 0x10, 0x0D, 0x1B, 0x02, 0x01, 0x15 };
-
-static const unsigned char table_176[32] = {
- 0x12, 0x03, 0x1A, 0x15, 0x04, 0x19, 0x0B, 0x1B,
- 0x17, 0x1E, 0x0D, 0x05, 0x11, 0x14, 0x1C, 0x00,
- 0x18, 0x10, 0x0A, 0x06, 0x0E, 0x08, 0x02, 0x07,
- 0x13, 0x09, 0x16, 0x1D, 0x0F, 0x0C, 0x01, 0x1F };
-
-static const unsigned char table_177[256] = {
- 0x5E, 0x4D, 0x76, 0xFE, 0xB5, 0x50, 0x83, 0x23,
- 0x72, 0xDD, 0x93, 0x08, 0x69, 0xAD, 0xEC, 0x3B,
- 0x0B, 0x9A, 0x36, 0xC9, 0xCA, 0xBE, 0xF7, 0x30,
- 0x19, 0x39, 0x2C, 0xAB, 0xE3, 0x7B, 0xBC, 0x32,
- 0xA0, 0xE4, 0xA6, 0xB6, 0xCB, 0xC8, 0x37, 0x07,
- 0xD2, 0xA1, 0xD9, 0xF6, 0xBF, 0xF5, 0x88, 0x01,
- 0x95, 0x0F, 0x03, 0xFD, 0xE6, 0x68, 0x90, 0x61,
- 0x21, 0x6D, 0x3C, 0x62, 0x34, 0x2B, 0x71, 0x4B,
- 0x44, 0x64, 0x75, 0xA2, 0x6A, 0xFF, 0x29, 0xBD,
- 0x35, 0x15, 0xF9, 0xC1, 0x09, 0x45, 0xB2, 0xF2,
- 0x3F, 0xCE, 0xB0, 0xC0, 0xB8, 0x00, 0x05, 0xD7,
- 0x11, 0xC6, 0x78, 0x53, 0x9E, 0xB3, 0xED, 0x56,
- 0x22, 0x5C, 0x9D, 0x6C, 0x99, 0x43, 0x2F, 0xAE,
- 0xEB, 0x40, 0x8C, 0x1F, 0xC2, 0xDF, 0x92, 0x65,
- 0x6F, 0x79, 0x5D, 0x5B, 0xAA, 0xDB, 0xF1, 0x96,
- 0xD4, 0xF4, 0x8B, 0x51, 0xD5, 0xE2, 0xBB, 0x80,
- 0x17, 0x7C, 0x2A, 0x6E, 0xDE, 0xEA, 0x94, 0x31,
- 0xA4, 0x2D, 0xC3, 0x8D, 0x55, 0x14, 0x9B, 0x0E,
- 0x7D, 0xC4, 0x06, 0x33, 0x73, 0xE9, 0x7A, 0x38,
- 0x5F, 0x89, 0x84, 0xD6, 0xA8, 0x13, 0xE8, 0xCF,
- 0x46, 0xD0, 0x7F, 0x24, 0x8F, 0xF8, 0x87, 0x1B,
- 0x47, 0x02, 0x0C, 0x97, 0x52, 0xFB, 0x8E, 0x20,
- 0x70, 0x3E, 0x7E, 0xD1, 0xE5, 0xEE, 0xCC, 0x91,
- 0x74, 0xCD, 0x42, 0x04, 0x8A, 0xEF, 0xE1, 0x10,
- 0x4F, 0x1C, 0x28, 0x9F, 0xD8, 0x0A, 0x18, 0x49,
- 0x9C, 0x16, 0xF3, 0x82, 0x57, 0x1D, 0x26, 0x66,
- 0x27, 0x86, 0xE7, 0x59, 0xFA, 0x25, 0x54, 0x0D,
- 0x98, 0xDC, 0xF0, 0x3D, 0x63, 0x1E, 0x77, 0x3A,
- 0xDA, 0xB7, 0x6B, 0x2E, 0x48, 0x4C, 0xBA, 0xC7,
- 0x60, 0xAC, 0x1A, 0xB9, 0xFC, 0xA3, 0xA7, 0xA5,
- 0xB4, 0x67, 0xA9, 0x81, 0xB1, 0x12, 0xD3, 0x85,
- 0x5A, 0xC5, 0xE0, 0x58, 0x41, 0x4E, 0x4A, 0xAF };
-
-static const unsigned char table_178[256] = {
- 0x33, 0xBA, 0x98, 0xDA, 0x07, 0x2C, 0x22, 0x9B,
- 0xE0, 0xED, 0xB7, 0xA1, 0x93, 0xEB, 0xDC, 0x49,
- 0xDF, 0xE1, 0x6C, 0xC2, 0x64, 0x52, 0xD0, 0x8F,
- 0xA2, 0x48, 0x26, 0x21, 0x6E, 0x5E, 0x0B, 0x7C,
- 0x0D, 0x90, 0xA4, 0xCE, 0xF5, 0x5F, 0xF9, 0x1D,
- 0x55, 0x83, 0x8D, 0xFB, 0x38, 0xB3, 0xF2, 0x67,
- 0xDE, 0x0A, 0xBE, 0xEC, 0x5B, 0x35, 0x08, 0x50,
- 0xE7, 0x56, 0x4A, 0x02, 0xBC, 0x5A, 0xBD, 0x43,
- 0x6F, 0x79, 0xB2, 0xF7, 0x60, 0xE9, 0xA0, 0x1B,
- 0xC8, 0xDD, 0x9D, 0xA3, 0x5C, 0x61, 0x77, 0x72,
- 0x9C, 0x31, 0x0E, 0x05, 0x1E, 0x12, 0xF1, 0xC9,
- 0x78, 0x4E, 0x15, 0x7D, 0x54, 0xCB, 0x73, 0xEA,
- 0xC5, 0x2B, 0x0F, 0x7E, 0x42, 0x96, 0xC6, 0x74,
- 0x09, 0x65, 0x34, 0xE6, 0x63, 0xA6, 0x70, 0xD3,
- 0x27, 0x87, 0x3A, 0x16, 0x7B, 0x13, 0x06, 0x40,
- 0x46, 0x69, 0xAD, 0x88, 0x81, 0xC0, 0x37, 0x58,
- 0xD1, 0x8A, 0x8E, 0x9A, 0x5D, 0x6D, 0xC7, 0xC3,
- 0xD2, 0xF4, 0x3F, 0x57, 0x3C, 0x4F, 0xA9, 0x6A,
- 0x92, 0xA5, 0x97, 0x0C, 0x2A, 0x36, 0x47, 0xDB,
- 0x8C, 0xEE, 0x03, 0x89, 0x7F, 0x91, 0x24, 0x80,
- 0x2F, 0x62, 0xE4, 0xAF, 0x17, 0x99, 0xD6, 0xCD,
- 0xFE, 0x76, 0x1C, 0xD4, 0x3E, 0xFF, 0xD8, 0xC4,
- 0x39, 0x32, 0xCF, 0xE2, 0xE3, 0x53, 0xD7, 0xCC,
- 0xD9, 0x11, 0xAA, 0x1F, 0x01, 0x3B, 0x51, 0xB5,
- 0x94, 0x4B, 0x28, 0xF0, 0xAC, 0x44, 0x14, 0x4C,
- 0xB9, 0xA7, 0xB8, 0x1A, 0xD5, 0xCA, 0xE8, 0x82,
- 0x9F, 0x2D, 0xAB, 0x2E, 0x29, 0xFD, 0x68, 0xB1,
- 0x66, 0xC1, 0x7A, 0xFA, 0x71, 0x04, 0xA8, 0xB0,
- 0x59, 0x18, 0xAE, 0x25, 0x3D, 0xE5, 0xF6, 0x41,
- 0x86, 0x75, 0x6B, 0xBB, 0xFC, 0x84, 0x8B, 0x85,
- 0x10, 0x23, 0xB6, 0xF3, 0x19, 0x30, 0x20, 0x4D,
- 0x95, 0x9E, 0xBF, 0xEF, 0xF8, 0x45, 0x00, 0xB4 };
-
-static const unsigned char table_179[256] = {
- 0x50, 0x3D, 0x41, 0x42, 0x06, 0x5B, 0xD6, 0x34,
- 0x9D, 0x3C, 0x7B, 0x14, 0xE2, 0x9B, 0x80, 0x15,
- 0x51, 0x01, 0x6A, 0x30, 0xD7, 0xFC, 0x61, 0x4B,
- 0x8A, 0xEC, 0x38, 0x71, 0x70, 0x2E, 0x1C, 0x72,
- 0x79, 0x26, 0x4C, 0x48, 0xED, 0xAD, 0x25, 0x53,
- 0x03, 0xD9, 0xB5, 0x0D, 0x8E, 0x19, 0xCC, 0xBE,
- 0xE1, 0x91, 0x64, 0xA6, 0x21, 0xCE, 0x76, 0xAB,
- 0x9F, 0xD1, 0xB6, 0x23, 0x6D, 0xB0, 0x90, 0xBD,
- 0x09, 0x3A, 0x5E, 0xD0, 0x73, 0x10, 0x44, 0x08,
- 0xFF, 0xB8, 0x24, 0x58, 0xDB, 0x65, 0x95, 0xAA,
- 0xE9, 0xC4, 0x32, 0x2B, 0x84, 0xC9, 0xC7, 0xB1,
- 0x4F, 0x0C, 0xCB, 0x11, 0x4E, 0x22, 0x4A, 0x16,
- 0xDE, 0xBC, 0xEE, 0x68, 0x13, 0xFA, 0xC3, 0x98,
- 0xEB, 0x29, 0x43, 0x9A, 0xA1, 0xE0, 0xF0, 0x3F,
- 0x2F, 0x1B, 0xC2, 0x66, 0x35, 0xF5, 0xC8, 0xD8,
- 0x5A, 0xE5, 0x87, 0x47, 0xD3, 0x7A, 0xE6, 0x39,
- 0x77, 0x81, 0xF2, 0x0E, 0x83, 0x7E, 0x17, 0x6C,
- 0xB3, 0x5C, 0xE8, 0xD2, 0xC0, 0xA4, 0xF9, 0x86,
- 0xCD, 0xFB, 0x54, 0x7C, 0xBF, 0x2D, 0x82, 0xDA,
- 0x96, 0x74, 0x97, 0xC5, 0x7D, 0x27, 0x57, 0x56,
- 0xDC, 0xBA, 0x69, 0x8C, 0x9C, 0x88, 0xB4, 0x8D,
- 0x37, 0xEA, 0x3B, 0x33, 0x2C, 0xB2, 0x45, 0xF7,
- 0xC1, 0x1E, 0x46, 0x02, 0x6B, 0x3E, 0xA7, 0xD5,
- 0x05, 0x0A, 0xA9, 0x1D, 0xA3, 0x4D, 0xAE, 0x6F,
- 0x49, 0xDD, 0x8F, 0xEF, 0xBB, 0x67, 0x0B, 0x40,
- 0x9E, 0xF1, 0x78, 0x28, 0xDF, 0x52, 0xF4, 0x92,
- 0x94, 0x0F, 0xB9, 0x93, 0xF6, 0x1F, 0xAF, 0xA8,
- 0xCA, 0xE4, 0x59, 0x7F, 0x85, 0x75, 0xC6, 0xFD,
- 0x00, 0xB7, 0x55, 0xFE, 0x8B, 0x62, 0x5F, 0x12,
- 0xF8, 0xD4, 0x89, 0xA0, 0x20, 0xE7, 0xCF, 0x60,
- 0x5D, 0xAC, 0x1A, 0x36, 0x63, 0x99, 0x31, 0xF3,
- 0x2A, 0x04, 0x18, 0xA5, 0xA2, 0x6E, 0x07, 0xE3 };
-
-static const unsigned char table_180[256] = {
- 0xDA, 0xCC, 0x72, 0xA6, 0xE7, 0x07, 0xFD, 0x25,
- 0x92, 0x39, 0x49, 0x02, 0xD6, 0x09, 0xA8, 0x65,
- 0x2E, 0x6C, 0xA1, 0x19, 0xBF, 0x21, 0x11, 0xC7,
- 0x3F, 0x9F, 0xF4, 0x51, 0xAF, 0x8C, 0xFE, 0xCD,
- 0x7A, 0xEB, 0x5A, 0xF7, 0x18, 0x69, 0xB9, 0xED,
- 0x37, 0x45, 0x13, 0xB4, 0xAA, 0x75, 0x47, 0x42,
- 0xA3, 0x81, 0x88, 0x70, 0xC1, 0x36, 0x73, 0x1D,
- 0x3B, 0x22, 0xB6, 0x35, 0xE9, 0x31, 0x56, 0x23,
- 0xE1, 0xF5, 0xAD, 0x46, 0x99, 0x32, 0xE4, 0x40,
- 0x00, 0x0F, 0x05, 0xC6, 0x33, 0x84, 0x7B, 0x4D,
- 0x4B, 0x7D, 0x91, 0x3D, 0xCE, 0x64, 0x77, 0x55,
- 0xD7, 0x2B, 0x2F, 0x2C, 0xB8, 0xD3, 0x85, 0xD1,
- 0xB5, 0x6A, 0xF9, 0x41, 0x08, 0xBB, 0x87, 0xEC,
- 0x78, 0xE0, 0xEE, 0x8D, 0x01, 0x58, 0x15, 0x8F,
- 0x06, 0xF0, 0x8B, 0x27, 0x0D, 0x0B, 0x6D, 0xBD,
- 0xCA, 0x2A, 0xA2, 0xE6, 0xDD, 0xBC, 0x4E, 0x5D,
- 0x74, 0x04, 0x3A, 0x96, 0x66, 0x12, 0x1E, 0xF2,
- 0xF6, 0xC4, 0xAE, 0x3C, 0x0C, 0x90, 0x68, 0xD8,
- 0x24, 0x5E, 0x79, 0x10, 0xAC, 0xDF, 0x9B, 0xC5,
- 0x44, 0xC3, 0x50, 0x5C, 0xA5, 0x89, 0x60, 0x5F,
- 0x48, 0x17, 0x34, 0xA7, 0xE2, 0xF3, 0xD9, 0x3E,
- 0x9C, 0xB7, 0x7C, 0x1F, 0xA9, 0xD4, 0xA4, 0x0E,
- 0x8E, 0x4C, 0xDC, 0xF8, 0xF1, 0x98, 0xDE, 0x2D,
- 0x61, 0xCB, 0xD5, 0x43, 0x86, 0x26, 0xB0, 0x7F,
- 0x7E, 0xFF, 0xAB, 0x83, 0x14, 0x9A, 0x80, 0x16,
- 0x30, 0xA0, 0x53, 0x97, 0x52, 0x9E, 0xB1, 0x1B,
- 0xD0, 0x1A, 0xC8, 0x57, 0xBA, 0x6E, 0xFA, 0x94,
- 0xE8, 0x63, 0x5B, 0x29, 0xEF, 0x71, 0x8A, 0x03,
- 0xB3, 0x76, 0xC9, 0xD2, 0xBE, 0xE5, 0x82, 0x1C,
- 0x95, 0x9D, 0x4A, 0x28, 0xEA, 0x0A, 0xC0, 0xE3,
- 0x6F, 0x20, 0x54, 0xFB, 0x93, 0xFC, 0x6B, 0x38,
- 0x62, 0x4F, 0xCF, 0xB2, 0xC2, 0x59, 0xDB, 0x67 };
-
-static const unsigned char table_181[256] = {
- 0x2B, 0xED, 0x14, 0x05, 0x80, 0xCC, 0x5A, 0xF8,
- 0x43, 0xB7, 0x86, 0xC6, 0xEE, 0xA6, 0xD7, 0xD6,
- 0xA0, 0xC4, 0x21, 0x34, 0xB1, 0x8C, 0xF9, 0xF4,
- 0x7C, 0x53, 0x06, 0xD4, 0x6B, 0x3F, 0xE1, 0x12,
- 0x6A, 0xCE, 0xCF, 0xBF, 0x74, 0x3E, 0xD5, 0xCB,
- 0x97, 0x01, 0xA2, 0x2D, 0xAE, 0xF7, 0x17, 0x29,
- 0x47, 0x03, 0x0E, 0xE9, 0x82, 0x46, 0x94, 0xAF,
- 0x2A, 0x90, 0xFE, 0x4A, 0x7E, 0x0C, 0x71, 0xB6,
- 0xA5, 0xF2, 0x67, 0x41, 0xBA, 0xC2, 0x8A, 0x9D,
- 0x36, 0xFF, 0x50, 0x2E, 0xC3, 0x91, 0x9C, 0x37,
- 0x66, 0xAD, 0xB2, 0x1F, 0xE4, 0xE3, 0x9F, 0xDD,
- 0x87, 0xC0, 0xE6, 0xEF, 0x13, 0x70, 0x5B, 0xDE,
- 0x5C, 0x75, 0x7F, 0x4F, 0x44, 0xCA, 0x55, 0x57,
- 0xF0, 0x26, 0xA7, 0xC7, 0x10, 0x51, 0x00, 0xB3,
- 0x5D, 0x99, 0x81, 0x3B, 0xB9, 0x1C, 0x64, 0x7B,
- 0xFB, 0xD9, 0x8D, 0x4E, 0xAC, 0x25, 0xBB, 0x69,
- 0xDF, 0x02, 0x9E, 0x2C, 0xAB, 0xF3, 0x65, 0x09,
- 0xA3, 0x6C, 0xC1, 0x76, 0x52, 0x30, 0xD8, 0x3A,
- 0x40, 0x18, 0x59, 0xD0, 0xE5, 0xB4, 0x5F, 0x33,
- 0x68, 0x92, 0x2F, 0xB8, 0x93, 0xD1, 0xEB, 0xA4,
- 0xFC, 0x77, 0x19, 0x62, 0xC9, 0x49, 0x84, 0x1A,
- 0x9A, 0xE7, 0x31, 0xE8, 0xE2, 0x58, 0xF1, 0x4B,
- 0x1E, 0x0B, 0x39, 0xFD, 0x42, 0x7A, 0x89, 0x38,
- 0x11, 0x98, 0x63, 0x08, 0xE0, 0xEA, 0xBE, 0xB0,
- 0x45, 0x1B, 0x4C, 0x54, 0xC8, 0x27, 0x3D, 0x73,
- 0x04, 0x8F, 0x79, 0xBC, 0x6F, 0x0D, 0x0F, 0xA1,
- 0x60, 0xDC, 0xC5, 0xFA, 0x8E, 0xDA, 0x15, 0x96,
- 0xD3, 0x07, 0xF5, 0x3C, 0x88, 0x72, 0x1D, 0x4D,
- 0x8B, 0x61, 0x0A, 0xDB, 0xAA, 0x20, 0x23, 0xEC,
- 0x6E, 0x22, 0x48, 0x28, 0xBD, 0xA9, 0x56, 0x5E,
- 0x85, 0xA8, 0x95, 0x6D, 0x16, 0x78, 0xB5, 0xF6,
- 0x32, 0x24, 0x7D, 0x9B, 0xD2, 0x83, 0x35, 0xCD };
-
-static const unsigned char table_182[256] = {
- 0x06, 0x7F, 0x66, 0xB5, 0xBA, 0x1E, 0xFD, 0x51,
- 0x81, 0x8D, 0x28, 0xA3, 0x15, 0x37, 0xDC, 0x58,
- 0xE6, 0x3D, 0xB4, 0xB9, 0x2E, 0xA0, 0x2F, 0xC4,
- 0xCB, 0xB1, 0x25, 0xBF, 0xC1, 0x4E, 0x5A, 0xE4,
- 0x0F, 0x10, 0x7C, 0x52, 0xA7, 0x29, 0x76, 0x55,
- 0xAA, 0x70, 0x62, 0x54, 0x43, 0x93, 0x3A, 0x7D,
- 0x5B, 0x56, 0x33, 0x64, 0x74, 0x2A, 0xD9, 0x9B,
- 0x88, 0xC0, 0x3C, 0x63, 0xDE, 0xF4, 0x73, 0xDF,
- 0x9E, 0xB2, 0xA8, 0x4F, 0x04, 0x57, 0x47, 0x87,
- 0x14, 0xFC, 0x27, 0x53, 0x83, 0xDB, 0xD7, 0x20,
- 0x96, 0x31, 0xD0, 0xCF, 0x30, 0x19, 0x69, 0x1A,
- 0xAE, 0x3B, 0x11, 0x0C, 0xA6, 0x95, 0x8A, 0xF2,
- 0x1B, 0xCC, 0x78, 0xEF, 0xB3, 0x71, 0x84, 0xA2,
- 0xF1, 0x7A, 0x92, 0x61, 0xCA, 0x90, 0x94, 0x89,
- 0x68, 0xEE, 0x97, 0x38, 0x0D, 0xF9, 0x1F, 0x8E,
- 0xE9, 0x26, 0xBD, 0xC9, 0xFF, 0x4C, 0x44, 0x1D,
- 0x98, 0xE5, 0x86, 0xF3, 0x18, 0xB6, 0x09, 0xD2,
- 0x7E, 0xC5, 0xE7, 0x2B, 0x8C, 0x8B, 0x60, 0x3F,
- 0x2C, 0x6A, 0x08, 0x0E, 0x50, 0x32, 0x9F, 0xF0,
- 0x9A, 0xC2, 0x39, 0xBE, 0xEA, 0x12, 0x16, 0xBB,
- 0x5E, 0x67, 0xE3, 0xB8, 0x79, 0x46, 0xDA, 0x00,
- 0xD3, 0xBC, 0xCE, 0x1C, 0x80, 0xFA, 0xAB, 0x65,
- 0x4A, 0xF8, 0xAC, 0x72, 0x01, 0xC6, 0x35, 0x85,
- 0x3E, 0x5C, 0xA1, 0x05, 0xA5, 0xA9, 0xE1, 0x40,
- 0xEB, 0xE8, 0x5F, 0xF5, 0xC3, 0xD1, 0x34, 0xFB,
- 0xEC, 0xF7, 0x9C, 0xC7, 0xDD, 0x6C, 0x36, 0x9D,
- 0x42, 0x59, 0x99, 0x5D, 0xD8, 0x82, 0x07, 0x24,
- 0x6D, 0xAD, 0x13, 0x48, 0x6B, 0x6E, 0x75, 0x4D,
- 0xD5, 0x02, 0xED, 0xFE, 0x91, 0xCD, 0x77, 0xB0,
- 0xF6, 0xC8, 0x6F, 0x23, 0xAF, 0xB7, 0x2D, 0xD6,
- 0xA4, 0xE2, 0x45, 0x8F, 0x21, 0xE0, 0x49, 0x22,
- 0x7B, 0x17, 0x0B, 0x0A, 0x41, 0x03, 0xD4, 0x4B };
-
-static const unsigned char table_183[32] = {
- 0x1E, 0x1B, 0x11, 0x07, 0x08, 0x06, 0x18, 0x17,
- 0x0D, 0x0F, 0x12, 0x03, 0x1D, 0x04, 0x0A, 0x1A,
- 0x0C, 0x13, 0x14, 0x1F, 0x0B, 0x19, 0x10, 0x01,
- 0x16, 0x05, 0x1C, 0x0E, 0x02, 0x00, 0x09, 0x15 };
-
-static const unsigned char table_184[32] = {
- 0x0F, 0x1D, 0x17, 0x16, 0x0D, 0x05, 0x13, 0x1F,
- 0x1B, 0x09, 0x1C, 0x1E, 0x15, 0x01, 0x06, 0x08,
- 0x0C, 0x10, 0x0B, 0x02, 0x04, 0x0A, 0x07, 0x1A,
- 0x18, 0x0E, 0x03, 0x11, 0x12, 0x14, 0x19, 0x00 };
-
-static const unsigned char table_185[256] = {
- 0xA5, 0xEE, 0x2E, 0x28, 0xA7, 0xAC, 0xD9, 0xB2,
- 0x6E, 0x04, 0xB4, 0x03, 0xE8, 0x92, 0x5F, 0x4D,
- 0x73, 0x20, 0x71, 0xE0, 0x43, 0x53, 0x3F, 0xF8,
- 0x96, 0xA1, 0x24, 0x97, 0xAD, 0x7B, 0xE5, 0xE6,
- 0xF2, 0xCE, 0xE3, 0x76, 0x2F, 0xA2, 0x48, 0x0E,
- 0x4B, 0x4A, 0x8B, 0x5A, 0x81, 0x2C, 0xBF, 0xD7,
- 0xFB, 0x7D, 0x4C, 0x16, 0xF4, 0x00, 0xF5, 0x40,
- 0x64, 0x74, 0xA9, 0x37, 0x86, 0xD3, 0x1B, 0xCD,
- 0xF1, 0x1A, 0x90, 0x9F, 0x54, 0x79, 0x29, 0xC3,
- 0x77, 0x85, 0x02, 0xB1, 0x70, 0xFE, 0x5B, 0xDA,
- 0x6B, 0x01, 0x0C, 0x07, 0xB8, 0x58, 0x47, 0x42,
- 0x09, 0xE4, 0x27, 0xDD, 0xF3, 0x1E, 0x10, 0x9E,
- 0x49, 0x30, 0x05, 0xBE, 0x59, 0xEB, 0xD2, 0xAA,
- 0xC8, 0x9D, 0x8C, 0x5E, 0x14, 0x56, 0x8E, 0xF7,
- 0x38, 0x55, 0x87, 0xA3, 0x5D, 0x41, 0x4F, 0x1F,
- 0xF6, 0x0F, 0x57, 0x91, 0xAE, 0xBA, 0xB3, 0x95,
- 0x9B, 0x69, 0xC1, 0x11, 0xD0, 0x25, 0x7F, 0x3B,
- 0x62, 0xCF, 0xC0, 0xA0, 0xFC, 0xB6, 0x12, 0x6C,
- 0xF0, 0x13, 0x93, 0xAB, 0xC6, 0x78, 0x6D, 0x88,
- 0x22, 0x08, 0x2A, 0xE2, 0xB7, 0x65, 0x31, 0x3A,
- 0xA6, 0x7C, 0xF9, 0xDC, 0xE7, 0xA4, 0xC9, 0x63,
- 0xA8, 0x0B, 0xED, 0x50, 0x36, 0xD8, 0x3E, 0xB0,
- 0x6A, 0x5C, 0x45, 0x4E, 0x23, 0x84, 0x34, 0x9A,
- 0xCC, 0x3D, 0xB5, 0xEA, 0xDE, 0x75, 0xD6, 0xFF,
- 0x6F, 0xC2, 0xDB, 0x8D, 0x7A, 0x1C, 0xE9, 0x61,
- 0x0A, 0x1D, 0x32, 0x52, 0x3C, 0x19, 0xFA, 0xD1,
- 0xD4, 0x68, 0xC7, 0x0D, 0x99, 0x83, 0xEF, 0x80,
- 0x82, 0xBD, 0xD5, 0x7E, 0x39, 0x72, 0x51, 0xAF,
- 0x8A, 0x2D, 0xB9, 0x89, 0xC4, 0x67, 0x35, 0xE1,
- 0x44, 0x06, 0xEC, 0xCB, 0x8F, 0x17, 0xDF, 0x94,
- 0x60, 0xCA, 0x26, 0xFD, 0x33, 0x46, 0x21, 0xBB,
- 0x2B, 0xC5, 0x98, 0x18, 0x66, 0x15, 0x9C, 0xBC };
-
-static const unsigned char table_186[256] = {
- 0xB7, 0xFA, 0x03, 0x7C, 0x76, 0x43, 0xA7, 0x15,
- 0x4B, 0x4F, 0x04, 0xAA, 0x4E, 0xD2, 0x52, 0xC8,
- 0x79, 0x16, 0xF6, 0x61, 0x01, 0x5D, 0xD6, 0x47,
- 0xDE, 0xC5, 0x4D, 0x2F, 0xF5, 0x29, 0x21, 0xE6,
- 0x97, 0x35, 0xDC, 0x0E, 0x8B, 0xF4, 0x0F, 0xBE,
- 0x30, 0x07, 0x1D, 0x46, 0x75, 0xCE, 0x56, 0x42,
- 0x28, 0x93, 0x84, 0x20, 0xA5, 0xC2, 0x87, 0x45,
- 0x1C, 0x6B, 0x55, 0x06, 0xEB, 0xB0, 0xF9, 0x14,
- 0x23, 0xF1, 0xFC, 0xD7, 0x98, 0xD1, 0xA4, 0xED,
- 0x5B, 0xB1, 0x12, 0x7A, 0xD5, 0x5F, 0x53, 0x88,
- 0x95, 0x71, 0xE7, 0x5C, 0xF8, 0x83, 0xC7, 0x49,
- 0xDD, 0xDA, 0x0B, 0xC1, 0x70, 0xEC, 0x67, 0xE2,
- 0xEA, 0x72, 0x4C, 0x92, 0xA6, 0xE5, 0x59, 0xA9,
- 0x3C, 0xFE, 0x0A, 0x65, 0x6E, 0xF3, 0xA3, 0x22,
- 0x24, 0x81, 0xF2, 0xCC, 0xD3, 0xA0, 0xDF, 0xDB,
- 0xAB, 0x09, 0x13, 0x96, 0x36, 0x9C, 0xEE, 0xD4,
- 0x33, 0x5E, 0x26, 0xAE, 0x48, 0x38, 0xFF, 0x08,
- 0x1F, 0x6D, 0x02, 0xEF, 0x7E, 0x57, 0x2A, 0x8A,
- 0xBA, 0x90, 0xAF, 0xA8, 0x37, 0x8E, 0x9B, 0xC0,
- 0x69, 0x32, 0x86, 0xBD, 0x73, 0x6C, 0xB9, 0x31,
- 0x66, 0xBF, 0x1B, 0x44, 0x9E, 0xB2, 0xD0, 0xE0,
- 0xF0, 0x2C, 0x3F, 0xE1, 0x91, 0x18, 0x19, 0x50,
- 0xCA, 0x8F, 0x54, 0xB5, 0x8D, 0x0C, 0x17, 0x39,
- 0x8C, 0x00, 0x7F, 0x41, 0xE3, 0x2E, 0x1A, 0x9D,
- 0x27, 0xA1, 0x10, 0x34, 0x1E, 0x3A, 0x60, 0x77,
- 0xBB, 0xB6, 0x0D, 0x4A, 0x3E, 0x6A, 0xB4, 0xA2,
- 0xB3, 0xFD, 0xCD, 0x80, 0x51, 0xAD, 0xCF, 0xBC,
- 0x40, 0x74, 0x6F, 0x68, 0x2B, 0xC3, 0xF7, 0x63,
- 0xB8, 0x25, 0xC4, 0x62, 0xE9, 0xFB, 0x58, 0x85,
- 0x78, 0xCB, 0x9A, 0x3D, 0xE4, 0xC9, 0x89, 0x2D,
- 0x64, 0x82, 0xC6, 0x05, 0xD8, 0xAC, 0x99, 0x9F,
- 0x11, 0x3B, 0x94, 0xE8, 0x7D, 0x7B, 0xD9, 0x5A };
-
-static const unsigned char table_187[32] = {
- 0x0F, 0x04, 0x1D, 0x1B, 0x15, 0x10, 0x01, 0x0B,
- 0x00, 0x17, 0x13, 0x07, 0x1E, 0x1F, 0x08, 0x0A,
- 0x19, 0x09, 0x05, 0x06, 0x0C, 0x1A, 0x14, 0x16,
- 0x0E, 0x18, 0x03, 0x1C, 0x12, 0x11, 0x0D, 0x02 };
-
-static const struct yahoo_fn yahoo_fntable[5][96] =
- {{{ IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 },
- { IDENT, 0, 0 }},
- {{ MULADD, 0x36056CD7, 0x4387 },
- { LOOKUP, (long)table_0, 0 },
- { LOOKUP, (long)table_1, 0 },
- { BITFLD, (long)table_2, 0 },
- { LOOKUP, (long)table_3, 0 },
- { BITFLD, (long)table_4, 0 },
- { MULADD, 0x4ABB534D, 0x3769 },
- { XOR, 0x1D242DA5, 0 },
- { MULADD, 0x3C23132D, 0x339B },
- { XOR, 0x0191265C, 0 },
- { XOR, 0x3DB979DB, 0 },
- { LOOKUP, (long)table_5, 0 },
- { XOR, 0x1A550E1E, 0 },
- { XOR, 0x2F140A2D, 0 },
- { MULADD, 0x7C466A4B, 0x29BF },
- { XOR, 0x2D3F30D3, 0 },
- { MULADD, 0x7E823B21, 0x6BB3 },
- { BITFLD, (long)table_6, 0 },
- { LOOKUP, (long)table_7, 0 },
- { BITFLD, (long)table_8, 0 },
- { LOOKUP, (long)table_9, 0 },
- { BITFLD, (long)table_10, 0 },
- { LOOKUP, (long)table_11, 0 },
- { BITFLD, (long)table_12, 0 },
- { LOOKUP, (long)table_13, 0 },
- { BITFLD, (long)table_14, 0 },
- { MULADD, 0x5B756AB9, 0x7E9B },
- { LOOKUP, (long)table_15, 0 },
- { XOR, 0x1D1C4911, 0 },
- { LOOKUP, (long)table_16, 0 },
- { LOOKUP, (long)table_17, 0 },
- { XOR, 0x46BD7771, 0 },
- { XOR, 0x51AE2B42, 0 },
- { MULADD, 0x2417591B, 0x177B },
- { MULADD, 0x57F27C5F, 0x2433 },
- { LOOKUP, (long)table_18, 0 },
- { LOOKUP, (long)table_19, 0 },
- { XOR, 0x71422261, 0 },
- { BITFLD, (long)table_20, 0 },
- { MULADD, 0x58E937F9, 0x1075 },
- { LOOKUP, (long)table_21, 0 },
- { BITFLD, (long)table_22, 0 },
- { LOOKUP, (long)table_23, 0 },
- { LOOKUP, (long)table_24, 0 },
- { MULADD, 0x0B4C3D13, 0x1597 },
- { BITFLD, (long)table_25, 0 },
- { XOR, 0x0FE07D38, 0 },
- { MULADD, 0x689B4017, 0x3CFB },
- { BITFLD, (long)table_26, 0 },
- { LOOKUP, (long)table_27, 0 },
- { XOR, 0x35413DF3, 0 },
- { MULADD, 0x05B611AB, 0x570B },
- { MULADD, 0x0DA5334F, 0x3AC7 },
- { XOR, 0x47706008, 0 },
- { BITFLD, (long)table_28, 0 },
- { LOOKUP, (long)table_29, 0 },
- { BITFLD, (long)table_30, 0 },
- { XOR, 0x57611B36, 0 },
- { MULADD, 0x314C2CD1, 0x2B5B },
- { XOR, 0x1EF33946, 0 },
- { MULADD, 0x28EA041F, 0x638F },
- { LOOKUP, (long)table_31, 0 },
- { LOOKUP, (long)table_32, 0 },
- { LOOKUP, (long)table_33, 0 },
- { MULADD, 0x511537CB, 0x7135 },
- { MULADD, 0x1CF71007, 0x5E17 },
- { XOR, 0x583D4BCF, 0 },
- { LOOKUP, (long)table_34, 0 },
- { XOR, 0x373E6856, 0 },
- { MULADD, 0x4D595519, 0x1A7D },
- { LOOKUP, (long)table_35, 0 },
- { LOOKUP, (long)table_36, 0 },
- { XOR, 0x0E2A36A7, 0 },
- { LOOKUP, (long)table_37, 0 },
- { LOOKUP, (long)table_38, 0 },
- { BITFLD, (long)table_39, 0 },
- { BITFLD, (long)table_40, 0 },
- { XOR, 0x53F3604F, 0 },
- { BITFLD, (long)table_41, 0 },
- { BITFLD, (long)table_42, 0 },
- { MULADD, 0x1EDC0BA3, 0x7531 },
- { LOOKUP, (long)table_43, 0 },
- { XOR, 0x10DF1038, 0 },
- { BITFLD, (long)table_44, 0 },
- { LOOKUP, (long)table_45, 0 },
- { XOR, 0x4EDE0CAC, 0 },
- { MULADD, 0x2F076EEB, 0x5BCF },
- { XOR, 0x6D86030F, 0 },
- { XOR, 0x3F331713, 0 },
- { LOOKUP, (long)table_46, 0 },
- { MULADD, 0x41CD726F, 0x3F79 },
- { BITFLD, (long)table_47, 0 },
- { XOR, 0x0ECE0054, 0 },
- { MULADD, 0x19B32B03, 0x4AD1 },
- { BITFLD, (long)table_48, 0 },
- { BITFLD, (long)table_49, 0 }},
- {{ MULADD, 0x39731111, 0x419B },
- { XOR, 0x54F7757A, 0 },
- { BITFLD, (long)table_50, 0 },
- { BITFLD, (long)table_51, 0 },
- { LOOKUP, (long)table_52, 0 },
- { LOOKUP, (long)table_53, 0 },
- { MULADD, 0x3CC0256B, 0x7CE7 },
- { XOR, 0x79991847, 0 },
- { MULADD, 0x228F7FB5, 0x472D },
- { MULADD, 0x32DA290B, 0x7745 },
- { XOR, 0x7A28180D, 0 },
- { BITFLD, (long)table_54, 0 },
- { BITFLD, (long)table_55, 0 },
- { MULADD, 0x5C814F8B, 0x227F },
- { LOOKUP, (long)table_56, 0 },
- { MULADD, 0x0B496F6D, 0x412D },
- { XOR, 0x6F4B62DA, 0 },
- { LOOKUP, (long)table_57, 0 },
- { XOR, 0x64973977, 0 },
- { LOOKUP, (long)table_58, 0 },
- { LOOKUP, (long)table_59, 0 },
- { BITFLD, (long)table_60, 0 },
- { LOOKUP, (long)table_61, 0 },
- { LOOKUP, (long)table_62, 0 },
- { XOR, 0x6DD14C92, 0 },
- { LOOKUP, (long)table_63, 0 },
- { BITFLD, (long)table_64, 0 },
- { BITFLD, (long)table_65, 0 },
- { BITFLD, (long)table_66, 0 },
- { LOOKUP, (long)table_67, 0 },
- { XOR, 0x5E6324D8, 0 },
- { LOOKUP, (long)table_68, 0 },
- { LOOKUP, (long)table_69, 0 },
- { LOOKUP, (long)table_70, 0 },
- { BITFLD, (long)table_71, 0 },
- { XOR, 0x62745ED0, 0 },
- { MULADD, 0x102C215B, 0x0581 },
- { LOOKUP, (long)table_72, 0 },
- { LOOKUP, (long)table_73, 0 },
- { LOOKUP, (long)table_74, 0 },
- { MULADD, 0x19511111, 0x12C1 },
- { LOOKUP, (long)table_75, 0 },
- { MULADD, 0x2A6E2953, 0x6977 },
- { LOOKUP, (long)table_76, 0 },
- { XOR, 0x55CD5445, 0 },
- { BITFLD, (long)table_77, 0 },
- { BITFLD, (long)table_78, 0 },
- { MULADD, 0x646C21EB, 0x43E5 },
- { XOR, 0x71DC4898, 0 },
- { XOR, 0x167519CB, 0 },
- { XOR, 0x6D3158F8, 0 },
- { XOR, 0x7EA95BEA, 0 },
- { BITFLD, (long)table_79, 0 },
- { XOR, 0x47377587, 0 },
- { XOR, 0x2D8B6E8F, 0 },
- { MULADD, 0x5E6105DB, 0x1605 },
- { XOR, 0x65B543C8, 0 },
- { LOOKUP, (long)table_80, 0 },
- { BITFLD, (long)table_81, 0 },
- { MULADD, 0x48AF73CB, 0x0A67 },
- { XOR, 0x4FB96154, 0 },
- { LOOKUP, (long)table_82, 0 },
- { BITFLD, (long)table_83, 0 },
- { XOR, 0x622C4954, 0 },
- { BITFLD, (long)table_84, 0 },
- { XOR, 0x20D220F3, 0 },
- { XOR, 0x361D4F0D, 0 },
- { XOR, 0x2B2000D1, 0 },
- { XOR, 0x6FB8593E, 0 },
- { LOOKUP, (long)table_85, 0 },
- { BITFLD, (long)table_86, 0 },
- { XOR, 0x2B7F7DFC, 0 },
- { MULADD, 0x5FC41A57, 0x0693 },
- { MULADD, 0x17154387, 0x2489 },
- { BITFLD, (long)table_87, 0 },
- { BITFLD, (long)table_88, 0 },
- { BITFLD, (long)table_89, 0 },
- { LOOKUP, (long)table_90, 0 },
- { XOR, 0x7E221470, 0 },
- { XOR, 0x7A600061, 0 },
- { BITFLD, (long)table_91, 0 },
- { BITFLD, (long)table_92, 0 },
- { LOOKUP, (long)table_93, 0 },
- { BITFLD, (long)table_94, 0 },
- { MULADD, 0x00E813A5, 0x2CE5 },
- { MULADD, 0x3D707E25, 0x3827 },
- { MULADD, 0x77A53E07, 0x6A5F },
- { BITFLD, (long)table_95, 0 },
- { LOOKUP, (long)table_96, 0 },
- { LOOKUP, (long)table_97, 0 },
- { XOR, 0x43A73788, 0 },
- { LOOKUP, (long)table_98, 0 },
- { BITFLD, (long)table_99, 0 },
- { LOOKUP, (long)table_100, 0 },
- { XOR, 0x55F4606B, 0 },
- { BITFLD, (long)table_101, 0 }},
- {{ BITFLD, (long)table_102, 0 },
- { MULADD, 0x32CA58E3, 0x04F9 },
- { XOR, 0x11756B30, 0 },
- { MULADD, 0x218B2569, 0x5DB1 },
- { XOR, 0x77D64B90, 0 },
- { BITFLD, (long)table_103, 0 },
- { LOOKUP, (long)table_104, 0 },
- { MULADD, 0x7D1428CB, 0x3D },
- { XOR, 0x6F872C49, 0 },
- { XOR, 0x2E484655, 0 },
- { MULADD, 0x1E3349F7, 0x41F5 },
- { LOOKUP, (long)table_105, 0 },
- { BITFLD, (long)table_106, 0 },
- { XOR, 0x61640311, 0 },
- { BITFLD, (long)table_107, 0 },
- { LOOKUP, (long)table_108, 0 },
- { LOOKUP, (long)table_109, 0 },
- { LOOKUP, (long)table_110, 0 },
- { XOR, 0x007044D3, 0 },
- { BITFLD, (long)table_111, 0 },
- { MULADD, 0x5C221625, 0x576F },
- { LOOKUP, (long)table_112, 0 },
- { LOOKUP, (long)table_113, 0 },
- { XOR, 0x2D406BB1, 0 },
- { MULADD, 0x680B1F17, 0x12CD },
- { BITFLD, (long)table_114, 0 },
- { MULADD, 0x12564D55, 0x32B9 },
- { MULADD, 0x21A67897, 0x6BAB },
- { LOOKUP, (long)table_115, 0 },
- { MULADD, 0x06405119, 0x7143 },
- { XOR, 0x351D01ED, 0 },
- { MULADD, 0x46356F6B, 0x0A49 },
- { MULADD, 0x32C77969, 0x72F3 },
- { BITFLD, (long)table_116, 0 },
- { LOOKUP, (long)table_117, 0 },
- { LOOKUP, (long)table_118, 0 },
- { BITFLD, (long)table_119, 0 },
- { LOOKUP, (long)table_120, 0 },
- { BITFLD, (long)table_121, 0 },
- { MULADD, 0x74D52C55, 0x5F43 },
- { XOR, 0x26201CA8, 0 },
- { XOR, 0x7AEB3255, 0 },
- { LOOKUP, (long)table_122, 0 },
- { MULADD, 0x578F1047, 0x640B },
- { LOOKUP, (long)table_123, 0 },
- { LOOKUP, (long)table_124, 0 },
- { BITFLD, (long)table_125, 0 },
- { BITFLD, (long)table_126, 0 },
- { XOR, 0x4A1352CF, 0 },
- { MULADD, 0x4BFB6EF3, 0x704F },
- { MULADD, 0x1B4C7FE7, 0x5637 },
- { MULADD, 0x04091A3B, 0x4917 },
- { XOR, 0x270C2F52, 0 },
- { LOOKUP, (long)table_127, 0 },
- { BITFLD, (long)table_128, 0 },
- { LOOKUP, (long)table_129, 0 },
- { BITFLD, (long)table_130, 0 },
- { MULADD, 0x127549D5, 0x579B },
- { MULADD, 0x0AB54121, 0x7A47 },
- { BITFLD, (long)table_131, 0 },
- { XOR, 0x751E6E49, 0 },
- { LOOKUP, (long)table_132, 0 },
- { LOOKUP, (long)table_133, 0 },
- { XOR, 0x670C3F74, 0 },
- { MULADD, 0x6B080851, 0x7E8B },
- { XOR, 0x71CD789E, 0 },
- { XOR, 0x3EB20B7B, 0 },
- { BITFLD, (long)table_134, 0 },
- { LOOKUP, (long)table_135, 0 },
- { MULADD, 0x58A67753, 0x272B },
- { MULADD, 0x1AB54AD7, 0x4D33 },
- { MULADD, 0x07D30A45, 0x0569 },
- { MULADD, 0x737616BF, 0x70C7 },
- { LOOKUP, (long)table_136, 0 },
- { MULADD, 0x45C4485D, 0x2063 },
- { BITFLD, (long)table_137, 0 },
- { XOR, 0x2598043D, 0 },
- { MULADD, 0x223A4FE3, 0x49A7 },
- { XOR, 0x1EED619F, 0 },
- { BITFLD, (long)table_138, 0 },
- { XOR, 0x6F477561, 0 },
- { BITFLD, (long)table_139, 0 },
- { BITFLD, (long)table_140, 0 },
- { LOOKUP, (long)table_141, 0 },
- { MULADD, 0x4BC13C4F, 0x45C1 },
- { XOR, 0x3B547BFB, 0 },
- { LOOKUP, (long)table_142, 0 },
- { MULADD, 0x71406AB3, 0x7A5F },
- { XOR, 0x2F1467E9, 0 },
- { MULADD, 0x009366D1, 0x22D1 },
- { MULADD, 0x587D1B75, 0x2CA5 },
- { MULADD, 0x213A4BE7, 0x4499 },
- { MULADD, 0x62653E89, 0x2D5D },
- { BITFLD, (long)table_143, 0 },
- { MULADD, 0x4F5F3257, 0x444F },
- { MULADD, 0x4C0E2B2B, 0x19D3 }},
- {{ MULADD, 0x3F867B35, 0x7B3B },
- { MULADD, 0x32D25CB1, 0x3D6D },
- { BITFLD, (long)table_144, 0 },
- { MULADD, 0x50FA1C51, 0x5F4F },
- { LOOKUP, (long)table_145, 0 },
- { XOR, 0x05FE7AF1, 0 },
- { MULADD, 0x14067C29, 0x10C5 },
- { LOOKUP, (long)table_146, 0 },
- { MULADD, 0x4A5558C5, 0x271F },
- { XOR, 0x3C0861B1, 0 },
- { BITFLD, (long)table_147, 0 },
- { LOOKUP, (long)table_148, 0 },
- { MULADD, 0x18837C9D, 0x6335 },
- { BITFLD, (long)table_149, 0 },
- { XOR, 0x7DAB5033, 0 },
- { LOOKUP, (long)table_150, 0 },
- { MULADD, 0x03B87321, 0x7225 },
- { XOR, 0x7F906745, 0 },
- { LOOKUP, (long)table_151, 0 },
- { BITFLD, (long)table_152, 0 },
- { XOR, 0x21C46C2C, 0 },
- { MULADD, 0x2B36757D, 0x028D },
- { BITFLD, (long)table_153, 0 },
- { LOOKUP, (long)table_154, 0 },
- { XOR, 0x106B4A85, 0 },
- { XOR, 0x17640F11, 0 },
- { LOOKUP, (long)table_155, 0 },
- { XOR, 0x69E60486, 0 },
- { LOOKUP, (long)table_156, 0 },
- { MULADD, 0x3782017D, 0x05BF },
- { BITFLD, (long)table_157, 0 },
- { LOOKUP, (long)table_158, 0 },
- { XOR, 0x6BCA53B0, 0 },
- { LOOKUP, (long)table_159, 0 },
- { LOOKUP, (long)table_160, 0 },
- { LOOKUP, (long)table_161, 0 },
- { LOOKUP, (long)table_162, 0 },
- { XOR, 0x0B8236E3, 0 },
- { BITFLD, (long)table_163, 0 },
- { MULADD, 0x5EE51C43, 0x4553 },
- { BITFLD, (long)table_164, 0 },
- { LOOKUP, (long)table_165, 0 },
- { LOOKUP, (long)table_166, 0 },
- { LOOKUP, (long)table_167, 0 },
- { MULADD, 0x42B14C6F, 0x5531 },
- { XOR, 0x4A2548E8, 0 },
- { MULADD, 0x5C071D85, 0x2437 },
- { LOOKUP, (long)table_168, 0 },
- { MULADD, 0x29195861, 0x108B },
- { XOR, 0x24012258, 0 },
- { LOOKUP, (long)table_169, 0 },
- { XOR, 0x63CC2377, 0 },
- { XOR, 0x08D04B59, 0 },
- { MULADD, 0x3FD30CF5, 0x7027 },
- { XOR, 0x7C3E0478, 0 },
- { MULADD, 0x457776B7, 0x24B3 },
- { XOR, 0x086652BC, 0 },
- { MULADD, 0x302F5B13, 0x371D },
- { LOOKUP, (long)table_170, 0 },
- { MULADD, 0x58692D47, 0x0671 },
- { XOR, 0x6601178E, 0 },
- { MULADD, 0x0F195B9B, 0x1369 },
- { XOR, 0x07BA21D8, 0 },
- { BITFLD, (long)table_171, 0 },
- { BITFLD, (long)table_172, 0 },
- { XOR, 0x13AC3D21, 0 },
- { MULADD, 0x5BCF3275, 0x6E1B },
- { MULADD, 0x62725C5B, 0x16B9 },
- { MULADD, 0x5B950FDF, 0x2D35 },
- { BITFLD, (long)table_173, 0 },
- { BITFLD, (long)table_174, 0 },
- { MULADD, 0x73BA5335, 0x1C13 },
- { BITFLD, (long)table_175, 0 },
- { BITFLD, (long)table_176, 0 },
- { XOR, 0x3E144154, 0 },
- { MULADD, 0x4EED7B27, 0x38AB },
- { LOOKUP, (long)table_177, 0 },
- { MULADD, 0x627C7E0F, 0x7F01 },
- { MULADD, 0x5D7E1F73, 0x2C0F },
- { LOOKUP, (long)table_178, 0 },
- { MULADD, 0x55C9525F, 0x4659 },
- { XOR, 0x3765334C, 0 },
- { MULADD, 0x5DF66DDF, 0x7C25 },
- { LOOKUP, (long)table_179, 0 },
- { LOOKUP, (long)table_180, 0 },
- { XOR, 0x16AE5776, 0 },
- { LOOKUP, (long)table_181, 0 },
- { LOOKUP, (long)table_182, 0 },
- { BITFLD, (long)table_183, 0 },
- { BITFLD, (long)table_184, 0 },
- { LOOKUP, (long)table_185, 0 },
- { MULADD, 0x4392327B, 0x7E0D },
- { LOOKUP, (long)table_186, 0 },
- { MULADD, 0x3D8B0CB5, 0x640D },
- { MULADD, 0x32865601, 0x4D43 },
- { BITFLD, (long)table_187, 0 }}};
-
-#define A( x ) (( x ) & 0xFF )
-#define B( x ) (( x ) >> 8 & 0xFF )
-#define C( x ) (( x ) >> 16 & 0xFF )
-#define D( x ) (( x ) >> 24 & 0xFF )
-
-int yahoo_xfrm( int table, int depth, int seed )
-{
- const struct yahoo_fn *xfrm;
- int i, j, z;
- unsigned int n = seed;
- unsigned char *arg;
-
- for( i = 0; i < depth; i++ )
- {
- xfrm = &yahoo_fntable[table][n % 96];
- switch( xfrm->type )
- {
- case IDENT:
- return seed;
- case XOR:
- seed ^= xfrm->arg1;
- break;
- case MULADD:
- seed = seed * xfrm->arg1 + xfrm->arg2;
- break;
- case LOOKUP:
- arg = (unsigned char *)xfrm->arg1;
- seed = arg[A( seed )] | arg[B( seed )] << 8 | arg[C( seed )] << 16
- | arg[D( seed )] << 24;
- break;
- case BITFLD:
- arg = (unsigned char *)xfrm->arg1;
- for( j = 0, z = 0; j < 32; j++ )
- z = ((( seed >> j ) & 1 ) << arg[j] ) | ( ~( 1 << arg[j] ) & z );
- seed = z;
- break;
- }
- if( depth - i == 1 )
- return seed;
- z = (((((( A( seed ) * 0x9E3779B1 ) ^ B( seed )) * 0x9E3779B1 )
- ^ C( seed )) * 0x9E3779B1 ) ^ D( seed )) * 0x9E3779B1;
- n = (((( z ^ ( z >> 8 )) >> 16 ) ^ z ) ^ ( z >> 8 )) & 0xFF;
- seed *= 0x00010DCD;
- }
- return seed;
-}
diff --git a/protocols/yahoo/yahoo_fn.h b/protocols/yahoo/yahoo_fn.h
deleted file mode 100644
index 5400e5d0..00000000
--- a/protocols/yahoo/yahoo_fn.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * libyahoo2 - originally from gaim patches by Amatus
- *
- * Copyright (C) 2003-2004
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#define IDENT 1 /* identify function */
-#define XOR 2 /* xor with arg1 */
-#define MULADD 3 /* multipy by arg1 then add arg2 */
-#define LOOKUP 4 /* lookup each byte in the table pointed to by arg1 */
-#define BITFLD 5 /* reorder bits according to table pointed to by arg1 */
-
-struct yahoo_fn {
- int type;
- long arg1, arg2;
-};
-
-int yahoo_xfrm(int table, int depth, int seed);
diff --git a/protocols/yahoo/yahoo_httplib.c b/protocols/yahoo/yahoo_httplib.c
index 6bb8923d..fd63d507 100644
--- a/protocols/yahoo/yahoo_httplib.c
+++ b/protocols/yahoo/yahoo_httplib.c
@@ -61,6 +61,7 @@ extern struct yahoo_callbacks *yc;
extern enum yahoo_log_level log_level;
+#if 0
int yahoo_tcp_readline(char *ptr, int maxlen, void *fd)
{
int n, rc;
@@ -92,6 +93,7 @@ int yahoo_tcp_readline(char *ptr, int maxlen, void *fd)
*ptr = 0;
return (n);
}
+#endif
static int url_to_host_port_path(const char *url,
char *host, int *port, char *path, int *ssl)
@@ -182,6 +184,7 @@ char *yahoo_urlencode(const char *instr)
return (str);
}
+#if 0
char *yahoo_urldecode(const char *instr)
{
int ipos = 0, bpos = 0;
@@ -278,6 +281,7 @@ char *yahoo_xmldecode(const char *instr)
return (str);
}
+#endif
typedef void (*http_connected) (int id, void *fd, int error);