libarchive/test/test_read_format_mtree.mtree.uu \
libarchive/test/test_read_format_mtree_nomagic.mtree.uu \
libarchive/test/test_read_format_rar.rar.uu \
+ libarchive/test/test_read_format_rar_compress_normal.rar.uu \
+ libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu \
libarchive/test/test_read_format_rar_noeof.rar.uu \
libarchive/test/test_read_format_rar_subblock.rar.uu \
libarchive/test/test_read_format_raw.data.Z.uu \
#include <errno.h>
#endif
#include <time.h>
+#include <limits.h>
#include "archive.h"
#include "archive_endian.h"
#define FHD_EXTFLAGS 0x2000
/* File dictionary sizes */
-#define DICTIONARY_SIZE_64 0
-#define DICTIONARY_SIZE_128 1
-#define DICTIONARY_SIZE_256 2
-#define DICTIONARY_SIZE_512 3
-#define DICTIONARY_SIZE_1024 4
-#define DICTIONARY_SIZE_2048 5
-#define DICTIONARY_SIZE_4096 6
-
-#define FILE_IS_DIRECTORY 7
+#define DICTIONARY_SIZE_64 0x00
+#define DICTIONARY_SIZE_128 0x20
+#define DICTIONARY_SIZE_256 0x40
+#define DICTIONARY_SIZE_512 0x60
+#define DICTIONARY_SIZE_1024 0x80
+#define DICTIONARY_SIZE_2048 0xA0
+#define DICTIONARY_SIZE_4096 0xC0
+#define FILE_IS_DIRECTORY 0xE0
+#define DICTIONARY_MASK FILE_IS_DIRECTORY
/* OS Flags */
#define OS_MSDOS 0
#define NS_UNIT 10000000
+#define DICTIONARY_MAX_SIZE 0x400000
+
+#define MAINCODE_SIZE 299
+#define OFFSETCODE_SIZE 60
+#define LOWOFFSETCODE_SIZE 17
+#define LENGTHCODE_SIZE 28
+#define HUFFMAN_TABLE_SIZE \
+ MAINCODE_SIZE + OFFSETCODE_SIZE + LOWOFFSETCODE_SIZE + LENGTHCODE_SIZE
+
+#define MAX_SYMBOL_LENGTH 0xF
+#define MAX_SYMBOLS 20
+
/* Define this here for non-Windows platforms */
#if !((defined(__WIN32__) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__))
#define FILE_ATTRIBUTE_DIRECTORY 0x10
char file_attr[4];
};
+struct huffman_tree_node
+{
+ int branches[2];
+};
+
+struct huffman_table_entry
+{
+ unsigned int length;
+ int value;
+};
+
+struct huffman_code
+{
+ struct huffman_tree_node *tree;
+ int numentries;
+ int minlength;
+ int maxlength;
+ int tablesize;
+ struct huffman_table_entry *table;
+};
+
+struct lzss
+{
+ unsigned char *window;
+ int mask;
+ int64_t position;
+};
+
struct rar
{
/* Entries from main RAR header */
/* Fields to help with tracking decompression of files. */
int64_t bytes_remaining;
int64_t offset;
+ int64_t bitoffset;
+ char valid;
+ struct huffman_code maincode;
+ struct huffman_code offsetcode;
+ struct huffman_code lowoffsetcode;
+ struct huffman_code lengthcode;
+ unsigned char lengthtable[HUFFMAN_TABLE_SIZE];
+ unsigned char *unp_buffer;
+ struct lzss lzss;
+ unsigned int dictionary_size;
+ char output_last_match;
+ unsigned int lastlength;
+ unsigned int lastoffset;
+ unsigned int oldoffset[4];
+ unsigned int lastlowoffset;
+ unsigned int numlowoffsetrepeats;
+ off_t filterstart;
+ char start_new_block;
+ char start_new_table;
};
static int archive_read_format_rar_bid(struct archive_read *);
/* Support functions */
static int read_header(struct archive_read *, struct archive_entry *, char);
static time_t get_time(int time);
-static void read_exttime(struct archive_entry *, const char *, struct rar *);
+static void read_exttime(const char *, struct rar *);
static int read_symlink_stored(struct archive_read *, struct archive_entry *,
struct archive_string_conv *);
static int read_data_stored(struct archive_read *, const void **, size_t *,
int64_t *);
+static int read_data_lzss(struct archive_read *, const void **, size_t *,
+ int64_t *);
+static int parse_codes(struct archive_read *);
+static void free_codes(struct archive_read *);
+static unsigned char read_bits(struct archive_read *, char);
+static unsigned int read_bits_32(struct archive_read *, char);
+static int read_next_symbol(struct archive_read *, struct huffman_code *);
+static void create_code(struct archive_read *, struct huffman_code *,
+ unsigned char *, int, char);
+static int add_value(struct archive_read *, struct huffman_code *, int, int,
+ int);
+static int new_node(struct huffman_code *);
+static void make_table(struct huffman_code *);
+static void make_table_recurse(struct huffman_code *, int,
+ struct huffman_table_entry *, int, int);
+static off_t expand(struct archive_read *, off_t);
+static int copy_from_lzss_window(struct archive_read *, const void **,
+ int64_t, int);
+
+/* Find last bit set */
+static inline int
+rar_fls(unsigned int word)
+{
+ word |= (word >> 1);
+ word |= (word >> 2);
+ word |= (word >> 4);
+ word |= (word >> 8);
+ word |= (word >> 16);
+ return word - (word >> 1);
+}
+
+/* LZSS functions */
+static inline int64_t
+lzss_position(struct lzss *lzss)
+{
+ return lzss->position;
+}
+
+static inline int
+lzss_mask(struct lzss *lzss)
+{
+ return lzss->mask;
+}
+
+static inline int
+lzss_size(struct lzss *lzss)
+{
+ return lzss->mask + 1;
+}
+
+static inline int
+lzss_offset_for_position(struct lzss *lzss, int64_t pos)
+{
+ return pos & lzss->mask;
+}
+
+static inline unsigned char *
+lzss_pointer_for_position(struct lzss *lzss, int64_t pos)
+{
+ return &lzss->window[lzss_offset_for_position(lzss, pos)];
+}
+
+static inline int
+lzss_current_offset(struct lzss *lzss)
+{
+ return lzss_offset_for_position(lzss, lzss->position);
+}
+
+static inline uint8_t *
+lzss_current_pointer(struct lzss *lzss)
+{
+ return lzss_pointer_for_position(lzss, lzss->position);
+}
+
+static inline void
+lzss_emit_literal(struct rar *rar, uint8_t literal)
+{
+ *lzss_current_pointer(&rar->lzss) = literal;
+ rar->lzss.position++;
+}
+
+static inline void
+lzss_emit_match(struct rar *rar, int offset, int length)
+{
+ int i, windowoffs = lzss_current_offset(&rar->lzss);
+ for(i = 0; i < length; i++)
+ {
+ rar->lzss.window[(windowoffs + i) & lzss_mask(&rar->lzss)] =
+ rar->lzss.window[(windowoffs + i - offset) & lzss_mask(&rar->lzss)];
+ }
+ rar->lzss.position += length;
+}
int
archive_read_support_format_rar(struct archive *_a)
case COMPRESS_METHOD_FASTEST:
case COMPRESS_METHOD_FAST:
case COMPRESS_METHOD_NORMAL:
+ return read_data_lzss(a, buff, size, offset);
+
case COMPRESS_METHOD_GOOD:
case COMPRESS_METHOD_BEST:
default:
struct rar *rar;
rar = (struct rar *)(a->format->data);
- __archive_read_consume(a, rar->packed_size);
+ switch (rar->compression_method)
+ {
+ case COMPRESS_METHOD_FASTEST:
+ case COMPRESS_METHOD_FAST:
+ case COMPRESS_METHOD_NORMAL:
+ if (rar->offset)
+ {
+ while (rar->bitoffset > 0)
+ rar->bitoffset -= 8 * __archive_read_consume(a, 1);
+ break;
+ }
+
+ case COMPRESS_METHOD_STORE:
+ case COMPRESS_METHOD_GOOD:
+ case COMPRESS_METHOD_BEST:
+ default:
+ __archive_read_consume(a, rar->packed_size);
+ }
return (ARCHIVE_OK);
}
struct rar *rar;
rar = (struct rar *)(a->format->data);
+ free_codes(a);
+ free(rar->unp_buffer);
+ free(rar->lzss.window);
free(rar);
(a->format->data) = NULL;
return (ARCHIVE_OK);
rar->arctime = 0;
rar->arcnsec = 0;
}
+ else
+ {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+ "RAR solid archive support unavailable.");
+ return (ARCHIVE_FATAL);
+ }
if ((h = __archive_read_ahead(a, header_size - 7, NULL)) == NULL)
return (ARCHIVE_FATAL);
}
if (rar->file_flags & FHD_EXTTIME)
- read_exttime(entry, p, rar);
+ read_exttime(p, rar);
__archive_read_consume(a, header_size - 7);
}
rar->bytes_remaining = rar->packed_size;
- rar->offset = 0;
+ rar->lzss.position = rar->dictionary_size = rar->offset = rar->bitoffset = 0;
+ rar->valid = 1;
+ rar->start_new_table = 1;
+ free(rar->unp_buffer);
+ rar->unp_buffer = NULL;
+ memset(rar->lengthtable, 0, sizeof(rar->lengthtable));
/* Don't set any archive entries for non-file header types */
if (head_type == NEWSUB_HEAD)
if (((rar->mode) & AE_IFMT) == AE_IFLNK)
{
- switch (rar->compression_method)
- {
- case COMPRESS_METHOD_STORE:
- if ((ret2 = read_symlink_stored(a, entry, sconv)) < (ARCHIVE_WARN))
- return ret2;
- if (ret > ret2)
- ret = ret2;
- break;
-
- case COMPRESS_METHOD_FASTEST:
- case COMPRESS_METHOD_FAST:
- case COMPRESS_METHOD_NORMAL:
- case COMPRESS_METHOD_GOOD:
- case COMPRESS_METHOD_BEST:
- default:
- archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
- "Unsupported compression method for RAR file.");
- return (ARCHIVE_FATAL);
- }
+ if ((ret2 = read_symlink_stored(a, entry, sconv)) < (ARCHIVE_WARN))
+ return ret2;
+ if (ret > ret2)
+ ret = ret2;
}
return ret;
}
static void
-read_exttime(struct archive_entry *entry, const char *p, struct rar *rar)
+read_exttime(const char *p, struct rar *rar)
{
- unsigned rmode, flags, rem, count;
- int time, i, j;
+ unsigned rmode, flags, rem, j, count;
+ int time, i;
struct tm *tm;
time_t t;
long nsec;
rar->bytes_remaining -= bytes_avail;
return (ARCHIVE_OK);
}
+
+static int
+read_data_lzss(struct archive_read *a, const void **buff, size_t *size,
+ int64_t *offset)
+{
+ struct rar *rar;
+ ssize_t bytes_avail;
+ off_t start, end, actualend;
+ int ret = (ARCHIVE_OK);
+
+ rar = (struct rar *)(a->format->data);
+ if (!rar->valid)
+ return (ARCHIVE_FATAL);
+
+ if (rar->dictionary_size && rar->offset >= rar->unp_size)
+ {
+ *buff = NULL;
+ *size = 0;
+ *offset = rar->offset;
+ return (ARCHIVE_EOF);
+ }
+
+ if (rar->dictionary_size && rar->bytes_remaining > 0)
+ {
+ *offset = rar->offset;
+ if (rar->offset + rar->bytes_remaining > rar->unp_size)
+ *size = rar->unp_size - rar->offset;
+ else
+ *size = rar->bytes_remaining;
+ ret = copy_from_lzss_window(a, buff, *offset, *size);
+ rar->offset += *size;
+ rar->bytes_remaining -= *size;
+ return ret;
+ }
+
+ if (rar->start_new_table && ((ret = parse_codes(a)) < (ARCHIVE_WARN)))
+ return (ARCHIVE_FATAL);
+
+ __archive_read_ahead(a, 1, &bytes_avail);
+ if (bytes_avail <= 0)
+ {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+ "Truncated RAR file data");
+ return (ARCHIVE_FATAL);
+ }
+ if (bytes_avail > rar->bytes_remaining)
+ bytes_avail = rar->bytes_remaining;
+
+ start = rar->offset;
+ end = start + rar->dictionary_size;
+ rar->filterstart = LONG_MAX;
+
+ if ((actualend = expand(a, end)) < 0)
+ return (ARCHIVE_FATAL);
+
+ rar->bytes_remaining = actualend - start;
+ *offset = rar->offset;
+ if (rar->offset + rar->bytes_remaining > rar->unp_size)
+ *size = rar->unp_size - rar->offset;
+ else
+ *size = rar->bytes_remaining;
+ ret = copy_from_lzss_window(a, buff, *offset, *size);
+ rar->offset += *size;
+ rar->bytes_remaining -= *size;
+ return ret;
+}
+
+static int
+parse_codes(struct archive_read *a)
+{
+ const void *h;
+ ssize_t bytes_avail;
+ int i, j, val, n;
+ unsigned char bitlengths[MAX_SYMBOLS], zerocount;
+ struct huffman_code precode;
+ struct rar *rar = (struct rar *)(a->format->data);
+
+ free_codes(a);
+
+ /* Skip to the next byte */
+ while (rar->bitoffset % 8)
+ rar->bitoffset++;
+
+ if ((h = __archive_read_ahead(a, 1, NULL)) == NULL)
+ {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+ "Truncated RAR file data");
+ return (ARCHIVE_FATAL);
+ }
+
+ /* PPMd block flag */
+ if (read_bits(a, 1))
+ {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+ "Unsupported compression method for RAR file.");
+ return (ARCHIVE_FATAL);
+ }
+
+ /* Keep existing table flag */
+ if (!read_bits(a, 1))
+ memset(rar->lengthtable, 0, sizeof(rar->lengthtable));
+
+ memset(&bitlengths, 0, sizeof(bitlengths));
+ for (i = 0; i < MAX_SYMBOLS;)
+ {
+ bitlengths[i++] = read_bits(a, 4);
+ if (bitlengths[i-1] == 0xF)
+ {
+ zerocount = read_bits(a, 4);
+ if (zerocount)
+ {
+ i--;
+ for (j = 0; j < zerocount + 2 && i < MAX_SYMBOLS; j++)
+ bitlengths[i++] = 0;
+ }
+ }
+ }
+
+ rar->bitoffset -= 8 * __archive_read_consume(a, (rar->bitoffset / 8));
+ h = __archive_read_ahead(a, (rar->bitoffset / 8) + 1, &bytes_avail);
+ if (bytes_avail <= 0)
+ {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+ "Truncated RAR file data");
+ return (ARCHIVE_FATAL);
+ }
+
+ memset(&precode, 0, sizeof(precode));
+ create_code(a, &precode, bitlengths, MAX_SYMBOLS, MAX_SYMBOL_LENGTH);
+
+ for (i = 0; i < HUFFMAN_TABLE_SIZE;)
+ {
+ if ((val = read_next_symbol(a, &precode)) < 0)
+ return (ARCHIVE_FATAL);
+ if (val < 16)
+ {
+ rar->lengthtable[i] = (rar->lengthtable[i] + val) & 0xF;
+ i++;
+ }
+ else if (val < 18)
+ {
+ if (i == 0)
+ {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+ "Internal error extracting RAR file.");
+ return (ARCHIVE_FATAL);
+ }
+
+ if(val == 16)
+ n = read_bits(a, 3) + 3;
+ else
+ n = read_bits(a, 7) + 11;
+
+ for (j = 0; j < n && i < HUFFMAN_TABLE_SIZE; j++)
+ {
+ rar->lengthtable[i] = rar->lengthtable[i-1];
+ i++;
+ }
+ }
+ else
+ {
+ if(val == 18)
+ n = read_bits(a, 3) + 3;
+ else
+ n = read_bits(a, 7) + 11;
+
+ for(j = 0; j < n && i < HUFFMAN_TABLE_SIZE; j++)
+ rar->lengthtable[i++] = 0;
+ }
+ }
+
+ create_code(a, &rar->maincode, &rar->lengthtable[0], MAINCODE_SIZE,
+ MAX_SYMBOL_LENGTH);
+ create_code(a, &rar->offsetcode, &rar->lengthtable[MAINCODE_SIZE],
+ OFFSETCODE_SIZE, MAX_SYMBOL_LENGTH);
+ create_code(a, &rar->lowoffsetcode,
+ &rar->lengthtable[MAINCODE_SIZE + OFFSETCODE_SIZE],
+ LOWOFFSETCODE_SIZE, MAX_SYMBOL_LENGTH);
+ create_code(a, &rar->lengthcode,
+ &rar->lengthtable[MAINCODE_SIZE + OFFSETCODE_SIZE +
+ LOWOFFSETCODE_SIZE], LENGTHCODE_SIZE, MAX_SYMBOL_LENGTH);
+
+ if (!rar->dictionary_size || !rar->lzss.window)
+ {
+ /* Seems as though dictionary sizes are not used. Even so, minimize
+ * memory usage as much as possible.
+ */
+ if (rar->unp_size >= DICTIONARY_MAX_SIZE)
+ rar->dictionary_size = DICTIONARY_MAX_SIZE;
+ else
+ rar->dictionary_size = rar_fls(rar->unp_size) << 1;
+ rar->lzss.window = (unsigned char *)realloc(rar->lzss.window,
+ rar->dictionary_size);
+ memset(rar->lzss.window, 0, rar->dictionary_size);
+ rar->lzss.mask = rar->dictionary_size - 1;
+ }
+
+ rar->start_new_table = 0;
+ rar->bitoffset -= 8 * __archive_read_consume(a, (rar->bitoffset / 8));
+ return (ARCHIVE_OK);
+}
+
+static void
+free_codes(struct archive_read *a)
+{
+ struct rar *rar = (struct rar *)(a->format->data);
+ free(rar->maincode.tree);
+ free(rar->offsetcode.tree);
+ free(rar->lowoffsetcode.tree);
+ free(rar->lengthcode.tree);
+ free(rar->maincode.table);
+ free(rar->offsetcode.table);
+ free(rar->lowoffsetcode.table);
+ free(rar->lengthcode.table);
+ memset(&rar->maincode, 0, sizeof(rar->maincode));
+ memset(&rar->offsetcode, 0, sizeof(rar->offsetcode));
+ memset(&rar->lowoffsetcode, 0, sizeof(rar->lowoffsetcode));
+ memset(&rar->lengthcode, 0, sizeof(rar->lengthcode));
+}
+
+static unsigned char
+read_bits(struct archive_read *a, char length)
+{
+ unsigned char ret, m;
+ const unsigned char *p;
+ struct rar *rar = (struct rar *)(a->format->data);
+ if (length <= 0 || length > 8)
+ {
+ rar->valid = 0;
+ return 0;
+ }
+ if ((p = __archive_read_ahead(a,
+ ((rar->bitoffset + length) / 8) + 1, NULL)) == NULL)
+ {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+ "Truncated RAR file data");
+ rar->valid = 0;
+ return 0;
+ }
+ m = rar->bitoffset % 8;
+ ret = (*(p + (rar->bitoffset / 8))) << m;
+ ret |= (*(p + ((rar->bitoffset + (8 - m)) / 8))) >> (8 - m);
+ rar->bitoffset += length;
+ return ret >> (8 - length);
+}
+
+static unsigned int
+read_bits_32(struct archive_read *a, char length)
+{
+ unsigned char bits[4];
+ struct rar *rar = (struct rar *)(a->format->data);
+ if (length <= 0 || length > 32)
+ {
+ rar->valid = 0;
+ return 0;
+ }
+ memset(&bits, 0, sizeof(bits));
+ while (length > 0 && rar->valid)
+ {
+ if (length % 8)
+ {
+ bits[(32 - length) / 8] = read_bits(a, length % 8);
+ length -= length % 8;
+ }
+ else
+ {
+ bits[(32 - length) / 8] = read_bits(a, 8);
+ length -= 8;
+ }
+ }
+ if (!rar->valid)
+ return 0;
+ return archive_be32dec(&bits);
+}
+
+static int
+read_next_symbol(struct archive_read *a, struct huffman_code *code)
+{
+ unsigned char bit;
+ unsigned int bits;
+ int length, value, node;
+ struct rar *rar;
+
+ if (!code->table)
+ make_table(code);
+
+ rar = (struct rar *)(a->format->data);
+
+ /* Look ahead (peek) at bits */
+ bits = read_bits_32(a, code->tablesize);
+ rar->bitoffset -= code->tablesize;
+
+ length = code->table[bits].length;
+ value = code->table[bits].value;
+
+ if (length < 0)
+ {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+ "Invalid prefix code in bitstream");
+ return -1;
+ }
+
+ if (length <= code->tablesize)
+ {
+ /* Skip length bits */
+ rar->bitoffset += length;
+ return value;
+ }
+
+ /* Skip tablesize bits */
+ rar->bitoffset += code->tablesize;
+
+ node = value;
+ while (!(code->tree[node].branches[0] ==
+ code->tree[node].branches[1]))
+ {
+ bit = read_bits(a, 1);
+ if (code->tree[node].branches[bit] < 0)
+ {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+ "Invalid prefix code in bitstream");
+ return -1;
+ }
+ node = code->tree[node].branches[bit];
+ }
+
+ return code->tree[node].branches[0];
+}
+
+static void
+create_code(struct archive_read *a, struct huffman_code *code,
+ unsigned char *lengths, int numsymbols, char maxlength)
+{
+ int i, j, codebits = 0, symbolsleft = numsymbols;
+ new_node(code);
+ code->numentries = 1;
+ code->minlength = INT_MAX;
+ code->maxlength = INT_MIN;
+ codebits = 0;
+ for(i = 1; i <= maxlength; i++)
+ {
+ for(j = 0; j < numsymbols; j++)
+ {
+ if (lengths[j] != i) continue;
+ add_value(a, code, j, codebits, i);
+ codebits++;
+ if (--symbolsleft <= 0) { break; break; }
+ }
+ codebits <<= 1;
+ }
+}
+
+static int
+add_value(struct archive_read *a, struct huffman_code *code, int value,
+ int codebits, int length)
+{
+ int repeatpos, lastnode, bitpos, bit, repeatnode, nextnode;
+
+ free(code->table);
+ code->table = NULL;
+
+ if(length > code->maxlength)
+ code->maxlength = length;
+ if(length < code->minlength)
+ code->minlength = length;
+
+ repeatpos = -1;
+ if (repeatpos == 0 || (repeatpos >= 0
+ && (((codebits >> (repeatpos - 1)) & 3) == 0
+ || ((codebits >> (repeatpos - 1)) & 3) == 3)))
+ {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+ "Invalid repeat position");
+ return (ARCHIVE_FATAL);
+ }
+
+ lastnode = 0;
+ for (bitpos = length - 1; bitpos >= 0; bitpos--)
+ {
+ bit = (codebits >> bitpos) & 1;
+
+ /* Leaf node check */
+ if (code->tree[lastnode].branches[0] ==
+ code->tree[lastnode].branches[1])
+ {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+ "Prefix found");
+ return (ARCHIVE_FATAL);
+ }
+
+ if (bitpos == repeatpos)
+ {
+ /* Open branch check */
+ if (!(code->tree[lastnode].branches[bit] < 0))
+ {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+ "Invalid repeating code");
+ return (ARCHIVE_FATAL);
+ }
+
+ repeatnode = new_node(code);
+ nextnode = new_node(code);
+
+ /* Set branches */
+ code->tree[lastnode].branches[bit] = repeatnode;
+ code->tree[repeatnode].branches[bit] = repeatnode;
+ code->tree[repeatnode].branches[bit^1] = nextnode;
+ lastnode = nextnode;
+
+ bitpos++; /* terminating bit already handled, skip it */
+ }
+ else
+ {
+ /* Open branch check */
+ if (code->tree[lastnode].branches[bit] < 0)
+ {
+ new_node(code);
+ code->tree[lastnode].branches[bit] = code->numentries++;
+ }
+
+ /* set to branch */
+ lastnode = code->tree[lastnode].branches[bit];
+ }
+ }
+
+ if (!(code->tree[lastnode].branches[0] == -1
+ && code->tree[lastnode].branches[1] == -2))
+ {
+ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
+ "Prefix found");
+ return (ARCHIVE_FATAL);
+ }
+
+ /* Set leaf value */
+ code->tree[lastnode].branches[0] = value;
+ code->tree[lastnode].branches[1] = value;
+
+ return (ARCHIVE_OK);
+}
+
+static int new_node(struct huffman_code *code)
+{
+ code->tree = (struct huffman_tree_node *)realloc(code->tree,
+ (code->numentries + 1) * sizeof(*code->tree));
+ code->tree[code->numentries].branches[0] = -1;
+ code->tree[code->numentries].branches[1] = -2;
+ return 1;
+}
+
+static void
+make_table(struct huffman_code *code)
+{
+ if (code->maxlength < code->minlength || code->maxlength > 10)
+ code->tablesize = 10;
+ else
+ code->tablesize = code->maxlength;
+
+ code->table =
+ (struct huffman_table_entry *)malloc(sizeof(*code->table)
+ * (1 << code->tablesize));
+
+ make_table_recurse(code, 0, code->table, 0, code->tablesize);
+}
+
+static void make_table_recurse(struct huffman_code *code, int node,
+ struct huffman_table_entry *table, int depth,
+ int maxdepth)
+{
+ int currtablesize, i;
+
+ currtablesize = 1 << (maxdepth - depth);
+
+ if (code->tree[node].branches[0] ==
+ code->tree[node].branches[1])
+ {
+ for(i = 0; i < currtablesize; i++)
+ {
+ table[i].length = depth;
+ table[i].value = code->tree[node].branches[0];
+ }
+ }
+ else if (node < 0)
+ {
+ for(i = 0; i < currtablesize; i++)
+ table[i].length = -1;
+ }
+ else
+ {
+ if(depth == maxdepth)
+ {
+ table[0].length = maxdepth + 1;
+ table[0].value = node;
+ }
+ else
+ {
+ make_table_recurse(code, code->tree[node].branches[0], table, depth + 1,
+ maxdepth);
+ make_table_recurse(code, code->tree[node].branches[1],
+ table + currtablesize / 2, depth + 1, maxdepth);
+ }
+ }
+}
+
+static off_t
+expand(struct archive_read *a, off_t end)
+{
+ static const unsigned char lengthbases[] =
+ { 0, 1, 2, 3, 4, 5, 6,
+ 7, 8, 10, 12, 14, 16, 20,
+ 24, 28, 32, 40, 48, 56, 64,
+ 80, 96, 112, 128, 160, 192, 224 };
+ static const unsigned char lengthbits[] =
+ { 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 2, 2,
+ 2, 2, 3, 3, 3, 3, 4,
+ 4, 4, 4, 5, 5, 5, 5 };
+ static const unsigned int offsetbases[] =
+ { 0, 1, 2, 3, 4, 6,
+ 8, 12, 16, 24, 32, 48,
+ 64, 96, 128, 192, 256, 384,
+ 512, 768, 1024, 1536, 2048, 3072,
+ 4096, 6144, 8192, 12288, 16384, 24576,
+ 32768, 49152, 65536, 98304, 131072, 196608,
+ 262144, 327680, 393216, 458752, 524288, 589824,
+ 655360, 720896, 786432, 851968, 917504, 983040,
+ 1048576, 1310720, 1572864, 1835008, 2097152, 2359296,
+ 2621440, 2883584, 3145728, 3407872, 3670016, 3932160 };
+ static const unsigned char offsetbits[] =
+ { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4,
+ 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10,
+ 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18 };
+ static const unsigned char shortbases[] =
+ { 0, 4, 8, 16, 32, 64, 128, 192 };
+ static const unsigned char shortbits[] =
+ { 2, 2, 3, 4, 5, 6, 6, 6 };
+
+ int symbol, offs, len, offsindex, lensymbol, i, offssymbol, lowoffsetsymbol;
+ unsigned char newfile;
+ struct rar *rar = (struct rar *)(a->format->data);
+
+ if (rar->filterstart < end)
+ end = rar->filterstart;
+
+ while (1)
+ {
+ if (rar->output_last_match &&
+ lzss_position(&rar->lzss) + rar->lastlength <= end)
+ {
+ lzss_emit_match(rar, rar->lastoffset, rar->lastlength);
+ rar->output_last_match = 0;
+ }
+
+ if(rar->output_last_match || lzss_position(&rar->lzss) >= end)
+ return lzss_position(&rar->lzss);
+
+ rar->bitoffset -= 8 * __archive_read_consume(a, (rar->bitoffset / 8));
+ symbol = read_next_symbol(a, &rar->maincode);
+ rar->output_last_match = 0;
+
+ if (symbol < 256)
+ {
+ lzss_emit_literal(rar, symbol);
+ continue;
+ }
+ else if (symbol == 256)
+ {
+ newfile = !read_bits(a, 1);
+
+ if(newfile)
+ {
+ rar->start_new_block = 1;
+ rar->start_new_table = read_bits(a, 1);
+ return lzss_position(&rar->lzss);
+ }
+ else
+ {
+ parse_codes(a);
+ continue;
+ }
+ }
+ else if(symbol==257)
+ {
+ if (rar->filterstart < end)
+ end = rar->filterstart;
+ continue;
+ }
+ else if(symbol==258)
+ {
+ if(rar->lastlength == 0)
+ continue;
+
+ offs = rar->lastoffset;
+ len = rar->lastlength;
+ }
+ else if (symbol <= 262)
+ {
+ offsindex = symbol - 259;
+ offs = rar->oldoffset[offsindex];
+
+ lensymbol = read_next_symbol(a, &rar->lengthcode);
+ len = lengthbases[lensymbol] + 2;
+ if (lengthbits[lensymbol] > 0)
+ len += read_bits_32(a, lengthbits[lensymbol]);
+
+ for (i = offsindex; i > 0; i--)
+ rar->oldoffset[i] = rar->oldoffset[i-1];
+ rar->oldoffset[0] = offs;
+ }
+ else if(symbol<=270)
+ {
+ offs = shortbases[symbol-263] + 1;
+ if(shortbits[symbol-263] > 0)
+ offs += read_bits_32(a, shortbits[symbol-263]);
+
+ len = 2;
+
+ for(i = 3; i > 0; i--)
+ rar->oldoffset[i] = rar->oldoffset[i-1];
+ rar->oldoffset[0] = offs;
+ }
+ else
+ {
+ len = lengthbases[symbol-271]+3;
+ if(lengthbits[symbol-271] > 0)
+ len += read_bits_32(a, lengthbits[symbol-271]);
+
+ offssymbol = read_next_symbol(a, &rar->offsetcode);
+ offs = offsetbases[offssymbol]+1;
+ if(offsetbits[offssymbol] > 0)
+ {
+ if(offssymbol > 9)
+ {
+ if(offsetbits[offssymbol] > 4)
+ offs += read_bits_32(a, offsetbits[offssymbol] - 4) << 4;
+
+ if(rar->numlowoffsetrepeats > 0)
+ {
+ rar->numlowoffsetrepeats--;
+ offs += rar->lastlowoffset;
+ }
+ else
+ {
+ lowoffsetsymbol = read_next_symbol(a, &rar->lowoffsetcode);
+ if(lowoffsetsymbol == 16)
+ {
+ rar->numlowoffsetrepeats = 15;
+ offs += rar->lastlowoffset;
+ }
+ else
+ {
+ offs += lowoffsetsymbol;
+ rar->lastlowoffset = lowoffsetsymbol;
+ }
+ }
+ }
+ else
+ offs += read_bits_32(a, offsetbits[offssymbol]);
+ }
+
+ if (offs >= 0x40000)
+ len++;
+ if (offs >= 0x2000)
+ len++;
+
+ for(i = 3; i > 0; i--)
+ rar->oldoffset[i] = rar->oldoffset[i-1];
+ rar->oldoffset[0] = offs;
+ }
+
+ rar->lastoffset = offs;
+ rar->lastlength = len;
+ rar->output_last_match = 1;
+ }
+}
+
+static int
+copy_from_lzss_window(struct archive_read *a, const void **buffer,
+ int64_t startpos, int length)
+{
+ int windowoffs, firstpart;
+ struct rar *rar = (struct rar *)(a->format->data);
+
+ if (!rar->unp_buffer)
+ {
+ if ((rar->unp_buffer = malloc(rar->dictionary_size)) == NULL)
+ {
+ archive_set_error(&a->archive, ENOMEM,
+ "Unable to allocate memory for uncompressed data.");
+ return (ARCHIVE_FATAL);
+ }
+ }
+
+ windowoffs = lzss_offset_for_position(&rar->lzss, startpos);
+ if(windowoffs + length <= lzss_size(&rar->lzss))
+ *buffer = &rar->lzss.window[windowoffs];
+ else
+ {
+ firstpart = lzss_size(&rar->lzss) - windowoffs;
+ memcpy(&rar->unp_buffer[0], &rar->lzss.window[windowoffs], firstpart);
+ memcpy(&rar->unp_buffer[firstpart], &rar->lzss.window[0],
+ length - firstpart);
+ *buffer = rar->unp_buffer;
+ }
+ return (ARCHIVE_OK);
+}
{0, "test_read_format_cpio_bin_be.cpio"},
{0, "test_read_format_cpio_svr4_gzip_rpm.rpm"}, /* Test RPM unwrapper */
{0, "test_read_format_rar.rar"}, /* Uncompressed RAR test */
+ {0, "test_read_format_rar_compress_normal.rar"}, /* Normal Compressed RAR
+ * test */
+ {0, "test_read_format_rar_multi_lzss_blocks.rar"}, /* Normal Compressed Multi
+ * LZSS blocks RAR test */
{0, "test_read_format_rar_noeof.rar"}, /* RAR with no EOF header */
{0, "test_read_format_rar_subblock.rar"}, /* RAR with subblocks */
{0, "test_read_format_gtar_sparse_1_17_posix10_modified.tar"},
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
+static void
+test_compress_normal(void)
+{
+ const char reffile[] = "test_read_format_rar_compress_normal.rar";
+ int file1_size = 20111;
+ char file1_buff[file1_size];
+ const char file1_test_txt[] = "<P STYLE=\"margin-bottom: 0in\"><BR>\n"
+ "</P>\n"
+ "</BODY>\n"
+ "</HTML>";
+ int file2_size = 20;
+ char file2_buff[file2_size];
+ const char file2_test_txt[] = "test text document\r\n";
+ struct archive_entry *ae;
+ struct archive *a;
+
+ extract_reference_file(reffile);
+ assert((a = archive_read_new()) != NULL);
+ assertA(0 == archive_read_support_filter_all(a));
+ assertA(0 == archive_read_support_format_all(a));
+ assertA(0 == archive_read_open_file(a, reffile, 10240));
+
+ /* First header. */
+ assertA(0 == archive_read_next_header(a, &ae));
+ assertEqualString("LibarchiveAddingTest.html", archive_entry_pathname(ae));
+ assertA((int)archive_entry_mtime(ae));
+ assertA((int)archive_entry_ctime(ae));
+ assertA((int)archive_entry_atime(ae));
+ assertEqualInt(file1_size, archive_entry_size(ae));
+ assertEqualInt(33188, archive_entry_mode(ae));
+ assertA(file1_size == archive_read_data(a, file1_buff, file1_size));
+ assertEqualMem(&file1_buff[file1_size - sizeof(file1_test_txt) + 1],
+ file1_test_txt, sizeof(file1_test_txt) - 1);
+
+ /* Second header. */
+ assertA(0 == archive_read_next_header(a, &ae));
+ assertEqualString("testlink", archive_entry_pathname(ae));
+ assertA((int)archive_entry_mtime(ae));
+ assertA((int)archive_entry_ctime(ae));
+ assertA((int)archive_entry_atime(ae));
+ assertEqualInt(25, archive_entry_size(ae));
+ assertEqualInt(41471, archive_entry_mode(ae));
+ assertEqualString("LibarchiveAddingTest.html", archive_entry_symlink(ae));
+
+ /* Third header. */
+ assertA(0 == archive_read_next_header(a, &ae));
+ assertEqualString("testdir/test.txt", archive_entry_pathname(ae));
+ assertA((int)archive_entry_mtime(ae));
+ assertA((int)archive_entry_ctime(ae));
+ assertA((int)archive_entry_atime(ae));
+ assertEqualInt(file2_size, archive_entry_size(ae));
+ assertEqualInt(33188, archive_entry_mode(ae));
+ assertA(file2_size == archive_read_data(a, file2_buff, file2_size));
+ assertEqualMem(&file2_buff[file2_size - sizeof(file2_test_txt) + 1],
+ file2_test_txt, sizeof(file2_test_txt) - 1);
+
+ /* Fourth header. */
+ assertA(0 == archive_read_next_header(a, &ae));
+ assertEqualString("testdir/LibarchiveAddingTest.html",
+ archive_entry_pathname(ae));
+ assertA((int)archive_entry_mtime(ae));
+ assertA((int)archive_entry_ctime(ae));
+ assertA((int)archive_entry_atime(ae));
+ assertEqualInt(file1_size, archive_entry_size(ae));
+ assertEqualInt(33188, archive_entry_mode(ae));
+ assertA(file1_size == archive_read_data(a, file1_buff, file1_size));
+ assertEqualMem(&file1_buff[file1_size - sizeof(file1_test_txt) + 1],
+ file1_test_txt, sizeof(file1_test_txt) - 1);
+
+ /* Fifth header. */
+ assertA(0 == archive_read_next_header(a, &ae));
+ assertEqualString("testdir", archive_entry_pathname(ae));
+ assertA((int)archive_entry_mtime(ae));
+ assertA((int)archive_entry_ctime(ae));
+ assertA((int)archive_entry_atime(ae));
+ assertEqualInt(0, archive_entry_size(ae));
+ assertEqualInt(16877, archive_entry_mode(ae));
+
+ /* Sixth header. */
+ assertA(0 == archive_read_next_header(a, &ae));
+ assertEqualString("testemptydir", archive_entry_pathname(ae));
+ assertA((int)archive_entry_mtime(ae));
+ assertA((int)archive_entry_ctime(ae));
+ assertA((int)archive_entry_atime(ae));
+ assertEqualInt(0, archive_entry_size(ae));
+ assertEqualInt(16877, archive_entry_mode(ae));
+
+ /* Test EOF */
+ assertA(1 == archive_read_next_header(a, &ae));
+ assertEqualInt(6, archive_file_count(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+/* This test is for sufficiently large files that would have been compressed
+ * using multiple lzss blocks.
+ */
+static void
+test_multi_lzss_blocks(void)
+{
+ const char reffile[] = "test_read_format_rar_multi_lzss_blocks.rar";
+ const char test_txt[] = "-bottom: 0in\"><BR>\n</P>\n</BODY>\n</HTML>";
+ int size = 20131111, offset = 0;
+ char buff[64];
+ struct archive_entry *ae;
+ struct archive *a;
+
+ extract_reference_file(reffile);
+ assert((a = archive_read_new()) != NULL);
+ assertA(0 == archive_read_support_filter_all(a));
+ assertA(0 == archive_read_support_format_all(a));
+ assertA(0 == archive_read_open_file(a, reffile, 10240));
+
+ /* First header. */
+ assertA(0 == archive_read_next_header(a, &ae));
+ assertEqualString("multi_lzss_blocks_test.txt", archive_entry_pathname(ae));
+ assertA((int)archive_entry_mtime(ae));
+ assertA((int)archive_entry_ctime(ae));
+ assertA((int)archive_entry_atime(ae));
+ assertEqualInt(size, archive_entry_size(ae));
+ assertEqualInt(33188, archive_entry_mode(ae));
+ while (offset + sizeof(buff) < size)
+ {
+ assertA(sizeof(buff) == archive_read_data(a, buff, sizeof(buff)));
+ offset += sizeof(buff);
+ }
+ assertA(size - offset == archive_read_data(a, buff, size - offset));
+ assertEqualMem(buff, test_txt, size - offset);
+
+ /* Test EOF */
+ assertA(1 == archive_read_next_header(a, &ae));
+ assertEqualInt(1, archive_file_count(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
DEFINE_TEST(test_read_format_rar)
{
test_basic();
test_subblock();
test_noeof();
+ test_compress_normal();
+ test_multi_lzss_blocks();
}
--- /dev/null
+begin 644 -
+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
+MQX_<XOV"C_58S[)9VXELF%[O>XV)5[,N;LV]#P_;T'E,W0-;MB9H&+;&;X/7C5<ET^1_'*7)ON,,AO/@_KABE7EY3</XI:L->FA'B
+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
+MC_58S[)9VXELF%[O>XV)5[,N;LV]#P_;T'E,W0-;MB9H&+;&;X/7C5<ET^1_'*7)ON,,AO/@_KABE7EY3</XI:L->FA'B*[H\PNH-
+MIZFV&5M<RJD>+244Y/@C6V5A>2W$@YBFY8;#V]U[9H$W-#<-SSRIH^>31F\;
+MV&:=*-0RV.7IY#^ZV"JLX13H,7<%&X`&=XX\P*6W"%`YN862'3QSBQJSMU[L
+MN+$`4=4P,K:<<-5IVIM#MO;L#,$]]DO:RW'-'8H.)]HBV,.%"0YO'\QKERWD
+M2;.M3#\%B+<D*HDT4SIO+M10'8NC+&R71W<N($40$[L!?#W'@O^P*3`.[8>J
+M!SGL(K5C.>(A;R<+)*1#Y8-#EMNK,=Z2WM$!2`")V2$"R<WC&38?-JA7Z\-B
+MVL+LL,4U"]BR"@=$J"@K/KF6;0N,YH)(4^N&5C7:*5.(WN460<T9L%50'DWT
+ME3OR'\Z[+EP@SNP&O1'HN(.3#*V6P%@0`"=>!OLV(U3"]W]`!(:!#6<]@]?2
+M7!)6;<&:!03HSN5;YVY)C>I/1WYV.WAXD+W-&.W.Z`RMOX(VNKWN@6,]$?$Y
+MX:F)XA-6LW^&_N*!.>$9BED8S?4$*5406C'2'Q[[G#0DQ&G]4(;6?T0>C0VM
+M(7]RQX3?:+2)J:OE5/QDUQBOHMVO3)>DHK>TDZBVG+,Y'_X*:;'WS:*:7#E-
+MBS!;P$T!%>,FC:%'?-_-,@NLZ&ZJRJ6*H-5C-*B"G"[+R*P\985O\=`H^7B&
+MO\V6$W'\*&C6%0FJ55IE<*JD"O&D4Y"EH\Z-K&&F-_-OK`J=\WV9GCJUVYK&
+MXHT5H6!:N^D,*#M;:2]I\<E]=YT:YC,WV1.3-?D(FUTX%<['2]P&<"5+V6&6
+M(?S67@:SV2TAQ[P=?@'N\[R]_BHSSN`ER::TE_9M#G$&#HUDQDL@00R+L7#8
+MXEJR].>(P?3Q.W="@O%,*J([?E*)07*<*\+.WF%6VVB6W0UV,9AP6-7F^`.$
+M1.K->EV0V?*2;6G7CS-`#4=5[6=9GI,H`@KN)<L'SEGRF$>+>*@N&KW6L]G&
+M<33PNY!9G'K8O:3!#9=9BY@_P,XLMSOJT]P^X%AC)%]]7HC9#SZG37/@9OHN
+MP2QXWC1V(-M8C`%.,_P0VXZ"+A9#J:]Z-`B"R6@577;36U(&SN'?-;"+'*>`
+MDY^MT9H[296"#300JKFOIY%(U,@\^%/(M5;3GTQO4VV>/W;N>!OK:FJV]R4Z
+M=*MBBJ+/%D/'G,>G#0R++M@SFB+F/#%>Z]$;&SLF\94M2Q`\MSF1G\9FZ_0C
+M(#A2QF:JET$0C9EJ&<*EH=6=%+8+Z\#_WJJADJ\#%W9CS1*9"L94_6]CX4@\
+MT9&>]FSVO-MVG;-"<*=7U/8VDI;.C8\GZGJ)$"!,*L0J04"VXE\RR<I>[#FE
+MKY#_M9\IMQ5H@]MA:EOOOP0EY&OEAV5=+NJS1C6QIT:ZGI&^N-;O=CIE*FNK
+M\J93!#;$X`."6^@BX>(NEN4+;U!8N[H`UDJ"G:(&7`=1!CFD7W/O)]S!_1P.
+MY</-6Y"X[5+W*?HBG7WZ3_I8UI(C8&+.#='2B);L%MF*Q/74ETF%46B[%5RD
+M3-*FH8,XBURY;8K["HA\74,TY:>DTGW55@XF#=T?5Z")ARQB7+VV&YWU`BG_
+MY`'"N0'CL_W[_>ZL!S^+(9.G^7YZ&Z9Y*=I-W6'NXO!A.>Y"Z1K\MK%/#-I.
+MF7-)'+!5QNU/3'7K+;479/L16X:1IYJGY\@]-."QGD4('I;6YS"32:$#I*ZA
+M5O5(P76ZCNW01(2#J@H-;X\2]<G6T#;<ZH],[(.H@)9Y,U.Y39?168,E^VJQ
+MQXJ9Y1MI;N\YR@!W,F\%II3<='<D\;<4W&ZS8?WZC+=2>A6J[A^_=UO@_M?'
+M=%D_!,>9F,_G2=6#7K;;R63\$`XJNW^+1?I+Z%,,AR*,R2:-6$?3U-IZ[*-I
+M&].AW+[B6S2)>&&J]S:>>UT%.0981-KV`<(.-"WHC=44R\W(O.!GIOJ:.1"S
+M6^7"=AFT.NI38@<>\;,OFIZIDT,AY:;+8;1DE"^"N&R1,M(;2OU*K];K+9=B
+M7%`(_T1+0M$=H7KN27_7A^GTQS(RI@/@?QV[#*?NU><YFWL5\*-J.0T;DD*Z
+M2@X3UEH*+C2N'0-@9M#*3!AEP'EHHD0?.QO*W+E.[!E*BA>=`R:.N4A1M!^S
+M1F"<%^KD%Z#A-\O;T(<?A./6?D'3#R-T&S.DE:X+KG1#>C6=R1DR"T;#41I(
+M#6I6]L$S"W6W3=]9MPW(VCG<"8TLWEKC+?1MF!3@-#>GHH16C3=HL47Q'H'T
+MDR<3^3'TW)8E]PMJ.A#MR&-"P-IH(88*A9<(0R%[H[^?D*,5V&B9'?S]<C7*
+M)\!+I9G9'X-J"-J&[S>+X<.8Q&$Y[(ER2<<+=EI./N8A/(#\.''75B92ZDY#
+M)K"[50-EB*4KHO,<&.]1TSO09W)HG>57;VCI8=.<M>8:6EON]'X9525-&NC$
+MTN\Z=4N34'77V!RAZ63P[4+.R2VI:OP2%N<HI>JDR_D:&7/E*BJ2%EO;SUA]
+MTQJ6'_;/20MN1LRIKO\"H6ZTH"JL'5N'ND<$O#.!G4_VMVIY4K+>D;RCZGV#
+M>`M(Q91ZF7+M&A\BTGAU+N91$9ALO+[S`=%8\UJ/6V`2Y8#&^,M&8GTHZGC5
+M*GU8!Y+V!26*0]"=!`<"B-4.DEI"Z%-IY=S`>K9UJ?X2HZ;4N9D_AK(`0S(Z
+M/W"EWA^D6`DRT/SLO5="QS/F\X1887E?@:J[-0;'&U<A>Q-ETG.5MTWZT->L
+M7R^G3"R'B86E`:-A4P?N"?$?YZ11$5)\*ZYZ+44YLGW?5N_K(58Y)0"0XP)H
+MO!^J<)W@3G>I^QE3>`H,>7FPUJ9MJ2Y%#3?J:_LWV6-L1I5N3>XR!GS>^JTH
+M?G?%,X8'G*>'-T`VZP"T[(P?H`WH/44@AJ>]]W2JUFLA*&&X1C8A!A1:"'"M
+M1R6^-YFE6UDI)7-O\$>RYK],SVA29)08;X7Z#HI%QX;MT?P&+I=:E&ZK53),
+MFU"<D_@#ER2BN^U?8?KRD<L\R@TF)7QQ9E%,_5;WQB#M].4TY%K%]GTN)3].
+M)QBFV"E)>0+9'!B:FAO6@V*N.+BFI,'L%"N>EK%+K4C^E?T%(39%2\DB@]C_
+M7<=2-K6CH+=@J`*:G%3V..;7<<$H9*8BVSN5C*NA2;2DI4L)<!(O=YYL[&`B
+MB0W>P8K(D%07B=Q0P!IB+Z+SP3VA_'!E4%-=4YQ?FF<USW.%\]]=-#:X4QT[
+M6Q'DTPX_?1UZKLD,:8J;HFP`(<(&B3$TU,XS3%K9'M88`>,)UAK,O#V*^Q3-
+MCW1)):*=.2(>.H:8*E2$$DRV&X+!.D,]/C7H+G((,\'#5P_@(X/!EO'B9;U'
+M*C;*DUE3K;1O9,*5U]UM5DVXY,ZF010,,Q1I=7,[023J7VD1>5E7VG3D(X`"
+M/AL4:7Y6K3MKFC9HXK8NRX(W$6D<[HPDK.DAH\\1:MG\=^I,U5/,+(T22K%U
+M8R^H!L6VR71C#:.,M+RO`X.[*?4).3^(D-JE5'0Q4$=5K?Y_L2'O)-T/=6^V
+M\K;AR*Z\??@7L00(E"+'''E=:.8VM)50G#1"%]I`IZ*:ED6F2E0\6JAW2LV+
+MF?(.*Z3,ZGYY"#M&A'Q[-<0EM-)1C3?`O3#K4LG'#I&B$+AZ6QH"4$EW@_>Y
+M(EAJC<VFX^0:6^_R,R-:+,;IBU4Z1\F04_RIS(;R73ML:WD![AU#BI0WM;_,
+M].]Z&8?6]/PV_T/Y/\Y)__0DBW3@D#$````````````#`````'*H[3X4,`<`
+M[4$``'1E<W1D:7+`S'*H[3YRJ.T^NJUTX)`V`````````````P````"=J]4^
+E%#`,`.U!``!T97-T96UP='ED:7+`S)VKU3Z%2NT^Q#U[`$`'````
+`
+end
--- /dev/null
+begin 644 -
+M4F%R(1H'`,^0<P``#0````````"5L73`D$0`(TT``"<M,P$#<!6B:RZ@[CX=
+M,QH`I($``&UU;'1I7VQZ<W-?8FQO8VMS7W1E<W0N='ATP,PNH.X^+:#N/@W!
+ME1$,S1$`%=F]SKX56/`,:6:25T-W=Y;Z1J;2>M#'TZD7E[>^E"B3)2K$2:-U
+M5%)EX,^[Z/T)6TB:)CD1,U4E(I-+`,]6V+:-&:B>1$<ZO.<CD'XIS^$'D><B
+M)J`9!%`5[?WS_X=O\?KV?Z_EW,/V[/W_=A_+\_J^[N_7A^'7ZW6_I\?U^@[>
+MSVZ_1\FQU\.SEQ<&;'GQY.#%O<E=S\/A^G!\\?9'X[G:[<I\'S_?W-GM3]#9
+M_+7[G_O\^[_M]'P_7^/X;/*G9UXR+X<-OZ\C9[/TS];Q9]_>^;#M^+%ES69_
+MHXL^[K_Z?#!$V>[L_=W/I^?K5_-Q5_#M>BY<?^N7W<[W:V?Q[UXF?=CVLMGX
+M[N[CV[,/Q['QX</4_/@Q_IU?A]3VOK[W<_O.YVY=]GK]CL=?^/9_C\W9_8^/
+M^'I77];TOM[7X?^I?__#Y/X2YW^=[FIPQN.W;6WFS4^C_#7U_0_!_YX<7AYF
+MO^,._ST^''P?+AZ^Q_+^?H\/_,_J_+3YM?:R9\^3?C[>O_I+GV]C]S[MCRV9
+MM&&7@GAMW)P9]?=Q;^/>X^4D&3Y&Q0BO#W_2,>[\.MAS1^;O7V_]_'ZWI_5C
+MSZ#,MGIV'_:?M\MYIM^'3C\^]+W]G*NS5A/R[W<]V*O,9O\H\F;AQ;=E<@[/
+MM]S]GW#/]G9_ZN?:^O"*NM1(DUR^M5<SY_J_'M_UP_=-0#Z/ALYEOS[^B;M]
+MWO35MV>]1?CL8?KY,[_?6H"Y$[NC?+DW.+;@^LR+V)X7\OIF@CG7V_%C\FBK
+M'FPZ-?+AYA.9S'E8=OGFX=ZS],/#CLGHC)NX<W[>?R\K?2\_BQ9\.7BYJN1>
+M#!ROX.+?FDV,#N8]W=])YCN3>7/*+GIR[^;8P]J>/])R<7A\7I$]%Z!N+GSI
+MEOIF:>*QXM[!,ZG)D\=A\D*"<>/@\.A2SF*X>0<_*;%P;E/KY5\N<L?53/MW
+MBS^FV0T]R#H(P;G,3\7(DV:,7CY4?IH<S^:\H^"F[=$.C'CYB)F[_*F].UP<
+M[N;'X>#15CV^7V>TB:%\F'>TF.UN:'EYO<6Y!'W\D];;7%,H8_TT5ZV#-SG\
+M6]S*<^G,WMP:7E[CLG^W'36D;C\TR9;M-05M.D:?9S$[.B'FRT4<A?WED_LF
+M:SS3E1H5G[OBLO:$O&PY.\NA/QT,93#Y,$VR+.#<CT=_3MOI$[?/<XM^K0-O
+M1L[P3(?@[W%P<$?.?N^#9GBO!^67)X<N+?FX7T$]I=C*9AYN4TYYKAEYI5&[
+MF+FOFQ#_O&]IF0R<$TL:^O?.;M9MS/Z9K4)\_GM\./)R@\6*:7J;DP<-2E5+
+MG.US=;>/-9FIF702-"LU,'IR>#G<J;,%#5VD:96RV4P7.--#6/@H2,W)'H/+
+MBXZD"/#ECTZ%'E_JU;J6BN(-Y3S9R0OU3W>AF/.UQY.*:@-FY"<?#!&A#7H/
+M+DJR%-13=P<Q,,*T=\_+<4_S^Z&X/N[OTZ'<-&Y?H^'U7-GI?PZ.*&*WM[#P
+M\OO%&1QH+<Q\X6WZ7EX]`/BR51C'F_R_MQ<NOFY*HT;-KW=GL3-7R:-?@IFU
+MN8].5IH`V^+/BVIK/7(8VK+EP)[AZG!H)T`XN'AWL>W3"]!COP56VQQG.]T'
+M,%Y"-<IT"7SB=6[3GH(,I;IWU-C42UBF2M[S2BB\)`\<W77!,J\/-KFJEZ,+
+MQ9M%6#'T463011H&SCJ2)[YY(R9:J2\7%/)\FY/]*HFCQTS3!Y<<S.XK3L;'
+M*>OPPT:$S3T)0I=%1'G[R9/'!!F]2L\N#DF:_>C+<GYMNB@&;YO/.;GFXX+*
+MK!9.:VC<E%2?BWM[2J9FX>>B;Q:AK_GV=GUFXM?+YIR-].@7AH8ZFJL]]*W!
+M"_%I\,7#/3_[6/D:\I[?7?\5EK5E4C7FL/!T=O0P-7$P[NMP>#0CS6S+>YO<
+M?S1E_';L7I59;^BM2N.Q@[6]G\5(%_MM#PCVIF9K!Z&>.%4[."U'='!L+85(
+M5_W=:NEM3\3BS1FU(,=WJSA'V9<%WL>>Z=[;&'NRF[BV\^MARZGB^;U4]XO#
+M#]//@H2<,KCB*=OS=853Y#!V+#X<F3<JZ2R6P_-3IR^\7H\)]#9O>2U@"%*(
+MSO;]'"0]Z^D+^DIP1IS6]=U+SL\6>;$>'%7PS8+P[\_\@0!2+'-^/0W4/J/3
+M=#63+ZWWP`?AL+%.-]EC957ZDUY.8^<<O-Q;\W7O'\NG1W>[GK+8?Y<&UFX?
+MFTP5J1,8$\];/O\/6O)TV.SU^O_/7Z_9U^Q_+9[/8V/CZ^Q\G7]._8P6D#U'
+M#'E]#O0E"8`6:@F6'G-<1;^.MXN0K-$>/?ZVITKZ=,U'C]#YYUO/<'2Z:R2O
+ML_;KK"WV>Y6%U/W/EN5[[.Q_'8_GS:8L.O?>&W>6WU^O\M,L\%VV^Q;^_*_0
+M7MV^/LMO)P\=OBU>#8V_E['\I^KVKD+6HGY!F'X@.U.*M_;BFB"WV.C^.O]'
+M7Z?Z-Z;K;/U(<@=G#_XP_'K<C^E<C<B=GJ_1K]CV6A/LJI%V?X_)R7CFJ!;B
+M/CMV!X;,^Y-O2WR_(\5F]P^IH38_8F%]RV7+;9-_'GB#_/SW&GAYWV/CM13E
+ML@1G#@*>@.++ISC#L\_W/U3%=?^'7_G_+4MY.$GHWV_'./%ZV*C7M[#P4NEP
+MW7OX3-X\?#PSPLU^^]W(BO8(>G_M8MR;@7>Q\$UI9N#X6BFUQN>^@`NA'QJX
+MHN7SI#J^"&H\VW.59V_%:PGN7#,ZN")NO=VT+E3:&:KB.WT\'P=%DCTO=F+X
+ML\6@&T*'CS7L_C+-W0]1W!SO3&/SU?X=BZ.%[H#1O$Z;6&CG1%M^*H!C+[1M
+MWWG)?LR9?;02-:8(/]P('4'W<*5];/?I^J&I(??P`)PW@\>BSF*XK7YL]-69
+M]CU@</=M.OMZ`[+7V&6%:9P,.:B<-G/9:#0@!/I1O&A.UF@!1@G)A3G/*^W$
+M!B@U.'0&]9J69N&!0#<J3MW2U%@EE08&[CYP\]&L^6-V#UH^4%;:LT5S5GB`
+MUTH(:KBKJT!%STK,YW,=.6DX)Y+K]B>@,V>'R]1MN']>662NB(+,Y0.:@MFY
+M[G)D0>VB.I_YEW]#&3>R>'CK)<503'UX)=]&2GOQ$)F0F&^H_DW<-^;*J'?H
+MY5K\N9KN71',-9+>'BE%3<>;5'<J)'Y,^N<Y=S]VK>:@R4206"OL9KS2FS&3
+MUEX9S(W#S!0J#"N>@3?LI1&K*:AR<-M$VS8(SC?Q4`!UU!J="U_>\KW-X1Q;
+MT3/$,%V?IBC5FM@Y>\%)4[I)G/-&4\%-N0S="<;ONCQURJB/L'#2;'T/8LM[
+M3LY4';Y^[(#&9,NE;#J?ULS45,QQLR8:S!CWX?7Q/!^H#_FW79X<4*@\Y=-'
+M^'E;!<Z`C3!0%!SK=74#Z^V&`J!68-SY8)6CG'"%>?;F0R\.>KF;I5OJ*H4G
+MSO1?KCX:+C:V"KI"FFH0'7[\>UCI-%T2MY.?GGRXG_WN_E=(:VFKS>X!!,/;
+M[GV=W\.YX-GN=_9ZGJ:"ZMT&O_CU(BW6_SI$9G4E^+AOQ$\/^?6]3$U13U.I
+MBP_1=I7P0E'P3H574ZO5P_X<C?A^?W?=U?FZ;U^Y`#"8#[J=KO?7]O=_VYI?
+MQ_UUO4Q'J>M?R+-S.0EVFT($TS48\$W"O,7U?^ZRZJ`_8Y3.6PRS'>>#3!=\
+M$K0'!_V6E89'ID49#S(:U'&OH>QU^S\G7]?3M?Q-+W>AG6KXR;E3+Q](EJOX
+M]GJ/U4W\_'@J"'ZF*T.+BL]CH&\5>_H]FYCZDMQ6?-?N_A]G6^_M?AW?LFME
+ML??]E?IU9=35_@NF=NI3).B$.Z5GVN8__)_^K-E[^+;RY+0SFF42QY9TS7P\
+M4/9YN8IM#YIN+YMK9YRM</R=S'1S[0')29@Z`PO-KZ\3#-SO_#CKA(U+<\&O
+M'QK5#\^#]W?&A2/8IJZH**HH.A.FZIF`^W^C.NQ0=,ME*0OJ=_753F*1-M6<
+MEV65C7^V-56+3::F!`$0>KTT9/@NIB<(IHV*M0HP]WO_C$)FZA$^S+MXM3'F
+MP976M+-?ON0_6J[SJ;_GF3@N&Z\]_U<<Q"/ILX.FM@I.VWC*6X2FDZ@(*@#.
+MI'V?7!\[:.G4[_*[>T85^75V,'?LA,UVB[="5JU-E'Q,SF6A+[8HN'%3SV4J
+M'6"Z@8:JL3!'T^6T.%H!ZDX8'BB-'[,T5S.=351LW]S%U9)ICK@QUJQ<1JM'
+M75P:8<G.9GJ&>F"]NG@,W0/#,1MJB\VT-*<17F.P05^?'E+1=2E=9TL9_-43
+M5.?WT23HF'/5//*PU]S'HAGP.<]/X+<BS>Y!B_NY?6>#;XYUL?P:+?!BH&5J
+M&)CZ<,L@^]9'+I`P\\HQ[GGU^Z$TPR[P2Y=0W)\*'9O;M8^UU8LM<9XO',M\
+M[&HP6KUL$\?HYYGYM&;DV/;I27I4B7XT?5O.G]B;L['FK\X#2^26J'QSY*\%
+M=9T:.;AOYEIHW-%.Z"4>2-KG(KZ4#U;9=:";2H9UJ5LV6,<QJ=RX/4_'@P1R
+M*$Z[;SUZN%WUJ2`E%7.EVC-0+AKLC2&T@Q]V70,5G0W.9VE'6F0X'G6=.O#H
+MWF@SQ58%IKJ*T1FTO6JC6=[>N>Q7N$"@5_">L\,[\<Z2YFBF#X,6YN:N%)OA
+MW-GQ=%VQ#$U!\EF:Z8XCTHV!.C,38CY4^')24^IQ/U&&=V=8VR>6@UKE9PQZ
+M\V<YY]AQV\6E5:GWV>9GRL?>[O^O<^GZ]#E'M^]O4-O_>37;V\N/AG-PYJ"@
+MH%`Q/29YUZO6C\3'1UIH$_G,6?.@<VDK#U*<1-\$_?L\LT-<,#I-N'`D"VM2
+M:9_M220VH@9\JM^;DG<V.K[Q.0?7#@ZRN^8A(3IWM_@5_+2M,49^F%7G&0U)
+M;OI3KL/RXZX&VOOSD'_@OUF3W;2?>F^6SURC;XLM.12A@*=8=]YVQ-`V;5J"
+MYPU[R0N[NW3JT?YP9-0%+!\%SRBDFE;'Z@_L>CTIRIM5S)W35\#QRS0ECS70
+MBXG=ND(=`'5*,M-;3@N!A4=G?!;*YYO63YI6=T[-Q1_W!QUEY:-P7UI[:UG/
+MDO\'P>R6HIO6L=;-IK%EY;VDVEYM5KLU68]$^+R6=/FG341CH0X:-M4H=F+=
+MLWN.$$S?I45D_Z/&E7*K:CM1S26_S&47RLO<1I,)=/<?O*FL<S!6E:;=&6[@
+MS%V:7F%+U+6HUS1P[.CK;'2\=/T6"HUA!4M"TVA+_KK^/58NU<:C0X]4+>^F
+MW[UDT@YJPAM^S?HNGLWE?\>>W@G='<Z6=3ELM[CIQ$_[450#%;ZMM0NGX<^2
+MC\2<&B99\<U+\?!ZM"/G\H8#]Y/_1\+34L*UV;E4&6P=(K,T\HB'+#L[U5B:
+MZ(A&&K0?K(,_#)GK1&)X_R\MXC,[6;)O<4_A$GQZRYOM0H7Y6OR/!05]#EJH
+M4"[SX)?-(3[OQ``JPA?XP6#FXKS&FF!'S'=_BNB.VV%[Q9NCQP%V+U])-M&N
+MXLUL33V]#._QFZ+\'@_+D79^S\>]]^"*$;=1&8/C9ETO?\U*]]_C/CJ^66"^
+M%:T39/!=H;JX/^,'J%+H34,%^TP,`MIC7L.Q4K3D+NCBJ5Y/5-A^ONB]3Y>K
+M\UVF/^=4UGZCHF<E#5SM16'4@;3S;D/)(7TR<$8'!JLPO2#*^^=DI:O:F4ND
+M0!!'HX>T63.+/2T`!+>1TP3+E*>!TMFYSUC/@7JLOVCY>.BU%`?&E0N<LYE@
+M+E10S3G\ZSO/EP^#<@ISK%\_2]]<3_G,G1`XR=-#MT23+MHT>==\Z;!494NP
+M?3D6&?_-U[&5_W=N'!=N'HQ!M[<".H;UU!_9QS//,V/:]<"_]/W1SXEHD'V4
+MA!_>VC`[N'LF+(^"=>6PX^A%SK/=?I^G,A>8.HJ7.R/8ANS051ZIRM^*:C>@
+M.!KUP6>G&%<.3AK5;>#SZG(7Y/+K>BXL]!F63@N?`157O2=R=6!]Y=%UY#SP
+M5;YJZ&[5^?OTN@=GH#2J2O.CJ#L3;RISQ5+8]FQ1=K^N^M6]<&+R3"?VV1Y1
+M8[WU6:M?LIR:LZL;\ONL]7[!7/IYZG6_=*OWV;\LT*>[\4C$'&@!F+0&]GD'
+MWSE'XQG[^MHQ/?X]_>\T\<OO&+^V='^U8S]TL]O'6R8<'O>X[4J^S+G=S=ZS
+MP_OZ#Y37:!UO;$SH&!]J4(T[W\?ZV?O%.,1^'FN;W,J??'&==*:NU.F2=E1^
+MW,G&([D"A_<\Q_#0E>QO[A7^NW/_WRULV?IZ_H^\.2;K&;\'V2M7)>GR899I
+M<F_?$,B[GP?[<6/+7EY8N'^=+5LU]-"/G%=Z/,+U!M8--L,UM<S52/*TE&G)
+M\0-;MK"^3;QT',:;EAV,'>]>V:)S<UFY%SSY::/SY.C-X[_%FSTHU%ML<X,^
+M2/WK8*M9PC3H.=W!;UX`-?XX^(%-UPA8KVYIV2'IXYRL:N-NX/9<6),*/5,%
+MM;3WK-5IVTVA[;V]B>84]^V7MMMQSH[%F<3]XB['%Q4)%[>/])ZYO6\C!L];
+M3#\G8BWDLJB3HIGIO+VHH#V+HS8[,.CO<N($J("O[`KX?<>"_]@4K0.]T/6@
+M<[!Q3K5EO/$67<G#;)24/EP]#EMO5F.^DM[2@*28$3V2$(9.NXQF+#YVM"O[
+M=FQMUA=PPQIJ%]JR%0.E*@I.L^WLL[4[C.N!)3I]=F6UKNBE5Y&^YHLQ>;+=
+M@U5`P4WU2IW\A_IKVW+ABYW<45Z*.BXS.39ENEL)V!!,"=OS-]S8SU39@]_0
+M!!#H$-MY[#!P4EP8*UUP9T"@QHSW*M\]O)FB]2?1\&>UV]/Q4+WFRUVY[H#*
+M[?XT;7J][T"[T=$?G.>14Q/BG-6V[_FW]XL5.>$MQ59&.+Z@LI51)VC'I#X^
+M^YQ<$F@:?ZH0W6P]$'I<&UTA?[UCPQ?:-Q$ZG5^:J?HDUYXK]:W:]FI>DLZW
+MMDSU%M7K,YG__%IIL?OFT::7FY3M68AO"<T!CWXDT=J='?B_FK8+MO0W:K*T
+ML52>JYYIJ(-.%VKR*T_'#"O!X]`L_E\4]?\V7%%Q_3H:.M.H3:E5=,KAJJ0-
+M>-(TY#2T>>C:QD4QO]+O6F5/?-]Q,\>K7;KF-YT:+:G8%M=]4,+,[7;I+VQX
+M\G!7>>C7F,YON1/)S7\A0;7IP*\;'I>X%O`E9?98:L0_S;AX'6>RK2','P>O
+MP#WO.\OP^+1GSN3)>3IK27^WM3YQ"T='63&I9`DX9&[C\.QXJU9?3GE&#]/$
+M[>Z%"O%,55$OWY31*%<IXJ\+/=S"MUMHPV[-KN>,XN'8ZOF_"9PH$ZVZ]AV1
+M=/E4FUL]>/,Z`&J-5]KG6M]*V@"3KN,.6(\\,^:81\[>*Q;D5>[:Y[/'&)T\
+M+O`+.,?6Q>Z3!%TNM:N9/_)LXVVYWZM/<CW)K#1)%^^KT;UL//U.FN?C$WU#
+ML&&/+N-'M0;M<<0!8QG^\!MY]!%XK8=5SWJ*!%-9+H%6^[:N;4Q73N'OFMIQ
+M8\L<!)Y_7=GFE^DRVB#8H(6JYK]/(I14R(Y\+/DK56Z<^G/>L6V?/][MSXKO
+M6ZG5NO<FG3I:V*+46?.R'HYS'TZ>AJ++W09XHB\1X<>_Z]$;GL[DWQPI;2Q`
+M^6\9E$_CFNU_0C4!PTL9G54NIHAGLS:LSS5+H=7/12W%P5X'_WJJAP5?!:N[
+MFCFB:9#6,K'UX)>0D'S9;&>^WL^UYMO:OV:%>*>KZL$KI*79Z-CR?VCJ)&*@
+M3#5B*I!H%MXZ^:LG+#W:?-+<$!_[F?--N*W"#[K"UAOOWX(3@HU]6'9JZ7=J
+MS2UK:*='74^D;[>:WP>QTS2IKU?E9JF"GMC/,`Y.6^Q8_#XH=+>6:V^H+%[N
+M@#K4J"GM$#5P'J(,O:1PWOO@^\0?Z.![UP\ZMR0X[JE[RQ]&//7W])_Z6-;!
+M$N@8V\&[/I1&7=Q;=N*X\&[272M*L[1=QZN4BMTK%0PMXBV]<MN/@M*E#XWT
+M,Z<MCI-,>[56#Q6C=Z/J^@B:?+&4N7NZ&Y[Z@2I__),.%N8HX[/^_O^^]6`\
+M_RLAE?/]7Y]#=.?)IVE=NN;W>=X,4Y[F:Z45^7:X\]F;I.F77$CRXM7&[:>F
+M.X-FZU%[9]C'MV:1I\53^/)/TZ<%CGR5"!]+:W/,)FR="!U2NH:MZTC!>MU'
+M>[04$*@ZJ:@VWX^.O7)ZV@;MYZH]B=DGU$"EGDYM.Y8LOJ%F(DO[JK'O<>F>
+M4NM+>_SG-`#O,G@FM-EBXZ/<D\=O'F\=]FR/W]1EO4GJ=:KW(^_N];\</:_+
+MNSLGZ:8^9G>C\])U8.O6V\%+)^F@'CU=O\K1?LG!0IS9#R5&94FC:PC]/4VL
+M&[EGM*+TZGW+[Q5LTC+X;-5[FZ>>UZ"G,S+3B;;_#/A!YZ%W\<75%FKS<E><
+M#CIOM-'40M<WS>)W%FZ'74LW',X^_%F7YM/5,K@R'S:;+8NHR50ODZX;DQVV
+MD-TK]35?K>M6R[*7%!./]C@M3M$>X+U[DE_[.+]?UEG(U4P1X,,MWX96'=U>
+M>,SN[%?91M2]#1W,EE=)8O#'66IJ+STKQ=`V$3:'*3AXLO#'+18Z(/SVMY;>
+M7E/?@RPHI#SJ9DZ.N:0H[@?N;>B"=-?K<Q;^+PQ?+W>LFX_FG'UGY$:8P4;H
+MBS.J2M>+=O=$-]'6=RHR9BVHL-2C24QK66[M@G,+NW73=^U=<-U&T>=R:8Z6
+M;S<XR[]&V<53@7!O8Z*%"T=-VSL47XHZ!]DS4XG^#'Z;DLI?<-U1T@.WDB-#
+M:&TZ"&+14-MPA3R'!Z/@Y^9J,:]IHK8[_/UY+G*,>""[#,]L?B+4$NJ&^"[B
+M^+QS+489X[(EY,GCLNV72<?O8BGDF?B\<>NK*93?2=0R=87=5`[;$4TKHX+7
+M!E_J.G.]BYW,V._RJ]W:.JPZ><NO,-5I;]_H_%M5)J:.NC*:7P7SJPY-H.NX
+M+0Y4_2Y/F[4AG:DMK#5_#DAN>$4X-4F7^<4,O/REHJE0LW=O/K#[TQJ;3_W3
+MTEEUR-Q*FW_X%16ZTL4*K3=6\7ND<&'AG@MZG_<W;3RTK+?2-Y;WJ?9/>$[2
+M,K*/:9<O:BA\SM)Z?4N\U1$<0V<%?>M!T:T<UK/UNQ,EY<41OHEHXB?99]3Q
+MU2I^K`8*7L#26*H>BG00+P42Y0[)ETA=(3;'+N<,=6SUM/\)4OFUAS-3^&LS
+M`0YJ.C^Y"7?#^N/A@F;4_SV<&KH6/,_%YPSL,+YL.*Y5W-H-WMZY<BO8FX=)
+MYX6WIOVX-?6+YP4Z87`>*TM5`:70J<7]Y.?$P^?5%$9U)^:NO/1M8\\63[WZ
+MMW^LA6UR30"1>8$Z+P?U3A7^!.O]3]WH4WQ0@S!7FPZU,W:R;F.S3?J=?VN]
+MFUMC>I5N8O<:@9^+WUK2A_/?BS7C`^>:>'-Z`;>L`NG9&(^B8WJ;U&D$.I[\
+M-_2M:S7`2BTW%&-H"#3HM$!PMK>R;?CP6Z5NK)5)7.[^"/<N=?TSGMFI-24&
+MGOBOT1HJBX]F[NS_@,7I>MI1O5:K-29-U"<J?P!S<R:*^"Y?:?Z^6!RV"V@T
+MQ$K\>/F4J9_5;WT1![O3RQ3D;F+]GZKR4_JX[S%.W,I9-^@6S>Q<=R:+NM!V
+MJN7EQ8J3$=@HJYZK6*;[4F'I7]$)"ND5-^DBA@E_;^.TC:ZT="MV"T`4ZG%6
+M"67MKWG!-#)9H%MQN6UE7H4FV$E52Q2X"9WN]@NG8YA%*0W?8,5P)!J"\IW%
+M#AFTQC_6O/!8.A_'!JJ"Q75//*_.F<Z\=SAPQWUV*&UX:8[/<V)@IIB\_?HZ
+M]J[)FQIQZ;HFX9A#IP-*3$V;3.,Z8M=L>VTP$_'-.MFM;>'N/@M4SM>Z4DEL
+M>>G)$8(U#I@J:D(4DR[3<0P3TAGL\K@Q;GDG!GQ>'5P_DR/,\'+?>X[;>H\M
+M&V:DVVIUW4;W)Q4KK]]M6V;<O3.L2"-`PUJC5=76]H)@ZG!<1*\K+7VKYR*.
+M`)H^GL6>E_+<M/=7-+IHZ%L;\N#/<4-(\[L\)EMZ2'1YY1:NW^._:3-:IYBL
+MC1DRUBZVLOU`-SMMF'1EIM+S+5>5XGP=W*?J03J?Q$BZJ5:.IXK%O:K6_Y_N
+M.A[X)O0]VM]M\K=R,BW<$>_BKV(*9$T(VN./FOM'6MK9-5"<BB$5]J@4^BFL
+M,BZ9*6AXNK0[L+-SN9^`<6[!F>I_3D*;M'0C\?9UYPENFDHYZ;\%>F';67)X
+M[.D:(H7)VY'T1*$-.0_>\F.L-6>YNFX^2>EOX_);D=:+-%TQ=6G2/J9!I_E3
+MG(>"ET[=CK?)AS1U#C4H;[6_S/J[WTVX?K?5^/;_K'YC^<D_/__[_.C@````
+M````2=D^```!)V3X!)V3X````"3LGP`````````6```````,X`"P``````).
+MR?```````````````````````````````````"3J3X``D[)\D[)\`````2=D
+M^``````````````````).R?````$G9/@```````D[)\D[)\`````````````
+M`D[)\````````"3LGP`DZD^````````````````````````````````````,
+M(``````````````!)V3X`````````````"3LGP```````````````$G9/@``
+M`!)V3X```````````!)V3X```$G9/R=D^D[)\`2=D^``S`!)V3X````).R?`
+M`````````S``D[)\`````````````"3LGP``````````````````````````
+M`````````L6```````,X`"P``````).R?```````````````````````````
+M````````"3J3X``D[)\D[)\`````2=D^``````````````````).R?````$G
+M9/@```````D[)\D[)\``````````````D[)\````````"3LGP`DZD^``````
+M``````````````````````````````,(``````````````!)V3X`````````
+M````"3LGP```````````````$G9/@```!)V3X```````````!)V3X```$G9/
+MR=D^D[)\`2=D^``S`!)V3X````).R?``````````S``D[)\`````````````
+M"3LGP```````````````````````````````````L6```````,X`"P``````
+M).R?```````````````````````````````````"3J3X``D[)\D[)\`````2
+M=D^``````````````````).R?````$G9/@```````D[)\D[)\```````````
+M```D[)\````````"3LGP`DZD^```````````````````````````````````
+M`,(``````````````!)V3X`````````````"3LGP```````````````$G9/@
+M```!)V3X```````````!)V3X```$G9/R=D^D[)\`2=D^``S`!)V3X````).R
+M?``````````S``D[)\`````````````"3LGP````````````````````````
+M```````````L6```````,X`"P``````).R?`````````````````````````
+M``````````"3J3X``D[)\D[)\`````2=D^``````````````````).R?````
+M$G9/@```````D[)\D[)\``````````````D[)\````````"3LGP`DZD^````
+M````````````````````````````````,(``````````````!)V3X```````
+M``````"3LGP```````````````$G9/@```!)V3X```````````!)V3X```$G
+M9/R=D^D[)\`2=D^``S`!)V3X````).R?``````````S``D[)\```````````
+M``"3LGP```````````````````````````````````L6```````,X`"P````
+M``).R?```````````````````````````````````"3J3X``D[)\D[)\````
+M`2=D^``````````````````).R?````$G9/@```````D[)\D[)\`````````
+M`````D[)\````````"3LGP`DZD^`````````````````````````````````
+M```,(``````````````!)V3X`````````````"3LGP```````````````$G9
+M/@```!)V3X```````````!)V3X```$G9/R=D^D[)\`2=D^``S`!)V3X````)
+M.R?``````````S``D[)\`````````````"3LGP``````````````````````
+M`````````````L6```````,X`"P``````).R?```````````````````````
+M````````````"3J3X``D[)\D[)\`````2=D^``````````````````).R?``
+M``$G9/@```````D[)\D[)\``````````````D[)\````````"3LGP`DZD^``
+M``````````````````````````````````,(``````````````!)V3X`````
+M````````"3LGP```````````````$G9/@```!)V3X```````````!)V3X```
+M$G9/R=D^D[)\`2=D^``S`!)V3X````).R?``````````S``D[)\`````````
+M````"3LGP```````````````````````````````````L6```````,X`"P``
+M````).R?```````````````````````````````````"3J3X``D[)\D[)\``
+M```2=D^``````````````````).R?````$G9/@```````D[)\D[)\```````
+M```````D[)\````````"3LGP`DZD^```````````````````````?_I+V3Q(
+MT\2BNG+`G[^<#:=#P````````````!X```````````````O;\```````````
+M``!>WX```````````````"]OP````O;\````````````O;\```"]O[V_7M^`
+M+V_``<`%[?@````O;\`````````#@`7M^`````````````!>WX``````````
+M`````````````````````````9@``````'P`#``````!>WX`````````````
+M``````````````````````7J_``%[?E[?@````"]OP`````````````````!
+M>WX````O;\```````%[?E[?@`````````````%[?@````````7M^`%ZOP```
+M````````````````````````````````!X```````````````O;\````````
+M`````!>WX```````````````"]OP````O;\````````````O;\```"]O[V_7
+MM^`+V_``<`%[?@````O;\`````````#@`7M^`````````````!>WX```````
+M````````````````````````````9@``````'P`#``````!>WX``````````
+M`````````````````````````7J_``%[?E[?@````"]OP```````````````
+M``!>WX````O;\```````%[?E[?@`````````````%[?@````````7M^`%ZOP
+M```````````````````````````````````!X```````````````O;\`````
+M````````!>WX```````````````"]OP````O;\````````````O;\```"]O[
+MV_7M^`+V_``<`%[?@````O;\`````````#@`7M^`````````````!>WX````
+M````````%[?@``````!>WX`````````````!>K\``!>WX`````/`````````
+M`````````"]OP```!>WX```````+V_+V_``````````7M^```"]OP```````
+M`+V_`"]7X````````````````````````````````````\``````````````
+M`7M^``````````````O;\```````````````!>WX````7M^````````````7
+MM^```!>W][?KV_`%[?@`.`"]OP````7M^`````````!P`+V_````````````
+M``O;\```````````````````````````````````,P``````#X`!@``````O
+M;\```````````````````````````````````+U?@`"]OR]OP````!>WX```
+M```````````````O;\````7M^```````"]OR]OP`````````````"]OP````
+M````+V_`"]7X````````````````````````````````````\```````````
+M````7M^``````````````O;\```````````````!>WX````7M^``````````
+M``7M^```!>W][?KV_`%[?@`.`"]OP````7M^`````````!P`+V_`````````
+M`````O;\```````````````````````````````````,P``````#X`!@````
+M``O;\```````````````````````````````````+U?@`"]OR]OP````!>WX
+M``````````````````O;\````7M^```````"]OR]OP`````````````"]OP`
+M```````+V_`"]7X````````````````````````````````````\````````
+M```````7M^``````````````O;\```````````````!>WX````7M^```````
+M`````7M^```!>W][?KV_`%[?@`.`"]OP````7M^`````````!P`+V_``````
+M````````O;\```````````````````````````````````,P``````#X`!@`
+M`````O;\```````````````````````````````````+U?@`"]OR]OP````!
+M>WX``````````````````O;\````7M^```````"]OR]OP`````````````"]
+MOP````````+V_`"]7X````````````````````````````````````\`````
+M``````````7M^``````````````O;\```````````````!>WX````7M^````
+M````````7M^```!>W][?KV_`%[?@`.`"]OP````7M^`````````!P`+V_```
+M```````````O;\```````````````````````````````````,P``````#X`
+M!@``````O;\```````````````````````````````````+U?@`"]OR]OP``
+M``!>WX``````````````````O;\````7M^```````"]OR]OP````````````
+M`"]OP````````+V_`"]7X````````````````````````````````````\``
+M`````````````7M^``````````````O;\```````````````!>WX````7M^`
+M```````````7M^```!>W][?KV_`%[?@`.`"]OP````7M^`````````!P`+V_
+M``````````````O;\```````````````````````````````````,P``````
+M#X`!@``````O;\```````````````````````````````````+U?@`"]OR]O
+MP````!>WX``````````````````O;\````7M^```````"]OR]OP`````````
+M````"]OP````````+V_`"]7X````````````````````````````````````
+M\```````````````7M^``````````````O;\```````````````!>WX````7
+MM^````````````7M^```!>W][?KV_`%[?@`.`"]OP````7M^`````````!P`
+M+V_``````````````O;\```````````````````````````````````,P```
+M```#X`!@``````O;\```````````````````````````````````+U?@`"]O
+MR]OP````!>WX``````````````````O;\````7M^```````"]OR]OP``````
+M```````"]OP````````+V_`"]7X`````````````````````````````````
+M```\```````````````7M^``````````````O;\```````````````!>WX``
+M``7M^```````#^!$_L_$HKIR@3W\%I0\````+V_````O;^]OU[?@"]OP`'`!
+M>WX````+V_``````````X`%[?@`````````````7M^``````````````````
+M`````````````````&8``````!X`!@``````O;\`````````````````````
+M``````````````+U?@`"]OR]OP````!>WX``````````````````O;\````7
+MM^```````"]OR]OP`````````````"]OP````````+V_`"]7X```````````
+M`````````````````````````^```````````````+V_``````````````7M
+M^````````````````O;\````+V_````````````+V_````O;^]OU[?@"]OP`
+M'`!>WX````+V_``````````X`%[?@`````````````7M^```````````````
+M````````````````````&8``````!X`!@``````O;\``````````````````
+M`````````````````+U?@`"]OR]OP````!>WX``````````````````O;\``
+M``7M^```````"]OR]OP`````````````"]OP````````+V_`"]7X````````
+M````````````````````````````^```````````````+V_`````````````
+M`7M^````````````````O;\````+V_````````````+V_````O;^]OU[?@"]
+MOP`'`!>WX````+V_``````````X`%[?@`````````````7M^````````````
+M```````````````````````&8``````!X`!@``````O;\```````````````
+M````````````````````+U?@`"]OR]OP````!>WX``````````````````O;
+M\````7M^```````"]OR]OP`````````````"]OP````````+V_`"]7X`````
+M```````````````````````````````^```````````````+V_``````````
+M````7M^````````````````O;\````+V_````````````+V_````O;^]OU[?
+M@"]OP`'`!>WX````+V_``````````X`%[?@`````````````7M^`````````
+M``````````````````````````&8``````!X`!@``````O;\````````````
+M```````````````````````+U?@`"]OR]OP````!>WX`````````````````
+M`O;\````7M^```````"]OR]OP`````````````"]OP````````+V_`"]7X``
+M``````````````````````````````````^```````````````+V_```````
+M```````7M^````````````````O;\````+V_````````````+V_````O;^]O
+MU[?@"]OP`'`!>WX````+V_``````````X`%[?@`````````````7M^``````
+M`````````````````````````````&8``````!X`!@``````O;\`````````
+M``````````````````````````+U?@`"]OR]OP````!>WX``````````````
+M````O;\````7M^```````"]OR]OP`````````````"]OP````````+V_`"]7
+MX````````````````````````````````````^```````````````+V_````
+M``````````7M^````````````````O;\````+V_````````````+V_````O;
+M^]OU[?@"]OP`'`!>WX````+V_``````````X`%[?@`````````````7M^```
+M````````````````````````````````&8``````!X`!@``````O;\``````
+M`````````````````````````````+U?@`"]OR]OP````!>WX```````````
+M```````O;\````7M^```````"]OR]OP`````````````"]OP````````+V_`
+M"]7X````````````````````````````````````^```````````````+V_`
+M`````````````7M^````````````````O;\````+V_````````````+V_```
+M`O;^]OU[?@"]OP`'`!>WX````+V_``````````X`%[?@`````````````7M^
+M```````````````````````````````````&8``````!X`!@``````O;\```
+M````````````````````````````````+U?@`"]OR]OP````!>WX````````
+M``````````O;\````7M^```````"]OR]OP`````````````"]OP````````+
+MV_`"]7X````````````````````````````````````^```````````````+
+MV_``````````````7M^````````````````O;\````+V_````````````+V_
+M````O;^]OU[?@"]OP`'`!>WX````+V_``````````X`%[?@`````````````
+M7M^```````````````````````````````````&8``````!X`!@``````O;\
+M```````````````````````````````````+U?@`"]OR]OP````!>WX`````
+M`````````````O;\````7M^```````"]OR]OP`````````````"]OP``````
+M``+V_`"]7X````````````````````````````````````^`````````````
+M``+V_``````````````7M^````````````````O;\````+V_````````````
+M+V_````O;^]OU[?@"]OP`'`!>WX````+V_``````````X`%[?@``````````
+M```7M^```````````````````````````````````&8``````!X`!@``````
+MO;\```````````````````````````````````+U?@`"]OR]OP````!>WX``
+M````````````````O;\````7M^```````"]OR]OP`````````````"]OP```
+M`````+V_`"]7X````````````````````````````````````^``````````
+M`````+V_``````````````7M^````````````````O;\````+V_`````````
+M```+V_````O;^]OU[?@"]OP`'`!>WX```']'_`95<H(_P=*/`O;\````````
+M`#@`7M^`````````````!>WX```````````````````````````````````9
+M@``````'@`&``````"]OP```````````````````````````````````O5^`
+M`+V_+V_`````%[?@`````````````````"]OP```!>WX```````+V_+V_```
+M```````````+V_`````````O;\`+U?@`````````````````````````````
+M``````#X```````````````O;\`````````````!>WX```````````````"]
+MOP````O;\````````````O;\```"]O[V_7M^`+V_``<`%[?@````O;\`````
+M````#@`7M^`````````````!>WX`````````````````````````````````
+M``9@``````'@`&``````"]OP```````````````````````````````````O
+M5^``+V_+V_`````%[?@`````````````````"]OP```!>WX```````+V_+V_
+M``````````````+V_`````````O;\`+U?@``````````````````````````
+M`````````#X```````````````O;\`````````````!>WX``````````````
+M`"]OP````O;\````````````O;\```"]O[V_7M^`+V_``<`%[?@````O;\``
+M```````#@`7M^`````````````!>WX``````````````````````````````
+M`````9@``````'@`&``````"]OP`````````````````````````````````
+M``O5^``+V_+V_`````%[?@`````````````````"]OP```!>WX```````+V_
+M+V_``````````````+V_`````````O;\`+U?@```````````````````````
+M````````````#X```````````````O;\`````````````!>WX```````````
+M````"]OP````O;\````````````O;\```"]O[V_7M^`+V_``<`%[?@````O;
+M\`````````#@`7M^`````````````!>WX```````````````````````````
+M````````9@``````'@`&``````"]OP``````````````````````````````
+M`````O5^``+V_+V_`````%[?@`````````````````"]OP```!>WX```````
+M+V_+V_``````````````+V_`````````O;\`+U?@````````````````````
+M```````````````#X```````````````O;\`````````````!>WX````````
+M```````"]OP````O;\````````````O;\```"]O[V_7M^`+V_``<`%[?@```
+M`O;\`````````#@`7M^`````````````!>WX````````````````````````
+M```````````9@``````'@`&``````"]OP```````````````````````````
+M````````O5^``+V_+V_`````%[?@`````````````````"]OP```!>WX````
+M```+V_+V_``````````````+V_`````````O;\`+U?@`````````````````
+M``````````````````#X```````````````O;\`````````````!>WX`````
+M``````````"]OP````O;\````````````O;\```"]O[V_7M^`+V_``<`%[?@
+M````O;\`````````#@`7M^`````````````!>WX`````````````````````
+M``````````````9@``````'@`&``````"]OP````````````````````````
+M```````````O5^``+V_+V_`````%[?@`````````````````"]OP```!>WX`
+M``````+V_+V_``````````````+V_`````````O;\`+U?@``````````````
+M`````````````````````#X```````````````O;\`````````````!>WX``
+M`````````````"]OP````O;\````````````O;\```"]O[V_7M^`+V_``<`%
+M[?@````O;\`````````#@`7M^`````````````!>WX``````````````````
+M`````````````````9@``````'@`&``````"]OP`````````````````````
+M``````````````O5^``+V_+V_`````%[?@`````````````````"]OP```!>
+MWX```````+V_+V_``````````````+V_`````````O;\`+U?@```````````
+M````````````````````````#X```````````````O;\`````````````!>W
+MX```````````````"]OP````O;\````````````O;\```"]O[V_7M^`+V_``
+M<`%[?@````O;\`````````#@`7M^`````````````!>WX```````````````
+M````````````````````9@``````'@`&``````"]OP``````````````````
+M`````````````````O5^``+V_+V_`````%[?@`````````````````"]OP``
+M`!>WX```````+V_+V_``````````````+V_`````````O;\`+U?@````````
+M```````````````````````````#X```````````````O;\`````````````
+M!>WX```````````````"]OP````O;\````````````O;\```"]O[V_7M^`+V
+M_``<`%[?@````O;\`````````#@`7M^`````````````!>WX````````````
+M```````````````````````9@``````'@`&``````"]OP```````````````
+M````````````````````O5^``+V_+V_`````%[?@`````````````````"]O
+MP```!>WX```````+V_+V_``````````````+V_`````````O;\`+U?@`````
+M``````````````````````````````#X```````````````O;\``````````
+M```!>WX```````````````"]OP````O;\````````````O;\```"]O[V_7M^
+M`+V_``<`%[?@````O;\`````````#@`7M^``````'\!'_`95<H(_P=*/````
+M```%[?@``````````````````````````````````!F```````>``8``````
+M+V_```````````````````````````````````"]7X``O;\O;\`````7M^``
+M````````````````+V_````%[?@```````O;\O;\``````````````O;\```
+M`````"]OP`O5^````````````````````````````````````/@`````````
+M`````"]OP`````````````%[?@```````````````+V_````"]OP````````
+M```"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP`````````.`!>WX```````
+M``````%[?@``````````````````````````````````!F```````>``8```
+M```+V_```````````````````````````````````"]7X``O;\O;\`````7M
+M^``````````````````+V_````%[?@```````O;\O;\``````````````O;\
+M````````"]OP`O5^````````````````````````````````````/@``````
+M````````"]OP`````````````%[?@```````````````+V_````"]OP`````
+M``````"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP`````````.`!>WX````
+M`````````%[?@``````````````````````````````````!F```````>``8
+M``````+V_```````````````````````````````````"]7X``O;\O;\````
+M`7M^``````````````````+V_````%[?@```````O;\O;\``````````````
+MO;\````````"]OP`O5^````````````````````````````````````/@```
+M```````````"]OP`````````````%[?@```````````````+V_````"]OP``
+M`````````"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP`````````.`!>WX`
+M````````````%[?@``````````````````````````````````!F```````>
+M``8``````+V_```````````````````````````````````"]7X``O;\O;\`
+M````7M^``````````````````+V_````%[?@```````O;\O;\```````````
+M```O;\````````"]OP`O5^````````````````````````````````````/@
+M``````````````"]OP`````````````%[?@```````````````+V_````"]O
+MP```````````"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP`````````.`!>
+MWX`````````````%[?@``````````````````````````````````!F`````
+M``>``8``````+V_```````````````````````````````````"]7X``O;\O
+M;\`````7M^``````````````````+V_````%[?@```````O;\O;\````````
+M``````O;\````````"]OP`O5^```````````````````````````````````
+M`/@``````````````"]OP`````````````%[?@```````````````+V_````
+M"]OP```````````"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP`````````.
+M`!>WX`````````````%[?@``````````````````````````````````!F``
+M`````>``8``````+V_```````````````````````````````````"]7X``O
+M;\O;\`````7M^``````````````````+V_````%[?@```````O;\O;\`````
+M`````````O;\````````"]OP`O5^````````````````````````````````
+M````/@``````````````"]OP`````````````%[?@```````````````+V_`
+M```"]OP```````````"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP```````
+M``.`!>WX`````````````%[?@``````````````````````````````````!
+MF```````>``8``````+V_```````````````````````````````````"]7X
+M``O;\O;\`````7M^``````````````````+V_````%[?@```````O;\O;\``
+M````````````O;\````````"]OP`O5^`````````````````````````````
+M```````/@``````````````"]OP`````````````%[?@```````````````+
+MV_````"]OP```````````"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP````
+M`````.`!>WX`````````````%[?@````````````````````````````````
+M``!F```````>``8``````+V_```````````````````````````````````"
+M]7X``O;\O;\`````7M^``````````````````+V_````%[?@```````O;\O;
+M\``````````````O;\````````"]OP`O5^``````````````````````````
+M``````````/@``````````````"]OP`````````````%[?@`````````````
+M``+V_````"]OP```````````"]OP```+V_O;]>WX`O;\`!P`7M^````"]OP`
+M````````.`!>WX`````````````%[?@`````````````````````````````
+M`````!F```````>``8``````+V_`````````````````````````````````
+M``"]7X``O;\O;\`````7M^``````````````````+V_````%[?@```````O;
+M\O;\``````````````O;\````````"]OP`O5^```````````````````````
+M`````````````/@``````````````"]OP`````````````%[?@``````````
+M`````+V_````"]OP```````````"]OP```+V_O;]>WX`O;\`!P`7M^````"]
+MOP`````````.`!>WX`````````````%[?@```````````#^`1_"\2RMN6#O^
+MAZ6/```````````````````````,P``````#@`&``````"]OP```````````
+M````````````````````````O5^``+V_+V_`````%[?@````````````````
+M`"]OP```!>WX```````+V_+V_``````````````+V_`````````O;\`+U?@`
+J``````````````````````````````````#P```````*GZ#$/7L`0`<`
+`
+end