From 6f9d83d2828d789bbf25e416012d993b25500909 Mon Sep 17 00:00:00 2001 From: Dario Pinto <dario.pinto@cea.fr> Date: Tue, 8 Sep 2020 10:57:55 +0200 Subject: [PATCH] add WordCompletion --- .../WordCompletion/.frama-c/GNUmakefile | 50 + .../.frama-c/WordCompletion.eva/alarms.csv | 8 + .../.frama-c/WordCompletion.eva/metrics.log | 25 + .../.frama-c/WordCompletion.eva/nonterm.log | 1 + .../.frama-c/WordCompletion.eva/warnings.log | 0 .../.frama-c/WordCompletion.parse/framac.ast | 5413 +++++++++++++++++ .../.frama-c/WordCompletion.parse/metrics.log | 50 + .../WordCompletion.parse/warnings.log | 0 .../WordCompletion/.frama-c/path.mk | 1 + cgc-challenges/WordCompletion/README.md | 16 + cgc-challenges/WordCompletion/src/cgc_words.h | 55 + cgc-challenges/WordCompletion/src/main.c | 437 ++ 12 files changed, 6056 insertions(+) create mode 100644 cgc-challenges/WordCompletion/.frama-c/GNUmakefile create mode 100644 cgc-challenges/WordCompletion/.frama-c/WordCompletion.eva/alarms.csv create mode 100644 cgc-challenges/WordCompletion/.frama-c/WordCompletion.eva/metrics.log create mode 100644 cgc-challenges/WordCompletion/.frama-c/WordCompletion.eva/nonterm.log create mode 100644 cgc-challenges/WordCompletion/.frama-c/WordCompletion.eva/warnings.log create mode 100644 cgc-challenges/WordCompletion/.frama-c/WordCompletion.parse/framac.ast create mode 100644 cgc-challenges/WordCompletion/.frama-c/WordCompletion.parse/metrics.log create mode 100644 cgc-challenges/WordCompletion/.frama-c/WordCompletion.parse/warnings.log create mode 120000 cgc-challenges/WordCompletion/.frama-c/path.mk create mode 100644 cgc-challenges/WordCompletion/README.md create mode 100644 cgc-challenges/WordCompletion/src/cgc_words.h create mode 100644 cgc-challenges/WordCompletion/src/main.c diff --git a/cgc-challenges/WordCompletion/.frama-c/GNUmakefile b/cgc-challenges/WordCompletion/.frama-c/GNUmakefile new file mode 100644 index 000000000..d4384f08c --- /dev/null +++ b/cgc-challenges/WordCompletion/.frama-c/GNUmakefile @@ -0,0 +1,50 @@ +# Makefile template for Frama-C/Eva case studies. +# For details and usage information, see the Frama-C User Manual. + +### Prologue. Do not modify this block. ####################################### +-include path.mk +FRAMAC ?= frama-c +include $(shell $(FRAMAC)-config -scripts)/prologue.mk +############################################################################### + +# Edit below as needed. MACHDEP is mandatory. Suggested flags are optional. + +MACHDEP = x86_32 + +## Preprocessing flags (for -cpp-extra-args) +CPPFLAGS += \ + -DPATCHED \ + -D__FC_PATCHED \ + -I../../lib \ + -I../src \ + +## General flags +FCFLAGS += \ + -add-symbolic-path=.:..,CGC_LIB:../../lib \ + -kernel-warn-key annot:missing-spec=abort \ + -kernel-warn-key typing:implicit-function-declaration=abort \ + -absolute-valid-range 0x4347C000-0x4347FFFF \ + -c11 \ + +## Eva-specific flags +EVAFLAGS += \ + -eva-warn-key builtins:missing-spec=abort \ + -eva-slevel 120 \ + -eva-precision 4 \ + +## GUI-only flags +FCGUIFLAGS += \ + -add-symbolic-path=.:..,CGC_LIB:../../lib \ + +## Analysis targets (suffixed with .eva) +TARGETS = WordCompletion.eva + +### Each target <t>.eva needs a rule <t>.parse with source files as prerequisites +WordCompletion.parse: \ + ../../lib/common.c \ + ../../lib/libcgc.c \ + ../src/main.c \ + +### Epilogue. Do not modify this block. ####################################### +include $(shell $(FRAMAC)-config -scripts)/epilogue.mk +############################################################################### diff --git a/cgc-challenges/WordCompletion/.frama-c/WordCompletion.eva/alarms.csv b/cgc-challenges/WordCompletion/.frama-c/WordCompletion.eva/alarms.csv new file mode 100644 index 000000000..f3fe465da --- /dev/null +++ b/cgc-challenges/WordCompletion/.frama-c/WordCompletion.eva/alarms.csv @@ -0,0 +1,8 @@ +directory file line function property kind status property +CGC_LIB libcgc.c 28 cgc_transmit precondition of write Unknown buf_has_room: \valid_read((char *)buf + (0 .. count - 1)) +FRAMAC_SHARE/libc string.h 137 strcmp precondition Unknown valid_string_s1: valid_read_string(s1) +FRAMAC_SHARE/libc unistd.h 1133 write precondition Unknown buf_has_room: \valid_read((char *)buf + (0 .. count - 1)) +src main.c 107 cgc_readline mem_access Unknown \valid(buf + count) +src main.c 327 cgc_scramble mem_access Unknown \valid_read(src + i) +src main.c 403 main precondition of strcmp Unknown valid_string_s1: valid_read_string(s1) +src main.c 427 main precondition of strcmp Unknown valid_string_s1: valid_read_string(s1) diff --git a/cgc-challenges/WordCompletion/.frama-c/WordCompletion.eva/metrics.log b/cgc-challenges/WordCompletion/.frama-c/WordCompletion.eva/metrics.log new file mode 100644 index 000000000..6d32c9a1b --- /dev/null +++ b/cgc-challenges/WordCompletion/.frama-c/WordCompletion.eva/metrics.log @@ -0,0 +1,25 @@ +[metrics] Eva coverage statistics +======================= +Syntactically reachable functions = 15 (out of 48) +Semantically reached functions = 15 +Coverage estimation = 100.0% +[metrics] References to non-analyzed functions +------------------------------------ +[metrics] Statements analyzed by Eva +-------------------------- +295 stmts in analyzed functions, 267 stmts analyzed (90.5%) +cgc_RANDOM: 2 stmts out of 2 (100.0%) +cgc_allocate: 9 stmts out of 9 (100.0%) +cgc_my_srand: 2 stmts out of 2 (100.0%) +cgc_receive: 9 stmts out of 9 (100.0%) +cgc_toInt: 22 stmts out of 22 (100.0%) +cgc_transmit: 9 stmts out of 9 (100.0%) +cgc_transmit_str: 3 stmts out of 3 (100.0%) +main: 61 stmts out of 65 (93.8%) +cgc_init: 42 stmts out of 45 (93.3%) +cgc_readline: 21 stmts out of 24 (87.5%) +cgc_rotN: 21 stmts out of 24 (87.5%) +cgc_scramble: 35 stmts out of 41 (85.4%) +cgc_transmit_all_zPcz: 17 stmts out of 20 (85.0%) +cgc_strrotcpy: 13 stmts out of 18 (72.2%) +cgc__terminate: 1 stmts out of 2 (50.0%) diff --git a/cgc-challenges/WordCompletion/.frama-c/WordCompletion.eva/nonterm.log b/cgc-challenges/WordCompletion/.frama-c/WordCompletion.eva/nonterm.log new file mode 100644 index 000000000..ddc444d43 --- /dev/null +++ b/cgc-challenges/WordCompletion/.frama-c/WordCompletion.eva/nonterm.log @@ -0,0 +1 @@ +CGC_LIB/libcgc.c:23:[nonterm] warning: unreachable implicit return diff --git a/cgc-challenges/WordCompletion/.frama-c/WordCompletion.eva/warnings.log b/cgc-challenges/WordCompletion/.frama-c/WordCompletion.eva/warnings.log new file mode 100644 index 000000000..e69de29bb diff --git a/cgc-challenges/WordCompletion/.frama-c/WordCompletion.parse/framac.ast b/cgc-challenges/WordCompletion/.frama-c/WordCompletion.parse/framac.ast new file mode 100644 index 000000000..19760886a --- /dev/null +++ b/cgc-challenges/WordCompletion/.frama-c/WordCompletion.parse/framac.ast @@ -0,0 +1,5413 @@ +/* Generated by Frama-C */ +#include "ctype.h" +#include "errno.h" +#include "fcntl.h" +#include "math.h" +#include "signal.h" +#include "stdarg.h" +#include "stddef.h" +#include "stdint.h" +#include "stdio.h" +#include "stdlib.h" +#include "string.h" +#include "strings.h" +#include "sys/select.h" +#include "sys/time.h" +#include "sys/types.h" +#include "unistd.h" +struct __anonstruct_File_1 { + size_t fd ; + size_t index ; + size_t num ; + unsigned char buffer[4096] ; +}; +typedef struct __anonstruct_File_1 File; +struct cgc_aes_state { + uint8_t vec[16] __attribute__((__aligned__(1))); + uint8_t key[16] __attribute__((__aligned__(1))); + uint8_t datetime[16] __attribute__((__aligned__(1))); +} __attribute__((__packed__, __aligned__(1))); +typedef struct cgc_aes_state cgc_aes_state; +struct cgc_prng { + cgc_aes_state state ; + uint8_t intermediate[16] ; + uint8_t random_data[16] ; + uint8_t random_idx ; +}; +typedef struct cgc_prng cgc_prng_0; +/*@ requires \valid(buf + (0 .. size - 1)); + assigns *(buf + (0 .. size - 1)), \result; + assigns *(buf + (0 .. size - 1)) + \from (indirect: fd), (indirect: term), (indirect: size); + assigns \result \from (indirect: fd), (indirect: term), (indirect: size); + */ +int cgc_recvuntil(int fd, char *buf, size_t size, char term); + +/*@ requires valid_s1: valid_read_string(s1); + requires valid_s2: valid_read_string(s2); + ensures result_equal_or_diff: \result ≡ 0 ∨ \result ≡ 1; + assigns \result; + assigns \result + \from (indirect: s1), (indirect: s2), (indirect: *(s1 + (0 ..))), + (indirect: *(s2 + (0 ..))); + */ +int cgc_streq(char *s1, char *s2); + +/*@ requires \valid(buf + (0 .. size - 1)); + assigns *(buf + (0 .. size - 1)), \result; + assigns *(buf + (0 .. size - 1)) \from (indirect: fd), (indirect: size); + assigns \result \from (indirect: fd), (indirect: size); + */ +int cgc_recvline(int fd, char *buf, size_t size); + +int cgc_recv(int fd, char *buf, size_t size); + +int cgc_check_timeout(struct timeval const *timeout); + + __attribute__((__noreturn__)) void cgc__terminate(unsigned int status); + +int cgc_transmit(int fd, void const *buf, size_t count, size_t *tx_bytes); + +int cgc_receive(int fd, void *buf, size_t count, size_t *rx_bytes); + +int cgc_fdwait(int nfds, fd_set *readfds, fd_set *writefds, + struct timeval const *timeout, int *readyfds); + +int cgc_allocate(size_t length, int is_X, void **addr); + +int cgc_deallocate(void *addr, size_t length); + +int cgc_random(void *buf, size_t count, size_t *rnd_bytes); + +int cgc_sendline(int fd, char const *buf, size_t size); + +int cgc_sendall(int fd, char const *buf, size_t size); + +int cgc_fill_buffer(void); + +int cgc_get_char(char *ch); + +int cgc_read_n_bytes(unsigned int socket, char *buffer, size_t size, + size_t *cgc_read); + +int cgc_read_until_delim_or_n(unsigned int socket, char *buffer, char delim, + size_t size, size_t *cgc_read); + +int cgc_transmit_all(int fd, void const *buf, size_t const size); + +int receive_bytes_iPcz(char *buffer, size_t count); + +int __prng_state; +/*@ assigns __prng_state; + assigns __prng_state \from seedValue; */ +void seed_prng(uint32_t seedValue); + +/*@ assigns \result, __prng_state; + assigns \result \from __prng_state; + assigns __prng_state \from __prng_state; + */ +uint32_t cgc_prng(void); + +void *calloc_Pvz(size_t size); + +char *strtok_PcPcc(char *s, char sep); + +int str2int_dPc(char const *str_buf); + +uint32_t str2uint_ud32Pc(char const *str_buf); + +int int2str_dPcdd(char *str_buf, int buf_size, int i); + +int uint2str_dPcdud32(char *str_buf, int buf_size, uint32_t i); + +size_t strcpy_zPcPc(char *s1, char *s2); + +size_t strncpy_zPcPcz(char *s1, char *s2, size_t n); + +int receive_bytes_iPcz(char *buffer, size_t count) +{ + int __retres; + size_t total; + size_t rxbytes; + total = (unsigned int)0; + while (total < count) { + int tmp; + rxbytes = (unsigned int)0; + tmp = cgc_receive(0,(void *)(buffer + total),count - total,& rxbytes); + if (tmp == 0) + if (rxbytes == (size_t)0) { + __retres = 0; + goto return_label; + } + else total += rxbytes; + else { + __retres = -1; + goto return_label; + } + } + __retres = 0; + return_label: return __retres; +} + +void *calloc_Pvz(size_t size) +{ + void *tmp; + tmp = calloc((unsigned int)1,size); + return tmp; +} + +char *strtok_PcPcc(char *s, char sep) +{ + char *tmp; + char tok[2] = {(char)0}; + tok[0] = sep; + tmp = strtok(s,(char const *)(tok)); + return tmp; +} + +int str2int_dPc(char const *str_buf) +{ + int __retres; + int result = 0; + int max_chars = 10; + int i = 0; + int sign = 0; + if (str_buf == (char const *)0) { + __retres = result; + goto return_label; + } + if ((int)*(str_buf + 0) == '-') { + sign = -1; + i ++; + max_chars ++; + } + while (i < max_chars) { + if ((int)*(str_buf + i) >= '0') { + if ((int)*(str_buf + i) <= '9') { + result *= 10; + result += (int)*(str_buf + i) - '0'; + } + else goto _LAND; + } + else _LAND: break; + i ++; + } + if (sign == -1) result = - result; + __retres = result; + return_label: return __retres; +} + +uint32_t str2uint_ud32Pc(char const *str_buf) +{ + uint32_t __retres; + int result = 0; + int max_chars = 10; + int i = 0; + if (str_buf == (char const *)0) { + __retres = (unsigned int)result; + goto return_label; + } + while (i < max_chars) { + if ((int)*(str_buf + i) >= '0') { + if ((int)*(str_buf + i) <= '9') { + result *= 10; + result += (int)*(str_buf + i) - '0'; + } + else goto _LAND; + } + else _LAND: break; + i ++; + } + __retres = (unsigned int)result; + return_label: return __retres; +} + +int int2str_dPcdd(char *str_buf, int buf_size, int i) +{ + int __retres; + int tmp_1; + int idx = 0; + int tmp = 0; + int digit = 0; + if (buf_size < 2) { + __retres = -1; + goto return_label; + } + if (i < 0) { + int tmp_0; + if (buf_size < 3) { + __retres = -1; + goto return_label; + } + tmp_0 = idx; + idx ++; + *(str_buf + tmp_0) = (char)'-'; + } + else i *= -1; + tmp = i; + while (1) { + idx ++; + tmp /= 10; + if (! (tmp < 0)) break; + } + if (idx >= buf_size) { + __retres = -1; + goto return_label; + } + tmp_1 = idx; + idx --; + *(str_buf + tmp_1) = (char)'\000'; + while (1) { + { + int tmp_2; + digit = -1 * (i % 10); + tmp_2 = idx; + idx --; + *(str_buf + tmp_2) = (char)('0' + digit); + i /= 10; + } + if (! (i < 0)) break; + } + __retres = 0; + return_label: return __retres; +} + +int uint2str_dPcdud32(char *str_buf, int buf_size, uint32_t i) +{ + int __retres; + int tmp_0; + int idx = 0; + uint32_t tmp = (unsigned int)0; + int digit = 0; + if (buf_size < 2) { + __retres = -1; + goto return_label; + } + tmp = i; + while (1) { + idx ++; + tmp /= (uint32_t)10; + if (! (tmp > (uint32_t)0)) break; + } + if (idx >= buf_size) { + __retres = -1; + goto return_label; + } + tmp_0 = idx; + idx --; + *(str_buf + tmp_0) = (char)'\000'; + while (1) { + { + int tmp_1; + digit = (int)(i % (unsigned int)10); + tmp_1 = idx; + idx --; + *(str_buf + tmp_1) = (char)('0' + digit); + i /= (uint32_t)10; + } + if (! (i > (uint32_t)0)) break; + } + __retres = 0; + return_label: return __retres; +} + +size_t strcpy_zPcPc(char *s1, char *s2) +{ + size_t __retres; + char *tmp_0; + char *tmp = s1; + while (*s2) { + *tmp = *s2; + tmp ++; + s2 ++; + } + tmp_0 = tmp; + tmp ++; + *tmp_0 = (char)'\000'; + __retres = (unsigned int)((tmp - s1) - 1); + return __retres; +} + +size_t strncpy_zPcPcz(char *s1, char *s2, size_t n) +{ + size_t __retres; + char *tmp_0; + char *tmp = s1; + while (1) { + if ((size_t)(tmp - s1) < n) { + if (! *s2) break; + } + else break; + *tmp = *s2; + tmp ++; + s2 ++; + } + tmp_0 = tmp; + tmp ++; + *tmp_0 = (char)'\000'; + __retres = (unsigned int)((tmp - s1) - 1); + return __retres; +} + +void cgc_init_prng(cgc_prng_0 *, cgc_aes_state const *); + +void cgc_aes_get_bytes(cgc_prng_0 *, uint32_t, uint8_t *); + + __attribute__((__noreturn__)) void cgc__terminate(unsigned int status); +void cgc__terminate(unsigned int status) +{ + exit((int)status); + return; +} + +int cgc_transmit(int fd, void const *buf, size_t count, size_t *tx_bytes) +{ + int __retres; + ssize_t const ret = write(fd,buf,count); + if (ret < 0) { + __retres = __fc_errno; + goto return_label; + } + else + if (tx_bytes != (size_t *)0) *tx_bytes = (unsigned int)ret; + __retres = 0; + return_label: return __retres; +} + +int cgc_receive(int fd, void *buf, size_t count, size_t *rx_bytes) +{ + int __retres; + ssize_t const ret = read(fd,buf,count); + if (ret < 0) { + __retres = __fc_errno; + goto return_label; + } + else + if (rx_bytes != (size_t *)0) *rx_bytes = (unsigned int)ret; + __retres = 0; + return_label: return __retres; +} + +static int cgc_copy_cgc_fd_set(fd_set const *cgc_fds, fd_set *os_fds, + int *num_fds) +{ + int __retres; + { + unsigned int fd = (unsigned int)0; + while (fd < (unsigned int)8 * sizeof(long)) { + { + int tmp; + tmp = FD_ISSET((int)fd,cgc_fds); + if (tmp) { + if (fd >= (unsigned int)(3 + 2 * 10)) { + __retres = 9; + goto return_label; + } + if (fd > (unsigned int)8 * sizeof(long)) goto __Cont; + FD_SET((int)fd,os_fds); + (*num_fds) ++; + } + } + __Cont: fd ++; + } + } + __retres = 0; + return_label: return __retres; +} + +static void cgc_copy_os_fd_set(fd_set const *os_fds, fd_set *cgc_fds) +{ + unsigned int fd = (unsigned int)0; + while (1) { + unsigned int tmp_0; + if ((unsigned int)8 * sizeof(long) < (unsigned int)8 * sizeof(long)) + tmp_0 = (unsigned int)8 * sizeof(long); + else tmp_0 = (unsigned int)8 * sizeof(long); + ; + if (! (fd < tmp_0)) break; + { + int tmp; + tmp = FD_ISSET((int)fd,os_fds); + if (tmp) FD_SET((int)fd,cgc_fds); + } + fd ++; + } + return; +} + +int cgc_fdwait(int nfds, fd_set *readfds, fd_set *writefds, + struct timeval const *timeout, int *readyfds) +{ + int __retres; + fd_set read_fds; + fd_set write_fds; + int tmp_3; + struct timeval *tmp_0; + fd_set *tmp_1; + fd_set *tmp_2; + int ret = cgc_check_timeout(timeout); + int actual_num_fds = 0; + struct timeval max_wait_time = {.tv_sec = (long)0, .tv_usec = 0}; + if (ret) { + __retres = ret; + goto return_label; + } + else + if (0 > nfds) goto _LOR; + else + if ((unsigned int)8 * sizeof(long) < (unsigned int)nfds) { + _LOR: { + __retres = 22; + goto return_label; + } + } + FD_ZERO(& read_fds); + FD_ZERO(& write_fds); + if (readfds) { + ret = cgc_copy_cgc_fd_set((fd_set const *)readfds,& read_fds, + & actual_num_fds); + if (0 != ret) { + __retres = ret; + goto return_label; + } + } + if (writefds) { + ret = cgc_copy_cgc_fd_set((fd_set const *)writefds,& write_fds, + & actual_num_fds); + if (0 != ret) { + __retres = ret; + goto return_label; + } + } + if (actual_num_fds != nfds) { + __retres = 22; + goto return_label; + } + if (readfds) FD_ZERO(readfds); + if (writefds) FD_ZERO(writefds); + if (timeout) { + max_wait_time.tv_sec = timeout->tv_sec; + max_wait_time.tv_usec = timeout->tv_usec; + } + if (timeout) tmp_0 = & max_wait_time; else tmp_0 = (struct timeval *)0; + if (writefds) tmp_1 = & write_fds; else tmp_1 = (fd_set *)0; + if (readfds) tmp_2 = & read_fds; else tmp_2 = (fd_set *)0; + ; + tmp_3 = select(nfds,tmp_2,tmp_1,(fd_set *)0,tmp_0); + int num_selected_fds = tmp_3; + if (num_selected_fds < 0) { + __retres = __fc_errno; + goto return_label; + } + if (readfds) cgc_copy_os_fd_set((fd_set const *)(& read_fds),readfds); + if (writefds) cgc_copy_os_fd_set((fd_set const *)(& write_fds),writefds); + if (readyfds) *readyfds = num_selected_fds; + __retres = 0; + return_label: return __retres; +} + +/*@ requires valid_addr: \valid((char *)addr); */ +int cgc_allocate(size_t length, int is_X, void **addr) +{ + int __retres; + *addr = malloc(length); + if (! *addr) { + __retres = 1; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + return_label: return __retres; +} + +int cgc_deallocate(void *addr, size_t length) +{ + int __retres; + free(addr); + __retres = 0; + return __retres; +} + +static cgc_prng_0 *cgc_internal_prng = (cgc_prng_0 *)0; +/*@ requires valid_read_string(s); + requires valid_read_string(format); + requires \valid(param0); + ensures \initialized(param0); + assigns \result, *param0; + assigns \result + \from (indirect: *(s + (0 ..))), (indirect: *(format + (0 ..))); + assigns *param0 + \from (indirect: *(s + (0 ..))), (indirect: *(format + (0 ..))); + */ +int sscanf_va_1(char const * __restrict s, char const * __restrict format, + unsigned char *param0); + +static void cgc_try_init_prng(void) +{ + if (cgc_internal_prng != (cgc_prng_0 *)0) goto return_label; + uint8_t prng_seed[16 * 3] = + {(unsigned char)0x73, + (unsigned char)0x65, + (unsigned char)0x65, + (unsigned char)0x64, + (unsigned char)0x73, + (unsigned char)0x65, + (unsigned char)0x65, + (unsigned char)0x64, + (unsigned char)0x73, + (unsigned char)0x65, + (unsigned char)0x65, + (unsigned char)0x64, + (unsigned char)0x73, + (unsigned char)0x65, + (unsigned char)0x65, + (unsigned char)0x64, + (unsigned char)0x30, + (unsigned char)0x31, + (unsigned char)0x32, + (unsigned char)0x33, + (unsigned char)0x34, + (unsigned char)0x35, + (unsigned char)0x36, + (unsigned char)0x37, + (unsigned char)0x38, + (unsigned char)0x39, + (unsigned char)0x61, + (unsigned char)0x62, + (unsigned char)0x63, + (unsigned char)0x64, + (unsigned char)0x65, + (unsigned char)0x66, + (unsigned char)0x00, + (unsigned char)0x00, + (unsigned char)0x00, + (unsigned char)0x00, + (unsigned char)0x00, + (unsigned char)0x00, + (unsigned char)0x00, + (unsigned char)0x00, + (unsigned char)0x00, + (unsigned char)0x00, + (unsigned char)0x00, + (unsigned char)0x00, + (unsigned char)0x00, + (unsigned char)0x00, + (unsigned char)0x00, + (unsigned char)0x00}; + char const *prng_seed_hex = getenv("seed"); + if (prng_seed_hex != (char const *)0) { + size_t tmp_0; + tmp_0 = strlen(prng_seed_hex); + if (tmp_0 == (size_t)((16 * 3) * 2)) { + char const *pos = prng_seed_hex; + { + int i = 0; + while (i < 16 * 3) { + sscanf_va_1(pos,"%2hhx",(unsigned char *)(& prng_seed[i])); + pos += 2; + i ++; + } + } + } + } + cgc_internal_prng = (cgc_prng_0 *)malloc(sizeof(cgc_prng_0)); + cgc_aes_state *seed = (cgc_aes_state *)(prng_seed); + cgc_init_prng(cgc_internal_prng,(cgc_aes_state const *)seed); + return_label: return; +} + +int cgc_random(void *buf, size_t count, size_t *rnd_bytes) +{ + int __retres; + cgc_try_init_prng(); + cgc_aes_get_bytes(cgc_internal_prng,count,(uint8_t *)buf); + if (rnd_bytes) *rnd_bytes = count; + __retres = 0; + return __retres; +} + +int cgc_sendall(int fd, char const *buf, size_t size) +{ + int __retres; + size_t sent = (unsigned int)0; + size_t total = (unsigned int)0; + if (! buf) { + __retres = -1; + goto return_label; + } + if (! size) { + __retres = 0; + goto return_label; + } + while (size) { + int tmp; + tmp = cgc_transmit(fd,(void const *)buf,size,& sent); + if (tmp) { + __retres = -1; + goto return_label; + } + buf += sent; + total += sent; + size -= sent; + } + __retres = (int)total; + return_label: return __retres; +} + +int cgc_sendline(int fd, char const *buf, size_t size) +{ + int __retres; + int ret; + ret = cgc_sendall(fd,buf,size); + if (ret < 0) { + __retres = ret; + goto return_label; + } + else { + int tmp; + tmp = cgc_transmit(fd,(void const *)"\n",(unsigned int)1,& size); + if (tmp) { + __retres = -1; + goto return_label; + } + else { + ret ++; + __retres = ret; + goto return_label; + } + } + return_label: return __retres; +} + +int cgc_check_timeout(struct timeval const *timeout) +{ + int __retres; + if (! timeout) { + __retres = 0; + goto return_label; + } + else + if ((time_t)0 > timeout->tv_sec) goto _LOR; + else + if (0 > timeout->tv_usec) { + _LOR: { + __retres = 22; + goto return_label; + } + } + else { + __retres = 0; + goto return_label; + } + return_label: return __retres; +} + +static File std_input = + {.fd = (unsigned int)0, + .index = (unsigned int)0, + .num = 0U, + .buffer = {(unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0, + (unsigned char)0}}; +int cgc_fill_buffer(void) +{ + int __retres; + int tmp; + std_input.index = (unsigned int)0; + std_input.num = (unsigned int)0; + tmp = cgc_receive((int)std_input.fd,(void *)(std_input.buffer), + (unsigned int)4096,& std_input.num); + if (tmp) { + __retres = -1; + goto return_label; + } + if (std_input.num == (size_t)0) { + __retres = -2; + goto return_label; + } + __retres = 0; + return_label: return __retres; +} + +int cgc_get_char(char *ch) +{ + int __retres; + int result; + if (std_input.num == (size_t)0) goto _LOR; + else + if (std_input.num <= std_input.index) { + _LOR: + { + result = cgc_fill_buffer(); + if (result) { + __retres = result; + goto return_label; + } + } + } + *ch = (char)std_input.buffer[std_input.index]; + std_input.index += (size_t)1; + __retres = 0; + return_label: return __retres; +} + +int cgc_read_until_delim_or_n(unsigned int socket, char *buffer, char delim, + size_t size, size_t *cgc_read) +{ + int __retres; + char tmp_char; + size_t tmp = (unsigned int)0; + *cgc_read = (unsigned int)0; + int result = 0; + if (! buffer) { + __retres = 3; + goto return_label; + } + if (! size) { + __retres = 4; + goto return_label; + } + { + unsigned int i = (unsigned int)0; + while (i < size) { + result = cgc_get_char(& tmp_char); + if (result) { + __retres = result; + goto return_label; + } + if ((int)delim != 0) + if ((int)tmp_char == (int)delim) { + __retres = 0; + goto return_label; + } + *(buffer + i) = tmp_char; + *cgc_read += (size_t)1; + i ++; + } + } + __retres = 0; + return_label: return __retres; +} + +int cgc_read_n_bytes(unsigned int socket, char *buffer, size_t size, + size_t *cgc_read) +{ + int tmp; + tmp = cgc_read_until_delim_or_n(socket,buffer,(char)0,size,cgc_read); + return tmp; +} + +int cgc_transmit_all(int fd, void const *buf, size_t const size) +{ + int __retres; + size_t bytes = (unsigned int)0; + { + size_t sent = (unsigned int)0; + while (sent < size) { + { + int tmp; + tmp = cgc_transmit(fd,buf + sent,size - sent,& bytes); + if (tmp) { + __retres = -1; + goto return_label; + } + sent += bytes; + } + sent += (size_t)1; + } + } + __retres = 0; + return_label: return __retres; +} + +/*@ requires \valid(buf + (0 .. size - 1)); + assigns *(buf + (0 .. size - 1)), \result; + assigns *(buf + (0 .. size - 1)) \from (indirect: fd), (indirect: size); + assigns \result \from (indirect: fd), (indirect: size); + */ +int cgc_recv(int fd, char *buf, size_t size) +{ + int __retres; + size_t bytes_read = (unsigned int)0; + size_t total_read = (unsigned int)0; + if (! size) { + __retres = 0; + goto return_label; + } + if (! buf) { + __retres = -1; + goto return_label; + } + while (size) { + int tmp_0; + char *tmp; + tmp = buf; + buf ++; + ; + ; + tmp_0 = cgc_receive(fd,(void *)tmp,(unsigned int)1,& bytes_read); + if (tmp_0) { + __retres = -1; + goto return_label; + } + total_read += (size_t)1; + size -= (size_t)1; + } + __retres = (int)total_read; + return_label: return __retres; +} + +/*@ assigns \nothing; */ +static void cgc_initialize_flag_page(void) __attribute__((__constructor__)); + +char *gSeedWords[51] = + {(char *)"My precious.", + (char *)"I see dead people.", + (char *)"I\'m the kind of the world!", + (char *)"Show me the money!", + (char *)"You had me at hello.", + (char *)"Houston, we have a problem.", + (char *)"Mama always said life was like a box of chocolates.", + (char *)"You can\'t handle the truth!", + (char *)"There\'s no crying in baseball!", + (char *)"A census taker once tried to test me.", + (char *)"Hasta la vista, baby.", + (char *)"I\'ll have what she\'s having.", + (char *)"If you build it, he will come.", + (char *)"Carpe diem. Seize the day, boys.", + (char *)"Greed, for lack of a better word, is good.", + (char *)"Snap out of it!", + (char *)"Nobody puts Baby in a corner.", + (char *)"I feel the need-the need for speed!", + (char *)"I\'ll be back.", + (char *)"Go ahead, make my day.", + (char *)"Say hello to my little friend!", + (char *)"E.T. phone home.", + (char *)"They\'re here!", + (char *)"No wire hangers, ever!", + (char *)"Listen to me, mister. You\'re my knight in shining armor.", + (char *)"Here\'s Johnny!", + (char *)"I am serious...and don\'t call me Shirley.", + (char *)"Cinderella story. Outta nowhere.", + (char *)"I love the smell of napalm in the morning.", + (char *)"Toga! Toga!", + (char *)"May the Force be with you.", + (char *)"La-dee-da, la-dee-da.", + (char *)"You talkin\' to me?", + (char *)"I\'m as mad as hell, and I\'m not going to take this anymore!", + (char *)"Is it safe?", + (char *)"Yo, Adrian!", + (char *)"You\'re gonna need a bigger boat.", + (char *)"Attica! Attica!", + (char *)"Keep your friends close, but your enemies closer.", + (char *)"Forget it, Jake, it\'s Chinatown.", + (char *)"Soylent Green is people!", + (char *)"I\'m going to make him an offer he can\'t refuse.", + (char *)"You\'ve got to ask yourself one question: \'Do I feel lucky?\'", + (char *)"Love means never having to say you\'re sorry", + (char *)"I\'m walking here! I\'am walking here!", + (char *)"Get your stinking paws off me, you damned dirty ape.", + (char *)"Open the pod bay doors please, HAL.", + (char *)"Hello, gorgeous.", + (char *)"What we\'ve got here is failure to communicate.", + (char *)"They call me Mister Tibbs!", + (char *)"We rob banks."}; +char gValidChars[63] = + {(char)'a', + (char)'b', + (char)'c', + (char)'d', + (char)'e', + (char)'f', + (char)'g', + (char)'h', + (char)'i', + (char)'j', + (char)'k', + (char)'l', + (char)'m', + (char)'n', + (char)'o', + (char)'p', + (char)'q', + (char)'r', + (char)'s', + (char)'t', + (char)'u', + (char)'v', + (char)'w', + (char)'x', + (char)'y', + (char)'z', + (char)'A', + (char)'B', + (char)'C', + (char)'D', + (char)'E', + (char)'F', + (char)'G', + (char)'H', + (char)'I', + (char)'J', + (char)'K', + (char)'L', + (char)'M', + (char)'N', + (char)'O', + (char)'P', + (char)'Q', + (char)'R', + (char)'S', + (char)'T', + (char)'U', + (char)'V', + (char)'W', + (char)'X', + (char)'Y', + (char)'Z', + (char)'0', + (char)'1', + (char)'2', + (char)'3', + (char)'4', + (char)'5', + (char)'6', + (char)'7', + (char)'8', + (char)'9', + (char)'\000'}; +size_t cgc_transmit_all_zPcz(char *buf, size_t size) +{ + size_t __retres; + size_t rx_bytes = (unsigned int)0; + size_t total = (unsigned int)0; + int ret = 0; + if (buf == (char *)0) { + __retres = (unsigned int)0; + goto return_label; + } + while (1) { + ret = cgc_transmit(1,(void const *)buf,size - total,& rx_bytes); + if (ret != 0) goto _LOR; + else + if (rx_bytes == (size_t)0) _LOR: cgc__terminate((unsigned int)1); + total += rx_bytes; + if (! (total < size)) break; + } + __retres = size; + return_label: return __retres; +} + +size_t cgc_transmit_str(char *buf) +{ + size_t tmp_0; + size_t len = strlen((char const *)buf); + tmp_0 = cgc_transmit_all_zPcz(buf,len); + return tmp_0; +} + +size_t cgc_receive_all(char *buf, size_t size) +{ + size_t __retres; + size_t rx_bytes = (unsigned int)0; + size_t total = (unsigned int)0; + int ret = 0; + if (buf == (char *)0) { + __retres = (unsigned int)0; + goto return_label; + } + while (1) { + ret = cgc_receive(0,(void *)buf,size - total,& rx_bytes); + if (ret != 0) goto _LOR; + else + if (rx_bytes == (size_t)0) _LOR: cgc__terminate((unsigned int)1); + total += rx_bytes; + if (! (total < size)) break; + } + __retres = size; + return_label: return __retres; +} + +size_t cgc_readline(char *buf, size_t len) +{ + size_t __retres; + if (buf == (char *)0) { + __retres = (unsigned int)0; + goto return_label; + } + size_t count = (unsigned int)0; + int ret = 0; + char c = (char)0; + size_t rx_bytes = (unsigned int)0; + while (1) { + ret = cgc_receive(0,(void *)(& c),(unsigned int)1,& rx_bytes); + if (ret != 0) goto _LOR; + else + if (rx_bytes == (size_t)0) _LOR: cgc__terminate((unsigned int)1); + *(buf + count) = c; + count += (size_t)1; + if ((int)c != '\n') { + if (! (count < len)) break; + } + else break; + } + __retres = count; + return_label: return __retres; +} + +char cgc_rotN(char c, int n) +{ + char __retres; + int temp = 0; + n = (int)((unsigned int)n % (sizeof(gValidChars) - (unsigned int)1)); + if ((int)c >= 'a') { + if ((int)c <= 'z') temp = (int)c - 'a'; else goto _LAND_1; + } + else { + _LAND_1: ; + if ((int)c >= 'A') { + if ((int)c <= 'Z') temp = ((int)c - 'A') + 26; else goto _LAND_0; + } + else { + _LAND_0: ; + if ((int)c >= '0') { + if ((int)c <= '9') temp = ((int)c - '0') + 52; else goto _LAND; + } + else { + _LAND: { + __retres = c; + goto return_label; + } + } + } + } + temp += n; + temp = (int)((unsigned int)temp % (sizeof(gValidChars) - (unsigned int)1)); + __retres = gValidChars[temp]; + return_label: return __retres; +} + +size_t cgc_strrotcpy(char *dst, char *src, int rot) +{ + size_t __retres; + if (src == (char *)0) goto _LOR; + else + if (dst == (char *)0) { + _LOR: { + __retres = (unsigned int)0; + goto return_label; + } + } + size_t ret = (unsigned int)0; + ret = (unsigned int)0; + while ((int)*(src + ret) != '\000') { + *(dst + ret) = cgc_rotN(*(src + ret),rot); + ret += (size_t)1; + } + *(dst + ret) = (char)'\000'; + __retres = ret; + return_label: return __retres; +} + +char **cgc_gWords = (char **)0; +char *cgc_gWordData = (char *)0; +int cgc_init(int rot) +{ + int __retres; + int ret = 0; + size_t numWords = sizeof(gSeedWords) / sizeof(char *); + ret = cgc_allocate(sizeof(gSeedWords),0,(void **)(& cgc_gWords)); + if (ret != 0) { + __retres = ret; + goto return_label; + } + size_t total = (unsigned int)0; + int i = 0; + i = 0; + while ((size_t)i < numWords) { + { + size_t tmp; + tmp = strlen((char const *)gSeedWords[i]); + total += tmp; + total += (size_t)1; + } + i ++; + } + ret = cgc_allocate(total,0,(void **)(& cgc_gWordData)); + if (ret != 0) { + __retres = ret; + goto return_label; + } + size_t temp = (unsigned int)0; + char *pTemp = cgc_gWordData; + i = 0; + while ((size_t)i < numWords) { + { + size_t tmp_0; + *(cgc_gWords + i) = pTemp; + tmp_0 = cgc_strrotcpy(pTemp,gSeedWords[i],rot); + pTemp += tmp_0; + pTemp ++; + } + i ++; + } + while ((unsigned int)i < sizeof(gSeedWords) / sizeof(char *)) { + *(cgc_gWords + i) = (char *)0; + i ++; + } + __retres = 0; + return_label: return __retres; +} + +int cgc_toInt(char c1, char c2) +{ + int __retres; + int ret = 0; + if ((int)c1 >= '0') + if ((int)c1 <= '9') { + ret = (int)c1 - '0'; + if ((int)c2 >= '0') { + if ((int)c2 <= '9') { + ret *= 10; + ret += (int)c2 - '0'; + __retres = ret; + goto return_label; + } + else goto _LAND; + } + else { + _LAND: ; + if ((int)c2 != '\000') { + __retres = ret; + goto return_label; + } + else { + __retres = 0; + goto return_label; + } + } + } + __retres = 0; + return_label: return __retres; +} + +static uint32_t gRandRegister = 0xDA2bAC9C; +uint32_t cgc_RANDOM(void) +{ + gRandRegister = ((((((((gRandRegister >> 31) ^ (gRandRegister >> 6)) ^ ( + gRandRegister >> 4)) ^ (gRandRegister >> 2)) ^ ( + gRandRegister >> 1)) ^ gRandRegister) & (unsigned int)0x00000001) << 31) | ( + gRandRegister >> 1); + return gRandRegister; +} + +void cgc_my_srand(uint32_t seed) +{ + gRandRegister = seed; + return; +} + +void cgc_scramble(char *dst, char *src, size_t len) +{ + size_t tmp; + uint32_t tmp_0; + if (dst == (char *)0) goto _LOR; + else + if (src == (char *)0) _LOR: goto return_label; + tmp = strlen((char const *)src); + int len_src = (int)tmp; + int i = 0; + tmp_0 = cgc_RANDOM(); + uint32_t r = tmp_0 % (unsigned int)3 + (unsigned int)2; + while (1) { + if ((int)*(src + i) != '\000') + if ((size_t)i < len) { + if (! (i < len_src)) break; + } + else break; + else break; + if ((int)*(src + i) >= 'a') { + if ((int)*(src + i) <= 'z') goto _LOR_0; else goto _LAND_1; + } + else { + _LAND_1: ; + if ((int)*(src + i) >= 'A') { + if ((int)*(src + i) <= 'Z') goto _LOR_0; else goto _LAND_0; + } + else { + _LAND_0: ; + if ((int)*(src + i) >= '0') { + if ((int)*(src + i) <= '9') + _LOR_0: + if ((unsigned int)i % r) *(dst + i) = *(src + i); + else *(dst + i) = (char)'_'; + else goto _LAND; + } + else _LAND: *(dst + i) = *(src + i); + } + } + i ++; + } + *(dst + (len - (size_t)1)) = (char)'\000'; + return_label: return; +} + +int main(int cgc_argc, char **cgc_argv) +{ + int __retres; + int tmp; + int tmp_2; + char buf[64] = {(char)0}; + int i = 0; + int ret = 0; + int temp = 0; + size_t sret = (unsigned int)0; + char c = (char)'\n'; + cgc_transmit_str((char *)"Please Enter a 2 Digit Number\n"); + sret = cgc_readline(buf,(unsigned int)64); + if (sret == (size_t)0) cgc__terminate((unsigned int)1); + i = cgc_toInt(buf[0],buf[1]); + tmp = cgc_init(i + 1); + if (tmp != 0) { + __retres = -1; + goto return_label; + } + cgc_my_srand((unsigned int)*((int *)(buf))); + i = 0; + while (i < 10) { + { + uint32_t tmp_0; + int tmp_1; + if (i == 0) cgc_transmit_str((char *)"Word: "); + else cgc_transmit_str((char *)"Next Word: "); + tmp_0 = cgc_RANDOM(); + temp = (int)(tmp_0 % (sizeof(gSeedWords) / sizeof(char *))); + cgc_scramble(buf,*(cgc_gWords + temp),(unsigned int)64); + cgc_transmit_str(buf); + cgc_transmit_all_zPcz(& c,(unsigned int)1); + sret = cgc_readline(buf,(unsigned int)64); + if (sret == (size_t)0) cgc__terminate((unsigned int)1); + buf[sret - (size_t)1] = (char)'\000'; + tmp_1 = strcmp((char const *)(buf),(char const *)*(cgc_gWords + temp)); + if (tmp_1 != 0) { + cgc_transmit_str((char *)"You Lose\n"); + __retres = 0; + goto return_label; + } + } + i ++; + } + cgc_transmit_str((char *)"Final Round. Chose another 2 digit number\n"); + sret = cgc_readline(buf,(unsigned int)64); + if (sret == (size_t)0) cgc__terminate((unsigned int)1); + i = cgc_toInt(buf[0],buf[1]); + i = (int)((unsigned int)i % (sizeof(gSeedWords) / sizeof(char *))); + cgc_scramble(buf,*(cgc_gWords + i),(unsigned int)64); + cgc_transmit_str(buf); + cgc_transmit_all_zPcz(& c,(unsigned int)1); + sret = cgc_readline(buf,(unsigned int)64); + if (sret == (size_t)0) cgc__terminate((unsigned int)1); + buf[sret - (size_t)1] = (char)'\000'; + tmp_2 = strcmp((char const *)(buf),(char const *)*(cgc_gWords + i)); + if (tmp_2 != 0) cgc_transmit_str((char *)"You Lose\n"); + else cgc_transmit_str((char *)"You Win!\n"); + __retres = 0; + return_label: return __retres; +} + + diff --git a/cgc-challenges/WordCompletion/.frama-c/WordCompletion.parse/metrics.log b/cgc-challenges/WordCompletion/.frama-c/WordCompletion.parse/metrics.log new file mode 100644 index 000000000..663bd6513 --- /dev/null +++ b/cgc-challenges/WordCompletion/.frama-c/WordCompletion.parse/metrics.log @@ -0,0 +1,50 @@ +[metrics] Defined functions (40) +====================== + calloc_Pvz (0 call); cgc_RANDOM (2 calls); cgc__terminate (7 calls); + cgc_allocate (2 calls); cgc_check_timeout (1 call); + cgc_copy_cgc_fd_set (2 calls); cgc_copy_os_fd_set (2 calls); + cgc_deallocate (0 call); cgc_fdwait (0 call); cgc_fill_buffer (1 call); + cgc_get_char (1 call); cgc_init (1 call); cgc_my_srand (1 call); + cgc_random (0 call); cgc_read_n_bytes (0 call); + cgc_read_until_delim_or_n (1 call); cgc_readline (4 calls); + cgc_receive (5 calls); cgc_receive_all (0 call); cgc_recv (0 call); + cgc_rotN (1 call); cgc_scramble (2 calls); cgc_sendall (1 call); + cgc_sendline (0 call); cgc_strrotcpy (1 call); cgc_toInt (2 calls); + cgc_transmit (4 calls); cgc_transmit_all (0 call); + cgc_transmit_all_zPcz (3 calls); cgc_transmit_str (9 calls); + cgc_try_init_prng (1 call); int2str_dPcdd (0 call); main (0 call); + receive_bytes_iPcz (0 call); str2int_dPc (0 call); str2uint_ud32Pc (0 call); + strcpy_zPcPc (0 call); strncpy_zPcPcz (0 call); strtok_PcPcc (0 call); + uint2str_dPcdud32 (0 call); + +Undefined functions (8) +======================= + cgc_aes_get_bytes (1 call); cgc_init_prng (1 call); + cgc_initialize_flag_page (0 call); cgc_prng (0 call); cgc_recvline (0 call); + cgc_recvuntil (0 call); cgc_streq (0 call); seed_prng (0 call); + +'Extern' global variables (0) +============================= + + +Potential entry points (18) +=========================== + calloc_Pvz; cgc_deallocate; cgc_fdwait; cgc_random; cgc_read_n_bytes; + cgc_receive_all; cgc_recv; cgc_sendline; cgc_transmit_all; int2str_dPcdd; + main; receive_bytes_iPcz; str2int_dPc; str2uint_ud32Pc; strcpy_zPcPc; + strncpy_zPcPcz; strtok_PcPcc; uint2str_dPcdud32; + +Global metrics +============== +Sloc = 786 +Decision point = 140 +Global variables = 8 +If = 140 +Loop = 25 +Goto = 74 +Assignment = 316 +Exit point = 40 +Function = 48 +Function call = 81 +Pointer dereferencing = 62 +Cyclomatic complexity = 180 diff --git a/cgc-challenges/WordCompletion/.frama-c/WordCompletion.parse/warnings.log b/cgc-challenges/WordCompletion/.frama-c/WordCompletion.parse/warnings.log new file mode 100644 index 000000000..e69de29bb diff --git a/cgc-challenges/WordCompletion/.frama-c/path.mk b/cgc-challenges/WordCompletion/.frama-c/path.mk new file mode 120000 index 000000000..222d0e049 --- /dev/null +++ b/cgc-challenges/WordCompletion/.frama-c/path.mk @@ -0,0 +1 @@ +../../frama-c-cgc-path.mk \ No newline at end of file diff --git a/cgc-challenges/WordCompletion/README.md b/cgc-challenges/WordCompletion/README.md new file mode 100644 index 000000000..14597e759 --- /dev/null +++ b/cgc-challenges/WordCompletion/README.md @@ -0,0 +1,16 @@ +# WordCompletion + +@Author: Lok Yan <Lok.Yan@us.af.mil> +@Group: AFRL + +## Description: + +This is a word completion game with 10 initial rounds and a final round. During each round, the user is given an occluded word. The user then needs to provide the full word in order to pass. Once the user completes 10 of these word completion tasks, they will be presented with a final word that must also be solved. + +## Vulnerability Class: + +The vulnerability is an [CWE-125: Out of Bounds Read](http://cwe.mitre.org/data/definitions/125.html) on an array. + +## Additional Notes: + +This CB is designed to help CRSes determine how well they handle dynamically generated data. That is the word completion list is created dynamically using a static list of words that are provided as part of the program itself. diff --git a/cgc-challenges/WordCompletion/src/cgc_words.h b/cgc-challenges/WordCompletion/src/cgc_words.h new file mode 100644 index 000000000..2c4e38678 --- /dev/null +++ b/cgc-challenges/WordCompletion/src/cgc_words.h @@ -0,0 +1,55 @@ +//#The following is a list of quotes from the American Film Institute's 100 Years... 100 Movie Quotes. The quotes were retrieved from Wikipedia <http://en.wikipedia.org/wiki/AFI's_100_Years...100_Movie_Quotes>. A few truncations were made so the sentences fit into 64 characters. Also we only used the first 50 quotes in reverse chronological order. + +char* gSeedWords[] = { +"My precious.", +"I see dead people.", +"I'm the kind of the world!", +"Show me the money!", +"You had me at hello.", +"Houston, we have a problem.", +"Mama always said life was like a box of chocolates.", +"You can't handle the truth!", +"There's no crying in baseball!", +"A census taker once tried to test me.", +"Hasta la vista, baby.", +"I'll have what she's having.", +"If you build it, he will come.", +"Carpe diem. Seize the day, boys.", +"Greed, for lack of a better word, is good.", +"Snap out of it!", +"Nobody puts Baby in a corner.", +"I feel the need-the need for speed!", +"I'll be back.", +"Go ahead, make my day.", +"Say hello to my little friend!", +"E.T. phone home.", +"They're here!", +"No wire hangers, ever!", +"Listen to me, mister. You're my knight in shining armor.", +"Here's Johnny!", +"I am serious...and don't call me Shirley.", +"Cinderella story. Outta nowhere.", +"I love the smell of napalm in the morning.", +"Toga! Toga!", +"May the Force be with you.", +"La-dee-da, la-dee-da.", +"You talkin' to me?", +"I'm as mad as hell, and I'm not going to take this anymore!", +"Is it safe?", +"Yo, Adrian!", +"You're gonna need a bigger boat.", +"Attica! Attica!", +"Keep your friends close, but your enemies closer.", +"Forget it, Jake, it's Chinatown.", +"Soylent Green is people!", +"I'm going to make him an offer he can't refuse.", +"You've got to ask yourself one question: 'Do I feel lucky?'", +"Love means never having to say you're sorry", +"I'm walking here! I'am walking here!", +"Get your stinking paws off me, you damned dirty ape.", +"Open the pod bay doors please, HAL.", +"Hello, gorgeous.", +"What we've got here is failure to communicate.", +"They call me Mister Tibbs!", +"We rob banks.", +}; diff --git a/cgc-challenges/WordCompletion/src/main.c b/cgc-challenges/WordCompletion/src/main.c new file mode 100644 index 000000000..ba831e070 --- /dev/null +++ b/cgc-challenges/WordCompletion/src/main.c @@ -0,0 +1,437 @@ +#include "libcgc.h" +#include "common.h" +#include "cgc_words.h" + +typedef unsigned int uint32_t; +#define PAGE_SIZE 4096 + +char gValidChars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; +#define VALID_CHARS_LEN (sizeof(gValidChars) - 1) +#define IS_VALID_CHAR(_c) ( ((_c >= 'a') && (_c <= 'z')) || ((_c >= 'A') && (_c <= 'Z')) || ((_c >= '0') && (_c <= '9')) ) +#define NUM_WORDS (sizeof(gSeedWords) / sizeof(char*)) +#define NUM_ROUNDS 10 + +#define ENTER_NUM_MSG "Please Enter a 2 Digit Number\n" +#define WORD_MSG "Word: " +#define LOSE_MSG "You Lose\n" +#define WIN_MSG "You Win!\n" +#define NEXT_WORD_MSG "Next Word: " +#define FINAL_RND_MSG "Final Round. Chose another 2 digit number\n" +/* +size_t strlen(char* str) +{ + size_t ret = 0; + if (str == NULL) + { + return (0); + } + for (ret = 0; str[ret] != '\0'; ret++) + { + } + return (ret); +} +*/ + +size_t cgc_transmit_all_zPcz(char* buf, size_t size) +{ + size_t rx_bytes = 0; + size_t total = 0; + int ret = 0; + if (buf == NULL) + { + return (0); + } + + do + { + ret = cgc_transmit(STDOUT, buf, size - total, &rx_bytes); + if ( (ret != 0) || (rx_bytes == 0) ) + { + cgc__terminate(1); + } + total += rx_bytes; + } + while (total < size); + + return (size); +} + +size_t cgc_transmit_str(char* buf) +{ + size_t len = strlen(buf); + return (cgc_transmit_all_zPcz(buf, len)); +} + +size_t cgc_receive_all(char* buf, size_t size) +{ + size_t rx_bytes = 0; + size_t total = 0; + int ret = 0; + if (buf == NULL) + { + return (0); + } + + do + { + ret = cgc_receive(STDIN, buf, size-total, &rx_bytes); + if ( (ret != 0) || (rx_bytes == 0) ) + { + cgc__terminate(1); + } + total += rx_bytes; + } + while (total < size); + + return (size); +} + +size_t cgc_readline(char* buf, size_t len) +{ + if (buf == NULL) + { + return (0); + } + + size_t count = 0; + int ret = 0; + char c = 0; + size_t rx_bytes = 0; + do + { + ret = cgc_receive(STDIN, &c, 1, &rx_bytes); + if ( (ret != 0) || (rx_bytes == 0) ) + { + cgc__terminate(1); + } + buf[count] = c; + count++; + } while ( (c != '\n') && (count < len) ); + + return (count); +} + +char cgc_rotN(char c, int n) +{ + int temp = 0; + n = n % VALID_CHARS_LEN; + + if ( (c >= 'a') && (c <= 'z') ) + { + temp = c - 'a'; //temp is the offset + } + else if ( (c >= 'A') && (c <= 'Z') ) + { + temp = c - 'A' + 26; + } + else if ( (c >= '0') && (c <= '9') ) + { + temp = c - '0' + 52; + } + else + { + return (c); //no rotation + } + + temp += n; + temp = temp % VALID_CHARS_LEN; + return (gValidChars[temp]); +} + +size_t cgc_strrotcpy(char* dst, char* src, int rot) +{ + if ( (src == NULL) || (dst == NULL) ) + { + return (0); + } + + size_t ret = 0; + for (ret = 0; src[ret] != '\0'; ret++) + { + dst[ret] = cgc_rotN(src[ret], rot); + } + + dst[ret] = '\0'; + return (ret); +} + +char** cgc_gWords = NULL; +char* cgc_gWordData = NULL; + +int cgc_init(int rot) +{ + int ret = 0; + size_t numWords = NUM_WORDS; + + //first allocate enough space for the wordlist + ret = cgc_allocate( sizeof(gSeedWords), 0, (void**)(&cgc_gWords)); + if (ret != 0) + { + return (ret); + } + + //now calculate how many bytes we need to store the words themselves + size_t total = 0; + int i = 0; + for (i = 0; i < numWords; i++) + { + total += strlen(gSeedWords[i]); + total += 1; //for the NULL character + } + + ret = cgc_allocate(total, 0, (void**)(&cgc_gWordData)); + if (ret != 0) + { + return (ret); + } + + //now that we have both we can fill in the data + size_t temp = 0; + char* pTemp = cgc_gWordData; + for (i = 0; i < numWords; i++) + { + cgc_gWords[i] = pTemp; + pTemp += cgc_strrotcpy(pTemp, gSeedWords[i], rot); + pTemp += 1; //for the NULL character + } + + #ifdef __FC_PATCHED + for ( ; i < (sizeof(gSeedWords) / sizeof(char*)); i++) + { + cgc_gWords[i] = 0; + } + #else + for ( ; i < (PAGE_SIZE / sizeof(char*)); i++) + { + cgc_gWords[i] = 0; + } + #endif + + return (0); +} + +int cgc_toInt(char c1, char c2) +{ + int ret = 0; + + if ( (c1 >= '0') && (c1 <= '9') ) + { + ret = c1 - '0'; + if ( (c2 >= '0') && (c2 <= '9') ) + { + ret *= 10; + ret += c2 - '0'; + return (ret); + } + else if (c2 != '\0') + { + return (ret); + } + else + { + return (0); + } + } + + return (0); +} + +/** This LFSR pesudo random number generator is from Bruce Schneier's + * 1992 article in Dr. Dobbs www.schneier.com/paper-pseudorandom-sequence.html + * As the article says, this is not a very good generator. But it is good + * enough for our purposes + * Instead of just returning the last bit, we return the whole uint32 +**/ +static uint32_t gRandRegister = 0xDA2bAC9C; + +uint32_t cgc_RANDOM() +{ + gRandRegister = ((((gRandRegister >> 31) + ^ (gRandRegister >> 6) + ^ (gRandRegister >> 4) + ^ (gRandRegister >> 2) + ^ (gRandRegister >> 1) + ^ gRandRegister) + & 0x00000001) + << 31) + | (gRandRegister >> 1); + + return (gRandRegister); +} +/* +int strcmp(char* s1, char* s2) +{ + if (s1 == NULL) + { + if (s2 == NULL) + { + return (0); + } + else + { + return (-1); + } + } + if (s2 == NULL) + { + return (1); + } + + int i = 0; + while (s1[i] != '\0') + { + if (s2[i] == '\0') + { + return (1); + } + if (s1[i] < s2[i]) + { + return (-1); + } + else if (s1[i] > s2[i]) + { + return (1); + } + + i++; + } + + if (s2[i] == '\0') + { + return (0); + } + + return (-1); +} +*/ +void cgc_my_srand(uint32_t seed) +{ + gRandRegister = seed; +} + +void cgc_scramble(char* dst, char* src, size_t len) +{ +#if PATCHED + if ( (dst == NULL) || (src == NULL) ) + { + return; + } +#endif + #ifdef __FC_PATCHED + int len_src = strlen(src); + #endif + int i = 0; + uint32_t r = (cgc_RANDOM() % 3) + 2; + + #ifdef __FC_PATCHED + while ( (src[i] != '\0') && (i < len) && (i < len_src) ) + #else + while ( (src[i] != '\0') && (i < len) ) + #endif + { + if (IS_VALID_CHAR(src[i])) + { + if (i % r) + { + dst[i] = src[i]; + } + else + { + dst[i] = '_'; + } + } + else + { + dst[i] = src[i]; + } + i++; + } + #ifdef __FC_PATCHED + dst[len - 1] = '\0'; + #else + dst[i] = '\0'; + #endif +} + +int main(int cgc_argc, char *cgc_argv[]) +{ +#define BUF_SIZE 64 +#define READLINE(_buf, _len) do { sret = cgc_readline(_buf, _len); if (sret == 0) { cgc__terminate(1); } } while (0) + +#ifdef __FC_PATCHED + char buf[BUF_SIZE] = {0}; +#else + char buf[BUF_SIZE] = {}; +#endif + int i = 0; + int ret = 0; + int temp = 0; + size_t sret = 0; + char c = '\n'; + + cgc_transmit_str(ENTER_NUM_MSG); + READLINE(buf, BUF_SIZE); + + i = cgc_toInt(buf[0], buf[1]); + if (cgc_init(i+1) != 0) + { + return (-1); + } + + //initialize the LFSR + cgc_my_srand(*((int*)buf)); + + for (i = 0; i < NUM_ROUNDS; i++) + { + if (i == 0) + { + cgc_transmit_str(WORD_MSG); + } + else + { + cgc_transmit_str(NEXT_WORD_MSG); + } + + temp = cgc_RANDOM() % NUM_WORDS; + cgc_scramble(buf, cgc_gWords[temp], BUF_SIZE); + cgc_transmit_str(buf); + cgc_transmit_all_zPcz(&c, 1); + READLINE(buf, BUF_SIZE); + + buf[sret-1] = '\0'; + + if (strcmp(buf, cgc_gWords[temp]) != 0) + { + cgc_transmit_str(LOSE_MSG); + return (0); + } + } + + cgc_transmit_str(FINAL_RND_MSG); + READLINE(buf, BUF_SIZE); + + i = cgc_toInt(buf[0], buf[1]); + +#if PATCHED + i = i % NUM_WORDS; +#endif + + cgc_scramble(buf, cgc_gWords[i], BUF_SIZE); + + cgc_transmit_str(buf); + cgc_transmit_all_zPcz(&c, 1); + READLINE(buf, BUF_SIZE); + + buf[sret-1] = '\0'; + + if (strcmp(buf, cgc_gWords[i]) != 0) + { + cgc_transmit_str(LOSE_MSG); + } + else + { + cgc_transmit_str(WIN_MSG); + } + return (0); +} + -- GitLab