/********************************************************************** transcode.c - $Author$ created at: Tue Oct 30 16:10:22 JST 2007 Copyright (C) 2007 Martin Duerst **********************************************************************/ #include "ruby/ruby.h" #include "ruby/encoding.h" #include "transcode_data.h" #include VALUE rb_eUndefinedConversionError; VALUE rb_eInvalidByteSequenceError; VALUE rb_eConverterNotFoundError; VALUE rb_cEncodingConverter; static VALUE sym_invalid, sym_undef, sym_ignore, sym_replace; static VALUE sym_xml, sym_text, sym_attr; static VALUE sym_universal_newline; static VALUE sym_crlf_newline; static VALUE sym_cr_newline; static VALUE sym_partial_input; static VALUE sym_invalid_byte_sequence; static VALUE sym_undefined_conversion; static VALUE sym_destination_buffer_full; static VALUE sym_source_buffer_empty; static VALUE sym_finished; static VALUE sym_after_output; static VALUE sym_incomplete_input; static unsigned char * allocate_converted_string(const char *sname, const char *dname, const unsigned char *str, size_t len, unsigned char *caller_dst_buf, size_t caller_dst_bufsize, size_t *dst_len_ptr); /* dynamic structure, one per conversion (similar to iconv_t) */ /* may carry conversion state (e.g. for iso-2022-jp) */ typedef struct rb_transcoding { const rb_transcoder *transcoder; int flags; int resume_position; unsigned int next_table; VALUE next_info; unsigned char next_byte; unsigned int output_index; int recognized_len; /* already interpreted */ int readagain_len; /* not yet interpreted */ union { unsigned char ary[8]; /* max_input <= sizeof(ary) */ unsigned char *ptr; /* length: max_input */ } readbuf; /* recognized_len + readagain_len used */ int writebuf_off; int writebuf_len; union { unsigned char ary[8]; /* max_output <= sizeof(ary) */ unsigned char *ptr; /* length: max_output */ } writebuf; union rb_transcoding_state_t { /* opaque data for stateful encoding */ void *ptr; double dummy_for_alignment; } state; } rb_transcoding; #define TRANSCODING_READBUF(tc) \ ((tc)->transcoder->max_input <= sizeof((tc)->readbuf.ary) ? \ (tc)->readbuf.ary : \ (tc)->readbuf.ptr) #define TRANSCODING_WRITEBUF(tc) \ ((tc)->transcoder->max_output <= sizeof((tc)->writebuf.ary) ? \ (tc)->writebuf.ary : \ (tc)->writebuf.ptr) #define TRANSCODING_WRITEBUF_SIZE(tc) \ ((tc)->transcoder->max_output <= sizeof((tc)->writebuf.ary) ? \ sizeof((tc)->writebuf.ary) : \ (tc)->transcoder->max_output) #define TRANSCODING_STATE_EMBED_MAX sizeof(union rb_transcoding_state_t) #define TRANSCODING_STATE(tc) \ ((tc)->transcoder->state_size <= sizeof((tc)->state) ? \ (void *)&(tc)->state : \ (tc)->state.ptr) typedef struct { struct rb_transcoding *tc; unsigned char *out_buf_start; unsigned char *out_data_start; unsigned char *out_data_end; unsigned char *out_buf_end; rb_econv_result_t last_result; } rb_econv_elem_t; struct rb_econv_t { int flags; const char *source_encoding_name; const char *destination_encoding_name; int started; const unsigned char *replacement_str; size_t replacement_len; const char *replacement_enc; int replacement_allocated; unsigned char *in_buf_start; unsigned char *in_data_start; unsigned char *in_data_end; unsigned char *in_buf_end; rb_econv_elem_t *elems; int num_allocated; int num_trans; int num_finished; struct rb_transcoding *last_tc; /* last error */ struct { rb_econv_result_t result; struct rb_transcoding *error_tc; const char *source_encoding; const char *destination_encoding; const unsigned char *error_bytes_start; size_t error_bytes_len; size_t readagain_len; } last_error; /* The following fields are only for Encoding::Converter. * rb_econv_open set them NULL. */ rb_encoding *source_encoding; rb_encoding *destination_encoding; }; /* * Dispatch data and logic */ #define DECORATOR_P(sname, dname) (*(sname) == '\0') typedef struct { const char *sname; const char *dname; const char *lib; /* maybe null. it means that don't load the library. */ const rb_transcoder *transcoder; } transcoder_entry_t; static st_table *transcoder_table; static transcoder_entry_t * make_transcoder_entry(const char *sname, const char *dname) { st_data_t val; st_table *table2; if (!st_lookup(transcoder_table, (st_data_t)sname, &val)) { val = (st_data_t)st_init_strcasetable(); st_add_direct(transcoder_table, (st_data_t)sname, val); } table2 = (st_table *)val; if (!st_lookup(table2, (st_data_t)dname, &val)) { transcoder_entry_t *entry = ALLOC(transcoder_entry_t); entry->sname = sname; entry->dname = dname; entry->lib = NULL; entry->transcoder = NULL; val = (st_data_t)entry; st_add_direct(table2, (st_data_t)dname, val); } return (transcoder_entry_t *)val; } static transcoder_entry_t * get_transcoder_entry(const char *sname, const char *dname) { st_data_t val; st_table *table2; if (!st_lookup(transcoder_table, (st_data_t)sname, &val)) { return NULL; } table2 = (st_table *)val; if (!st_lookup(table2, (st_data_t)dname, &val)) { return NULL; } return (transcoder_entry_t *)val; } void rb_register_transcoder(const rb_transcoder *tr) { const char *const sname = tr->src_encoding; const char *const dname = tr->dst_encoding; transcoder_entry_t *entry; entry = make_transcoder_entry(sname, dname); if (entry->transcoder) { rb_raise(rb_eArgError, "transcoder from %s to %s has been already registered", sname, dname); } entry->transcoder = tr; } static void declare_transcoder(const char *sname, const char *dname, const char *lib) { transcoder_entry_t *entry; entry = make_transcoder_entry(sname, dname); entry->lib = lib; } #define MAX_TRANSCODER_LIBNAME_LEN 64 static const char transcoder_lib_prefix[] = "enc/trans/"; void rb_declare_transcoder(const char *enc1, const char *enc2, const char *lib) { if (!lib || strlen(lib) > MAX_TRANSCODER_LIBNAME_LEN) { rb_raise(rb_eArgError, "invalid library name - %s", lib ? lib : "(null)"); } declare_transcoder(enc1, enc2, lib); } #define encoding_equal(enc1, enc2) (STRCASECMP(enc1, enc2) == 0) typedef struct search_path_queue_tag { struct search_path_queue_tag *next; const char *enc; } search_path_queue_t; typedef struct { st_table *visited; search_path_queue_t *queue; search_path_queue_t **queue_last_ptr; const char *base_enc; } search_path_bfs_t; static int transcode_search_path_i(st_data_t key, st_data_t val, st_data_t arg) { const char *dname = (const char *)key; search_path_bfs_t *bfs = (search_path_bfs_t *)arg; search_path_queue_t *q; if (st_lookup(bfs->visited, (st_data_t)dname, &val)) { return ST_CONTINUE; } q = ALLOC(search_path_queue_t); q->enc = dname; q->next = NULL; *bfs->queue_last_ptr = q; bfs->queue_last_ptr = &q->next; st_add_direct(bfs->visited, (st_data_t)dname, (st_data_t)bfs->base_enc); return ST_CONTINUE; } static int transcode_search_path(const char *sname, const char *dname, void (*callback)(const char *sname, const char *dname, int depth, void *arg), void *arg) { search_path_bfs_t bfs; search_path_queue_t *q; st_data_t val; st_table *table2; int found; int pathlen = -1; if (encoding_equal(sname, dname)) return -1; q = ALLOC(search_path_queue_t); q->enc = sname; q->next = NULL; bfs.queue_last_ptr = &q->next; bfs.queue = q; bfs.visited = st_init_strcasetable(); st_add_direct(bfs.visited, (st_data_t)sname, (st_data_t)NULL); while (bfs.queue) { q = bfs.queue; bfs.queue = q->next; if (!bfs.queue) bfs.queue_last_ptr = &bfs.queue; if (!st_lookup(transcoder_table, (st_data_t)q->enc, &val)) { xfree(q); continue; } table2 = (st_table *)val; if (st_lookup(table2, (st_data_t)dname, &val)) { st_add_direct(bfs.visited, (st_data_t)dname, (st_data_t)q->enc); xfree(q); found = 1; goto cleanup; } bfs.base_enc = q->enc; st_foreach(table2, transcode_search_path_i, (st_data_t)&bfs); bfs.base_enc = NULL; xfree(q); } found = 0; cleanup: while (bfs.queue) { q = bfs.queue; bfs.queue = q->next; xfree(q); } if (found) { const char *enc = dname; int depth; pathlen = 0; while (1) { st_lookup(bfs.visited, (st_data_t)enc, &val); if (!val) break; pathlen++; enc = (const char *)val; } depth = pathlen; enc = dname; while (1) { st_lookup(bfs.visited, (st_data_t)enc, &val); if (!val) break; callback((const char *)val, enc, --depth, arg); enc = (const char *)val; } } st_free_table(bfs.visited); return pathlen; /* is -1 if !found */ } static const rb_transcoder * load_transcoder_entry(transcoder_entry_t *entry) { if (entry->transcoder) return entry->transcoder; if (entry->lib) { const char *lib = entry->lib; int len = strlen(lib); char path[sizeof(transcoder_lib_prefix) + MAX_TRANSCODER_LIBNAME_LEN]; entry->lib = NULL; if (len > MAX_TRANSCODER_LIBNAME_LEN) return NULL; memcpy(path, transcoder_lib_prefix, sizeof(transcoder_lib_prefix) - 1); memcpy(path + sizeof(transcoder_lib_prefix) - 1, lib, len + 1); if (!rb_require(path)) return NULL; } if (entry->transcoder) return entry->transcoder; return NULL; } static const char* get_replacement_character(const char *encname, size_t *len_ret, const char **repl_encname_ptr) { if (encoding_equal(encname, "UTF-8")) { *len_ret = 3; *repl_encname_ptr = "UTF-8"; return "\xEF\xBF\xBD"; } else { *len_ret = 1; *repl_encname_ptr = "US-ASCII"; return "?"; } } /* * Transcoding engine logic */ static const unsigned char * transcode_char_start(rb_transcoding *tc, const unsigned char *in_start, const unsigned char *inchar_start, const unsigned char *in_p, size_t *char_len_ptr) { const unsigned char *ptr; if (inchar_start - in_start < tc->recognized_len) { MEMCPY(TRANSCODING_READBUF(tc) + tc->recognized_len, inchar_start, unsigned char, in_p - inchar_start); ptr = TRANSCODING_READBUF(tc); } else { ptr = inchar_start - tc->recognized_len; } *char_len_ptr = tc->recognized_len + (in_p - inchar_start); return ptr; } static rb_econv_result_t transcode_restartable0(const unsigned char **in_pos, unsigned char **out_pos, const unsigned char *in_stop, unsigned char *out_stop, rb_transcoding *tc, const int opt) { const rb_transcoder *tr = tc->transcoder; int unitlen = tr->input_unit_length; int readagain_len = 0; const unsigned char *inchar_start; const unsigned char *in_p; unsigned char *out_p; in_p = inchar_start = *in_pos; out_p = *out_pos; #define SUSPEND(ret, num) \ do { \ tc->resume_position = (num); \ if (0 < in_p - inchar_start) \ MEMMOVE(TRANSCODING_READBUF(tc)+tc->recognized_len, \ inchar_start, unsigned char, in_p - inchar_start); \ *in_pos = in_p; \ *out_pos = out_p; \ tc->recognized_len += in_p - inchar_start; \ if (readagain_len) { \ tc->recognized_len -= readagain_len; \ tc->readagain_len = readagain_len; \ } \ return ret; \ resume_label ## num:; \ } while (0) #define SUSPEND_OBUF(num) \ do { \ while (out_stop - out_p < 1) { SUSPEND(econv_destination_buffer_full, num); } \ } while (0) #define SUSPEND_AFTER_OUTPUT(num) \ if ((opt & ECONV_AFTER_OUTPUT) && *out_pos != out_p) { \ SUSPEND(econv_after_output, num); \ } #define next_table (tc->next_table) #define next_info (tc->next_info) #define next_byte (tc->next_byte) #define writebuf_len (tc->writebuf_len) #define writebuf_off (tc->writebuf_off) switch (tc->resume_position) { case 0: break; case 1: goto resume_label1; case 2: goto resume_label2; case 3: goto resume_label3; case 4: goto resume_label4; case 5: goto resume_label5; case 6: goto resume_label6; case 7: goto resume_label7; case 8: goto resume_label8; case 9: goto resume_label9; case 10: goto resume_label10; case 11: goto resume_label11; case 12: goto resume_label12; case 13: goto resume_label13; case 14: goto resume_label14; case 15: goto resume_label15; case 16: goto resume_label16; case 17: goto resume_label17; case 18: goto resume_label18; case 19: goto resume_label19; case 20: goto resume_label20; case 21: goto resume_label21; case 22: goto resume_label22; case 23: goto resume_label23; case 24: goto resume_label24; case 25: goto resume_label25; case 26: goto resume_label26; case 27: goto resume_label27; case 28: goto resume_label28; } while (1) { inchar_start = in_p; tc->recognized_len = 0; next_table = tr->conv_tree_start; SUSPEND_AFTER_OUTPUT(24); if (in_stop <= in_p) { if (!(opt & ECONV_PARTIAL_INPUT)) break; SUSPEND(econv_source_buffer_empty, 7); continue; } #define BYTE_ADDR(index) (tr->byte_array + (index)) #define WORD_ADDR(index) (tr->word_array + INFO2WORDINDEX(index)) #define BL_BASE BYTE_ADDR(BYTE_LOOKUP_BASE(WORD_ADDR(next_table))) #define BL_INFO WORD_ADDR(BYTE_LOOKUP_INFO(WORD_ADDR(next_table))) #define BL_MIN_BYTE (BL_BASE[0]) #define BL_MAX_BYTE (BL_BASE[1]) #define BL_OFFSET(byte) (BL_BASE[2+(byte)-BL_MIN_BYTE]) #define BL_ACTION(byte) (BL_INFO[BL_OFFSET((byte))]) next_byte = (unsigned char)*in_p++; follow_byte: if (next_byte < BL_MIN_BYTE || BL_MAX_BYTE < next_byte) next_info = INVALID; else { next_info = (VALUE)BL_ACTION(next_byte); } follow_info: switch (next_info & 0x1F) { case NOMAP: /* xxx: copy last byte only? */ SUSPEND_OBUF(3); *out_p++ = next_byte; continue; case 0x00: case 0x04: case 0x08: case 0x0C: case 0x10: case 0x14: case 0x18: case 0x1C: SUSPEND_AFTER_OUTPUT(25); while (in_p >= in_stop) { if (!(opt & ECONV_PARTIAL_INPUT)) goto incomplete; SUSPEND(econv_source_buffer_empty, 5); } next_byte = (unsigned char)*in_p++; next_table = next_info; goto follow_byte; case ZERObt: /* drop input */ continue; case ONEbt: SUSPEND_OBUF(9); *out_p++ = getBT1(next_info); continue; case TWObt: SUSPEND_OBUF(10); *out_p++ = getBT1(next_info); SUSPEND_OBUF(21); *out_p++ = getBT2(next_info); continue; case THREEbt: SUSPEND_OBUF(11); *out_p++ = getBT1(next_info); SUSPEND_OBUF(15); *out_p++ = getBT2(next_info); SUSPEND_OBUF(16); *out_p++ = getBT3(next_info); continue; case FOURbt: SUSPEND_OBUF(12); *out_p++ = getBT0(next_info); SUSPEND_OBUF(17); *out_p++ = getBT1(next_info); SUSPEND_OBUF(18); *out_p++ = getBT2(next_info); SUSPEND_OBUF(19); *out_p++ = getBT3(next_info); continue; case STR1: tc->output_index = 0; while (tc->output_index < STR1_LENGTH(BYTE_ADDR(STR1_BYTEINDEX(next_info)))) { SUSPEND_OBUF(28); *out_p++ = BYTE_ADDR(STR1_BYTEINDEX(next_info))[1+tc->output_index]; tc->output_index++; } continue; case FUNii: next_info = (VALUE)(*tr->func_ii)(TRANSCODING_STATE(tc), next_info); goto follow_info; case FUNsi: { const unsigned char *char_start; size_t char_len; char_start = transcode_char_start(tc, *in_pos, inchar_start, in_p, &char_len); next_info = (VALUE)(*tr->func_si)(TRANSCODING_STATE(tc), char_start, (size_t)char_len); goto follow_info; } case FUNio: SUSPEND_OBUF(13); if (tr->max_output <= out_stop - out_p) out_p += tr->func_io(TRANSCODING_STATE(tc), next_info, out_p, out_stop - out_p); else { writebuf_len = tr->func_io(TRANSCODING_STATE(tc), next_info, TRANSCODING_WRITEBUF(tc), TRANSCODING_WRITEBUF_SIZE(tc)); writebuf_off = 0; while (writebuf_off < writebuf_len) { SUSPEND_OBUF(20); *out_p++ = TRANSCODING_WRITEBUF(tc)[writebuf_off++]; } } break; case FUNso: { const unsigned char *char_start; size_t char_len; SUSPEND_OBUF(14); if (tr->max_output <= out_stop - out_p) { char_start = transcode_char_start(tc, *in_pos, inchar_start, in_p, &char_len); out_p += tr->func_so(TRANSCODING_STATE(tc), char_start, (size_t)char_len, out_p, out_stop - out_p); } else { char_start = transcode_char_start(tc, *in_pos, inchar_start, in_p, &char_len); writebuf_len = tr->func_so(TRANSCODING_STATE(tc), char_start, (size_t)char_len, TRANSCODING_WRITEBUF(tc), TRANSCODING_WRITEBUF_SIZE(tc)); writebuf_off = 0; while (writebuf_off < writebuf_len) { SUSPEND_OBUF(22); *out_p++ = TRANSCODING_WRITEBUF(tc)[writebuf_off++]; } } break; } case INVALID: if (tc->recognized_len + (in_p - inchar_start) <= unitlen) { if (tc->recognized_len + (in_p - inchar_start) < unitlen) SUSPEND_AFTER_OUTPUT(26); while ((opt & ECONV_PARTIAL_INPUT) && tc->recognized_len + (in_stop - inchar_start) < unitlen) { in_p = in_stop; SUSPEND(econv_source_buffer_empty, 8); } if (tc->recognized_len + (in_stop - inchar_start) <= unitlen) { in_p = in_stop; } else { in_p = inchar_start + (unitlen - tc->recognized_len); } } else { int invalid_len; /* including the last byte which causes invalid */ int discard_len; invalid_len = tc->recognized_len + (in_p - inchar_start); discard_len = ((invalid_len - 1) / unitlen) * unitlen; readagain_len = invalid_len - discard_len; } goto invalid; case UNDEF: goto undef; } continue; invalid: SUSPEND(econv_invalid_byte_sequence, 1); continue; incomplete: SUSPEND(econv_incomplete_input, 27); continue; undef: SUSPEND(econv_undefined_conversion, 2); continue; } /* cleanup */ if (tr->finish_func) { SUSPEND_OBUF(4); if (tr->max_output <= out_stop - out_p) { out_p += tr->finish_func(TRANSCODING_STATE(tc), out_p, out_stop - out_p); } else { writebuf_len = tr->finish_func(TRANSCODING_STATE(tc), TRANSCODING_WRITEBUF(tc), TRANSCODING_WRITEBUF_SIZE(tc)); writebuf_off = 0; while (writebuf_off < writebuf_len) { SUSPEND_OBUF(23); *out_p++ = TRANSCODING_WRITEBUF(tc)[writebuf_off++]; } } } while (1) SUSPEND(econv_finished, 6); #undef SUSPEND #undef next_table #undef next_info #undef next_byte #undef writebuf_len #undef writebuf_off } static rb_econv_result_t transcode_restartable(const unsigned char **in_pos, unsigned char **out_pos, const unsigned char *in_stop, unsigned char *out_stop, rb_transcoding *tc, const int opt) { if (tc->readagain_len) { unsigned char *readagain_buf = ALLOCA_N(unsigned char, tc->readagain_len); const unsigned char *readagain_pos = readagain_buf; const unsigned char *readagain_stop = readagain_buf + tc->readagain_len; rb_econv_result_t res; MEMCPY(readagain_buf, TRANSCODING_READBUF(tc) + tc->recognized_len, unsigned char, tc->readagain_len); tc->readagain_len = 0; res = transcode_restartable0(&readagain_pos, out_pos, readagain_stop, out_stop, tc, opt|ECONV_PARTIAL_INPUT); if (res != econv_source_buffer_empty) { MEMCPY(TRANSCODING_READBUF(tc) + tc->recognized_len + tc->readagain_len, readagain_pos, unsigned char, readagain_stop - readagain_pos); tc->readagain_len += readagain_stop - readagain_pos; return res; } } return transcode_restartable0(in_pos, out_pos, in_stop, out_stop, tc, opt); } static rb_transcoding * rb_transcoding_open_by_transcoder(const rb_transcoder *tr, int flags) { rb_transcoding *tc; tc = ALLOC(rb_transcoding); tc->transcoder = tr; tc->flags = flags; if (TRANSCODING_STATE_EMBED_MAX < tr->state_size) tc->state.ptr = xmalloc(tr->state_size); if (tr->state_init_func) { (tr->state_init_func)(TRANSCODING_STATE(tc)); /* xxx: check return value */ } tc->resume_position = 0; tc->recognized_len = 0; tc->readagain_len = 0; tc->writebuf_len = 0; tc->writebuf_off = 0; if (sizeof(tc->readbuf.ary) < tr->max_input) { tc->readbuf.ptr = xmalloc(tr->max_input); } if (sizeof(tc->writebuf.ary) < tr->max_output) { tc->writebuf.ptr = xmalloc(tr->max_output); } return tc; } static rb_econv_result_t rb_transcoding_convert(rb_transcoding *tc, const unsigned char **input_ptr, const unsigned char *input_stop, unsigned char **output_ptr, unsigned char *output_stop, int flags) { return transcode_restartable( input_ptr, output_ptr, input_stop, output_stop, tc, flags); } static void rb_transcoding_close(rb_transcoding *tc) { const rb_transcoder *tr = tc->transcoder; if (tr->state_fini_func) { (tr->state_fini_func)(TRANSCODING_STATE(tc)); /* check return value? */ } if (TRANSCODING_STATE_EMBED_MAX < tr->state_size) xfree(tc->state.ptr); if (sizeof(tc->readbuf.ary) < tr->max_input) xfree(tc->readbuf.ptr); if (sizeof(tc->writebuf.ary) < tr->max_output) xfree(tc->writebuf.ptr); xfree(tc); } static rb_econv_t * rb_econv_alloc(int n_hint) { rb_econv_t *ec; if (n_hint <= 0) n_hint = 1; ec = ALLOC(rb_econv_t); ec->flags = 0; ec->source_encoding_name = NULL; ec->destination_encoding_name = NULL; ec->started = 0; ec->replacement_str = NULL; ec->replacement_len = 0; ec->replacement_enc = NULL; ec->replacement_allocated = 0; ec->in_buf_start = NULL; ec->in_data_start = NULL; ec->in_data_end = NULL; ec->in_buf_end = NULL; ec->num_allocated = n_hint; ec->num_trans = 0; ec->elems = ALLOC_N(rb_econv_elem_t, ec->num_allocated); ec->num_finished = 0; ec->last_tc = NULL; ec->last_error.result = econv_source_buffer_empty; ec->last_error.error_tc = NULL; ec->last_error.source_encoding = NULL; ec->last_error.destination_encoding = NULL; ec->last_error.error_bytes_start = NULL; ec->last_error.error_bytes_len = 0; ec->last_error.readagain_len = 0; ec->source_encoding = NULL; ec->destination_encoding = NULL; return ec; } static int rb_econv_add_transcoder_at(rb_econv_t *ec, const rb_transcoder *tr, int i) { int n, j; int bufsize = 4096; unsigned char *p; if (ec->num_trans == ec->num_allocated) { n = ec->num_allocated * 2; REALLOC_N(ec->elems, rb_econv_elem_t, n); ec->num_allocated = n; } p = xmalloc(bufsize); MEMMOVE(ec->elems+i+1, ec->elems+i, rb_econv_elem_t, ec->num_trans-i); ec->elems[i].tc = rb_transcoding_open_by_transcoder(tr, 0); ec->elems[i].out_buf_start = p; ec->elems[i].out_buf_end = p + bufsize; ec->elems[i].out_data_start = p; ec->elems[i].out_data_end = p; ec->elems[i].last_result = econv_source_buffer_empty; ec->num_trans++; if (!DECORATOR_P(tr->src_encoding, tr->dst_encoding)) for (j = ec->num_trans-1; i <= j; j--) { rb_transcoding *tc = ec->elems[j].tc; const rb_transcoder *tr2 = tc->transcoder; if (!DECORATOR_P(tr2->src_encoding, tr2->dst_encoding)) { ec->last_tc = tc; break; } } return 0; } static rb_econv_t * rb_econv_open_by_transcoder_entries(int n, transcoder_entry_t **entries) { rb_econv_t *ec; int i, ret; for (i = 0; i < n; i++) { const rb_transcoder *tr; tr = load_transcoder_entry(entries[i]); if (!tr) return NULL; } ec = rb_econv_alloc(n); for (i = 0; i < n; i++) { const rb_transcoder *tr = load_transcoder_entry(entries[i]); ret = rb_econv_add_transcoder_at(ec, tr, ec->num_trans); if (ret == -1) { rb_econv_close(ec); return NULL; } } return ec; } struct trans_open_t { transcoder_entry_t **entries; int num_additional; }; static void trans_open_i(const char *sname, const char *dname, int depth, void *arg) { struct trans_open_t *toarg = arg; if (!toarg->entries) { toarg->entries = ALLOC_N(transcoder_entry_t *, depth+1+toarg->num_additional); } toarg->entries[depth] = get_transcoder_entry(sname, dname); } static rb_econv_t * rb_econv_open0(const char *sname, const char *dname, int ecflags) { transcoder_entry_t **entries = NULL; int num_trans; rb_econv_t *ec; rb_encoding *senc, *denc; int sidx, didx; senc = NULL; if (*sname) { sidx = rb_enc_find_index(sname); if (0 <= sidx) { senc = rb_enc_from_index(sidx); } } denc = NULL; if (*dname) { didx = rb_enc_find_index(dname); if (0 <= didx) { denc = rb_enc_from_index(didx); } } if (*sname == '\0' && *dname == '\0') { num_trans = 0; entries = NULL; } else { struct trans_open_t toarg; toarg.entries = NULL; toarg.num_additional = 0; num_trans = transcode_search_path(sname, dname, trans_open_i, (void *)&toarg); entries = toarg.entries; if (num_trans < 0) { xfree(entries); return NULL; } } ec = rb_econv_open_by_transcoder_entries(num_trans, entries); xfree(entries); if (!ec) return NULL; ec->flags = ecflags; ec->source_encoding_name = sname; ec->destination_encoding_name = dname; return ec; } #define MAX_ECFLAGS_DECORATORS 32 static int decorator_names(int ecflags, const char **decorators_ret) { int num_decorators; if ((ecflags & ECONV_CRLF_NEWLINE_DECORATOR) && (ecflags & ECONV_CR_NEWLINE_DECORATOR)) return -1; if ((ecflags & (ECONV_CRLF_NEWLINE_DECORATOR|ECONV_CR_NEWLINE_DECORATOR)) && (ecflags & ECONV_UNIVERSAL_NEWLINE_DECORATOR)) return -1; if ((ecflags & ECONV_XML_TEXT_DECORATOR) && (ecflags & ECONV_XML_ATTR_CONTENT_DECORATOR)) return -1; num_decorators = 0; if (ecflags & ECONV_XML_TEXT_DECORATOR) decorators_ret[num_decorators++] = "xml_text_escape"; if (ecflags & ECONV_XML_ATTR_CONTENT_DECORATOR) decorators_ret[num_decorators++] = "xml_attr_content_escape"; if (ecflags & ECONV_XML_ATTR_QUOTE_DECORATOR) decorators_ret[num_decorators++] = "xml_attr_quote"; if (ecflags & ECONV_CRLF_NEWLINE_DECORATOR) decorators_ret[num_decorators++] = "crlf_newline"; if (ecflags & ECONV_CR_NEWLINE_DECORATOR) decorators_ret[num_decorators++] = "cr_newline"; if (ecflags & ECONV_UNIVERSAL_NEWLINE_DECORATOR) decorators_ret[num_decorators++] = "universal_newline"; return num_decorators; } rb_econv_t * rb_econv_open(const char *sname, const char *dname, int ecflags) { rb_econv_t *ec; int num_decorators; const char *decorators[MAX_ECFLAGS_DECORATORS]; int i; num_decorators = decorator_names(ecflags, decorators); if (num_decorators == -1) return NULL; ec = rb_econv_open0(sname, dname, ecflags & ECONV_ERROR_HANDLER_MASK); if (!ec) return NULL; for (i = 0; i < num_decorators; i++) if (rb_econv_decorate_at_last(ec, decorators[i]) == -1) { rb_econv_close(ec); return NULL; } ec->flags |= ecflags & ~ECONV_ERROR_HANDLER_MASK; return ec; } static int trans_sweep(rb_econv_t *ec, const unsigned char **input_ptr, const unsigned char *input_stop, unsigned char **output_ptr, unsigned char *output_stop, int flags, int start) { int try; int i, f; const unsigned char **ipp, *is, *iold; unsigned char **opp, *os, *oold; rb_econv_result_t res; try = 1; while (try) { try = 0; for (i = start; i < ec->num_trans; i++) { rb_econv_elem_t *te = &ec->elems[i]; if (i == 0) { ipp = input_ptr; is = input_stop; } else { rb_econv_elem_t *prev_te = &ec->elems[i-1]; ipp = (const unsigned char **)&prev_te->out_data_start; is = prev_te->out_data_end; } if (i == ec->num_trans-1) { opp = output_ptr; os = output_stop; } else { if (te->out_buf_start != te->out_data_start) { int len = te->out_data_end - te->out_data_start; int off = te->out_data_start - te->out_buf_start; MEMMOVE(te->out_buf_start, te->out_data_start, unsigned char, len); te->out_data_start = te->out_buf_start; te->out_data_end -= off; } opp = &te->out_data_end; os = te->out_buf_end; } f = flags; if (ec->num_finished != i) f |= ECONV_PARTIAL_INPUT; if (i == 0 && (flags & ECONV_AFTER_OUTPUT)) { start = 1; flags &= ~ECONV_AFTER_OUTPUT; } if (i != 0) f &= ~ECONV_AFTER_OUTPUT; iold = *ipp; oold = *opp; te->last_result = res = rb_transcoding_convert(te->tc, ipp, is, opp, os, f); if (iold != *ipp || oold != *opp) try = 1; switch (res) { case econv_invalid_byte_sequence: case econv_incomplete_input: case econv_undefined_conversion: case econv_after_output: return i; case econv_destination_buffer_full: case econv_source_buffer_empty: break; case econv_finished: ec->num_finished = i+1; break; } } } return -1; } static rb_econv_result_t rb_trans_conv(rb_econv_t *ec, const unsigned char **input_ptr, const unsigned char *input_stop, unsigned char **output_ptr, unsigned char *output_stop, int flags, int *result_position_ptr) { int i; int needreport_index; int sweep_start; unsigned char empty_buf; unsigned char *empty_ptr = &empty_buf; if (!input_ptr) { input_ptr = (const unsigned char **)&empty_ptr; input_stop = empty_ptr; } if (!output_ptr) { output_ptr = &empty_ptr; output_stop = empty_ptr; } if (ec->elems[0].last_result == econv_after_output) ec->elems[0].last_result = econv_source_buffer_empty; needreport_index = -1; for (i = ec->num_trans-1; 0 <= i; i--) { switch (ec->elems[i].last_result) { case econv_invalid_byte_sequence: case econv_incomplete_input: case econv_undefined_conversion: case econv_after_output: case econv_finished: sweep_start = i+1; needreport_index = i; goto found_needreport; case econv_destination_buffer_full: case econv_source_buffer_empty: break; default: rb_bug("unexpected transcode last result"); } } /* /^[sd]+$/ is confirmed. but actually /^s*d*$/. */ if (ec->elems[ec->num_trans-1].last_result == econv_destination_buffer_full && (flags & ECONV_AFTER_OUTPUT)) { rb_econv_result_t res; res = rb_trans_conv(ec, NULL, NULL, output_ptr, output_stop, (flags & ~ECONV_AFTER_OUTPUT)|ECONV_PARTIAL_INPUT, result_position_ptr); if (res == econv_source_buffer_empty) return econv_after_output; return res; } sweep_start = 0; found_needreport: do { needreport_index = trans_sweep(ec, input_ptr, input_stop, output_ptr, output_stop, flags, sweep_start); sweep_start = needreport_index + 1; } while (needreport_index != -1 && needreport_index != ec->num_trans-1); for (i = ec->num_trans-1; 0 <= i; i--) { if (ec->elems[i].last_result != econv_source_buffer_empty) { rb_econv_result_t res = ec->elems[i].last_result; if (res == econv_invalid_byte_sequence || res == econv_incomplete_input || res == econv_undefined_conversion || res == econv_after_output) { ec->elems[i].last_result = econv_source_buffer_empty; } if (result_position_ptr) *result_position_ptr = i; return res; } } if (result_position_ptr) *result_position_ptr = -1; return econv_source_buffer_empty; } static rb_econv_result_t rb_econv_convert0(rb_econv_t *ec, const unsigned char **input_ptr, const unsigned char *input_stop, unsigned char **output_ptr, unsigned char *output_stop, int flags) { rb_econv_result_t res; int result_position; int has_output = 0; memset(&ec->last_error, 0, sizeof(ec->last_error)); if (ec->num_trans == 0) { size_t len; if (ec->in_buf_start && ec->in_data_start != ec->in_data_end) { if (output_stop - *output_ptr < ec->in_data_end - ec->in_data_start) { len = output_stop - *output_ptr; memcpy(*output_ptr, ec->in_data_start, len); *output_ptr = output_stop; ec->in_data_start += len; res = econv_destination_buffer_full; goto gotresult; } len = ec->in_data_end - ec->in_data_start; memcpy(*output_ptr, ec->in_data_start, len); *output_ptr += len; ec->in_data_start = ec->in_data_end = ec->in_buf_start; if (flags & ECONV_AFTER_OUTPUT) { res = econv_after_output; goto gotresult; } } if (output_stop - *output_ptr < input_stop - *input_ptr) { len = output_stop - *output_ptr; } else { len = input_stop - *input_ptr; } if (0 < len && (flags & ECONV_AFTER_OUTPUT)) { *(*output_ptr)++ = *(*input_ptr)++; res = econv_after_output; goto gotresult; } memcpy(*output_ptr, *input_ptr, len); *output_ptr += len; *input_ptr += len; if (*input_ptr != input_stop) res = econv_destination_buffer_full; else if (flags & ECONV_PARTIAL_INPUT) res = econv_source_buffer_empty; else res = econv_finished; goto gotresult; } if (ec->elems[ec->num_trans-1].out_data_start) { unsigned char *data_start = ec->elems[ec->num_trans-1].out_data_start; unsigned char *data_end = ec->elems[ec->num_trans-1].out_data_end; if (data_start != data_end) { size_t len; if (output_stop - *output_ptr < data_end - data_start) { len = output_stop - *output_ptr; memcpy(*output_ptr, data_start, len); *output_ptr = output_stop; ec->elems[ec->num_trans-1].out_data_start += len; res = econv_destination_buffer_full; goto gotresult; } len = data_end - data_start; memcpy(*output_ptr, data_start, len); *output_ptr += len; ec->elems[ec->num_trans-1].out_data_start = ec->elems[ec->num_trans-1].out_data_end = ec->elems[ec->num_trans-1].out_buf_start; has_output = 1; } } if (ec->in_buf_start && ec->in_data_start != ec->in_data_end) { res = rb_trans_conv(ec, (const unsigned char **)&ec->in_data_start, ec->in_data_end, output_ptr, output_stop, (flags&~ECONV_AFTER_OUTPUT)|ECONV_PARTIAL_INPUT, &result_position); if (res != econv_source_buffer_empty) goto gotresult; } if (has_output && (flags & ECONV_AFTER_OUTPUT) && *input_ptr != input_stop) { input_stop = *input_ptr; res = rb_trans_conv(ec, input_ptr, input_stop, output_ptr, output_stop, flags, &result_position); if (res == econv_source_buffer_empty) res = econv_after_output; } else if ((flags & ECONV_AFTER_OUTPUT) || ec->num_trans == 1) { res = rb_trans_conv(ec, input_ptr, input_stop, output_ptr, output_stop, flags, &result_position); } else { flags |= ECONV_AFTER_OUTPUT; do { res = rb_trans_conv(ec, input_ptr, input_stop, output_ptr, output_stop, flags, &result_position); } while (res == econv_after_output); } gotresult: ec->last_error.result = res; if (res == econv_invalid_byte_sequence || res == econv_incomplete_input || res == econv_undefined_conversion) { rb_transcoding *error_tc = ec->elems[result_position].tc; ec->last_error.error_tc = error_tc; ec->last_error.source_encoding = error_tc->transcoder->src_encoding; ec->last_error.destination_encoding = error_tc->transcoder->dst_encoding; ec->last_error.error_bytes_start = TRANSCODING_READBUF(error_tc); ec->last_error.error_bytes_len = error_tc->recognized_len; ec->last_error.readagain_len = error_tc->readagain_len; } return res; } static int output_replacement_character(rb_econv_t *ec); static int output_hex_charref(rb_econv_t *ec) { int ret; unsigned char utfbuf[1024]; const unsigned char *utf; size_t utf_len; int utf_allocated = 0; char charef_buf[16]; const unsigned char *p; if (encoding_equal(ec->last_error.source_encoding, "UTF-32BE")) { utf = ec->last_error.error_bytes_start; utf_len = ec->last_error.error_bytes_len; } else { utf = allocate_converted_string(ec->last_error.source_encoding, "UTF-32BE", ec->last_error.error_bytes_start, ec->last_error.error_bytes_len, utfbuf, sizeof(utfbuf), &utf_len); if (!utf) return -1; if (utf != utfbuf && utf != ec->last_error.error_bytes_start) utf_allocated = 1; } if (utf_len % 4 != 0) goto fail; p = utf; while (4 <= utf_len) { unsigned int u = 0; u += p[0] << 24; u += p[1] << 16; u += p[2] << 8; u += p[3]; snprintf(charef_buf, sizeof(charef_buf), "&#x%X;", u); ret = rb_econv_insert_output(ec, (unsigned char *)charef_buf, strlen(charef_buf), "US-ASCII"); if (ret == -1) goto fail; p += 4; utf_len -= 4; } if (utf_allocated) xfree((void *)utf); return 0; fail: if (utf_allocated) xfree((void *)utf); return -1; } rb_econv_result_t rb_econv_convert(rb_econv_t *ec, const unsigned char **input_ptr, const unsigned char *input_stop, unsigned char **output_ptr, unsigned char *output_stop, int flags) { rb_econv_result_t ret; unsigned char empty_buf; unsigned char *empty_ptr = &empty_buf; ec->started = 1; if (!input_ptr) { input_ptr = (const unsigned char **)&empty_ptr; input_stop = empty_ptr; } if (!output_ptr) { output_ptr = &empty_ptr; output_stop = empty_ptr; } resume: ret = rb_econv_convert0(ec, input_ptr, input_stop, output_ptr, output_stop, flags); if (ret == econv_invalid_byte_sequence || ret == econv_incomplete_input) { /* deal with invalid byte sequence */ /* todo: add more alternative behaviors */ switch (ec->flags & ECONV_INVALID_MASK) { case ECONV_INVALID_REPLACE: if (output_replacement_character(ec) == 0) goto resume; } } if (ret == econv_undefined_conversion) { /* valid character in source encoding * but no related character(s) in destination encoding */ /* todo: add more alternative behaviors */ switch (ec->flags & ECONV_UNDEF_MASK) { case ECONV_UNDEF_REPLACE: if (output_replacement_character(ec) == 0) goto resume; break; case ECONV_UNDEF_HEX_CHARREF: if (output_hex_charref(ec) == 0) goto resume; break; } } return ret; } const char * rb_econv_encoding_to_insert_output(rb_econv_t *ec) { rb_transcoding *tc = ec->last_tc; const rb_transcoder *tr; if (tc == NULL) return ""; tr = tc->transcoder; if (tr->asciicompat_type == asciicompat_encoder) return tr->src_encoding; return tr->dst_encoding; } static unsigned char * allocate_converted_string(const char *sname, const char *dname, const unsigned char *str, size_t len, unsigned char *caller_dst_buf, size_t caller_dst_bufsize, size_t *dst_len_ptr) { unsigned char *dst_str; size_t dst_len; size_t dst_bufsize; rb_econv_t *ec; rb_econv_result_t res; const unsigned char *sp; unsigned char *dp; if (caller_dst_buf) dst_bufsize = caller_dst_bufsize; else if (len == 0) dst_bufsize = 1; else dst_bufsize = len; ec = rb_econv_open(sname, dname, 0); if (ec == NULL) return NULL; if (caller_dst_buf) dst_str = caller_dst_buf; else dst_str = xmalloc(dst_bufsize); dst_len = 0; sp = str; dp = dst_str+dst_len; res = rb_econv_convert(ec, &sp, str+len, &dp, dst_str+dst_bufsize, 0); dst_len = dp - dst_str; while (res == econv_destination_buffer_full) { if (SIZE_MAX/2 < dst_bufsize) { goto fail; } dst_bufsize *= 2; if (dst_str == caller_dst_buf) { unsigned char *tmp; tmp = xmalloc(dst_bufsize); memcpy(tmp, dst_str, dst_bufsize/2); dst_str = tmp; } else { dst_str = xrealloc(dst_str, dst_bufsize); } dp = dst_str+dst_len; res = rb_econv_convert(ec, &sp, str+len, &dp, dst_str+dst_bufsize, 0); dst_len = dp - dst_str; } if (res != econv_finished) { goto fail; } rb_econv_close(ec); *dst_len_ptr = dst_len; return dst_str; fail: if (dst_str != caller_dst_buf) xfree(dst_str); rb_econv_close(ec); return NULL; } /* result: 0:success -1:failure */ int rb_econv_insert_output(rb_econv_t *ec, const unsigned char *str, size_t len, const char *str_encoding) { const char *insert_encoding = rb_econv_encoding_to_insert_output(ec); unsigned char insert_buf[4096]; const unsigned char *insert_str = NULL; size_t insert_len; int last_trans_index; rb_transcoding *tc; unsigned char **buf_start_p; unsigned char **data_start_p; unsigned char **data_end_p; unsigned char **buf_end_p; size_t need; ec->started = 1; if (len == 0) return 0; if (encoding_equal(insert_encoding, str_encoding)) { insert_str = str; insert_len = len; } else { insert_str = allocate_converted_string(str_encoding, insert_encoding, str, len, insert_buf, sizeof(insert_buf), &insert_len); if (insert_str == NULL) return -1; } need = insert_len; last_trans_index = ec->num_trans-1; if (ec->num_trans == 0) { tc = NULL; buf_start_p = &ec->in_buf_start; data_start_p = &ec->in_data_start; data_end_p = &ec->in_data_end; buf_end_p = &ec->in_buf_end; } else if (ec->elems[last_trans_index].tc->transcoder->asciicompat_type == asciicompat_encoder) { tc = ec->elems[last_trans_index].tc; need += tc->readagain_len; if (need < insert_len) goto fail; if (last_trans_index == 0) { buf_start_p = &ec->in_buf_start; data_start_p = &ec->in_data_start; data_end_p = &ec->in_data_end; buf_end_p = &ec->in_buf_end; } else { rb_econv_elem_t *ee = &ec->elems[last_trans_index-1]; buf_start_p = &ee->out_buf_start; data_start_p = &ee->out_data_start; data_end_p = &ee->out_data_end; buf_end_p = &ee->out_buf_end; } } else { rb_econv_elem_t *ee = &ec->elems[last_trans_index]; buf_start_p = &ee->out_buf_start; data_start_p = &ee->out_data_start; data_end_p = &ee->out_data_end; buf_end_p = &ee->out_buf_end; tc = ec->elems[last_trans_index].tc; } if (*buf_start_p == NULL) { unsigned char *buf = xmalloc(need); *buf_start_p = buf; *data_start_p = buf; *data_end_p = buf; *buf_end_p = buf+need; } else if (*buf_end_p - *data_end_p < need) { MEMMOVE(*buf_start_p, *data_start_p, unsigned char, *data_end_p - *data_start_p); *data_end_p = *buf_start_p + (*data_end_p - *data_start_p); *data_start_p = *buf_start_p; if (*buf_end_p - *data_end_p < need) { unsigned char *buf; size_t s = (*data_end_p - *buf_start_p) + need; if (s < need) goto fail; buf = xrealloc(*buf_start_p, s); *data_start_p = buf; *data_end_p = buf + (*data_end_p - *buf_start_p); *buf_start_p = buf; *buf_end_p = buf + s; } } memcpy(*data_end_p, insert_str, insert_len); *data_end_p += insert_len; if (tc && tc->transcoder->asciicompat_type == asciicompat_encoder) { memcpy(*data_end_p, TRANSCODING_READBUF(tc)+tc->recognized_len, tc->readagain_len); *data_end_p += tc->readagain_len; tc->readagain_len = 0; } if (insert_str != str && insert_str != insert_buf) xfree((void*)insert_str); return 0; fail: if (insert_str != str && insert_str != insert_buf) xfree((void*)insert_str); return -1; } void rb_econv_close(rb_econv_t *ec) { int i; if (ec->replacement_allocated) { xfree((void *)ec->replacement_str); } for (i = 0; i < ec->num_trans; i++) { rb_transcoding_close(ec->elems[i].tc); if (ec->elems[i].out_buf_start) xfree(ec->elems[i].out_buf_start); } xfree(ec->in_buf_start); xfree(ec->elems); xfree(ec); } int rb_econv_putbackable(rb_econv_t *ec) { if (ec->num_trans == 0) return 0; return ec->elems[0].tc->readagain_len; } void rb_econv_putback(rb_econv_t *ec, unsigned char *p, int n) { rb_transcoding *tc; if (ec->num_trans == 0 || n == 0) return; tc = ec->elems[0].tc; memcpy(p, TRANSCODING_READBUF(tc) + tc->recognized_len + tc->readagain_len - n, n); tc->readagain_len -= n; } struct asciicompat_encoding_t { const char *ascii_compat_name; const char *ascii_incompat_name; }; static int asciicompat_encoding_i(st_data_t key, st_data_t val, st_data_t arg) { struct asciicompat_encoding_t *data = (struct asciicompat_encoding_t *)arg; transcoder_entry_t *entry = (transcoder_entry_t *)val; const rb_transcoder *tr; if (DECORATOR_P(entry->sname, entry->dname)) return ST_CONTINUE; tr = load_transcoder_entry(entry); if (tr && tr->asciicompat_type == asciicompat_decoder) { data->ascii_compat_name = tr->dst_encoding; return ST_STOP; } return ST_CONTINUE; } const char * rb_econv_asciicompat_encoding(const char *ascii_incompat_name) { st_data_t v; st_table *table2; struct asciicompat_encoding_t data; if (!st_lookup(transcoder_table, (st_data_t)ascii_incompat_name, &v)) return NULL; table2 = (st_table *)v; /* * Assumption: * There are at most one transcoder for * converting from ASCII incompatible encoding. * * For ISO-2022-JP, there is ISO-2022-JP -> stateless-ISO-2022-JP and no others. */ if (table2->num_entries != 1) return NULL; data.ascii_incompat_name = ascii_incompat_name; data.ascii_compat_name = NULL; st_foreach(table2, asciicompat_encoding_i, (st_data_t)&data); return data.ascii_compat_name; } VALUE rb_econv_substr_append(rb_econv_t *ec, VALUE src, long off, long len, VALUE dst, int flags) { unsigned const char *ss, *sp, *se; unsigned char *ds, *dp, *de; rb_econv_result_t res; int max_output; if (NIL_P(dst)) { dst = rb_str_buf_new(len); if (ec->destination_encoding) rb_enc_associate(dst, ec->destination_encoding); } if (ec->last_tc) max_output = ec->last_tc->transcoder->max_output; else max_output = 1; res = econv_destination_buffer_full; while (res == econv_destination_buffer_full) { long dlen = RSTRING_LEN(dst); if (rb_str_capacity(dst) - dlen < (size_t)len + max_output) { unsigned long new_capa = (unsigned long)dlen + len + max_output; if (LONG_MAX < new_capa) rb_raise(rb_eArgError, "too long string"); rb_str_resize(dst, new_capa); rb_str_set_len(dst, dlen); } ss = sp = (const unsigned char *)RSTRING_PTR(src) + off; se = ss + len; ds = (unsigned char *)RSTRING_PTR(dst); de = ds + rb_str_capacity(dst); dp = ds += dlen; res = rb_econv_convert(ec, &sp, se, &dp, de, flags); off += sp - ss; len -= sp - ss; rb_str_set_len(dst, dlen + (dp - ds)); rb_econv_check_error(ec); } return dst; } VALUE rb_econv_str_append(rb_econv_t *ec, VALUE src, VALUE dst, int flags) { return rb_econv_substr_append(ec, src, 0, RSTRING_LEN(src), dst, flags); } VALUE rb_econv_substr_convert(rb_econv_t *ec, VALUE src, long byteoff, long bytesize, int flags) { return rb_econv_substr_append(ec, src, byteoff, bytesize, Qnil, flags); } VALUE rb_econv_str_convert(rb_econv_t *ec, VALUE src, int flags) { return rb_econv_substr_append(ec, src, 0, RSTRING_LEN(src), Qnil, flags); } static int rb_econv_add_converter(rb_econv_t *ec, const char *sname, const char *dname, int n) { transcoder_entry_t *entry; const rb_transcoder *tr; if (ec->started != 0) return -1; entry = get_transcoder_entry(sname, dname); if (!entry) return -1; tr = load_transcoder_entry(entry); return rb_econv_add_transcoder_at(ec, tr, n); } static int rb_econv_decorate_at(rb_econv_t *ec, const char *decorator_name, int n) { return rb_econv_add_converter(ec, "", decorator_name, n); } int rb_econv_decorate_at_first(rb_econv_t *ec, const char *decorator_name) { const rb_transcoder *tr; if (ec->num_trans == 0) return rb_econv_decorate_at(ec, decorator_name, 0); tr = ec->elems[0].tc->transcoder; if (!DECORATOR_P(tr->src_encoding, tr->dst_encoding) && tr->asciicompat_type == asciicompat_decoder) return rb_econv_decorate_at(ec, decorator_name, 1); return rb_econv_decorate_at(ec, decorator_name, 0); } int rb_econv_decorate_at_last(rb_econv_t *ec, const char *decorator_name) { const rb_transcoder *tr; if (ec->num_trans == 0) return rb_econv_decorate_at(ec, decorator_name, 0); tr = ec->elems[ec->num_trans-1].tc->transcoder; if (!DECORATOR_P(tr->src_encoding, tr->dst_encoding) && tr->asciicompat_type == asciicompat_encoder) return rb_econv_decorate_at(ec, decorator_name, ec->num_trans-1); return rb_econv_decorate_at(ec, decorator_name, ec->num_trans); } void rb_econv_binmode(rb_econv_t *ec) { const rb_transcoder *trs[3]; int n, i, j; transcoder_entry_t *entry; int num_trans; n = 0; if (ec->flags & ECONV_UNIVERSAL_NEWLINE_DECORATOR) { entry = get_transcoder_entry("", "universal_newline"); if (entry->transcoder) trs[n++] = entry->transcoder; } if (ec->flags & ECONV_CRLF_NEWLINE_DECORATOR) { entry = get_transcoder_entry("", "crlf_newline"); if (entry->transcoder) trs[n++] = entry->transcoder; } if (ec->flags & ECONV_CR_NEWLINE_DECORATOR) { entry = get_transcoder_entry("", "cr_newline"); if (entry->transcoder) trs[n++] = entry->transcoder; } num_trans = ec->num_trans; j = 0; for (i = 0; i < num_trans; i++) { int k; for (k = 0; k < n; k++) if (trs[k] == ec->elems[i].tc->transcoder) break; if (k == n) { ec->elems[j] = ec->elems[i]; j++; } else { rb_transcoding_close(ec->elems[i].tc); xfree(ec->elems[i].out_buf_start); ec->num_trans--; } } ec->flags &= ~(ECONV_UNIVERSAL_NEWLINE_DECORATOR|ECONV_CRLF_NEWLINE_DECORATOR|ECONV_CR_NEWLINE_DECORATOR); } static VALUE econv_description(const char *sname, const char *dname, int ecflags, VALUE mesg) { int has_description = 0; if (NIL_P(mesg)) mesg = rb_str_new(NULL, 0); if (*sname != '\0' || *dname != '\0') { if (*sname == '\0') rb_str_cat2(mesg, dname); else if (*dname == '\0') rb_str_cat2(mesg, sname); else rb_str_catf(mesg, "%s to %s", sname, dname); has_description = 1; } if (ecflags & (ECONV_UNIVERSAL_NEWLINE_DECORATOR| ECONV_CRLF_NEWLINE_DECORATOR| ECONV_CR_NEWLINE_DECORATOR| ECONV_XML_TEXT_DECORATOR| ECONV_XML_ATTR_CONTENT_DECORATOR| ECONV_XML_ATTR_QUOTE_DECORATOR)) { const char *pre = ""; if (has_description) rb_str_cat2(mesg, " with "); if (ecflags & ECONV_UNIVERSAL_NEWLINE_DECORATOR) { rb_str_cat2(mesg, pre); pre = ","; rb_str_cat2(mesg, "universal_newline"); } if (ecflags & ECONV_CRLF_NEWLINE_DECORATOR) { rb_str_cat2(mesg, pre); pre = ","; rb_str_cat2(mesg, "crlf_newline"); } if (ecflags & ECONV_CR_NEWLINE_DECORATOR) { rb_str_cat2(mesg, pre); pre = ","; rb_str_cat2(mesg, "cr_newline"); } if (ecflags & ECONV_XML_TEXT_DECORATOR) { rb_str_cat2(mesg, pre); pre = ","; rb_str_cat2(mesg, "xml_text"); } if (ecflags & ECONV_XML_ATTR_CONTENT_DECORATOR) { rb_str_cat2(mesg, pre); pre = ","; rb_str_cat2(mesg, "xml_attr_content"); } if (ecflags & ECONV_XML_ATTR_QUOTE_DECORATOR) { rb_str_cat2(mesg, pre); pre = ","; rb_str_cat2(mesg, "xml_attr_quote"); } has_description = 1; } if (!has_description) { rb_str_cat2(mesg, "no-conversion"); } return mesg; } VALUE rb_econv_open_exc(const char *sname, const char *dname, int ecflags) { VALUE mesg, exc; mesg = rb_str_new_cstr("code converter not found ("); econv_description(sname, dname, ecflags, mesg); rb_str_cat2(mesg, ")"); exc = rb_exc_new3(rb_eConverterNotFoundError, mesg); return exc; } static VALUE make_econv_exception(rb_econv_t *ec) { VALUE mesg, exc; if (ec->last_error.result == econv_invalid_byte_sequence || ec->last_error.result == econv_incomplete_input) { const char *err = (const char *)ec->last_error.error_bytes_start; size_t error_len = ec->last_error.error_bytes_len; VALUE bytes = rb_str_new(err, error_len); VALUE dumped = rb_str_dump(bytes); size_t readagain_len = ec->last_error.readagain_len; VALUE bytes2 = Qnil; VALUE dumped2; int idx; if (ec->last_error.result == econv_incomplete_input) { mesg = rb_sprintf("incomplete %s on %s", StringValueCStr(dumped), ec->last_error.source_encoding); } else if (readagain_len) { bytes2 = rb_str_new(err+error_len, readagain_len); dumped2 = rb_str_dump(bytes2); mesg = rb_sprintf("%s followed by %s on %s", StringValueCStr(dumped), StringValueCStr(dumped2), ec->last_error.source_encoding); } else { mesg = rb_sprintf("%s on %s", StringValueCStr(dumped), ec->last_error.source_encoding); } exc = rb_exc_new3(rb_eInvalidByteSequenceError, mesg); rb_ivar_set(exc, rb_intern("error_bytes"), bytes); rb_ivar_set(exc, rb_intern("readagain_bytes"), bytes2); rb_ivar_set(exc, rb_intern("incomplete_input"), ec->last_error.result == econv_incomplete_input ? Qtrue : Qfalse); set_encs: rb_ivar_set(exc, rb_intern("source_encoding_name"), rb_str_new2(ec->last_error.source_encoding)); rb_ivar_set(exc, rb_intern("destination_encoding_name"), rb_str_new2(ec->last_error.destination_encoding)); idx = rb_enc_find_index(ec->last_error.source_encoding); if (0 <= idx) rb_ivar_set(exc, rb_intern("source_encoding"), rb_enc_from_encoding(rb_enc_from_index(idx))); idx = rb_enc_find_index(ec->last_error.destination_encoding); if (0 <= idx) rb_ivar_set(exc, rb_intern("destination_encoding"), rb_enc_from_encoding(rb_enc_from_index(idx))); return exc; } if (ec->last_error.result == econv_undefined_conversion) { VALUE bytes = rb_str_new((const char *)ec->last_error.error_bytes_start, ec->last_error.error_bytes_len); VALUE dumped; int idx; dumped = rb_str_dump(bytes); mesg = rb_sprintf("%s from %s to %s", StringValueCStr(dumped), ec->last_error.source_encoding, ec->last_error.destination_encoding); exc = rb_exc_new3(rb_eUndefinedConversionError, mesg); idx = rb_enc_find_index(ec->last_error.source_encoding); if (0 <= idx) rb_enc_associate_index(bytes, idx); rb_ivar_set(exc, rb_intern("error_char"), bytes); goto set_encs; } return Qnil; } static void more_output_buffer( VALUE destination, unsigned char *(*resize_destination)(VALUE, int, int), int max_output, unsigned char **out_start_ptr, unsigned char **out_pos, unsigned char **out_stop_ptr) { size_t len = (*out_pos - *out_start_ptr); size_t new_len = (len + max_output) * 2; *out_start_ptr = resize_destination(destination, len, new_len); *out_pos = *out_start_ptr + len; *out_stop_ptr = *out_start_ptr + new_len; } static int make_replacement(rb_econv_t *ec) { rb_transcoding *tc; const rb_transcoder *tr; rb_encoding *enc; const unsigned char *replacement; const char *repl_enc; const char *ins_enc; size_t len; if (ec->replacement_str) return 0; ins_enc = rb_econv_encoding_to_insert_output(ec); tc = ec->last_tc; if (*ins_enc) { tr = tc->transcoder; enc = rb_enc_find(tr->dst_encoding); replacement = (const unsigned char *)get_replacement_character(ins_enc, &len, &repl_enc); } else { replacement = (unsigned char *)"?"; len = 1; repl_enc = ""; } ec->replacement_str = replacement; ec->replacement_len = len; ec->replacement_enc = repl_enc; ec->replacement_allocated = 0; return 0; } int rb_econv_set_replacement(rb_econv_t *ec, const unsigned char *str, size_t len, const char *encname) { unsigned char *str2; size_t len2; const char *encname2; encname2 = rb_econv_encoding_to_insert_output(ec); if (encoding_equal(encname, encname2)) { str2 = xmalloc(len); MEMCPY(str2, str, unsigned char, len); /* xxx: str may be invalid */ len2 = len; encname2 = encname; } else { str2 = allocate_converted_string(encname, encname2, str, len, NULL, 0, &len2); if (!str2) return -1; } if (ec->replacement_allocated) { xfree((void *)ec->replacement_str); } ec->replacement_allocated = 1; ec->replacement_str = str2; ec->replacement_len = len2; ec->replacement_enc = encname2; return 0; } static int output_replacement_character(rb_econv_t *ec) { int ret; if (make_replacement(ec) == -1) return -1; ret = rb_econv_insert_output(ec, ec->replacement_str, ec->replacement_len, ec->replacement_enc); if (ret == -1) return -1; return 0; } #if 1 static void transcode_loop(const unsigned char **in_pos, unsigned char **out_pos, const unsigned char *in_stop, unsigned char *out_stop, VALUE destination, unsigned char *(*resize_destination)(VALUE, int, int), const char *src_encoding, const char *dst_encoding, int ecflags, VALUE ecopts) { rb_econv_t *ec; rb_transcoding *last_tc; rb_econv_result_t ret; unsigned char *out_start = *out_pos; int max_output; VALUE exc; ec = rb_econv_open_opts(src_encoding, dst_encoding, ecflags, ecopts); if (!ec) rb_exc_raise(rb_econv_open_exc(src_encoding, dst_encoding, ecflags)); last_tc = ec->last_tc; max_output = last_tc ? last_tc->transcoder->max_output : 1; resume: ret = rb_econv_convert(ec, in_pos, in_stop, out_pos, out_stop, 0); if (ret == econv_invalid_byte_sequence || ret == econv_incomplete_input || ret == econv_undefined_conversion) { exc = make_econv_exception(ec); rb_econv_close(ec); rb_exc_raise(exc); } if (ret == econv_destination_buffer_full) { more_output_buffer(destination, resize_destination, max_output, &out_start, out_pos, &out_stop); goto resume; } rb_econv_close(ec); return; } #else /* sample transcode_loop implementation in byte-by-byte stream style */ static void transcode_loop(const unsigned char **in_pos, unsigned char **out_pos, const unsigned char *in_stop, unsigned char *out_stop, VALUE destination, unsigned char *(*resize_destination)(VALUE, int, int), const char *src_encoding, const char *dst_encoding, int ecflags, VALUE ecopts) { rb_econv_t *ec; rb_transcoding *last_tc; rb_econv_result_t ret; unsigned char *out_start = *out_pos; const unsigned char *ptr; int max_output; VALUE exc; ec = rb_econv_open_opts(src_encoding, dst_encoding, ecflags, ecopts); if (!ec) rb_exc_raise(rb_econv_open_exc(src_encoding, dst_encoding, ecflags)); last_tc = ec->last_tc; max_output = last_tc ? last_tc->transcoder->max_output : 1; ret = econv_source_buffer_empty; ptr = *in_pos; while (ret != econv_finished) { unsigned char input_byte; const unsigned char *p = &input_byte; if (ret == econv_source_buffer_empty) { if (ptr < in_stop) { input_byte = *ptr; ret = rb_econv_convert(ec, &p, p+1, out_pos, out_stop, ECONV_PARTIAL_INPUT); } else { ret = rb_econv_convert(ec, NULL, NULL, out_pos, out_stop, 0); } } else { ret = rb_econv_convert(ec, NULL, NULL, out_pos, out_stop, ECONV_PARTIAL_INPUT); } if (&input_byte != p) ptr += p - &input_byte; switch (ret) { case econv_invalid_byte_sequence: case econv_incomplete_input: case econv_undefined_conversion: exc = make_econv_exception(ec); rb_econv_close(ec); rb_exc_raise(exc); break; case econv_destination_buffer_full: more_output_buffer(destination, resize_destination, max_output, &out_start, out_pos, &out_stop); break; case econv_source_buffer_empty: break; case econv_finished: break; } } rb_econv_close(ec); *in_pos = in_stop; return; } #endif /* * String-specific code */ static unsigned char * str_transcoding_resize(VALUE destination, int len, int new_len) { rb_str_resize(destination, new_len); return (unsigned char *)RSTRING_PTR(destination); } static int econv_opts(VALUE opt) { VALUE v; int ecflags = 0; v = rb_hash_aref(opt, sym_invalid); if (NIL_P(v)) { } else if (v==sym_replace) { ecflags |= ECONV_INVALID_REPLACE; } else { rb_raise(rb_eArgError, "unknown value for invalid character option"); } v = rb_hash_aref(opt, sym_undef); if (NIL_P(v)) { } else if (v==sym_replace) { ecflags |= ECONV_UNDEF_REPLACE; } else { rb_raise(rb_eArgError, "unknown value for undefined character option"); } v = rb_hash_aref(opt, sym_xml); if (!NIL_P(v)) { if (v==sym_text) { ecflags |= ECONV_XML_TEXT_DECORATOR|ECONV_UNDEF_HEX_CHARREF; } else if (v==sym_attr) { ecflags |= ECONV_XML_ATTR_CONTENT_DECORATOR|ECONV_XML_ATTR_QUOTE_DECORATOR|ECONV_UNDEF_HEX_CHARREF; } else if (TYPE(v) == T_SYMBOL) { rb_raise(rb_eArgError, "unexpected value for xml option: %s", rb_id2name(SYM2ID(v))); } else { rb_raise(rb_eArgError, "unexpected value for xml option"); } } v = rb_hash_aref(opt, sym_universal_newline); if (RTEST(v)) ecflags |= ECONV_UNIVERSAL_NEWLINE_DECORATOR; v = rb_hash_aref(opt, sym_crlf_newline); if (RTEST(v)) ecflags |= ECONV_CRLF_NEWLINE_DECORATOR; v = rb_hash_aref(opt, sym_cr_newline); if (RTEST(v)) ecflags |= ECONV_CR_NEWLINE_DECORATOR; return ecflags; } int rb_econv_prepare_opts(VALUE opthash, VALUE *opts) { int ecflags; VALUE newhash = Qnil; VALUE v; if (NIL_P(opthash)) { *opts = Qnil; return 0; } ecflags = econv_opts(opthash); v = rb_hash_aref(opthash, sym_replace); if (!NIL_P(v)) { StringValue(v); if (rb_enc_str_coderange(v) == ENC_CODERANGE_BROKEN) { VALUE dumped = rb_str_dump(v); rb_raise(rb_eArgError, "replacement string is broken: %s as %s", StringValueCStr(dumped), rb_enc_name(rb_enc_get(v))); } v = rb_str_new_frozen(v); newhash = rb_hash_new(); rb_hash_aset(newhash, sym_replace, v); } if (!NIL_P(newhash)) rb_hash_freeze(newhash); *opts = newhash; return ecflags; } rb_econv_t * rb_econv_open_opts(const char *source_encoding, const char *destination_encoding, int ecflags, VALUE opthash) { rb_econv_t *ec; VALUE replacement; if (NIL_P(opthash)) { replacement = Qnil; } else { if (TYPE(opthash) != T_HASH || !OBJ_FROZEN(opthash)) rb_bug("rb_econv_open_opts called with invalid opthash"); replacement = rb_hash_aref(opthash, sym_replace); } ec = rb_econv_open(source_encoding, destination_encoding, ecflags); if (!ec) return ec; if (!NIL_P(replacement)) { int ret; rb_encoding *enc = rb_enc_get(replacement); ret = rb_econv_set_replacement(ec, (const unsigned char *)RSTRING_PTR(replacement), RSTRING_LEN(replacement), rb_enc_name(enc)); if (ret == -1) { rb_econv_close(ec); return NULL; } } return ec; } static int enc_arg(volatile VALUE *arg, const char **name_p, rb_encoding **enc_p) { rb_encoding *enc; const char *n; int encidx; VALUE encval; if ((encidx = rb_to_encoding_index(encval = *arg)) < 0) { enc = NULL; encidx = 0; n = StringValueCStr(*arg); } else { enc = rb_enc_from_index(encidx); n = rb_enc_name(enc); } *name_p = n; *enc_p = enc; return encidx; } static int str_transcode_enc_args(VALUE str, volatile VALUE *arg1, volatile VALUE *arg2, const char **sname_p, rb_encoding **senc_p, const char **dname_p, rb_encoding **denc_p) { rb_encoding *senc, *denc; const char *sname, *dname; int sencidx, dencidx; dencidx = enc_arg(arg1, &dname, &denc); if (NIL_P(*arg2)) { sencidx = rb_enc_get_index(str); senc = rb_enc_from_index(sencidx); sname = rb_enc_name(senc); } else { sencidx = enc_arg(arg2, &sname, &senc); } *sname_p = sname; *senc_p = senc; *dname_p = dname; *denc_p = denc; return dencidx; } static int str_transcode0(int argc, VALUE *argv, VALUE *self, int ecflags, VALUE ecopts) { VALUE dest; VALUE str = *self; volatile VALUE arg1, arg2; long blen, slen; unsigned char *buf, *bp, *sp; const unsigned char *fromp; rb_encoding *senc, *denc; const char *sname, *dname; int dencidx; if (argc <0 || argc > 2) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 0..2)", argc); } if (argc == 0) { arg1 = rb_enc_default_internal(); if (NIL_P(arg1)) { return -1; } ecflags |= ECONV_INVALID_REPLACE | ECONV_UNDEF_REPLACE; } else { arg1 = argv[0]; } arg2 = argc<=1 ? Qnil : argv[1]; dencidx = str_transcode_enc_args(str, &arg1, &arg2, &sname, &senc, &dname, &denc); if ((ecflags & (ECONV_UNIVERSAL_NEWLINE_DECORATOR| ECONV_CRLF_NEWLINE_DECORATOR| ECONV_CR_NEWLINE_DECORATOR| ECONV_XML_TEXT_DECORATOR| ECONV_XML_ATTR_CONTENT_DECORATOR| ECONV_XML_ATTR_QUOTE_DECORATOR)) == 0) { if (senc && senc == denc) { return -1; } if (senc && denc && rb_enc_asciicompat(senc) && rb_enc_asciicompat(denc)) { if (ENC_CODERANGE(str) == ENC_CODERANGE_7BIT) { return dencidx; } } if (encoding_equal(sname, dname)) { return -1; } } else { if (encoding_equal(sname, dname)) { sname = ""; dname = ""; } } fromp = sp = (unsigned char *)RSTRING_PTR(str); slen = RSTRING_LEN(str); blen = slen + 30; /* len + margin */ dest = rb_str_tmp_new(blen); bp = (unsigned char *)RSTRING_PTR(dest); transcode_loop(&fromp, &bp, (sp+slen), (bp+blen), dest, str_transcoding_resize, sname, dname, ecflags, ecopts); if (fromp != sp+slen) { rb_raise(rb_eArgError, "not fully converted, %"PRIdPTRDIFF" bytes left", sp+slen-fromp); } buf = (unsigned char *)RSTRING_PTR(dest); *bp = '\0'; rb_str_set_len(dest, bp - buf); /* set encoding */ if (!denc) { dencidx = rb_define_dummy_encoding(dname); } *self = dest; return dencidx; } static int str_transcode(int argc, VALUE *argv, VALUE *self) { VALUE opt; int ecflags = 0; VALUE ecopts = Qnil; if (0 < argc) { opt = rb_check_convert_type(argv[argc-1], T_HASH, "Hash", "to_hash"); if (!NIL_P(opt)) { argc--; ecflags = rb_econv_prepare_opts(opt, &ecopts); } } return str_transcode0(argc, argv, self, ecflags, ecopts); } static inline VALUE str_encode_associate(VALUE str, int encidx) { int cr = 0; rb_enc_associate_index(str, encidx); /* transcoded string never be broken. */ if (rb_enc_asciicompat(rb_enc_from_index(encidx))) { rb_str_coderange_scan_restartable(RSTRING_PTR(str), RSTRING_END(str), 0, &cr); } else { cr = ENC_CODERANGE_VALID; } ENC_CODERANGE_SET(str, cr); return str; } /* * call-seq: * str.encode!(encoding [, options] ) => str * str.encode!(dst_encoding, src_encoding [, options] ) => str * * The first form transcodes the contents of str from * str.encoding to +encoding+. * The second form transcodes the contents of str from * src_encoding to dst_encoding. * The options Hash gives details for conversion. See String#encode * for details. * Returns the string even if no changes were made. */ static VALUE str_encode_bang(int argc, VALUE *argv, VALUE str) { VALUE newstr = str; int encidx = str_transcode(argc, argv, &newstr); if (encidx < 0) return str; rb_str_shared_replace(str, newstr); return str_encode_associate(str, encidx); } /* * call-seq: * str.encode(encoding [, options] ) => str * str.encode(dst_encoding, src_encoding [, options] ) => str * str.encode([options]) => str * * The first form returns a copy of str transcoded * to encoding +encoding+. * The second form returns a copy of str transcoded * from src_encoding to dst_encoding. * The options Hash gives details for conversion. Details * to be added. * The last form returns a copy of str transcoded to * Encoding.default_internal. */ static VALUE str_encode(int argc, VALUE *argv, VALUE str) { VALUE newstr = str; int encidx = str_transcode(argc, argv, &newstr); if (encidx < 0) return rb_str_dup(str); if (newstr == str) { newstr = rb_str_dup(str); } else { RBASIC(newstr)->klass = rb_obj_class(str); } return str_encode_associate(newstr, encidx); } VALUE rb_str_encode(VALUE str, VALUE to, int ecflags, VALUE ecopts) { int argc = 1; VALUE *argv = &to; VALUE newstr = str; int encidx = str_transcode0(argc, argv, &newstr, ecflags, ecopts); if (encidx < 0) return rb_str_dup(str); RBASIC(newstr)->klass = rb_obj_class(str); return str_encode_associate(newstr, encidx); } static void econv_free(rb_econv_t *ec) { rb_econv_close(ec); } static VALUE econv_s_allocate(VALUE klass) { return Data_Wrap_Struct(klass, NULL, econv_free, NULL); } static rb_encoding * make_dummy_encoding(const char *name) { rb_encoding *enc; int idx; idx = rb_define_dummy_encoding(name); enc = rb_enc_from_index(idx); return enc; } static rb_encoding * make_encoding(const char *name) { rb_encoding *enc; enc = rb_enc_find(name); if (!enc) enc = make_dummy_encoding(name); return enc; } static VALUE make_encobj(const char *name) { return rb_enc_from_encoding(make_encoding(name)); } /* * call-seq: * Encoding::Converter.asciicompat_encoding(string) => encoding or nil * Encoding::Converter.asciicompat_encoding(encoding) => encoding or nil * * returns the corresponding ASCII compatible encoding. * * It returns nil if the argument is an ASCII compatible encoding. * * "corresponding ASCII compatible encoding" is a ASCII compatible encoding which * represents same characters in the given ASCII incompatible encoding. * * So, no conversion undefined error occur between the ASCII compatible and incompatible encoding. * * Encoding::Converter.stateless_encoding("ISO-2022-JP") #=> # * Encoding::Converter.stateless_encoding("UTF-16BE") #=> # * Encoding::Converter.stateless_encoding("UTF-8") #=> nil * */ static VALUE econv_s_asciicompat_encoding(VALUE klass, VALUE arg) { const char *arg_name, *result_name; rb_encoding *arg_enc, *result_enc; enc_arg(&arg, &arg_name, &arg_enc); result_name = rb_econv_asciicompat_encoding(arg_name); if (result_name == NULL) return Qnil; result_enc = make_encoding(result_name); return rb_enc_from_encoding(result_enc); } static void econv_args(int argc, VALUE *argv, volatile VALUE *snamev_p, volatile VALUE *dnamev_p, const char **sname_p, const char **dname_p, rb_encoding **senc_p, rb_encoding **denc_p, int *ecflags_p, VALUE *ecopts_p) { VALUE opt, opthash, flags_v, ecopts; int sidx, didx; const char *sname, *dname; rb_encoding *senc, *denc; int ecflags; rb_scan_args(argc, argv, "21", snamev_p, dnamev_p, &opt); if (NIL_P(opt)) { ecflags = 0; ecopts = Qnil; } else if (!NIL_P(flags_v = rb_check_to_integer(opt, "to_int"))) { ecflags = NUM2INT(flags_v); ecopts = Qnil; } else { opthash = rb_convert_type(opt, T_HASH, "Hash", "to_hash"); ecflags = rb_econv_prepare_opts(opthash, &ecopts); } senc = NULL; sidx = rb_to_encoding_index(*snamev_p); if (0 <= sidx) { senc = rb_enc_from_index(sidx); } else { StringValue(*snamev_p); } denc = NULL; didx = rb_to_encoding_index(*dnamev_p); if (0 <= didx) { denc = rb_enc_from_index(didx); } else { StringValue(*dnamev_p); } sname = senc ? rb_enc_name(senc) : StringValueCStr(*snamev_p); dname = denc ? rb_enc_name(denc) : StringValueCStr(*dnamev_p); *sname_p = sname; *dname_p = dname; *senc_p = senc; *denc_p = denc; *ecflags_p = ecflags; *ecopts_p = ecopts; } static int decorate_convpath(VALUE convpath, int ecflags) { int num_decorators; const char *decorators[MAX_ECFLAGS_DECORATORS]; int i; int n, len; num_decorators = decorator_names(ecflags, decorators); if (num_decorators == -1) return -1; len = n = RARRAY_LEN(convpath); if (n != 0) { VALUE pair = RARRAY_PTR(convpath)[n-1]; const char *sname = rb_enc_name(rb_to_encoding(RARRAY_PTR(pair)[0])); const char *dname = rb_enc_name(rb_to_encoding(RARRAY_PTR(pair)[1])); transcoder_entry_t *entry = get_transcoder_entry(sname, dname); const rb_transcoder *tr = load_transcoder_entry(entry); if (!tr) return -1; if (!DECORATOR_P(tr->src_encoding, tr->dst_encoding) && tr->asciicompat_type == asciicompat_encoder) { n--; rb_ary_store(convpath, len + num_decorators - 1, pair); } } for (i = 0; i < num_decorators; i++) rb_ary_store(convpath, n + i, rb_str_new_cstr(decorators[i])); return 0; } static void search_convpath_i(const char *sname, const char *dname, int depth, void *arg) { VALUE *ary_p = arg; VALUE v; if (*ary_p == Qnil) { *ary_p = rb_ary_new(); } if (DECORATOR_P(sname, dname)) { v = rb_str_new_cstr(dname); } else { v = rb_assoc_new(make_encobj(sname), make_encobj(dname)); } rb_ary_store(*ary_p, depth, v); } /* * call-seq: * Encoding::Converter.search_convpath(source_encoding, destination_encoding) -> ary * Encoding::Converter.search_convpath(source_encoding, destination_encoding, opt) -> ary * * returns the conversion path. * * p Encoding::Converter.search_convpath("ISO-8859-1", "EUC-JP") * #=> [[#, #], * # [#, #]] * * p Encoding::Converter.search_convpath("ISO-8859-1", "EUC-JP", universal_newline: true) * #=> [[#, #], * # [#, #], * # "universal_newline"] * * p Encoding::Converter.search_convpath("ISO-8859-1", "UTF-32BE", universal_newline: true) * #=> [[#, #], * # "universal_newline", * # [#, #]] */ static VALUE econv_s_search_convpath(int argc, VALUE *argv, VALUE klass) { volatile VALUE snamev, dnamev; const char *sname, *dname; rb_encoding *senc, *denc; int ecflags; VALUE ecopts; VALUE convpath; econv_args(argc, argv, &snamev, &dnamev, &sname, &dname, &senc, &denc, &ecflags, &ecopts); convpath = Qnil; transcode_search_path(sname, dname, search_convpath_i, &convpath); if (NIL_P(convpath)) rb_exc_raise(rb_econv_open_exc(sname, dname, ecflags)); if (decorate_convpath(convpath, ecflags) == -1) rb_exc_raise(rb_econv_open_exc(sname, dname, ecflags)); return convpath; } /* * check the existance of converter. * returns the count of the converting paths. * result: >=0:success -1:failure */ int rb_econv_has_convpath_p(const char* from_encoding, const char* to_encoding) { VALUE convpath = Qnil; transcode_search_path(from_encoding, to_encoding, search_convpath_i, &convpath); return RTEST(convpath); } struct rb_econv_init_by_convpath_t { rb_econv_t *ec; int index; int ret; }; void rb_econv_init_by_convpath_i(const char *sname, const char *dname, int depth, void *arg) { struct rb_econv_init_by_convpath_t *a = (struct rb_econv_init_by_convpath_t *)arg; int ret; if (a->ret == -1) return; ret = rb_econv_add_converter(a->ec, sname, dname, a->index); a->ret = ret; return; } static rb_econv_t * rb_econv_init_by_convpath(VALUE self, VALUE convpath, const char **sname_p, const char **dname_p, rb_encoding **senc_p, rb_encoding**denc_p) { rb_econv_t *ec; long i; int ret, first=1; VALUE elt; rb_encoding *senc = 0, *denc = 0; const char *sname, *dname; ec = rb_econv_alloc(RARRAY_LEN(convpath)); DATA_PTR(self) = ec; for (i = 0; i < RARRAY_LEN(convpath); i++) { volatile VALUE snamev, dnamev; VALUE pair; elt = rb_ary_entry(convpath, i); if (!NIL_P(pair = rb_check_array_type(elt))) { if (RARRAY_LEN(pair) != 2) rb_raise(rb_eArgError, "not a 2-element array in convpath"); snamev = rb_ary_entry(pair, 0); enc_arg(&snamev, &sname, &senc); dnamev = rb_ary_entry(pair, 1); enc_arg(&dnamev, &dname, &denc); } else { sname = ""; dname = StringValueCStr(elt); } if (DECORATOR_P(sname, dname)) { ret = rb_econv_add_converter(ec, sname, dname, ec->num_trans); if (ret == -1) rb_raise(rb_eArgError, "decoration failed: %s", dname); } else { int j = ec->num_trans; struct rb_econv_init_by_convpath_t arg; arg.ec = ec; arg.index = ec->num_trans; arg.ret = 0; ret = transcode_search_path(sname, dname, rb_econv_init_by_convpath_i, &arg); if (ret == -1 || arg.ret == -1) rb_raise(rb_eArgError, "conversion add failed: %s to %s", sname, dname); if (first) { first = 0; *senc_p = senc; *sname_p = ec->elems[j].tc->transcoder->src_encoding; } *denc_p = denc; *dname_p = ec->elems[ec->num_trans-1].tc->transcoder->dst_encoding; } } if (first) { *senc_p = NULL; *denc_p = NULL; *sname_p = ""; *dname_p = ""; } ec->source_encoding_name = *sname_p; ec->destination_encoding_name = *dname_p; return ec; } /* * call-seq: * Encoding::Converter.new(source_encoding, destination_encoding) * Encoding::Converter.new(source_encoding, destination_encoding, opt) * Encoding::Converter.new(convpath) * * possible options elements: * hash form: * :invalid => nil # raise error on invalid byte sequence (default) * :invalid => :replace # replace invalid byte sequence * :undef => nil # raise error on undefined conversion (default) * :undef => :replace # replace undefined conversion * :replace => string # replacement string ("?" or "\uFFFD" if not specified) * :universal_newline => true # decorator for converting CRLF and CR to LF * :crlf_newline => true # decorator for converting LF to CRLF * :cr_newline => true # decorator for converting LF to CR * :xml => :text # escape as XML CharData. * :xml => :attr # escape as XML AttValue * integer form: * Encoding::Converter::INVALID_REPLACE * Encoding::Converter::UNDEF_REPLACE * Encoding::Converter::UNDEF_HEX_CHARREF * Encoding::Converter::UNIVERSAL_NEWLINE_DECORATOR * Encoding::Converter::CRLF_NEWLINE_DECORATOR * Encoding::Converter::CR_NEWLINE_DECORATOR * Encoding::Converter::XML_TEXT_DECORATOR * Encoding::Converter::XML_ATTR_CONTENT_DECORATOR * Encoding::Converter::XML_ATTR_QUOTE_DECORATOR * * Encoding::Converter.new creates an instance of Encoding::Converter. * * source_encoding and destination_encoding should be a string or * Encoding object. * * opt should be nil, a hash or an integer. * * convpath should be an array. * convpath should contains * - two-element array which contains encoding or encoding name, or * - a string of decorator name. * * Encoding::Converter.new optionally takes an option. * The option should be a hash or an integer. * The option hash can contain :invalid => nil, etc. * The option integer should be logical-or of constants such as * Encoding::Converter::INVALID_REPLACE, etc. * * [:invalid => nil] * raise error on invalid byte sequence. This is a default behavior. * [:invalid => :replace] * replace invalid byte sequence as a replacement string. * [:undef => nil] * raise error on conversion failure due to an character in source_encoding is not defined in destination_encoding. * This is a default behavior. * [:undef => :replace] * replace undefined character in destination_encoding as a replacement string. * [:replace => string] * specify the replacement string. * If not specified, "\uFFFD" is used for Unicode encodings and "?" for others. * [:universal_newline => true] * convert CRLF and CR to LF. * [:crlf_newline => true] * convert LF to CRLF. * [:cr_newline => true] * convert LF to CR. * [:xml => :text] * escape as XML CharData. * This form can be used as a HTML 4.0 #PCDATA. * - '&' -> '&' * - '<' -> '<' * - '>' -> '>' * - undefined characters in destination_encoding -> hexadecimal CharRef such as &#xHH; * [:xml => :attr] * escape as XML AttValue. * The converted result is quoted as "...". * This form can be used as a HTML 4.0 attribute value. * - '&' -> '&' * - '<' -> '<' * - '>' -> '>' * - '"' -> '"' * - undefined characters in destination_encoding -> hexadecimal CharRef such as &#xHH; * * example: * # UTF-16BE to UTF-8 * ec = Encoding::Converter.new("UTF-16BE", "UTF-8") * * # Usually, decorators such as newline conversion are inserted at last. * ec = Encoding::Converter.new("UTF-16BE", "UTF-8", :universal_newline => true) * p ec.convpath #=> [[#, #], * # "universal_newline"] * * # But, if the last encoding is ASCII incompatible, * # decorators are inserted before the last conversion. * ec = Encoding::Converter.new("UTF-8", "UTF-16BE", :crlf_newline => true) * p ec.convpath #=> ["crlf_newline", * # [#, #]] * * # conversion path can be specified directly. * ec = Encoding::Converter.new(["universal_newline", ["EUC-JP", "UTF-8"], ["UTF-8", "UTF-16BE"]]) * p ec.convpath #=> ["universal_newline", * # [#, #], * # [#, #]] */ static VALUE econv_init(int argc, VALUE *argv, VALUE self) { VALUE ecopts; volatile VALUE snamev, dnamev; const char *sname, *dname; rb_encoding *senc, *denc; rb_econv_t *ec; int ecflags; VALUE convpath; if (DATA_PTR(self)) { rb_raise(rb_eTypeError, "already initialized"); } if (argc == 1 && !NIL_P(convpath = rb_check_array_type(argv[0]))) { ec = rb_econv_init_by_convpath(self, convpath, &sname, &dname, &senc, &denc); ecflags = 0; ecopts = Qnil; } else { econv_args(argc, argv, &snamev, &dnamev, &sname, &dname, &senc, &denc, &ecflags, &ecopts); ec = rb_econv_open_opts(sname, dname, ecflags, ecopts); } if (!ec) { rb_exc_raise(rb_econv_open_exc(sname, dname, ecflags)); } if (!DECORATOR_P(sname, dname)) { if (!senc) senc = make_dummy_encoding(sname); if (!denc) denc = make_dummy_encoding(dname); } ec->source_encoding = senc; ec->destination_encoding = denc; DATA_PTR(self) = ec; return self; } /* * call-seq: * ec.inspect -> string * * Returns a printable version of ec * * ec = Encoding::Converter.new("iso-8859-1", "utf-8") * puts ec.inspect #=> # * */ static VALUE econv_inspect(VALUE self) { const char *cname = rb_obj_classname(self); rb_econv_t *ec = DATA_PTR(self); if (!ec) return rb_sprintf("#<%s: uninitialized>", cname); else { const char *sname = ec->source_encoding_name; const char *dname = ec->destination_encoding_name; VALUE str; str = rb_sprintf("#<%s: ", cname); econv_description(sname, dname, ec->flags, str); rb_str_cat2(str, ">"); return str; } } #define IS_ECONV(obj) (RDATA(obj)->dfree == (RUBY_DATA_FUNC)econv_free) static rb_econv_t * check_econv(VALUE self) { Check_Type(self, T_DATA); if (!IS_ECONV(self)) { rb_raise(rb_eTypeError, "wrong argument type %s (expected Encoding::Converter)", rb_class2name(CLASS_OF(self))); } if (!DATA_PTR(self)) { rb_raise(rb_eTypeError, "uninitialized encoding converter"); } return DATA_PTR(self); } /* * call-seq: * ec.source_encoding -> encoding * * returns the source encoding as an Encoding object. */ static VALUE econv_source_encoding(VALUE self) { rb_econv_t *ec = check_econv(self); if (!ec->source_encoding) return Qnil; return rb_enc_from_encoding(ec->source_encoding); } /* * call-seq: * ec.destination_encoding -> encoding * * returns the destination encoding as an Encoding object. */ static VALUE econv_destination_encoding(VALUE self) { rb_econv_t *ec = check_econv(self); if (!ec->destination_encoding) return Qnil; return rb_enc_from_encoding(ec->destination_encoding); } /* * call-seq: * ec.convpath -> ary * * returns the conversion path of ec. * * The result is an array of conversions. * * ec = Encoding::Converter.new("ISo-8859-1", "EUC-JP", crlf_newline: true) * p ec.convpath * #=> [[#, #], * # [#, #], * # "crlf_newline"] * * A element of the array is a pair of encodings or a string. * The pair means encoding conversion. * The string means decorator. * * In the above example, [#, #] means * a converter from ISO-8859-1 to UTF-8. * "crlf_newline" means newline converter from LF to CRLF. */ static VALUE econv_convpath(VALUE self) { rb_econv_t *ec = check_econv(self); VALUE result; int i; result = rb_ary_new(); for (i = 0; i < ec->num_trans; i++) { const rb_transcoder *tr = ec->elems[i].tc->transcoder; VALUE v; if (DECORATOR_P(tr->src_encoding, tr->dst_encoding)) v = rb_str_new_cstr(tr->dst_encoding); else v = rb_assoc_new(make_encobj(tr->src_encoding), make_encobj(tr->dst_encoding)); rb_ary_push(result, v); } return result; } static VALUE econv_result_to_symbol(rb_econv_result_t res) { switch (res) { case econv_invalid_byte_sequence: return sym_invalid_byte_sequence; case econv_incomplete_input: return sym_incomplete_input; case econv_undefined_conversion: return sym_undefined_conversion; case econv_destination_buffer_full: return sym_destination_buffer_full; case econv_source_buffer_empty: return sym_source_buffer_empty; case econv_finished: return sym_finished; case econv_after_output: return sym_after_output; default: return INT2NUM(res); /* should not be reached */ } } /* * call-seq: * ec.primitive_convert(source_buffer, destination_buffer) -> symbol * ec.primitive_convert(source_buffer, destination_buffer, destination_byteoffset) -> symbol * ec.primitive_convert(source_buffer, destination_buffer, destination_byteoffset, destination_bytesize) -> symbol * ec.primitive_convert(source_buffer, destination_buffer, destination_byteoffset, destination_bytesize, opt) -> symbol * * possible opt elements: * hash form: * :partial_input => true # source buffer may be part of larger source * :after_output => true # stop conversion after output before input * integer form: * Encoding::Converter::PARTIAL_INPUT * Encoding::Converter::AFTER_OUTPUT * * possible results: * :invalid_byte_sequence * :incomplete_input * :undefined_conversion * :after_output * :destination_buffer_full * :source_buffer_empty * :finished * * primitive_convert converts source_buffer into destination_buffer. * * source_buffer should be a string or nil. * nil means a empty string. * * destination_buffer should be a string. * * destination_byteoffset should be an integer or nil. * nil means the end of destination_buffer. * If it is omitted, nil is assumed. * * destination_bytesize should be an integer or nil. * nil means unlimited. * If it is omitted, nil is assumed. * * opt should be nil, a hash or an integer. * nil means no flags. * If it is omitted, nil is assumed. * * primitive_convert converts the content of source_buffer from beginning * and store the result into destination_buffer. * * destination_byteoffset and destination_bytesize specify the region which * the converted result is stored. * destination_byteoffset specifies the start position in destination_buffer in bytes. * If destination_byteoffset is nil, * destination_buffer.bytesize is used for appending the result. * destination_bytesize specifies maximum number of bytes. * If destination_bytesize is nil, * destination size is unlimited. * After conversion, destination_buffer is resized to * destination_byteoffset + actually produced number of bytes. * Also destination_buffer's encoding is set to destination_encoding. * * primitive_convert drops the converted part of source_buffer. * the dropped part is converted in destination_buffer or * buffered in Encoding::Converter object. * * primitive_convert stops conversion when one of following condition met. * - invalid byte sequence found in source buffer (:invalid_byte_sequence) * - unexpected end of source buffer (:incomplete_input) * this occur only when :partial_input is not specified. * - character not representable in output encoding (:undefined_conversion) * - after some output is generated, before input is done (:after_output) * this occur only when :after_output is specified. * - destination buffer is full (:destination_buffer_full) * this occur only when destination_bytesize is non-nil. * - source buffer is empty (:source_buffer_empty) * this occur only when :partial_input is specified. * - conversion is finished (:finished) * * example: * ec = Encoding::Converter.new("UTF-8", "UTF-16BE") * ret = ec.primitive_convert(src="pi", dst="", 100) * p [ret, src, dst] #=> [:finished, "", "\x00p\x00i"] * * ec = Encoding::Converter.new("UTF-8", "UTF-16BE") * ret = ec.primitive_convert(src="pi", dst="", 1) * p [ret, src, dst] #=> [:destination_buffer_full, "i", "\x00"] * ret = ec.primitive_convert(src, dst="", 1) * p [ret, src, dst] #=> [:destination_buffer_full, "", "p"] * ret = ec.primitive_convert(src, dst="", 1) * p [ret, src, dst] #=> [:destination_buffer_full, "", "\x00"] * ret = ec.primitive_convert(src, dst="", 1) * p [ret, src, dst] #=> [:finished, "", "i"] * */ static VALUE econv_primitive_convert(int argc, VALUE *argv, VALUE self) { VALUE input, output, output_byteoffset_v, output_bytesize_v, opt, flags_v; rb_econv_t *ec = check_econv(self); rb_econv_result_t res; const unsigned char *ip, *is; unsigned char *op, *os; long output_byteoffset, output_bytesize; unsigned long output_byteend; int flags; rb_scan_args(argc, argv, "23", &input, &output, &output_byteoffset_v, &output_bytesize_v, &opt); if (NIL_P(output_byteoffset_v)) output_byteoffset = 0; /* dummy */ else output_byteoffset = NUM2LONG(output_byteoffset_v); if (NIL_P(output_bytesize_v)) output_bytesize = 0; /* dummy */ else output_bytesize = NUM2LONG(output_bytesize_v); if (NIL_P(opt)) { flags = 0; } else if (!NIL_P(flags_v = rb_check_to_integer(opt, "to_int"))) { flags = NUM2INT(flags_v); } else { VALUE v; opt = rb_convert_type(opt, T_HASH, "Hash", "to_hash"); flags = 0; v = rb_hash_aref(opt, sym_partial_input); if (RTEST(v)) flags |= ECONV_PARTIAL_INPUT; v = rb_hash_aref(opt, sym_after_output); if (RTEST(v)) flags |= ECONV_AFTER_OUTPUT; } StringValue(output); if (!NIL_P(input)) StringValue(input); rb_str_modify(output); if (NIL_P(output_bytesize_v)) { output_bytesize = RSTRING_EMBED_LEN_MAX; if (!NIL_P(input) && output_bytesize < RSTRING_LEN(input)) output_bytesize = RSTRING_LEN(input); } retry: if (NIL_P(output_byteoffset_v)) output_byteoffset = RSTRING_LEN(output); if (output_byteoffset < 0) rb_raise(rb_eArgError, "negative output_byteoffset"); if (RSTRING_LEN(output) < output_byteoffset) rb_raise(rb_eArgError, "output_byteoffset too big"); if (output_bytesize < 0) rb_raise(rb_eArgError, "negative output_bytesize"); output_byteend = (unsigned long)output_byteoffset + (unsigned long)output_bytesize; if (output_byteend < (unsigned long)output_byteoffset || LONG_MAX < output_byteend) rb_raise(rb_eArgError, "output_byteoffset+output_bytesize too big"); if (rb_str_capacity(output) < output_byteend) rb_str_resize(output, output_byteend); if (NIL_P(input)) { ip = is = NULL; } else { ip = (const unsigned char *)RSTRING_PTR(input); is = ip + RSTRING_LEN(input); } op = (unsigned char *)RSTRING_PTR(output) + output_byteoffset; os = op + output_bytesize; res = rb_econv_convert(ec, &ip, is, &op, os, flags); rb_str_set_len(output, op-(unsigned char *)RSTRING_PTR(output)); if (!NIL_P(input)) rb_str_drop_bytes(input, ip - (unsigned char *)RSTRING_PTR(input)); if (NIL_P(output_bytesize_v) && res == econv_destination_buffer_full) { if (LONG_MAX / 2 < output_bytesize) rb_raise(rb_eArgError, "too long conversion result"); output_bytesize *= 2; output_byteoffset_v = Qnil; goto retry; } if (ec->destination_encoding) { rb_enc_associate(output, ec->destination_encoding); } return econv_result_to_symbol(res); } /* * call-seq: * ec.convert(source_string) -> destination_string * * convert source_string and return destination_string. * * source_string is assumed as a part of source. * i.e. :partial_input=>true is specified internally. * finish method should be used at last. * * ec = Encoding::Converter.new("utf-8", "euc-jp") * puts ec.convert("\u3042").dump #=> "\xA4\xA2" * puts ec.finish.dump #=> "" * * ec = Encoding::Converter.new("euc-jp", "utf-8") * puts ec.convert("\xA4").dump #=> "" * puts ec.convert("\xA2").dump #=> "\xE3\x81\x82" * puts ec.finish.dump #=> "" * * ec = Encoding::Converter.new("utf-8", "iso-2022-jp") * puts ec.convert("\xE3").dump #=> "".force_encoding("ISO-2022-JP") * puts ec.convert("\x81").dump #=> "".force_encoding("ISO-2022-JP") * puts ec.convert("\x82").dump #=> "\e$B$\"".force_encoding("ISO-2022-JP") * puts ec.finish.dump #=> "\e(B".force_encoding("ISO-2022-JP") * * If a conversion error occur, * Encoding::UndefinedConversionError or * Encoding::InvalidByteSequenceError is raised. * */ static VALUE econv_convert(VALUE self, VALUE source_string) { VALUE ret, dst; VALUE av[5]; int ac; rb_econv_t *ec = check_econv(self); StringValue(source_string); dst = rb_str_new(NULL, 0); av[0] = rb_str_dup(source_string); av[1] = dst; av[2] = Qnil; av[3] = Qnil; av[4] = INT2NUM(ECONV_PARTIAL_INPUT); ac = 5; ret = econv_primitive_convert(ac, av, self); if (ret == sym_invalid_byte_sequence || ret == sym_undefined_conversion || ret == sym_incomplete_input) { VALUE exc = make_econv_exception(ec); rb_exc_raise(exc); } if (ret == sym_finished) { rb_raise(rb_eArgError, "converter already finished"); } if (ret != sym_source_buffer_empty) { rb_bug("unexpected result of econv_primitive_convert"); } return dst; } /* * call-seq: * ec.finish -> string * * finishes the converter. * It returns the last part of converted string. * * ec = Encoding::Converter.new("utf-8", "iso-2022-jp") * p ec.convert("\u3042") #=> "\e$B$\"" * p ec.finish #=> "\e(B" */ static VALUE econv_finish(VALUE self) { VALUE ret, dst; VALUE av[5]; int ac; rb_econv_t *ec = check_econv(self); dst = rb_str_new(NULL, 0); av[0] = Qnil; av[1] = dst; av[2] = Qnil; av[3] = Qnil; av[4] = INT2NUM(0); ac = 5; ret = econv_primitive_convert(ac, av, self); if (ret == sym_invalid_byte_sequence || ret == sym_undefined_conversion || ret == sym_incomplete_input) { VALUE exc = make_econv_exception(ec); rb_exc_raise(exc); } if (ret != sym_finished) { rb_bug("unexpected result of econv_primitive_convert"); } return dst; } /* * call-seq: * ec.primitive_errinfo -> array * * primitive_errinfo returns a precious information of the last error result * as a 5-elements array: * * [result, enc1, enc2, error_bytes, readagain_bytes] * * result is the last result of primitive_convert. * * Other elements are only meaningful when result is * :invalid_byte_sequence, :incomplete_input or :undefined_conversion. * * enc1 and enc2 indicates a conversion step as pair of strings. * For example, a converter from EUC-JP to ISO-8859-1 converters * a string as EUC-JP -> UTF-8 -> ISO-8859-1. * So [enc1, enc2] is ["EUC-JP", "UTF-8"] or ["UTF-8", "ISO-8859-1"]. * * error_bytes and readagain_bytes indicates the byte sequences which causes the error. * error_bytes is discarded portion. * readagain_bytes is buffered portion which is read again on next conversion. * * Example: * * # \xff is invalid as EUC-JP. * ec = Encoding::Converter.new("EUC-JP", "Shift_JIS") * ec.primitive_convert(src="\xff", dst="", nil, 10) * p ec.primitive_errinfo * #=> [:invalid_byte_sequence, "EUC-JP", "UTF-8", "\xFF", ""] * * # HIRAGANA LETTER A (\xa4\xa2 in EUC-JP) is not representable in ISO-8859-1. * # Since this error is occur in UTF-8 to ISO-8859-1 conversion, * # error_bytes is HIRAGANA LETTER A in UTF-8 (\xE3\x81\x82). * ec = Encoding::Converter.new("EUC-JP", "ISO-8859-1") * ec.primitive_convert(src="\xa4\xa2", dst="", nil, 10) * p ec.primitive_errinfo * #=> [:undefined_conversion, "UTF-8", "ISO-8859-1", "\xE3\x81\x82", ""] * * # partial character is invalid * ec = Encoding::Converter.new("EUC-JP", "ISO-8859-1") * ec.primitive_convert(src="\xa4", dst="", nil, 10) * p ec.primitive_errinfo * #=> [:incomplete_input, "EUC-JP", "UTF-8", "\xA4", ""] * * # Encoding::Converter::PARTIAL_INPUT prevents invalid errors by * # partial characters. * ec = Encoding::Converter.new("EUC-JP", "ISO-8859-1") * ec.primitive_convert(src="\xa4", dst="", nil, 10, Encoding::Converter::PARTIAL_INPUT) * p ec.primitive_errinfo * #=> [:source_buffer_empty, nil, nil, nil, nil] * * # \xd8\x00\x00@ is invalid as UTF-16BE because * # no low surrogate after high surrogate (\xd8\x00). * # It is detected by 3rd byte (\00) which is part of next character. * # So the high surrogate (\xd8\x00) is discarded and * # the 3rd byte is read again later. * # Since the byte is buffered in ec, it is dropped from src. * ec = Encoding::Converter.new("UTF-16BE", "UTF-8") * ec.primitive_convert(src="\xd8\x00\x00@", dst="", nil, 10) * p ec.primitive_errinfo * #=> [:invalid_byte_sequence, "UTF-16BE", "UTF-8", "\xD8\x00", "\x00"] * p src * #=> "@" * * # Similar to UTF-16BE, \x00\xd8@\x00 is invalid as UTF-16LE. * # The problem is detected by 4th byte. * ec = Encoding::Converter.new("UTF-16LE", "UTF-8") * ec.primitive_convert(src="\x00\xd8@\x00", dst="", nil, 10) * p ec.primitive_errinfo * #=> [:invalid_byte_sequence, "UTF-16LE", "UTF-8", "\x00\xD8", "@\x00"] * p src * #=> "" * */ static VALUE econv_primitive_errinfo(VALUE self) { rb_econv_t *ec = check_econv(self); VALUE ary; ary = rb_ary_new2(5); rb_ary_store(ary, 0, econv_result_to_symbol(ec->last_error.result)); rb_ary_store(ary, 4, Qnil); if (ec->last_error.source_encoding) rb_ary_store(ary, 1, rb_str_new2(ec->last_error.source_encoding)); if (ec->last_error.destination_encoding) rb_ary_store(ary, 2, rb_str_new2(ec->last_error.destination_encoding)); if (ec->last_error.error_bytes_start) { rb_ary_store(ary, 3, rb_str_new((const char *)ec->last_error.error_bytes_start, ec->last_error.error_bytes_len)); rb_ary_store(ary, 4, rb_str_new((const char *)ec->last_error.error_bytes_start + ec->last_error.error_bytes_len, ec->last_error.readagain_len)); } return ary; } /* * call-seq: * ec.insert_output(string) -> nil * * inserts string into the encoding converter. * The string will be converted into the destination encoding and * outputed on later conversions. * * If the destination encoding is stateful, * string is converted according to the state and update the state. * * This method should be used only when a conversion error is occur. * * ec = Encoding::Converter.new("utf-8", "iso-8859-1") * src = "HIRAGANA LETTER A is \u{3042}." * dst = "" * p ec.primitive_convert(src, dst) #=> :undefined_conversion * puts "[#{dst.dump}, #{src.dump}]" #=> ["HIRAGANA LETTER A is ", "."] * ec.insert_output("") * p ec.primitive_convert(src, dst) #=> :finished * puts "[#{dst.dump}, #{src.dump}]" #=> ["HIRAGANA LETTER A is .", ""] * * ec = Encoding::Converter.new("utf-8", "iso-2022-jp") * src = "\u{306F 3041 3068 2661 3002}" # U+2661 is not representable in iso-2022-jp * dst = "" * p ec.primitive_convert(src, dst) #=> :undefined_conversion * puts "[#{dst.dump}, #{src.dump}]" #=> ["\e$B$O$!$H".force_encoding("ISO-2022-JP"), "\xE3\x80\x82"] * ec.insert_output "?" # state change required to output "?". * p ec.primitive_convert(src, dst) #=> :finished * puts "[#{dst.dump}, #{src.dump}]" #=> ["\e$B$O$!$H\e(B?\e$B!#\e(B".force_encoding("ISO-2022-JP"), ""] * */ static VALUE econv_insert_output(VALUE self, VALUE string) { const char *insert_enc; int ret; rb_econv_t *ec = check_econv(self); StringValue(string); insert_enc = rb_econv_encoding_to_insert_output(ec); string = rb_str_encode(string, rb_enc_from_encoding(rb_enc_find(insert_enc)), 0, Qnil); ret = rb_econv_insert_output(ec, (const unsigned char *)RSTRING_PTR(string), RSTRING_LEN(string), insert_enc); if (ret == -1) { rb_raise(rb_eArgError, "too big string"); } return Qnil; } /* * call-seq * ec.putback => string * ec.putback(max_numbytes) => string * * put back the bytes which will be converted. * * The bytes are caused by invalid_byte_sequence error. * When invalid_byte_sequence error, some bytes are discarded and * some bytes are buffered to be converted later. * The latter bytes can be put back. * It can be observed by * Encoding::InvalidByteSequenceError#readagain_bytes and * Encoding::Converter#primitive_errinfo. * * ec = Encoding::Converter.new("utf-16le", "iso-8859-1") * src = "\x00\xd8\x61\x00" * dst = "" * p ec.primitive_convert(src, dst) #=> :invalid_byte_sequence * p ec.primitive_errinfo #=> [:invalid_byte_sequence, "UTF-16LE", "UTF-8", "\x00\xD8", "a\x00"] * p ec.putback #=> "a\x00" * p ec.putback #=> "" # no more bytes to put back * */ static VALUE econv_putback(int argc, VALUE *argv, VALUE self) { rb_econv_t *ec = check_econv(self); int n; int putbackable; VALUE str, max; rb_scan_args(argc, argv, "01", &max); if (NIL_P(max)) n = rb_econv_putbackable(ec); else { n = NUM2INT(max); putbackable = rb_econv_putbackable(ec); if (putbackable < n) n = putbackable; } str = rb_str_new(NULL, n); rb_econv_putback(ec, (unsigned char *)RSTRING_PTR(str), n); if (ec->source_encoding) { rb_enc_associate(str, ec->source_encoding); } return str; } /* * call-seq: * ec.last_error -> exception or nil * * returns an exception object for the last conversion. * It returns nil if the last conversion is not an error. * * "error" means that * Encoding::InvalidByteSequenceError and Encoding::UndefinedConversionError for * Encoding::Converter#convert and * :invalid_byte_sequence, :incomplete_input and :undefined_conversion for * Encoding::Converter#primitive_convert. * * ec = Encoding::Converter.new("utf-8", "iso-8859-1") * p ec.primitive_convert(src="\xf1abcd", dst="") #=> :invalid_byte_sequence * p ec.last_error #=> # * p ec.primitive_convert(src, dst, nil, 1) #=> :destination_buffer_full * p ec.last_error #=> nil * */ static VALUE econv_last_error(VALUE self) { rb_econv_t *ec = check_econv(self); VALUE exc; exc = make_econv_exception(ec); if (NIL_P(exc)) return Qnil; return exc; } /* * call-seq: * ec.replacement -> string * * returns the replacement string. * * ec = Encoding::Converter.new("euc-jp", "us-ascii") * p ec.replacement #=> "?" * * ec = Encoding::Converter.new("euc-jp", "utf-8") * p ec.replacement #=> "\uFFFD" */ static VALUE econv_get_replacement(VALUE self) { rb_econv_t *ec = check_econv(self); int ret; rb_encoding *enc; ret = make_replacement(ec); if (ret == -1) { rb_raise(rb_eUndefinedConversionError, "replacement character setup failed"); } enc = rb_enc_find(ec->replacement_enc); return rb_enc_str_new((const char *)ec->replacement_str, (long)ec->replacement_len, enc); } /* * call-seq: * ec.replacement = string * * sets the replacement string. * * ec = Encoding::Converter.new("utf-8", "us-ascii", :undef => :replace) * ec.replacement = "" * p ec.convert("a \u3042 b") #=> "a b" */ static VALUE econv_set_replacement(VALUE self, VALUE arg) { rb_econv_t *ec = check_econv(self); VALUE string = arg; int ret; rb_encoding *enc; StringValue(string); enc = rb_enc_get(string); ret = rb_econv_set_replacement(ec, (const unsigned char *)RSTRING_PTR(string), RSTRING_LEN(string), rb_enc_name(enc)); if (ret == -1) { /* xxx: rb_eInvalidByteSequenceError? */ rb_raise(rb_eUndefinedConversionError, "replacement character setup failed"); } return arg; } void rb_econv_check_error(rb_econv_t *ec) { VALUE exc; exc = make_econv_exception(ec); if (NIL_P(exc)) return; rb_exc_raise(exc); } /* * call-seq: * ecerr.source_encoding_name -> string * * returns the source encoding name as a string. */ static VALUE ecerr_source_encoding_name(VALUE self) { return rb_attr_get(self, rb_intern("source_encoding_name")); } /* * call-seq: * ecerr.source_encoding -> encoding * * returns the source encoding as an encoding object. * * Note that the result may not be equal to the source encoding of * the encoding converter if the conversion has multiple steps. * * ec = Encoding::Converter.new("ISO-8859-1", "EUC-JP") # ISO-8859-1 -> UTF-8 -> EUC-JP * begin * ec.convert("\xa0") # NO-BREAK SPACE, which is available in UTF-8 but not in EUC-JP. * rescue Encoding::UndefinedConversionError * p $!.source_encoding #=> # * p $!.destination_encoding #=> # * p $!.source_encoding_name #=> "UTF-8" * p $!.destination_encoding_name #=> "EUC-JP" * end * */ static VALUE ecerr_source_encoding(VALUE self) { return rb_attr_get(self, rb_intern("source_encoding")); } /* * call-seq: * ecerr.destination_encoding_name -> string * * returns the destination encoding name as a string. */ static VALUE ecerr_destination_encoding_name(VALUE self) { return rb_attr_get(self, rb_intern("destination_encoding_name")); } /* * call-seq: * ecerr.destination_encoding -> string * * returns the destination encoding as an encoding object. */ static VALUE ecerr_destination_encoding(VALUE self) { return rb_attr_get(self, rb_intern("destination_encoding")); } /* * call-seq: * ecerr.error_char -> string * * returns the one-character string which cause Encoding::UndefinedConversionError. * * ec = Encoding::Converter.new("ISO-8859-1", "EUC-JP") * begin * ec.convert("\xa0") * rescue Encoding::UndefinedConversionError * puts $!.error_char.dump #=> "\xC2\xA0" * p $!.error_char.encoding #=> # * end * */ static VALUE ecerr_error_char(VALUE self) { return rb_attr_get(self, rb_intern("error_char")); } /* * call-seq: * ecerr.error_bytes -> string * * returns the discarded bytes when Encoding::InvalidByteSequenceError occur. * * ec = Encoding::Converter.new("EUC-JP", "ISO-8859-1") * begin * ec.convert("abc\xA1\xFFdef") * rescue Encoding::InvalidByteSequenceError * p $! #=> # * puts $!.error_bytes.dump #=> "\xA1" * puts $!.readagain_bytes.dump #=> "\xFF" * end */ static VALUE ecerr_error_bytes(VALUE self) { return rb_attr_get(self, rb_intern("error_bytes")); } /* * call-seq: * ecerr.readagain_bytes -> string * * returns the bytes to be read again when Encoding::InvalidByteSequenceError occur. */ static VALUE ecerr_readagain_bytes(VALUE self) { return rb_attr_get(self, rb_intern("readagain_bytes")); } /* * call-seq: * ecerr.incomplete_input? -> true or false * * returns true if the invalid byte sequence error is caused by * premature end of string. * * ec = Encoding::Converter.new("EUC-JP", "ISO-8859-1") * * begin * ec.convert("abc\xA1z") * rescue Encoding::InvalidByteSequenceError * p $! #=> # * p $!.incomplete_input? #=> false * end * * begin * ec.convert("abc\xA1") * ec.finish * rescue Encoding::InvalidByteSequenceError * p $! #=> # * p $!.incomplete_input? #=> true * end */ static VALUE ecerr_incomplete_input(VALUE self) { return rb_attr_get(self, rb_intern("incomplete_input")); } extern void Init_newline(void); void Init_transcode(void) { rb_eUndefinedConversionError = rb_define_class_under(rb_cEncoding, "UndefinedConversionError", rb_eEncodingError); rb_eInvalidByteSequenceError = rb_define_class_under(rb_cEncoding, "InvalidByteSequenceError", rb_eEncodingError); rb_eConverterNotFoundError = rb_define_class_under(rb_cEncoding, "ConverterNotFoundError", rb_eEncodingError); transcoder_table = st_init_strcasetable(); sym_invalid = ID2SYM(rb_intern("invalid")); sym_undef = ID2SYM(rb_intern("undef")); sym_ignore = ID2SYM(rb_intern("ignore")); sym_replace = ID2SYM(rb_intern("replace")); sym_xml = ID2SYM(rb_intern("xml")); sym_text = ID2SYM(rb_intern("text")); sym_attr = ID2SYM(rb_intern("attr")); sym_invalid_byte_sequence = ID2SYM(rb_intern("invalid_byte_sequence")); sym_undefined_conversion = ID2SYM(rb_intern("undefined_conversion")); sym_destination_buffer_full = ID2SYM(rb_intern("destination_buffer_full")); sym_source_buffer_empty = ID2SYM(rb_intern("source_buffer_empty")); sym_finished = ID2SYM(rb_intern("finished")); sym_after_output = ID2SYM(rb_intern("after_output")); sym_incomplete_input = ID2SYM(rb_intern("incomplete_input")); sym_universal_newline = ID2SYM(rb_intern("universal_newline")); sym_crlf_newline = ID2SYM(rb_intern("crlf_newline")); sym_cr_newline = ID2SYM(rb_intern("cr_newline")); sym_partial_input = ID2SYM(rb_intern("partial_input")); rb_define_method(rb_cString, "encode", str_encode, -1); rb_define_method(rb_cString, "encode!", str_encode_bang, -1); rb_cEncodingConverter = rb_define_class_under(rb_cEncoding, "Converter", rb_cData); rb_define_alloc_func(rb_cEncodingConverter, econv_s_allocate); rb_define_singleton_method(rb_cEncodingConverter, "asciicompat_encoding", econv_s_asciicompat_encoding, 1); rb_define_singleton_method(rb_cEncodingConverter, "search_convpath", econv_s_search_convpath, -1); rb_define_method(rb_cEncodingConverter, "initialize", econv_init, -1); rb_define_method(rb_cEncodingConverter, "inspect", econv_inspect, 0); rb_define_method(rb_cEncodingConverter, "convpath", econv_convpath, 0); rb_define_method(rb_cEncodingConverter, "source_encoding", econv_source_encoding, 0); rb_define_method(rb_cEncodingConverter, "destination_encoding", econv_destination_encoding, 0); rb_define_method(rb_cEncodingConverter, "primitive_convert", econv_primitive_convert, -1); rb_define_method(rb_cEncodingConverter, "convert", econv_convert, 1); rb_define_method(rb_cEncodingConverter, "finish", econv_finish, 0); rb_define_method(rb_cEncodingConverter, "primitive_errinfo", econv_primitive_errinfo, 0); rb_define_method(rb_cEncodingConverter, "insert_output", econv_insert_output, 1); rb_define_method(rb_cEncodingConverter, "putback", econv_putback, -1); rb_define_method(rb_cEncodingConverter, "last_error", econv_last_error, 0); rb_define_method(rb_cEncodingConverter, "replacement", econv_get_replacement, 0); rb_define_method(rb_cEncodingConverter, "replacement=", econv_set_replacement, 1); rb_define_const(rb_cEncodingConverter, "INVALID_MASK", INT2FIX(ECONV_INVALID_MASK)); rb_define_const(rb_cEncodingConverter, "INVALID_REPLACE", INT2FIX(ECONV_INVALID_REPLACE)); rb_define_const(rb_cEncodingConverter, "UNDEF_MASK", INT2FIX(ECONV_UNDEF_MASK)); rb_define_const(rb_cEncodingConverter, "UNDEF_REPLACE", INT2FIX(ECONV_UNDEF_REPLACE)); rb_define_const(rb_cEncodingConverter, "UNDEF_HEX_CHARREF", INT2FIX(ECONV_UNDEF_HEX_CHARREF)); rb_define_const(rb_cEncodingConverter, "PARTIAL_INPUT", INT2FIX(ECONV_PARTIAL_INPUT)); rb_define_const(rb_cEncodingConverter, "AFTER_OUTPUT", INT2FIX(ECONV_AFTER_OUTPUT)); rb_define_const(rb_cEncodingConverter, "UNIVERSAL_NEWLINE_DECORATOR", INT2FIX(ECONV_UNIVERSAL_NEWLINE_DECORATOR)); rb_define_const(rb_cEncodingConverter, "CRLF_NEWLINE_DECORATOR", INT2FIX(ECONV_CRLF_NEWLINE_DECORATOR)); rb_define_const(rb_cEncodingConverter, "CR_NEWLINE_DECORATOR", INT2FIX(ECONV_CR_NEWLINE_DECORATOR)); rb_define_const(rb_cEncodingConverter, "XML_TEXT_DECORATOR", INT2FIX(ECONV_XML_TEXT_DECORATOR)); rb_define_const(rb_cEncodingConverter, "XML_ATTR_CONTENT_DECORATOR", INT2FIX(ECONV_XML_ATTR_CONTENT_DECORATOR)); rb_define_const(rb_cEncodingConverter, "XML_ATTR_QUOTE_DECORATOR", INT2FIX(ECONV_XML_ATTR_QUOTE_DECORATOR)); rb_define_method(rb_eUndefinedConversionError, "source_encoding_name", ecerr_source_encoding_name, 0); rb_define_method(rb_eUndefinedConversionError, "destination_encoding_name", ecerr_destination_encoding_name, 0); rb_define_method(rb_eUndefinedConversionError, "source_encoding", ecerr_source_encoding, 0); rb_define_method(rb_eUndefinedConversionError, "destination_encoding", ecerr_destination_encoding, 0); rb_define_method(rb_eUndefinedConversionError, "error_char", ecerr_error_char, 0); rb_define_method(rb_eInvalidByteSequenceError, "source_encoding_name", ecerr_source_encoding_name, 0); rb_define_method(rb_eInvalidByteSequenceError, "destination_encoding_name", ecerr_destination_encoding_name, 0); rb_define_method(rb_eInvalidByteSequenceError, "source_encoding", ecerr_source_encoding, 0); rb_define_method(rb_eInvalidByteSequenceError, "destination_encoding", ecerr_destination_encoding, 0); rb_define_method(rb_eInvalidByteSequenceError, "error_bytes", ecerr_error_bytes, 0); rb_define_method(rb_eInvalidByteSequenceError, "readagain_bytes", ecerr_readagain_bytes, 0); rb_define_method(rb_eInvalidByteSequenceError, "incomplete_input?", ecerr_incomplete_input, 0); Init_newline(); } 4i3\'ClLЕpl: 2,(t R) An,=0t~RhrI <b6ʎr`%$0tw+n} ])^|v5*\nyB]ݶ%vQO6@QoRݮW49A 4=\hJ}`e:p*u{f-+) uhĄ0|g)'b{wxE_V @.s`Ju{YV Xs= o+:z}*i,~3I>bT)~e i/AKpBޓ1B㟁-'Dao9h#>VC"7T6^4ITw{v꿆:˅Q: XhcJ%/x?e&sNM! dpE9 ¹ib_DY: xJM5iG`ۺh{c-ypGބNd2w&C]]zC8⹻G6VgmsڢnV5 4jLܾ|tҵDEaߪp jgPDQ4 a?5͖ z_ˍڅO@:0 MQiMj'I Y~hO@ ߪs Q㏖)|^/r\3[R¨4 -c9F}lB;Q!P$1:)yDL|NOTvREyG`ZfW'0~rᑗۅ"}pyJٌ o$EZ!.5-Oh{jL-L4+PQq՗<ۿ~,xZRt:ġiq0Gr+QGt TG\5oI./[lJ7e.Bҕk-2\k~I\XytHnc1*J Hy ;8@͏"~gn `gv k<9]2O"K YNoQq՟1`ݰ;trw]%J_cSwJX:Jۂx"b x>SZE|C4JtE {@R5Јms.\8K H7(^C؄<;=5T|$e16ks={ig$!nQ#o8hGr崯˷m4W q7IDj2o- o 7R&{+$B2WWG~ ޱL!LT?-y ż^y' /ݤu`y"3IeLoe#3`  eKRY ժ:@&@~}ڛC D6BF\K1EU2- ϔ?=٦]p!P-_hGPtUxks_x=9*!2J+j-DRR399뮊UOAGhO}'fȉQ'4(TnķKh.@mqs8Z#5:}Cn5a~7u+=Fh\w剤;p\X- C0 |H, ΜX47'u 2MQE/+ Tc",K] /r{J-i -:ٚ97ax;c=K85üF} QFS9J/Ճ}R2 NYЅbF*boΎ3XX>jL-ޒmU L`޵s '5e;xĩA*UCZS"ЬaKޫĭpZ̢hkR"1׊yo c Z􅘯@ԃ#HlΉSzM4>@ĜG͑abH„1Usx.v]Qyjx߆cÑp]M3WԛyϯǪ&+x~F.Dvq5U-ݸJx~,GV='rՎJ5Сͻ̐e觔!ӲbGN(ϟn.e B /Df9ù R3 oq& 1Q6A TWPbcRCboeB(.?]bCG* Kʄ6lЦKx<S_GcѰ߇H[q HF.@8z '&{.չDhy,vAI`}c?P>\VhG$~`!(qqߠ.r4k97,| fpXA7¶=|Bc94ҌNEZJ}Z|--˫-?ݬKg | 7"q1 .7,?9htUjEУQϨEV"/T֓D}Bf$*AǜU!.*haø9\U&m<1įeij&I[󏀊mkћpJORĿ0)LD[p1ͷ5F4s5Bmͳ0tX^\$^9T(g]8SB[XHkkgxJRgZK螦L 5ɫa}^_ f|O-e 0IgIip\/~ΰ9$k(㈥jIqzm-ӛJ)!tn_%.;ćrX!ZiVJc֨E+[$Y`]\̊^rA9#pjC+qQ*\;D J"f: )giz(IjyM-qnq@Y iF$]Ơ@Nŵ]Y+u/4H\$ *8Q,}D!s^P8nk&DI}i()@Moi~-Hu@T]R+wīz-|{epo Twlј0>lզۀU3} )^EUa'N̷-ky0ƣz J>o+܁/ϊ).|7WLQ59!q,g٫L;$@tzBcDmG!`b,Ū!cyмy?="}8^B], [o#eSh˖}!P*zNgJ8Cwp87=j#ZUy6>2X(@U敌F90o˼fz~ A`ᙴ, б@GaQ[%IwtDPN DhS^s&]cdEIZN :z^Stz;]cqqcB(%¨B $jtşG$nգ%.'u.e}\-0F &kI(5MhfOƒQ2hT2ޅVH^k!>5b3hYz1фϒl&pzs@Cj&n_=s[T>+}:</~ѯT~[W&^TKzLֻ¾|[8Z0JCr{^ Ycyz8ٴ}vlKILՒ=ٮ$ 45(Ԁ4LUşF77NH%vc/j ^m}Xu L&xi$9B@VNY3LLA+"e<35D<#aÇ"psfջ0I`Z:٫rTOL1(F`^mp5XQ$ak#'%ϯ&sh"l§HK +`~O0qՀqAI,Ή^z/K&Q?h Tf*D*ZZ?&%bqg1Qrأe?]2#A!; F&nS0@Dz~ zۇXdiٗ@Hyjk051md T|4)tTmJZtY# o< gabZtߨM]#3ӑg;`2cߍ`vD9WӇsGe{"Rc,!;y$p82h;垾P n%(;T(f Gҭk"b`$`щ>Iu,Y x;4('-圿)>h : +e:d+Zy;2W&kK_]/&r_yn+bV9?}qJOX,e '+1Ᵽеo>FD}"FMT]?H(%$EVXup&[n5X1X&zvT9ӳcaKRt)T~^ pT`N>!*? ;W :Mrih mdk(_/bp#XLHgk"~%MU H_AM<' 6źTx)Yp54MxK ?ZB=*6}`UU'7x*mdPŮw|Br%X 1|;d3TcLvSB?3l}N1aR&q[yre漲\}q*۔1 _pZd-4Cjg;Q4\,btWڻj:F0heZFA"v_ 'b"} ~` =+E:nnRt@S7Qwa*VV( ?yvTQ"qí32OIN3ixCY[K07tW3eomt3͗47#;hSekTL;}Z,EI$K^3  6z-mo甀~6ro|n8jD Lvi}1nB6ۮ\hMZӀLLU3|?VR> |e˕ҶpiX˓)>rIΖ3sslDQ$7mtM^jjpGF (5a==usݹ $ܹWSv?8HD63`WcgA5QéRT_l(~mPD֖[6Fb_q*ցY 8,^לyx<0gqR, 28콩*֖4FaC \YtZPRUX_ .FZy;W\D#`rtIg] x4F4h?;#D2k~:%Ѳ_GCX0[IXeЫGK33 1bg$#t]^zç+#[ڑi&_S~6hz*6/<7+ivw̛PbA<J[j 3e,87S!G$D> +쩼:,YNl-Ci%CuI5r3$<&W>7:8nSEftǚ_J}"i%)vMWsg+~s͔ ՙm@S L$e4{Q/L,+;F+p):N2"6AV: *ij'MW|SA/ԫ)jl?ɰо}f >LF*Hġտ=Cw?~L!T᭘ZTs"JM~P* +Mo@Gp{{hz=a(jT-C(w#0<Е&c]IŽэk&WW.Q^sCD iqt"QI[ٰGS5C,5)d*癘+U"NGnV4_v6G .Dߊ\ApGjOjQ> !M##I/n(l_i`ƗJ.݁SuM&3$o[9M1sK}oٖW20_W _GTvxBa<ۣX@qPԪַ&ckc1T@ = |M;g1C@ L8bnHKZ~eohևmk20?( OOUo@ŝFN GP!E4D.v: /7|#Ai̎Ƕ} U@Ʌ%#[ש8mdVX|ܽ\ؗx|cOi!~0ԔP[(P)x5_4I_+aB c;ׄlujҝ,ajlc ToErMāp7 k{,ko3Poz+#y~JeƋ̄J!uЉKKcBpʹYJ' o>p2vjXѰ}D Da/)WRxBŏKxi I郉&n#zZ*g2jofe$x ,OO͗woON17 v3`5?Ɛlx.s ؙj̧̯ρJMLp{*W6>,EHI% aX( ـxe#ܼƍj=q!e]F<4XhҘu. ,穸V"g٨/w ș?i)Urg7NE G$}J3{6Gб< xyV],Ǹ)Pvc_;y;̡ ; ɟZкv.}h[53K;eP-OЯYS'IHH2,d $5k`& j3V)1vLP^/9nTu+EsD%B Ҫc9M`x@basDH\MpsXXҾӮ(WYV?z%*vq-8g\C4HrL#C+n_?OqM}dG,HM%ȞP[l\T_6j\9@+<Ǣ4]q-.h>/:e-7ޕ=XMZf^Pc*[ˋu"{ꂔL pH/SikKqNQ+Uّ_S4貈?F#la& ?0hw 'R3.<IwA Gjjz -מep>2jP?ˑh3`a=Xq)„:ϒˆc#*J:jdžA(>1!fUh@ezUћ> Mӄ\v>uڟ bn;D#~Қz8!A^:q3%@${Ͳb<\ƾB8 WPA4OW~N_|P@ktfQBk"'zNA*\'jPGvK7IlK ?U#k-gɶd+4œֆ)[f-Qrݑ{]F3w ӍzAO ަ !dn#0s2IÉq^-fXOi+ѐ"ּ[mb~ٚJ?-i_TA뇷5pMbcg<1ˀGG?Ύ{HΑnѸ/dbxDu՘cɷ8A qW_`"ڂ|@cu3z.6+ɜ/??v`NЧ1-Qn0F3R(jY+!d' F۽;6wk5 O!wb1k|WڰVͦ%}SթǴuWX(f [G_AEڱFO㹾/&Ҩ/fsvkKqܑu6#`MgeU5Ri8[%t)0A"N9-lD ,%͠8 Pl+pu"rb!v6J9aaØ5ior_Tsj2LpQ /:20u2J~Jl^MUC"R2bc0DJj8孕2iYW KI+>M%+yP*wetpS"olYrMn~(Qu~7K(KK0-@"DqCyi fLFO@c'(9CU5c3XD`Fl3J/pןS׬ :pQ-P|^Zټ"2H^r W10U0f('d̠1`z*^D+9,Ko9S駚H HY?F5LD~P^ E룒 A~o]Jr|ߡz"I?, tw FՓ}9+\?K5\dwm`\ S{,zD2/Q$Y-+[-D>fk>8Q6jW%l{%+yda󢥣ڧa_gY {KcIAZ`c)3 %6DŽ~S9_;>3$e: {WG$_[Jjkh]am VXPz}(QU(okӊ&[e=ZҜ8B1g|?\?\L7d'qw+(3 0mnbt}hގEߘxn_!w f1Xhfg'ibˏI"K͈Gcd)GP{Md+hw!)<}d)77.ۭC!Lh<& 2P+Y ?ϝe@@ϰ/¨Yِ# Bh;l*,P>*>}ܿl`. RM:Wm ѐ1Lw]/?G=;FI ]3F!p`r=7->$GRLD#|w4(;E&-ӄR!g8{&6u+Dߤ|S=(68H(]G (J^cRڡ 8NyyS`@Nf]słɳG: Gd,̠6Q;nnΥ ,Z@k?A嫐!FXC1TZ~;g&6n>[IcYV|*&9Vd*&S(%jI|xD*h{Yi [K _²X 'i?O7\b{1"u S*Įnf ( l1qW\#z@VOmaK%Ors*/٦_vRHyYRڭ`RKW[r΍2 jf@`}筦aה&1t/u$s|OxAv7svg\g.s)Ϣ洕߿^t miFOanOc$` p'"nyuEXiR"3($2q6I}vO 4JB K\c*Vʌ-LydpI7%dDO7&Ɉ4e| rwx##y=p9G>^Ƀcl!}^f;ʳ܆co6 oq Ys2jQ {V[X+Ag?aKc}?9sMp^j|Ky ۗRnET21jĝ{L+Hl֡"pFtU.cǔVmw? h҂Jڇרiucv=UB23*ʼnKS@/f0nLENJ9Hgݲ/|B^Rc`&K+pˮ)ɏfАc~#rmWuNo-`0!27.-K+3uv::{Cb tn.VM?^ȖW<쀓Rc%X=7A8C=ܳ%$Yw#:מՍ? ɈccP I+E̅RXXE3XwN"76YÇg (_K߶`]M5Rw z(לo+L),_=hЛݮ C i}W z;j)ksj!on\=?Sd2x' ,{kL9yںYO۟} WdboXѴ]DiA] Ƴ]a$G=aCfPv2U]Gt>C KiW'N-~.{8{ݹ0% U -#3j(lWvH[)d6$m%n=-0\DGށukWCk]uftKe龿gY]m\#_E]8'QKUO ^/OQ3.kW<#[.j7hLn,kޡz‚ٗfcj( Qzvvp+R?9H L%${X&D`\Mzo9T=p7iծkx d(*AEHzp8T؁?*?ea :6}ػe-ǹn]-9^AĹO/_ ]Mč!ݡ-yP*B|W@:Pڵ2^e0&:􌓡W}HRj.֔$o.,#ߚQ^N>Tݚa¨*t_XgJq oLbm}t'- >~u8'YLu!;EcDŽi.;av7۰*s4d 'GE[wv ?dxV?rsJW|DZ[@װfݣyI0ˇ^flЦxPxM]$t(l)j qX$ f1!Rd`QºMC}XaNvwGo?@Qt..ܹY?'&M8)Q|!~a2X 5wo+N{W3N`2߮_aܕܷAZ:y{/lt$>dkpBfu@dk𹳜]Pl S-j =ȘhcGBW@6}(jDI=1EXSZ!X4ж^J8c_%Q*I))`C=Ghe`,93S*Ж@j)^^#0şHD#K$}cJ}ˬCޘR36yN b0yv@ Ĕ.U,/W@I!p$1EJ99o󭀽^NVˢ @ONt(eq=hEizGHrO =Vڷ,ൣgE!tK9A/픵rs ?a=f~_* "*FRvsu߀`-]c%ʏ+,_9TrUAx;4 G[Y" #g5 HRz,$"} )qф,4 ot Q迟l1X5<|{!IwU稪U AHwBQB37۷!]a<pXYEs? HAI:LdT8n $b2k`㽌~TSVDzP4<(:''# E+; IU"ʹ qwb[rJ[et`o?5̏l 69mÝTxpߑ 8-2Po5S\3z;w G_" +L|/~D@+v3;cm;JX%726_røsGSI Dn92"s,Iʅ^e-G^VYi! Fj-(mijpI uaAM6pzm>7`[B9oߴGVBZfX[1{ R|2;WdiT㵝,-ڎy$p7I=:-7tƈ-= =n?Sh+a4J"үf˧>Peኹ.GferӴ1A);L;JeM?a Pү^u;QL|5]%'4&e65'f0yAFsXp?|9}f屐f=7F9ȷ U>.,؎\~});7xD'ˤ s}1(5|u+20M@hy#4K|Eޘ^HԾ̫P@ 4K扷'Jm<@-?]j$5Z#dyɸDL]6 $kQOJ2|T{j98&oJsvyQ 6zE4*C2i|t=yhW-E:8ظd2SM%Wڙ +_ْFu~-o2Iz+R ZI ܲdRȅ@?zˏ;D,4] :")d:UդBpHH\_n0#WpI kMXʠňL|-(I?+W`g)7Dul6J߄cSŢꖖ[c5[Ǎd`Z?1Ue6oĎLX {[Yn[ }ף9:^XdU8iY~wّׄ @,YAĘ/WM9ѽYBNr37(*  L.wE#b1+rQ;`j+_=5}o.~PeQvFh&#u%5B{?!WȧpaRu"\r;$:?0 _H+_ *sb#-d;JĤ6eA؀LD"X8~70. Y{?Ѓ@DuUbֈoj%dD0mN^]ej:=%{-BpVfA;+U~{XxUء|_'d"]dn6k?qٙ6bR ܗ d7/;Q&P̰i `Ipt?G2b,r}(xJD̠(/ ~UlZB4G c ebCZ_qr%җzZ PT:ale?dF HW3u7D-7fAw>&L4L \)Ġewmor]@{J4f|yCID"f,rL>'R%%dB/rȦ<ꕎfq4!{烩)Z/W!pTfM A,V)>=v|Qg'nN HS-\ 'B/ѱ9/񩥵 VVf$V~7ONU{p5I]LLy 6ǼEI-YQH wUgޜDnw?_ubil/Sstaٯ׼DKZHMؽh<;7gV+BV T+Ĥ-\*$B5no"-ɝDO7h1p4^=3\.FB{/ui#*u ds{J& =4`\Nrxl ;Faz/k3PmU'} 0~#^ V nJ׷zOdp^{-V4c~|@&ϽVuyi-=OK7ٵ"(MxqS[(&$3:zy(Z8[YHqy>-Q;(c؊LgXj nemf0WK;#.m<di/rpxݪ 8jQ0 }Ѥ)ʙ״ Bc*?Ʀ<)ƞNZ0Y;Yvz0p4t՘:gv*7rlbw_`!j XAO Xs@_j&SϤߖ)TN5؊W_=IIf )8:G7ڀd߷<([..V"R~NrUqZ&m`2 qqmJugF/ gL諥k9bЗ5)a:֦u!Q=?$6ƺ]dD!YTWRR#1K^FywMpH.bu獇"QɆ-O@~z(kc£?tfMD.\,r=AEn@ =$uaIxc~00јr"ӚT} l\TswMP d=`q割B\6k ;7YªҾᐋ Nm˂9jCnj*$w\!xO eG)VdaS!N3:߫(CEܐoma 5R0FPmL.^΢ -Xdٟ(eKv$L]Tx{եܭ_M.?۰' uSQL%(t3dt[De6o)2 |Ҿ<;u<uMޏo ݕ:1^?Vob,¾]yCn3j+R´eR&<}\zn BpޣQ\>O8&W;EI,:*Uҥ&V˶}0fӀu ©󙙄 0gmQWn@8UDp~H =w[ɏ0UC𥚻q{Nn_+͗ɁJJ:887K݄&/g{P]ֽ"JIvyOgě51ᙊr?V;an(9\l!ʌF)"g]0M|?2hC#5I-@Nvy[Fك*rjY @]_luSK+Ḡu~@28X0 &uOCJ&LO 9bTpedxo$T6VWQ:^  ]b :Z nFq#`hЫABB.ij\xGQs,&*.}7>K5aSXR28|/ _Rk1W_w$!9.I;ju($941#{&>mU!-\nיzŏt6\[ t>K' L 4Ξc,YWgn&UgJ-&L! 5YgU nI]n| 9,v8Bz- $v=֔J 9&2JZGjGNlM3=8C4Y"(Dsw\^Gos7t97XiT!БuInMR#\;zCq6ʤTjZHwad^GW^{hԷO(Bq6[ + Ҫ3F,`qzvpq$[?b:AEtW̷ 2O{v=|?Yt#<!b 1ލzU-e@ :b`?zr rhg5H,a#k$Æds9~,' ar ڢ'S]sv&! D(X7]M\izy4ʇj:^us^bqP~lm >ԽABL\$iΨ:cLD6; ^h<-|p'F_/TCOP`٥kf*zcW(SŢ@4}K\]2M6)/4[`o4h{ d͞d.T;a> G*IȮMD~{^b[9 6OxM@B?pT/2HE2$iayNWcg-kPEazMRw™( pMqvGL B.OuCc Ɠ_K<@Ch*rظ1WOVIPgtұĜl$rYcW!ðLzxrEf{Urz-Q~b 96TGJYJ&#jNno鉜 .ɽ#ڠl'CT*$&ZS1@c*-AW+(e鵃W$2Aa LV#6=hHOOQإ{LEӞXw, vUti7fj ޮkYY3sDtݳʲP4MƾHGAZ_0G!Fxk21#pUX=/˚7ݨ<9hannWSe0u֐u:@jpNr֞Ƅ[2f-3(;BC]*H DaՋwN?=['7N+TN vQ$bU a珬͜WHX[0 +q tZkP_T௲qNى;S?40v턔吴](1!tKxR1lCn񣎣Du&ԍ=V3lN _w0zo6 4@j䈞cK?wtv_Up`n!{8WMZ/6=wx|{bfqr_p?y*>dEo̡JG>6%}͵d1 y#Dh(V% }sP<}Awi ފOxJcg7Duu^T[HoI~4HkIpShGc qp`< ,](np  d֐$\Z+ $/>;Y4z hӎtJ'܌f59:ޱzB ĹfG LIxIW)3%tlwg,(jwb wYmPP#)/E@Ida1AN)?Zꁮ=Μa)v M7D7i(R@Y:y7+ pȤ[P3b}Mj|$ՄkaF}r b_DW/Dzv0?@dz=El&1E73)cxJ";W$ŗ&L^OJsbv)DR}{43rgvMwj|y|`$|maD:`T7P#p,oZ1p{o2pkMk<Yrjvaz3rќ|8y`n ^ t>f[.oJ~hm: RjZnqt!W# &jŜ17++T#ޙ$5VR5NPU4*}O'hG@VM'z&s;@ b[Z_ 9v7~' &S !RWi]a~ݒe poBnUk"i~F; gK7:6ו_}L >&jU(y=ΨT )rx%lr'T( O_o@Q߬U TM  /XTzԳ6JϔWagSԃ.m: O{Y<Րt2},,i}tRUcDbJ@/)a])&Ҷ@ v[3WXUEB&r<:?% UKQҼHPG Ѣ <CTuh%("tڻenu<yx ~=#lrUZfb-* GŬW="~{TM s^f(ct)?A3دG 3@roWam l{?QglHЭf7uٗJ8`yl35&(4xIԡs5PO"26ܰZ1 3`ogůsJ&@]Tğ7~xy}w1Amo} SL1Xs*%lZ㞅r)y2:"Y7؆#A+Z IC {;9jF~GG#nR.ܨBZ*߃ԃ~썘 D[rb*O;Zyi2ϻզ$%SW4<2yёRg+͞:1UK/ lN_G\8Im;>JKEwa +l,w$71½Mj yݹa3\0M#>' x7KIckү90ZP&(Gո&C߰,x+GZPsŻJ}(ĸXՆ`t+ 9l}>$+'gq k쁱#&z*p ͟? 5Gʿln$;y Yi0W>O@⵸= ûS9 'e8ݲzJ块خ7*=OX$?8( 眢.={7ؖ}ZFb㣑ɘ=uj{.vHVvןY.Ot B̷R1UW!T#^g5}2mL[UnDT^]T(G zᐩ^2Sb.{cle :) 4rzɷG#gުrehz3EIUh%ţʷXuBY8]\tJ~_$u>"P1LhaZN4_],ԀNU׍Z =3T aQgo!gςY_`[+z xtc[VyiFRx͡>tq=|d,S2T-1M[jAZ4^?ڧhم:@&? 's7lK [F=쳏O48$p^6D {U)i Һ̊E³+i ڼC=5K#))b5iyBaJ>x:OfWOBC/gue ##)znj*BӁVv珼`^{Vd16RVbr6ߦ]8{c;p+ NA|1z+T0+sqpC W*7y(` kˈ~iE2:x!fjDwK+Y[uH[bj/KNC) r/>_Q'ˁul5&T6I{X9`u1tFr&쀞Ӡ#}#P9אo /ts='M @LB$PijLI[M7bmPT'H̦oo;YV% Q*з|p'2$X&e vh񮀖|7'ʼn D,R䮥h MtOs9 ;8E3Z[X8"{Al?̤1W J^?Է,/q<*#Lˁ!YDY clmVEW6qȿj=:i!9(n0?m}}]P&:r+O'dk?FXI١Tn`%< \t!bYh{* Le;'TnUq}ocdŪ;h^}!Ƨn4+ :IB] 5Fzf(GvÃwMmMzZgHcDnL`*~NS lp!qG9_hG||'$YVŪ]l! a!Z8-ADN5{#1*{DF+N;8D K`6i>N; a-djH |8!ۈ&L&Z6 dVdEP|;!,Ђ_~q6lw>oVhy@E@bBS7XP냋*&C|4gT!3[.h駅l7ehM?&z|h6=*:y=( $%A3 @mw1_)cϕd9ʛ3\\wo#UW#OC-V@(ãckgmA;*.6i^,c}od`؂0>B3Ok2QA.n Fx1az̵*ۻ)sx?4gGiYo٢2n;=2U͏ߕ5Dm=TC7V$ll6ƿ ;G]#>헡q,<?&79, p)Rhbw˭uƝ m l  .Jq7uؠM'YFk }CװD -VߑG)aa.LSkJCM.-HR0\TRƿ TZiX;u361ˮz3rgJߝ3d0gGcؑ( KXy&iypʢRu #9YD}\A#Wz+ziJ6PQ<4j專a-@׊q܍IE~^sġ/F(Z!?BNUr T=;dZ\.>FN 0?_bƎ0N Hr 9kb3:IEb9Qѫz+E渱7NI 0]Nz!ͤ€1$$5QUr5 bH65wj4;cW8W3U6-Qeb̽@辣?L@hz=9)y$V5՛Ty1$k~ \΄N%5NPNd t3m%FJΊ~oafFw S|I488h#&JgÁG׀v*xiTv\~dgZF-߶15#qdg9ˡ?dkby ~h=Ȩ2)uy67}x7rkGcRlN w6sXYu{/t6RGWQlb`|FŐWx79nym#l80@m\gc_ g%:g8Ū;-i# ^+ҀRzFJa(T.2"Ut164̜deaӈN#oW#` ρo9EIpQC|UV:c:t @!0`O`0tպ>ME08 kڶm0|ڙ5*K 8L:t%avxe]L€{1:)bv%=VC!CŭN&>ݖmO=X9wy(3. žeV_P%+Am_p&"a3Z!K^ D6I8q[bwuїRZaw/&?i)_ޙgQ<ڴ0Bn" KBvUT m7|_iXgEM]k0(t?1>[[ Gs36e`u3)+Q1CīWzx1M)(-@%EJ]SkQIu"tt6 @8hj71'#=6T.Md좜Vi.7Is5("&U6$9^u̫$ƨ3vg`uVnG6AL@Q)1WTr0-,sM& ]i ҹ@\fw6ƒ]BϘ)hYe@UBԽP7.}E6-APy9(jI~ pxJ-2W"?kĠǂ'CtdcˋN6,1,}vtNju`#yK3QMM7Q  wL|a4hI9S`|w@=צ||XEeA5pϭD#P0vkIRiUȹ9?4">z@}-|Ȗs1Q+kByatW9)9{X2: Z[*(z$]i>@,RڻךK0oNw?x %gpApZ[zx/ny E +~>yqNHyobz}.boQ ;4~?Loؽ3q$F 3?ʁB< X6:қ$OoXR{ߥpG{d;k#2U wN=IO=tK,Vf/zHVX;}[PrkT+µ|MS;V.7Znr`\(5*5Aϔo׽c14IL3AZT#0U`,E#ZSujSl81+\>է|Z0+'<"@=]_0g ezyspCQ v 5SA Mݹ>߷QcS!Ţ`_-UK)uQ'nJ 0BCͮH Գ *ىQFFjѦ@$qGabTȭc&͋(/~s!Tb"*:}Lr78#tL]YJl/lA3Bgc]yO#gkhO!л><#-4J#>iĻQ1 B(\$ &{:FBbSS>MC[0Hv+&IC}f:tzQ!"47Ott۸쐭A~0р` INtns4{Yoi|F8THTGlq rZ!̟矧0{+ /a"ʹey4"B蠵Kfz/ж4-\oDz Yz "lObY,&6;Ai*e+Q[i`Ovr[f~ sPkh(!y?̯]< zQZlՏidho$S,|pzD+ 4^3CpHJ hTL(1.(\GtyّKAWÄ4һHW3{>7x/ 2y3E%ٽyCzc^*AC NMd]E6؏"KVhjPEN$l6c8L6& NɎ7e1$@dKVTijOo0;c7aU /T?Iê9BPѮuxUìPX p,Mgw2N* 7SP, 5F 0̑ q~D%iPo .G::w,uÍH(lYxtL2#X_ʦ& b4\,/4ʈN@>\_fgb>Q } G΀zF,H ph8Yҹ""R ,ϝMUbd9\@yu[yK}x;ErYų}YF6 Yn+oCr"Mܲ Phx*8q]yQ.U1ʗ3w[@!1}IzBPh'U%8ʀxw]2贅3֬K0zX\,2Ф8JS..,n8922%7wNnӒ!pEYmᒈHM} .Gs|sM=L!s?Es(G:UA׳>I~ 88c܇v, u0B21Vtk]*'6-DG~AJ-2Y ֶ: -rڴrτKmd7Mg%,7o[ٚ2ζpӈ 'gV=芲 o7CRN7k C@s73 \Z6JSb^*|OЩ1׌?tȋ$SGͤ=hz=+f\T8S*P8"iښ$/ƩFBeAӏ,2̛I pӥJ0KG2#\GR7k>]6Z@nVM^hR?<(BG^I7A8Y,- 2Y{UHӾ ,o:`@1hUB١EV%s=S|^HzhT h vL++3k8uҷdh}Q] b$7tUCOk@Z{Mȣ1lf A!vwn*Æo &BITg׳Zsz؎mWYOح!c+grҬ>.DS? uv8x],`^z.>Lw7ԥbGJG9ov\yj1H#mK>{f1Z ̐kщe~ΆB60s̈^/ݺы no.øWUSj_1*:,|x4 ӫC=];9{ļϪs rO"P2Hr M|I^~ m?R*T"V=}~k)) T+ד[QPۭ+v6k)"Q969JOGt|s)#M 'FɚArB*/_>LR}+WJΟ'yj,y;Kgtԓ2ۓ -sa\3_E LobwCo6R+ͥsA| /g)*n\^Q5F` q}ZLrS4o Ahgopꕾc6N=.VlF WF~y] ~.h6r:V#s!>TͬV:-#W#臇 +: m+`w@/' vLŌ梉S' $}T:ޏSqK4N{u s2DiF?z8AHΤ&Km;@SX;Q֌ "9PTw"RmO%m6#rM|f!̈NV5<k9G[9Ɗ_0R9 4n7:D`]k(I6atx;^e++qrrD#6ȾRJcGGqK:j\!=ҩgBLwL.3LgkBL2:p r4Vk Dbi  RU9 N.ڗ|PF!hIw LjKcUʛRFϨu<¥D[io8\L\AR|yhصqFQ3"ALE"ygCB|ѳ K; ibƟS} &Q7Y _RP2х}l۾p\?ʑ>$Hj,`riFD2?GԍFv> j]Mw 蛬o=1ikQ<NmDw#/(𲄄׬Ho6LrE ֧X'i/WZ7>LR\דah9u̓;| kT$X*~QZhq_t ]cCx{2 w n%ӻMJ`7f~xSFAc`e[zi C San˷fo&_8|oC& W1b4=|g\l4Z֋0%l: /H1É=bo}= z|vJ\A~6CR4>?H(*b*v@V$س'Ҟr&$p)@ vukNc>Zџ>ILUZevv)\FɧyPm̔9ƄBB\ojQǒJb0U0 ހ"P+Ć5oϬSi3bu 9lJ2 > +=<>EZ`ZM/Y֚K;^?cqLn\̾ለiƽ;(=r|&I$6B׾RG.;}$?v 9(0휹>}PQn&{ %ENG8P$T^ofq{}SH#Td@dx>1_U2t͍1RLK#}#3*ULY81,c_@"u];ISEdg16-eE]B\1wI $wf;e[ȒV;] 6l|Z](N 8\?mX1kY^-=dXix O&ʤ L, 2a|LY WŢq>qSUZtz!uv6felѪhDѵ2XY|T|eMzl:RX.`"%{qq0\8ƵӬMcQB`NOX` QA$nNk`[ŽmZӸZE4t6]MmhXdb`n,v4C  \8QZlܒr̴sK7WڲbW#Vܡ}~!z8s?^GWX CȁBwس @7΁?DXlw }v ,XGnɗ@ih8wop %Hҭ?YEd!~9Fӣ*R33jjMԞ_|'.= #;nʚ=:d6#~[-egĥ["`!v3,~VR\?!4]ynh`%f5n50[/Q*;D oPivM;{ӕ$ww0>Kg[]&PTxk߰'!O5[" %EfʁsYP(l MQkɠ4sxw]GQ~Zjtȳi{ DMǮk,'+52L!6r7RIÓ0jX(42|BQnJ/2rO|UJgX&]l ڱ4>ܴEgD-}MyJpY;'D ~Pc?1 XMa:ЉXnhp du=E=.(-}'B:XHeZnN⥹1{fM& uKp A NLE3&J88,7 Y#Q?OgXuwMͭk!jf>Meh7#nmRX~={A |`S9`M=ѽM+B25oJA{M^8XrdU^sc,L0pGGMkUZ{\;CɸK'\%{ԮuY_%sxԡLYlI8n]f6']`R+'$6 gK:f0ac׋j_nZ:tyfhCZ &Z9PS_Qq$M.QrUPƃt-ֶ ܘ~0҆Б& %QS(=OH%V 3jc~dکPG}b}UAVaCg.$|Kn޼QUԑKlgM aQPFQ 3qf n@)O=CZlՈew*lU(GOϺ.ѓ5,_};3JFؘ#"/lN Vn\q8opsd3#Yu*gtNXw8 !(Oh Ju68-EjP~ ]uRyN@{@b!DEqL4pU.];A&hSBy&'<,9r8Jr# tCc6*c {T_/ hHܱ5JcfΤ$&S;U뒯B۩ɒO~دvS+|1|SyyGks 3 H:ڡk"uq4l1׮T/\+7| if5ԣ؜ 6~ o<%)@i=ݽ3naNk S_|LjLR5MX=x3 ̣e& 6ωIW{Ex~"R߰t[e2RlAw/+7jmI}4*s+_X^d6#@z!&Iȫl^wՉ*W)ViE?ھ q!#x4m -]zDϡAr D=H#BہhGaLu0ײM/Z@ؓ=+`ўgF؍ƉOFџT#gXЈu쥛wQuwd苜MO%'ǕF#ED$m76Divp Kmؓ3BuC<K/GOn7$`7pw2'G㹮ʏy8JJ)kRye-W[j_%LOeCS_|&ԡ QA~ 3ڪT^O1C/Zs@/# 3k`3X68_c~E$Gה  ţ7?b7?vֱQzCfFQ8"up^G@+ 3֜IUP崂i;Aa%guAnvz \ksQI!y'f^z[a܍Y 3KDunL0?|m;eb.#$^T(P"NUEh&^>AkQmcV?֙^r(!IBMӼ`UdʦŬT p%Ek,TfCG* *Q_R~QT':a-os%?*_a{6>sd]BLe::% ;<ٝ Ww 6%um:pZLfe Գ(G=4br 1(OcԠôca*M::FHkƒL;ַf3Z©JVpz~̺r aF_;݄􅥵pFT\µ L:[ڙ5D\w>?zćxxomXX߫RleݟnT{Qqqu:i_7$VAǦ(cip923giDQ>k63Sjȉ>_^;Gw0 "eIԃ0fLJ5}tꦻ,ܳ=hHW慤Cʂ@]`}miD+A/ g̡p*:Prb&CUA>ʽs43X3m̌\L5ż€}!M4H*ڱ]4qn OyK cB!PeHe.Ne|T|O6(;-M{w 6FƘa ynHB”d9d\peHqk ȟw;DVѤS^kK*cˎ23X3R& 3;SN@Bi7͵Ps$Ͳt |Bw,.RȲ DU/3ǘbE'j[bb Dqc9I#I9IOz| g1![>A!< 3[Y92\`"JY܃λ4 ,Vd߫yDo=šs춅Km3U%(?YeA9ѩ_9n&xyF[_l[bK}Kf;~cIu1avˇ6r)z=CV~b3'(<l{#pR \x 35$y[>)SR`|kp X篬b,c=O\<ބa){D- P3)[s} Ԡ;?#J9_0eJ큁N eɵbiR?A9C=*ذ5M:4tŒ ^k^uMT\cTl'k n @%>h.T&Nm,׊aojEP xlt[c'`ec{#3>';f/#&>+&&F Q9<63֠0pQ*E x9b_B|2TYkx,-q_gY. UVb%RauSzzK"߻8z6@ ynxV,ްf.v0+$?Q1O)/nBo0]ŷET}1,.`6 31=ɞ"rtwlu>`w5$:U@z׽V R˜26,x$A P^<1d8"L_x/*(&y:8ѷqVX/stlg?-(?)~8.`ŝNI mٲ\ )? oD Zx{ lo%aO }1"ijMUWjqlUf+Hm c9tGch(2 Tc\ &;^CH,P(ZTAd!vݤcg!կ>0i\eER"~JRh5jsƔ TqcjS`m# G6cr/5+uX+ ;nS}L6GMF\$fe4!Ndi_f Ȯy]Ru XgZ̐49$g_J/gxۣ`HdxF"J}]q.~?pu'xws@7AikV;߮Q*4XO ؤ<kA44bQJ՝p %զ?.d;r_?K 2/Kzo Áꇕۤ# v;1&X-dR+}O] |>ŲE4 n4,Pѧ!/yܢ:{(- $YeK$뮼#{ fG.zC[ޝTN!'o_> iQxKczM#8NxGx:*[ak"3SH[9CTa|ٰ842bQ&`Оk: l6dhOhOJZWoB#F Kl[|6+[TKB>}/h fx/!A 8h86lOl&rtti5A0hO."h&W+o^tMȬ!ҹp(yT`=1i\?0usƾKl u|A*#`atBnf̱Gw ^R"rqxg؅ _;$>H)}V 6˺o]茀vϲ b&/4Uŝ`]`d5O4&\>;RB< ~@>?q ^ѩ'Ȱk ,x:dpzA$3Ѐ!˪ڒ5h]ݔU 3wO}'M'S&*z5 >w ۩Gz3!ȅ5 b 9"<+ybVhڄK;*APxax j"]*\@[}zy\wwhlБu`, `p٦tyvI:T}]ΊuF8d? #P{9 bAaxݷ 17 %78? JwWC~IW.EkP2_{sf$qx5$;kjv|cMKg.Z_FwO;7_?~ rtlHH0j}"KZtšiQ !=.߈v>ʜkJ3ۉM񜇵j)wM4 ++%NCʧ: mD8|2i( 僟86!vhIW?sJ2Rώ%Jl܌Zb&܄w^6r"{@,>N4]棆RzcNvPΤedI๒_P(#!O1(@> VhymVJ:G3NX ^.RQFrlK8L-jJƁ⟭[*5O:p8?ӘD~nTDh 8>]RܿBS wnWeF/Eʹ!>C`ߔ|ȥA! fQ`/ lD1{$K SѾ"H~ȃƠL_Y9 a/xv(CP0V~ܿX (:\[O){xs=b?_r `VP^xFTgtO16^İX;jOB}YMRjn? ht4%*TtHלc^ -l7жvNw8ĬWd'?NV,C%Nq=وFT~crЏ_}lib%yKN2̍7ܶ4Bc.Ćؘد*%e|\TNHS|>D*w7a_@{h4,ly;-^ZzRlO;49q`7aOoSAuԒ\F"%E;X]SsVnm;A3\(c^[*$'CC>(9аxOIqrHxOι3Hubt{xབ  gK `b+- 6YF^%*8qUd9dIrНSIV! yKcL~ٰp[WQi)ajygtf9-1ReHr]JE[[9M,c ^PnI!"5KL=iLs5<u~3wR&(2`cB s_м (|Jxƌ"K60gl~׹H«2ÁQ@]K _qLv2S׆YV&_:k5$whn\H oόz ٯй hHxUFANCJND)ec:p4ۼ]ɺaqd;U+B^(* }O:19@ͤE,۔Ws4 @g'Ċ,k Qi&r2#ZG巛k_T[@ Qpܵ;r.$*oLy.T}>iRJ^2qk =3?6;h,ISYL7YeW+8*hw(Xo6}yc+V~u ۖpttuRfOJkN#>e7g>{N~MY%#\pvdb1_N=! 8ΛVGq9 i$O~ Un pW1 T?Ӯ]?dm`9r j[I__P}]B!چ~cb#w+g5![Pt^"- l]cO"pt:VY8U皦bC[xLJZo(o􎧇⍵GҠ?|Omʙfg><ՅYt a~mF|g~)q=Aĺu~ǰWmvcr{H< &OnD Dhps؆QZKJZ=V-R ✫qd4 0`6#*燲 o}@>͡AlNL+_[DEd6)0CIj(Aw{Wp2Vu61Ae<-:#Z'l '#}-i<4! .G1/?f gB7_Z)s&py|6-tz4_E%qZ"0=TqT|U W۲r4IU(~|A熏I)m]DO"ߵY+ޟ`m^Z'3\U횚jC 0L1)itlKecteMZzDG@ogz$ (Aj*'pM:N|ENi,;atV`iCtR*aB:ުwM{MX8.v "E8 Z/%ʞo0qX w3 T!"ےnZK&>n΢7:[ J!W") *7^t=>_} FBJ2AG摮h[-Y|VX]k]}8g3Z#}:~4pfL K ]yn_sAǎɹKDf)!3O539OUb ӣ3J,*hxoTagLajFjDV;ٕ0)ӏ[CRO|4iw7#^2~ }s\QX>E~3DZ"g 8.+9Ga$H$6z}.x3ڍN75qLei;Хo=p'Ϥ; Z?s=n>%1 lTP_XwؚA_*C_T oSᒧXfsBpygo)"V蚑 Տ \vD]C>@ݿ6aNtRdkJeb[z'"/7I<_˼Vlb P-oC@Aɪ71pQ0lAhi& gM< FP"ė)VuDs7Ѳ WP BtFdz\nNB%"{b{ \Nvx3Jz[\̳JM4Ly]Vg&ucd%|8A[q~LmT@S/oqS˽5ނ% >5VάeK2bdXكH%~sz#TsQ!*pLa@iuكs=lK 祓=p1y~) #KXjefo9D ?#NKsB$R^ȑL4Hy|. 7 hoB1Spb(T߄]^6Jp4g! jgX[M<%_o$*1!%^XBXGvȿQ3RX(.A͢|7t~Du;Ii11K^C/I8``IZ@ui5گ+B6ccc~L@NƺCNtdU-y G#,'BU ΎyR$l6 ,dߟ~hR @L(*˖\{mt ~$p QWs63]a>(mLfo8l=X<*Pz쑬eH$XM.R8T7!X2rg h*24q c(BQ{DyUz1(>\ -#dP]sfy9Y{])_8'yUNBpyd9&ʂ\}/1s7pkn7\/o~ߎcKe` $,B h_ C⒧eN L~ PnO 6g'T,h2([h/ӊTLzQ6-R6YZ)mG)WPz2X?O4TzkL>j=qҌ,BFݵ:dNfꃋ U"",Su[**KG R-4F9 9DV.ɴ誀a~YC9361t(#_ 9ϝ 61 kK9sTZ9&:rsHM S?l-n'*0<x־$90:1&bћzm6慞[鹎E#z p- g߽Q#c):Oaڵ3쎞cPCK,$,+*G4G W$Z׿!r`gYX4cUׇW9E_;o5 t7b{unT!Rv"gVVzHW$įRLALY'4kDDזՋV,5R~$[" ԇJA0#^XyNg3VٺQIS64ʞ[(:z9]p}B$\o83ia AWAʔ-MKY]1~4d+>0!g;zH4 *y˦=:2ʕ( |_۟_<\-hdJ=TÚ d@}Dm9gH 8̇N*Dy,5ŔjPeV{ܛ,Z0)Lw^xo {*w̡=++W,-;Bgm_i׫rȥxXV$_A&X#ܵ|*?0n-du $+1dNRzs a _]rb.{+ &$Ȍto.0ҍ`JcRC> D9&TmyL'x(K^;e^f o:f!sK2#ԍ{= |,5|ݯa</ '͌p/ K}wh*rB9PԟsfPyx-S 9%2nV s3ǚCL!+tDd#.&δgCɓݔL9W=_RV𳶤l"2-זB7mpݺ"Zg,kkCȏh9J7!IB Q;Rrbߴ'w[D󕀜K砵>4oϙqmuJ.ي/үǬl^ws$|j'@lJ#ccu!M[- v߅xqusb9}OY_7JfmVHU,W'.9 L6.fn7z7J,`;j31<*x:L9c$|0mG`4. $^Y#YZ=ԣ617B2ɌT,cIl15I2bCw. [(϶IiJ`)Yԑ,.= gSt8.Ņ==7:/i .A\A '[eOhp"x MLk *]^a{nMAߟ#'GNPwoݝ%X~ -,lfmT#ň8|QuSCE:;~D xS,_l]T`𖻛 ×{=gdk/}݂4F3;s&+CXE7RdƏqE[ˏQnq,?Bj;B*.5;jqӘu=_\*?d50P}ޣ@aX&wQoz$e: r>X" 孷-2PQR@`? ovb>$RK:_@ nl :HЗ+ (mƷ478YK>UG+}p^Iq簡xqu @~q\&:i f= x'+*oOD?m=u[͂1fd[hw@"boώ7PO4!2 iP2 ߷ucdʏp}RG HȺ̚LN3*"M$dye+L!I1=]y)YM{m;J%5.˧X8\ ) sZy< =|T|_VaUۙAbP)[MBμcm.m͖R)E34_*UP, Dyl.S{DxT PD&.›X}=yy vgt{7[zq왛'7C!$'냩()r[2ܤTA h$KNj|'=Y軚8/7rUqrNOdYMbDȄIJ&VKδǼNc>ץOGvDIHB2)"cQ+ꄘJA-e %*ŻE<Gv z&+-NC)^j+oiVC/˼+l鯮r ܑ.a07WzXgH[mfe`EM{DVCo3=ǿ5y5 3%Z+5ly%Knhݻ(StEa411G3>׊P3ܧ)=:h꽉bģ_&lشd2}U݋8EH$ݻ@mmrvjB }5lz\Uf I*2t:g{ %oN c}x2QKV/P9RTϨ(wZ-Ti;[!#!tʅ̲4o Su|*ZRzG2d`#xKaTUÓ:෻G / 6Z%\a<+*G%%Űl6J@&֑1,v{m|j-"C{QA{;}ui\sMt"+N9Pb4CAsL =[E1h4N/=JCcɛnX p bC!kX9+ҙ-ˤ4=a^#[MvӚ"vM("nSu;GSVܽ4E2eQ.+9_4WAFfpq:w4orAJ]䮍41Ub.YNZ@>3WX7N~@Tj)>KOMBIp :)կC[o'CyPVTp1ҮʡD-)ZmTb9ɾl=W/@jCy8jIY% JE,}Q=߰T$Q7'V 5KպIM̋*&.g7ǻwTZ讑-[ŪY虈JA)"yMfJ>`PK+ZR1%6o cDsaWyfI b9PEFc J?fPaܛO4y?`[t3u% Y1irE]_2qcH,\>u 1meɏ9ڼx,6E+m49~N8eA9FW(/KX㙎Nkr?'NK+@9e8ʕMzfiz CBr0nmL_W +Ϡd&zgPc"(켿_܃B*X!cɯD;koI 9zJ4z[(|?\ݱs`hIx6Q-X`mk3j$m Tzi6։C eݟpL4B1GmѲ;+rNszMaW_*O,=vqŚ\AIe~2+J2T,&0o|vjɷ܇,k5gvJ_e?nԤ}8/[!\{Qg~ : P]'zps6]Ul"!,fW`lUReRr]/8J4F@r+r-j$$82!ːєP*܇?#R * kۥQAN~.ה[o–kpM5Ef8ݽF+cBO6io}Nal$~nM\d3BP8)8/bjo~c@ht[%+dݖPu@zXFGXɽ& 3*<}gDj=l}3˟)y $6Vcw>\F Yi[D߉lO6KƦ/>2:U|fvzPZyǘse^ [B:Gn?mɰCY-0MLzlY;5ϑDԾt0WqFH Wzcn}%_PB'hlN,hPĢ^e_sS?* )%b.%T ODA@&TV|oM8 zDszqϰhgq_nm+8 ķ(jI;&8%RZE~ޛR(~Ex"xE=zjxӳ$cu<32 3@YWn;1; Y*FuH͐,9Cl3:P-ʬO7Xff'T(c$TI %k~ة}7I-43YJNT&D80%fG2k5\m(j*m*h&ᄦI RhVLoliKSUq޻"8m=ac` f_xv`g̳H 9EGxUPNS:l~T[\0w5誏Z y3Ɂg6vHՙ?ӋXwE,q')lKb4Gl3IR9Kve OC #DJN^Ń&b#s!z@5%z|\'~?vwS#M $BBB1';UWBXW\1u_SK$ni5bXӉ„8n k#yvssbGΉdCi1n?1)ET9؅d5]twdl3tǭM%yU*;LUd _Q]V 4KDS7:|+: Ύ?Owz>omoY}?g (/g7PjdK!8U*g dzx9K6[6Ws_g`FRޠ:zk͜wr/\:PF,+?ky7xR );7"k+x@BayDnT;FNH^dM3KQN9-KB"ϱhg 󻑨|a,~8.1bםz-Y̲,~/yXutTڇ'd!VJhg:qBYjU7%rp N T$t!1ZC.TuL#x|'?q?}^,P&!',k)Rjr[6R7t,vP ܟ݄H9pi)"^S^@" U0J7JGs@&Ik3ܟLŷvn=|]] H}Rr_8 Ǐ ZN_$ }^REF%7%nSA nC"{ PWHL u̓M[UA}5ēK:}4骒&4I*R[HCo} o reFVoB8ƭ:hъ_6 V%Bb*vq¦~"Y@Kq~3/r[Q ěW~UƷ2 su.+[&7a]GZJHnER~$8! T$#)51mlE, {#1:!wبbHw"O֣ƕT|X+OdVS1XI!CnfFdw'X{֮J2aցaK y~)R$o>r&zi"DŽ4Ga՛.U* b2m)/#\ׇl W}l/B+iAU6F~ܫ$p8P@|z>~$xY#] dafUrxPVIdbhR)O7LCi;Gshje<[%7MIJ)趻nGōBP .C"l2o9N(sR?*Mc|G3咙JZmkS6KBS3}%,/rEDY°]^MB^QX9X^_΃<__߮,cW {:͟SݳLp';Uj%&֛UF_ \9+=>7T.{?1NZy52DW}iYq .s{G{ͅNN )y6_ .4Qʝ&7d7Jo9;ꍾd{=0gÍ>#AdA1Z#p P-r3RV22ިT'"{vmд|sB\Y6yg.a&au.[n1i =+<]pfuQa G"PخD15x,ѼW]VqۑZ|Q`>"@Zb1ɒ vx{ut,wHlQӀ㤬t_EHMFXIי2 s忞n1uDy)2q!4֒ա~wHA.GvD(4`|1X}w'y6 Y S9! GA@[A)/鎸qCEAktXu ϧtT :٘92?Zp/Wǀ$X8]L^G#l~lrrQ5g* Z^;|N =VP!ܼ,05ĒasKDFiO:8[do G̏(ch84J/=;^yJ8Һlm|ZՒɖl~|+\&Jqhૂf겐N3Ra"]˅LT3ٵbgt`Դ]Jfګv8zҾ H=,uPز9$Dxy7Dk վ& 3Q6dhu?Ki#b\ӧĩGd0k8'oC۾H8)!CGMPc-жp=Gn+__Y--.r9% (->#q#!X#k$œ&t|r?rf=za[0,dՎ;W:(/QpW뙋]w^ .[6lR`eD: BFd%m;lњ`&]I *g˭a48sČkzjN $V*4`+ᄜv-bx st﹓ #-gb-#{H/&m$j"&d.ʊjgxXp0d,-Ze bNJ~@VnGִV!`5 tYU  nS&PJd`$Mغ>7ҮvYZAZ#d؊?ֹlS\X=Ɇ{~'2;$}2s֡+r_nHi_:gav gM(eH/c5DPua`St @+0Xg.5xڣ/ د/_]ƣ;I8`8?5AE^l>1XKFZ@ǔ$U9)!_-!BћڲpOBd Vv&AxdZ#Oa㎞w=r z .E޷NW)>.܇N- ~_ T1%8EX A}법QK40d "գ!U[dd(nU۬KWn[" aR *pD29QASrzxIA_*8!U+ssj@7͏f8VM*33)U.ME \e@v_ǐIfɉ>.#ޚ)o܌@,? 45vZEmmHD}(Am%( \_X>2No&)~8$SIA|vBJ[̨ջjxpu{a%kƔzMY q#h'R{eLPEYQg&qBء'. Z[VA1.4y|ɘ.JGÚu1ؽT,DzPW:X T'@`JV%2Qw a1up@Jǧ+ ѳ!iAR1븶~ߺ?yu""Ai5U6#ޢId 0HV++lovSǀ00}@B(4(q V8)*( + ٲhd."jX+%qM):=l=;]7䁮uR"9E??@u,wരT\֫¢a$h?e+C0J1}ȩ!T+iScMfSzDʑgg48S6ZЯ &(G!<|PAMSLzkia21.Vy4UldM&â@.lnmelvk43:uatAnr.BYز dyb^P$Z#cMg.X>=|ϸETMԜ/DLAP|捜_|k%J7aѓYG wުb C鶕B,|\/6L']lM$Jђa}AD) Lv&ZJ F~Ys_)C_/rx opU-i?F>81 6qLzs-86QsUCf}+ 1BQz Ι7JsPdCWM~rRh^,QI%P8Ku8Mq~M#|m Z9q꭪?~J@;x@N`;-֎]أ{@s dM33Pr֩?sM-#f?KN)C~'#2JŬ  i 7ӡʋqf5'}!W6ۚcZuY=Zt3~D%= n+Vv+“1;59pQ+Hڽ)j:N~M_^9ZOG''}. "hioJ` 7'#dZ F?̏R`T#!1 VhMB: jxu= p-:/)JHWjytd(t}[.6Nc ZblCɧ'\hm4,Ud3mGf!P7E_|7VI_%8M*y:"@./=cѨr- k{@|s8D\-e~/ua8$oϽif\mNDb4pQj$Doam:lw7,c{r9!CuD5huuը4 cj ~2xˑGΝRgb`n=M : b/G&iam}ׯq$^8d1{;Y8ca3WZ6UX(pQ뵂” ?)ߜj1NrH0ShnE Ri\h{[+-F>ېK:$ =} f5]u7讻^k4r۔yBJOy+z2jo "deGs a:w$?O" ٩^;$>[/>.΢ H-$PrيPstۂLJ=Mz& )Ns̕f*eF)&qE1'ψQO=[R=q4V3PA Z K9i%r ^Y4q&h02^tP8<Ù6^#p-jj m9q؝% 3Ye:bjfէ@aQ 7S{>c rB.MKLiH+C᳢M38Rx\қ}=VP&>U\>RͭhT![iE0\b;rծjKujWqFCI(:ims ~Pۈ_ Zbz5;db Ό/ofIZ pf_Šc.7dްorq0qe-g>4]V ؤ 6_9soɰuŇYTcmLL1 %UY35TU1aDͣ6X|[h%VY5+cD#RtqK0Idwmyg|o[jjatP>dgIΓg?ux@%j_/m4RrSv5'Do ˸QVrRȭĿњ?ŐqLD xX: ]7A{wY0#[Y+Uop)Cw kGOFJQR֚?湽{_]ekhǦƱԖp:|g l,!pF;2<> U&k0 aU4^fs }Qcjj\mS!`iBgq#Dϛ >b)MSy0xEG=$em^ =aS@xOo?Xs\G#V֧B,o 1ZpHvydJ0.rBf&J%qRlYQzD_-=#GӚdZ;z]2lA(ZVR!IliF)W`,\396JSsmVӕ̣u?5^aJ ڷ;[#k^*f R1b$H%1>-,Ĥζi~G(fj v@.MGΔz@Sūϰe q,VU"3{eψۅx\M d^\h$;D{HU3ImWځ~ؚ18zӈTcg@z.Gd[NQ K#36'KLʉUUQ'<@ZUOLV'Ŀ6Wx'[M[)C'E 'Y|V4 !I bԦqG, da0)hpl{Nut)noMI02#xz^?1#:aԴ/Μ~$>ɑ7;u lw->%i$iLV UC| GgH6qK+g\8#7 G# עKjꩵcCBܥNֆ*|E$ZU$.?X. X=%! UJOؼ\Olɑ ~+ SC\EO{M9n=[i4]Aش"e?Ϥ]0h!}{o((a Hw `;NgW,ۺu[$زL`13e R2Heb` 8!F^ԵbBd LQ'fd|/sG/Ͷ*^oAlD0ȻG@ 6ԗqDjq^s/Th5 P=.*Ϲ j4JWa[q&M-;}}> K8k03h!l>gGp64-eL7NJf޽ QE/du';LU\>{615ZV&}4m+CXl}_YDnB(2ڈ!_ws&Laxi'O =:p9ey-b֧<ѣYRcck;8#..b9Q{ѧn R v$d.SQ>fe8\a"MacBjY߾Ԣ)TkȘ kBF΃@¢ *|;g% X>:8/@B@%.sf (]ų w' ]mk0=IgP$s b&~%#ku) k0*6HQ™QQ(X ɳC@7l9͆6@VS JMWUyʑD`.P]ޅ(oKR881|hn,s:ynq@Wބo3ZT\7)oEdoL`4F)QMpC⪁?6#zMh=?c,$#a>ܨ=VD^Jc=(+@S]doƺ{Xe( ;LN1y-.2핳@gj}rJR{H%z`b_ؤMx\fn)(C7[Ի}6R{MYjkgTOd_ȩ-l95& eWHJ>#i:R~趰 HҬK駟}&4~z Ъ?Fv Ӹ/6>^# A e(ſ>o22Q&JuG:.5!wR j{bs\JsEҧZaO{*? Z9 k(4@F> >dT!XaDu. xj]y28VP4;9tt 3:_;*ɬO&vw=4PCD 9I}G,.g@_htl'ϤQ~ ~nD<:{."Y\h(5E-yi_2^X%~ v%F$݊NVO9,acDc"pn.Hi\mڠ P_p?Kv br|]x# 7sZb=0N\zQ| \$=4Eb2MHqp1XמK=A>!vZ?[fn5,T_ A ]l+&4]p^_U@C‰n-?^4 g b><{Y|P^beeB!>Qm=Ěa~G Vq!R4Q?JyN> P.ZcE`k BOur3f?Pax%I[\D`#zx Pnb~8:=MZTj(S|s[O%C6fu'# q@o [gi@g䏋߇j&$׷\u. p0 On"QYܢ:=n 3.*TAYh] v\2g9 s؅&z0*Hx=֊Ƿ 'GCċڮU^\<هt2&Tt8tk8Y e[f[?ѻPɷjVЎڿ-!9!N.(JA=9;8Lm}(ku! ӝ]Z xkc8A[bN)zOgQJZvM:'o#ɴ,p17gM)1{=z8!ڷ5巪3Ek"җ{:L'D+gRVn둥#n<3^s3;6o•V)-X<p5_eZ|4'UeOG :UmH-%!vdQY,C"짞M܏#).O9d+#o6 ԉ-;W@)Xω<7(|v[#F#C@ΑEJ1*Jf$,YÕףSu 'Z>ҬSx7!pǙ5uY9RfNr9dF]6{z}͸E1ZTȵ<\ޞ[SeG\n.HoKko[~9APMvJzyZxu vm}v 񄫸vw[eȩ?꿮S;?Ԛ9]BȯtբTkrrTKPTS/ { 2!͚3&RC_anI'-R#z3A^׭";9״{=8ګj0Ow֧w-:P$r D˞oR>_53#_hL bg~|͚J7#2ިsv`\` EY_ߋs!b2_BRkou; c^l9K[O1j3+F )Yz@#I|ӿ=_j"5bA3t|ȍk0LP.k59cxlvYI<ݲnYfva%9K[שtBV,;w__Td^!il3iblԾ[~/տCwrQ]h`mС@&'-i_jzNǭa H\b,)[DL\vn=!}8-GMt_+26l%bv$6F:5y8:~RWa cW (V$PҚL3,Lŝ,#g v޼VMyPDJC fk3\3KRG cz>2[~4N;窤.w58Ќf5]ebS 0WΉilq"qM8ZU[ŻaV:T,U,2edi *5QeRbE;C=52M k# vW{; Ŧƀ@tq93M%&G:KHw/Nġ$4<.GETBЄ]N%V'uPllxqKSWz|(^ pZh#Ϣ "H fItm '^^ |Y${Q@!dp- xp31B* 1"+܁vǑنӛ[ц'F2hA}+CfFA' IyopuxcNYf:CtTC+pnp6zaWݞġok}„ &>?XJuZ>|d@1ѥ.;ƄfNPAx‰I*Os"rNNVEĐ%9Y ac@en_m0`0y;ŐnXrV)y[ X3ado撄o1;ԧ<*Uyc^)Do%:2͉Ӣh8ߗe4J>RW;HsXjkMtMugd']pyh)%>ҰLu KwmH.) ?Pej-ʸ>$]ʗ%2ғN㥖LKb9vRk7=w10iL< /;/u]f.~\i!"ok)$!\&^@2!]cpwhZ hp fL|\r9DIݺf{oS?MaBh+\ʾjV˖䬿Ӂ8AwZ?rZCm[^3J}iGݏ/_˥WBLO]01KK'0'A,SIBVVMK^;<zbpY~Q1QJoҢhޑ၏ɞ=A w3ýφ"& "]O_@Ow!i=iAǔه*R i(ܹ+sZM ?Lzb\3(nRYlX## 6bKrT@7(+O&cpa*=#;Op>1T\D|n;ܜ9z$~IJigO8Y Ø??pq} T/G5Ғ+Fr $La->.`zc&"]n)ֿXS@s.δ@ rè2FLA`*ekѥ% Vc 75ۏ@3MpO.>2C+ üaA ykݞ/N07 +Bz}u&'-;mlD#S3[TiWMj.*C?>V3yTXw]*C]f=n; XֶtCRTk˔05"Y2A_d*T.,`tZ;:xڧ9;涍3I6N*DAl0 Vl32LdFiRvG3/` -L˜ jπ '|:#k/VſL$ΰW: *:IO˧%Hgı_g5^ p$"Egېms4։@:DǸx-^sf!(¶1MMԭOvkPԽְ0gx32$YXHD3٠)?+<Ҕ P*'L6琯bO0;frruw$T8祥KFbI6D"n`ۂh bee\ĉ(UI3W=W([DCґ)\7#x&&f^ ZL|mд?8nVbkoVQiݗ2kf- <Q,R.]){5ZiroB[ U2\VF<.mz,ԋ/Gۮ$9ۼ{:np%$a&6)HXKv8at^UuI$ĸ?&Uv!ҕ!K{]OK>췷 bU*Fxk"397j3`GtP0{=S't@M|*XFaL*fl\(P> @7eż:Kd/Kxm ldD5Pj V6b׵pTeݼ`R8}Z,q4FRV4Ba, Yri8}YFu$›2Qk?˖OfW>bou_XMŠuy1zWY@ ֹ}u.jcWwɊ!^xp/JH>d&f.-z*KhR*,2a@k%j TIݫŮ?٬iZqm[.衕W Z+ƽ*|BV<]s;?m~דT2{2ֱK8֝g"Zu"IsTqpD١}{5ZtaZz=9vL}']p yũ(ȧ)}3}n1g:}L TnJ@DJ`0Tv+Md%Bq놿|Xn4R9j-O#uN 1!q1o퐺@uJ9);H) OWf)`R!':>GcI`SQQ(؇f{ i@H]*ZNp C$u0/ $ӈHryBB/4!N8Qf}?ÄOƉf޾Gcm@ ^RM=Fim4كEXH8v:%=$ND<B KHu i*(34Xs Fߤ_$4WᛚƮ3uJoi} 9/ӪԸ~ri ضSxTʌ>j5s[usҜ /[/Q-̌+vB\֝#->ML|KA-sY%ǰ6  e땝i~ i=VqmH2ٔʢCF3 =Vw3;KP&ë{?bk~ X^@>rDN 'oe"ݳ7-4Ύ´x#aEkF8>VyiY[0ICcY멳D QRԚL:! H8Fj7Ojl'C sIts8qa[ڰ0ArA/?z81V7 R0UHX lf,!^rC vWƝ-.!9--I_ce C?wZ:op^ƽbSn &G$^4DN4Nm&:xlP!$>qlDαj_FU\y>$ƙ U ǐ@mًTRG Ub[<)!$)ў PAcH 4Y^LI]%ܬ+zvZ :NQ?|<%$6;2s;EpW||ik'zRbeqMАC#P',a<]'gƫ c& ⌽ _g^#T7-lgMMlJ%4pS&ڤ'̪M{Ĝ[U"/UR_{7M;Nj?#xW=%c!\:6^7;m#4+"#qUTONpJB;^뾂(:vhA;5Z۱n3l^a#8l\ȥ'KJU7{IBFAQGDnGtFTD_L 5W9d7tn Qx0vpxGCy gԷ2]d֭}쳮ְk_Rv$ 2@ PKP G O}:<HyVX}5!Pn\>Cu=0&; 4hx+yPyn|~ru=+1^G F~ ܁/1$* C]K~눈t`Awi9%޳p(mؖJsa,S"5`5V*J8Yz@ts 2\yw͊ } n+A&D3kµ6R^"L5Q"d`vGO8iap!颰 ߺB]q)ضhtۈ_, CO,Cu%ߚe])q8Xw40b O F;ƈ(iz' ʶW |̜4";3؊rTٰ|=G SXzQ'N[t=I>kWHq?wxʾɨz@ƨo$?:G=c\rF@Y<_J}z"Gv:K@SD\,t]zYQA|A=~f+9O7%WZ1Z)DgFt΋ Qtx Qp/-'e%mJ73{TF6xڛ^n`RƩv eZr-ק@7@^É>/~<[,0ϡ؁s<ÜńON4mF V.y埮U1+1'> 1ڏ$Y̆cU@9-cO~)E%s]OH}˾oLЫ趝n 03:E1ww-p@4"T(99T^*Aͱ9`> 륋pP_-l=cs(0^Gñfz^(ͷNfrt3E&?R¸VjE5iɸ< e+jܱ`lXST_?t87F]ߧtl^!kXk8Vlg!\F==dkPB2>Wi3GmnWM.mnlrzZ-7쾭ݓ:{-x],8ʠoAjCd_نώj(X)CPhH=#=^. ۲$rp炙%;OVoc$(߼Ɏs=Zg" !Hm*~…O vjQjz%?dP [!'ܯ.'vC5[I\q"I!H}>i]U1b@"MLu_T [ 锠6"ʕpBN|XWAX]owʴPfNI"C*g0/ )W96w<%"z-7PDO(D@e=艎qi{U((P/@.O ږKF7'lI㇦6+UuS_ƟwDfM~Go+ z 0&` ?u@1"2ŝ 1$)phMm̘ME& VU~tVlojiQ%%2Bfl5IiEQ &Sp<_n{!Ss%Mq%RGϕu%h.= 0nܩnU/gDǣvP$ƳD#o8Yu~ Wn5yV-;ɓgJg|3iOL䢧\XDJL1r !㧫en.LU )q0(l^ynR*H[^}t-nEkNwnݵ N7qx}6B`N\& FAXYZ*!c=$(4`& ܍ߑ- aVVjICo?"ˮŝAgv;c7Y FmBfvr-l<8#DhPQ4k*䤟IEJ~:Uz[Dfܲ5zqF v$FV݀8r6+$kd|gMc.X}\ѩtbgŗ/l\2"T'Ю:65Bs d|4"QsuKL8Ne}G,$n+++zjSo˓Z~zk4M]6sTA*o^b ^A<{cp{z:TBr_ٺ5% g:.zEbx%\5qn3H,fxNjw= hArյQOq qCc h mc>2cwSgK)+ɱVIFoU;tU*QhAF\w&`:&@S۶dݵk˽LP,蔧~W`.F};?CStt/`>d$*W쭮aDt7$ԧE}E>06cqD>W֤ID6GVic6܅Ğ\i%6fFwC"iHUU/hѦ׆ 8yG=8^?/ɻgImn;vk7zMw3gI> &7B|V`00,͙. ҭȓ&! 1DYh,7zh9Єr<ݗx^@??dq%%jbta 8 Ym u;F!g\^qs?D玪bCj٧$51Rb, 庽{ѷjeM-M{ÕͲ'&DV}_f#XEsE5Kj=4גhǜ>@ 쐶6$b!7jvH#GǎhXpA29 QL9t g XwPд8/V؞.}˜~i>e^?4^/JF  2T-&080i=x|qp17C4 QNϭ<=)`Ͻkb=uF?Re'wbX&vVֻf+qRA3C431wJzP ~ۏERX/+G&V\nPS7EvoLG &LecśPr@(rcráfbI;q(vOѧSOUO˝V"7E[RX! |y 3awiAGx75Y]Nݰcg!I{28*J fYV]+΀6n&ڬLIAQǍHP9v?lwf2rֻ&65vk\I>ZaW~\YOL6 UKl͖#}ht$l wMn >J9Qiՠc;7DU )yyxfQitvRLGIsN?Eݴݭqv vO? A4˜o)a7*Nb |7_?XN)|´e_wЙhdHڱT&%\װ򐱛PD"5z- T?ӑ(ߎ5>y_ y VJ ڥw|abD.djELr$VtXt2 ]ԩ7W #R#603zd:^2b_L3f#I$;tV@z "4s`u6Z%Ab:^wy+EŹzwq]#r!V(X)Sz)I¡@;33Tksv#Las v ʚB dUM[ˈ_#65!G'/|={MRBA[xzt-(֠AuWDϳ'1A+nK(O' t1\?jMVZtyJ(9îV/P؞*YNƦM'w1NV ʪZR4w } Tٽw|R X-g˩o$a P)i~ֵR|kVɴIpP^n$5J*!O uwlcl_aQ{8{Ef}p7`t09WW*6sەeq#U/YJ"&~^o%2~gՌjWBpPy9~1*Ihv}l\8ǚ@*6浮pm}yLKTk܇UƤh``IӟK_+I&pd0ӘM"7ol~[][n,4!׾Hw5  +duP֒)5wVhi~r3`aYI56qi,w6i6վ-D-x*_YtԔaF| !u-g'y5kJ2Jsm?5:ZjdlpLwε@'w FWP/. xvpv3V*BdXK ^C*Cae夽9`4S@k},=9bEvY%##{#?Rkgv}bffB/I0g|)@u+[yn8''SdZ)x7Q ,jό&O@zFy3/t7}{Y*Jq›JGa4Q]޽&Y#zs$4M6iȵedjl x< pPp4`2a_GOIh-lFO0@m3ݻ`fm)L͡"V tRkO+(ў;=XP%+h-o|⳸|۶p X,g+S1~ \е21|=enn-)6 ,JXHvjݟ}6ɞ% E6;tae#怗BdD}kL .4v3lN_q{`* -J$u ل$zӜs+VsE_cxrqP!Hf<4fs.8MzL jBKcRE^n/~UI'X7}.t.;~i.Phh-9ou<*uju:s!hUHIMDdYN k\?Jfݹm FeQ~;zpSp52Y9a>l4\HuOd2t󕞪3r;~IC$/R9YHnο׿{O)).1bNxZzG,@bu-ͳR{('@ƈX`J!\7ٌDH[,s3yλFyU: (k٫ %b9Cj/E{B]P_舘@ =d^_{;Bt E~X"ԫ΃Dk`UL`n?eK.jdrM&=ǦB#ܓǁz:ŊF )wTof==.n%ĿC,80fF ψ]uR[Gzb[ni8(9nGG׿U~z;)+ؙ43]<[Jrw /Jbqސ ~'(4`T)׾ RT+Ҽ=L6 NG&rGfi۵&B2VՠŇW`U-3X*؆E-1WX(N _ܗ%BEG&0ы<~<{`5ʛzy4(jR5kڒ#%o\'S 2Zm_r|:USSl84q 4?|j) 55oV5_=i͊h,N.%YYދZsyF}ЇXBeoZ_3h&~`JR_L?3eb̝N`Oa2BGTk*hd$ [ģw0FiB7YEвIbfT=[zUGqr9wPՏ'NEU9oWɡWJpeilΰ-9"I.eku<7Esomcw?{=Z vZh)Y7F͓ ɹ;S 22#;O:;qU 2%1;SQ\,/ieȱbB4j7'>mː%1̱a4 նe+5Vs(v95W6bFM4#F8${D&E^ Ͳi5G(tdj*ID[Gu$p1=/UrQi&U{#F0wNUz X oH`qU8I ^A;w> BE[H',vBfu}scX:;3WXIP&'j1CMz4\SS%HW7Wάv}udBW8TOrYxytml@95p0"po1P gjΗb-缿& ҌRH)2rj/4't>)f}b GFGfug!AAD8P* nD$ RLZi=EWDgf7y&vㆋ6?ߨ&]2eAZ[G)u@RfUi ݄Y1 sVWZ?:u;?gZcgԫ8[q{}V[Bb9TJ. G5Wb|A#rdX2r9NBɡu0^Ѐc_C5UbX 6\<|k_DV,-Lۀ+8e&ep-Bv" g(6: OUұmS&X5À/yLf{E~k=<R;Ԯ:~Q&HӪ=">&c%h>սz bLkzWI58b0ktՙHk'@RQG؂.I"''+_$թ Ii~vҡegJm#s;ߒ,RFU['^2АozntYU N AbhZ@x]8-#^ͧ2` { I_M&!^F떼0I=@Ͳ{tZ+e3tD݆rg>oL0h 'gG_(,dմ^!ʗ _mg[{x\Z}2#oՠ5B*KHHbK%W@:$$Ipg9fyAwT)c’t"E3]# mԚeA:/.iuՀ($s@#Ӎ_c0#Z<ԭN kl U5ïcVFwKdM+X⻵Jhҭ))b)݁b #?Ҁ2&[IVogdB >!dMkW'ěW{C'c>|'&k~grKp$4b?lio g  j(,Bu?wJ&\(2JT4adȢn\QDwR!ŋ95:g")}ǔʊZɣGcI ..^ HH.'H<0 S-vPۥ4$`djD* #W + o =߭+@@͡5'-pK8i_khh4_!pj h:b?\RDvvɠ{.l³Bڿ)m4&mp(6$CENe"Or`⅟N8_ꑥ/ rӱ,dp5@'y"5.cBW;ʔC/Q@j#A 5*y?V&%nUZN6YeIkZN/7=mdo\?h~&mȍrt8FتvFπGq R?WcfAi)Cc6 s*p3B L!c}_a;.a  3|k>1QAR;BdT̠(,/_]@R_7AmP*))d Rۮ-ڃ/#ןdOC.Wb_b{?2SQ?]tԁwH \"g >[j>p5*Ē(c^L+ }/ yZ4hyF(cXJN>%6: n]I4o/>]oE=!2ݝ{Ny@NƯ=9:1Qk: ='m_C/sDMjy }!Q)yCX [2U4JK7lM/\ɱwΨL03gqRd*_7W>mpՠ.Wv0z4U܊(iHuqBzzT_^\_'h].oga6VnO}tTH#RFѪ٥#DmvsbT r31LŎ%w4;fq`~AY{"31C+K/O _y[] n42TY-rZC7%z6r{#joL5aeKe3kC;:[sxL j=bϚxs]F: x:QNebH㐆âh^3i܁y|fƽ컊吾לtHmU@p6u,x|W%-L$ҩuͨsc̜lv lm?#Bg?#R-3ΒgÇcU{ pQfz+#'Z!n+(o¿[:8$qYvh6MZU1ۿ|]8]@ovR*I=al/&'[b,15mbv/[QQ6\/1X+rҬIݮ< 7Q7 bOז0$4/.]pʡH P>,afRJI֗Fb5v)|Bj| UrDzU2`H\6ֲzCfAc9 ްoquLF/s6$ˍhLi~|K}j>#_Nje^h+wlr娭 ]䧫#hCY._uo,873;o:3`1 򅕃箾ݝGp^y(1lnQzcH߃q5](xtP;(g=h?iyf<.O#TGv\us(m,Jc k Fr@c=sr_F{۠ښҫ/H֊00ncV{M5/s %{G3D)gO*mP~&53{#{D.V,z(.O ZDBQ T9.JN[9U41_D89*B,tNL*&ӶKMgm[J!@.BD_j/]qcPkj[+ 9 񜔵HAuHsNo"5#DY"Juq_Px Haj23w <(hZ*" fQH1_^u%xUe9ɟ-k70:$eXjk\^0YKl`EVkxfE:KߕUYͳ}E[=k 0?j^I|^H6m2 ]hQ* К0lYc=H*d%pcqMLb1GwC*pRyCZls>ƁBdF Y@J R:۠3XWu=gaߩzQ ^n@Z2WGp|i #xwi%M ֆ07 uu V07GY9 m/}[-w5e%Htd(?en ^7 X8Zz7,jHbSHL6J[`@H+rܘT0O mfԜyOf89&aJbX"/n&X0U;\yEhU˄]WT) Pj]߆;T ,Cq-${Xon}Ǘ;'4ˢcqe9 C9LZh$y.4cGmKT?pwf~ |[3,'eLBpWJMWrβcct%$7ۋ [}NoXݠ!k"2x=$t|P5'njnXk慫$cS piFXj KFO/o)h?$EKǰ`FI/B%Ӝ'ob/U8y} 6yS.N(4kȣ?dQ&h9exRpH 쁚y(ZN*pДvp!Y 2DL[K%3X*B'u 5k?L"ŇM9L^aH%lǠ̗b1NR!<z cO66=(pѵKT %>s0ݝ﮺jS ފ(+!;)|3X  D7sӭ]]"Eg҇|3gl1HCQ2:qs:tROV}+pPG(E=G*g>wBv5^Lf{=Bs4=%Kv>c9 ރymlyX˙.CAmovġ\@8戬`a]/@s3gH?B96pp"qlӺPh,TLPiRENZxA"ap=Zz2QYndE w|4ҕʷ3F?ɹe4ǿDKjqZWeCJe08.b_F6gd&V}=N^i`-a#h+ *iޭUwfiy~MPt+c=u рj󿽊_y ,;4u\~l~GՆ}kd#= ]俦+|7ANqVkz]|B\; Ш?g+Ң(SǵA{i W`2;+vTrJ- 3hl8jܣ+*\ GЖUMQ:Z)ܰo&O#ɽ–t9 6 pfxͽ)#n~O@//eոy䅆}AL}u.R+#+ 5R>Y&9M)Eו4LvDл6DV`?B4Ȯ_WYwׅ1'E;^I;r֯!mD`i )+i %=>X? D ^Le"%v]8=D8*b LFvr0k ?o/'v33K5 cK!gЋ<*at&`8Ú:WXp Y(OZbҵoN8@6V{AL޷|)P2|w6ю˂mp`AA ظ>HuoM) c[nuټ3ź- )%Z[_Sxz zْ{Б@X5BxzWÖ .ݑ~䵃[f^>Sݏe3"vX@֩2[쟝ak%< peiE|!!E _.zng,LqeÁ((mQĬs3x Sř#9ys^8c¸8 vVEp+Lk39N[<],or)N摯InvяȻ AG7t)wzcynOIsR+F.*/j@]*:Bx(,*$$0'gĔd;B Q[s"tq?ZiPȃY2$Zb.=dx[ l`. ovc{wBǦÀ" . .ʒSU"ʰ=2+!ǩȰ3z]_**!)kwe;WP$<80HGtjOOr8ODivE]H[hCz} A(74wg~jEKV^e>h,s7v =Z׷2s5A<=_멡?KIV`|2@z$B$$ Ңƻ.qL3Ie!Ba1- ;5z8jS&Y +Q7/O\|[`wM70`sۘ/:J!`A<8lcO%: Hc[:˩=0JLBbģnqӴ&QI{U~B|-Kt}0Gb0^$V;mu>:ɚ_:s%bP6-)H X\ۖ[#mUߋ38wO.M+2EsRTWkruYfaۡ_Mb1A%Ϡ]9%3`_< I6U3h8xx@B؄E4` ~'nWqg/*{F>U]h OSO|_阿`5-1$3$ݍD"5%#_5! 'RzS \K(ngZ=weGI,Ϗp8{"C 3y,ljs[4^̺:CK4]p>9ȻiET%q"̧DBHY>ϔqy+IaJ􌖆?E8KX ;"E/R (}UUI-cq_=Lڕk.=X#*+a@+} {fUf f/݃B31u|ϚbgekXDb#u`Ͳ)9{"ٹҰ?w"JOzb$ eܢ҄FG׀,Hr*([enCxjmJ]ɆM9?3gNPVu"ldSI J/׎$3 H hhݬ~KRI $䲗YR9 aoh9$D%#2JU da[\+ߥ.2Wi;c]Aܴn']bd%7&`>Ltp[oC-9$_R0郋B+]읿1{3YdٝKROjmPƯȫ0]}ʶdzwȢ=iAy Q)Ѧf Gh˜?-=UQӿsy})Bŋ^4p.͋%5"+;<*Jp^6u+0< HKGt#$<yAr՟sXxl‡\[%Gy@ n䯖L|\oy | v+yN[J ˶H+ FNo$z'`A}"sɣZ>H PkJ&i ]` oBU;I_,MBocM6N{.ދ>;vdo1w[;'ٝYq+B[DU&ο7xe:pH,S%e2j}V5\vbNY#כ\-$QȜmn[|е^Q$fQZmhPGn{{\dEWg-NL@OM6HꐡJ|3Wkt;"+:n(;c!YM[~F Xe*'v0bգ^Q:BZ5u9E0^ҋ=]0r)H0Z2Gg⋚A=8k$5_/2f%wmhǢz!LBل>ԁ'j a4;MCn YÌ{c25ǮsFƑJ ##@9T>, n@Իbt4T Aˌ|BsXUjlC@e/h^>Lg"urv7={jX5_ r-.>/ܓ?ADWuH*^y8]~\u2o8Rg*\/H7T.yPW$XD /;/r:l4A7tR/l\X?Sk?H:}_;:60i^!bIiyq;M@X$DJl5 ~\=UؒF͙7VB'ֿEPGz c]lR=2({VhZ⓮=T K]0ªU\qU7&ykN>\oB(DL S{ZvXgy4` ]MfC8kپ;č)X'7]Ty1f{ڼңI2L' ^u%}}XtrEc +)!7+d1\SB#J$?;TA- z?;`^YIC&AF;CoJ ӧAqvVfI*4AG72ҙmaxVKiQM (}s]{E'803k+}W=WV5@[z:$}t29 UmrV"%;=*JT]TBW@$8YR*jyCCq涬Z=D1f.c\_Bɇ{$rK5d7 Y6-bYstFI ITLkcOeZ?r]yzjȡBII)JJW/VD6; s|y$lq9L'#캐δKRsޞ2^;֔7TM$lWq3~jDh/N25TE"a8hF[hqDZi3ycrd|4]<hV"h}rdU6?3.7Nw:odD5HH6XnSxeohC'6ݵҖc_7\[AOY+)*][TӦY;'WʿjCx$ ~gxك Efl8Qsg$R9p=o|jUCZ1*&1Zfm=V+a[ hav`g+c/RҠ;mY6x*QquHpVify>.j&YrZ}~TSo4J|, {.zbݲ_йʜdAaO tphJaia7nR#ƥ9 b eq@A+=GfH*nڗ/+9Y[Iv/Ž$襔 X]ɠ/7)nn;}U& M- O+P-BC0G ܐKS9ڷ KQRl ao}Hjh]$y`'TՊ΀aNT^ |gxk &k`2H$ZXlx3DEBs&7>ʈi$= 8=A0uN.B`[d`ᕓ \/!ɒsQ#p&0"%h1{Os^qI_)&J^sL@)rzTQ:_d [Y~MG{[Ka9spܜITNF3/qIoPFMlvZa %- qܥ3oI@聥nyzbJ݈"iL"*xcՁv$'Ӫj֏ P,沊BP_Y%Vs!p1kx g Ѱ2}.7ix@kiqXZ "v'.c6Nr9Hπv%<0bȇT b7(~ UYM{1$dSm{Êb!qs}%K.[!q/͆5M>S*; hL/zw}mâMl9=B<af3Lԏ5Pᆻ, APrMƗcKʷexM۪F06J>k(|H+آ2&.jKu\n11Aw~j Y'wGP]2R" 35J02 D4LkSlǞc# R9Gby_S RuA;Q}Ĕɋb='7,cLVT0ϯ|WlJ1([Q2ɝvL սzu݅pC2_~ًI}/bxqrzp{Q: 9%o`=#0 ]bqG\C!O1d}n#ec/9^I8-tMwPO[ًr}}nAVTnkoĔ 7VyK\<ĪuO  8" #}ǰn,Z$9;wufHEQTO *Y7ݏ7x9bשṃ2p ODl>]D+~Ge?oޅxEFw-WH0b`y @XqKRb2ͫ<۶h|6mKu.Ru6Ӈ2BhZ=VQ+!*a,9I~}cCQm}l2Uk@as-B:U*C( %Ȩv}!!YZڳu. 8<׺xCR! )iFRq2xlۥGZvCVKGACu,H /*whɰE<_Byr\2ѭ3qX$_8.N BÓFtLTҩGBwcr6% z5H͡1yiz[827'*vwΣW;;vnA/<, cu D.Qy`x!p3n&qWz e~4 bb B*VŪ`zm~ }t,F al'am.'W׉=O87\-(Z_>ny1JI 9Џz0#^! #t=b={eFIeA(u.\"OBMx"MAđ5q/n@wmVeFʘؚf۲2jE @B;m@ Q`kUږ/3GK&3}Q  j^jjj~tssgGq=l\6DSwΖMFrUy[~N :zmU6) e dp.5 W%q\J,NΞܑHӑLj, -o޿c:o/qa;Y$x4m #S5\ mRcXY`s % ?d?EDLR o nʼB6eu !frs60{ƳzPd(}G a8T3NjZ]A'-]*F4uyޣ@ks9R7W~*yA2i .%VCKW8\JO?~*q٧')MMͤ8y )%<<q]o9*1fE,'UYil@@:?2"wU(yi!LP@/n޻4 %Ưvꀕ@ ?Jb=MfWUWBlΒHl^F 0{)gl4yA^յ@LMOȭ] A=9YEIA[]eZQiaT|1 nrd#_>kmxm:{nXvuQwh2t Vvǐ8H@I]O11xd9ZCRo5?y߸p.<r7w F(~P"#FIy.diMlzCX1w`*Q˾#*0lxsu m~%ǫGz^ o3Sm({f7h-acx-D6sSYt+C4A! WE7?# l?\VE&@|ޖ(R]p^-5#R" MۙrJJ&E Rk2BXqʆSohT3@!T*ߞzjMCuvXB5 Н]->I޻OS?QYկpL wMaU]>TluqWHjcx}#xNioRnې-CJ4gEcu[?jpјx\q1fQL }ɓYPE(dE"|2Cg~{1زbXyo#j挳w$P}f5%,~yKr]z8aH`P-Q>rڝx%!^Id'޵E9J wfuM; 4mLH;㟵?um֤ O썘Uy!6RfnXѡxs& Fń24^.;VlQPѾVL-e\: =og[O+ _J?Zn 30V3jв;XfYCEdIE?nhX2oBTEVuJ!`;CFۚRZBx6Tdxsvٖ><_'R㴆"Dy&/K!qC~~"ۯ`uv1(`80T Ñ/='h !pAJ_E ۬VU84Qđ90'n/ 6K碌*UQ P1Fٞ6Pp2 f|Q/*WB^|p#C;N?5 v/LZ Լ<|0-]8Z[xav&񱟖 P فJw⦞'LG1M]C1vZV#@7yB&{8E /On}%?$*ЕFjȾԱ#zzV_#]+RsSxTl޾QҽQ aDcT*>v„(E0iHGYR&trh{1px@a[`kfE[nFnfN(5y5_=w}#ԾLւ- f? BZafNLD=~&a6J 1{'nQ;pQ!2k.T?2l>Gl8Q頙qk:aA^%; *AKB/x 5; ijaKfg[J* b8 qI^@~Ar:kIłÉ+'?׊ Xa =# `czJ "8 reb1ϒwh7MmKlr_wo&V"Ky5غ5}(Ϳ)N{Ż*AFsTy}}(ʩx6 gLq֞G@"拃j+|(|dUŽ}cՕi+9"{"~Ȕh Tru.#"^$)8ch/^#"Ej{EN\I!qq5o3^/6I%}qSbR,#ezJӧVd(OCh2dFÄָnZO/gእXv(ʢ&04Y OJpcX?p-4He2lx|_*rԴ-7]TSD re`Edc3ϖsʌU|=1YT! WHvVE:P7s$»j}u+H >B)p :9}`9xhZSxݱRI*)\͔0B`v`Pz7|y l/sGҡm`H+9vϴ0<ŝA8;H]N+&+0CaBdtg$mz= 4;+7Z۠XpѴ vmT"z-Kl/fh:C@j*kOu]1 A:AS^jR 'c9H_ni2` WJHS0Fff`'M+%_B_?scPg𹧃ɚV"h%玁k m.3ipHvCZnGIw,fIn~[0p^G+K \ҜMH&*{I/ϥ]eN_ /! %I3X%Rҡv bcp8'X2Pީ3lt>UދFe3u-!á#2]V(0êHɷ E]%M*7X <"&<k͓n=9x~B92ZNs%.沿V(Exɤ~mP7syagJ .}_Ő#:Az޵>IoI)Mj4WE}^ΕJP[eʟvRI~\EO @S=5J] Df̭F I 1aLC:\h =אoiF+V\KǮw.2 Yk5hⰺ7ElGpY822S<=?UcXU"^?Zr!`k`K5 g3pyuZD}5ÌpuS+iDﭛ1Q< ɂƘ !y$f[CʜNSqTg2GNhЁv+\"QTMˆF=[b(Itb>[eZkJ5{Y^v=b&j*x[e#.K5i.gvCr=Zn5g~*gEHZ&?H˷c=D.`3b^gLz4ΨYYWK%}EdO7D`inDJ>t0pjUk16)o#{kB)BRUsPϜr*Ϳgb'=85Lw,F٘U* 1N4$!zmoF=g30w۱4;RG:MJ< Lqމiƭ"ZW&JuvFiI3Ȳ [Iפ8"ߡI+wwqUkMpySgFU/B$/60=@E6~D$Ӥ7T\A Q @RȽL(9>`^iKC\ D_qԁ'Ś  o\x i{;>`KBm/1g76 e޶Fپ_xL߭:Ĕ˧OҤ.dBQ=`e5{XSd]=ZH|z?>tSó$;P(Ҽ8ܒ#:JGGds:Ν" u h.S!g'fE] 4v٧ST5[o:!ou&F /kk:ƜeU/g- Dћa;JY}e;ʷb}KR0A"QZ U^#ͺf[Q=i L`Ȗ J,-ڏB_TrntY|_76XuG?1B,+PXB5G)f e}@:x⎘{XHC'1Åx\X l >!K8E3ȝ 0gi:8o CKvܤgqwïK\fǚS Y 5?0pPfMBq鱕wXn@ ]U,; ȕ[DE B;biaP kA(b̵r0Y}JEf6^bݨ!{Qtر9}JlAs4_"){p9nT$Mh8+q>#$R1b& xpj|z/ Վ*Z A4<${ 1 #O&P'C*Z4Cp'( g.Nd0W16!P֎P {PZEBu(}TG $<& s~Mݦ_Ul U}C$\ |q:|% Xm r5ye?ꯧ]΁=8W}m%1iX[BVnM+Cܥ2oh]d ^1^X|a w恌 eZ~: & V},Q.{*zWI<:/ 8e.b u2}څ.d%HxXQ-:è }>Et#X#_V zRojSF0ɫmV~~&SM8~"R;kjI ť 1-*[!1Y (&~HcTJp0k?KGNbGRjŖ#iv;ًЛu+%,.C{k<oc^e/ҍvb e7 /BG> x#4i%>?b;0yX٘Y<0k\/b'*ɔ=M,xJƺLIڄqkH ,`?"Hl+@E5ŭ C&n# .j*D#gsb~S[jKu쉜=)]BwI?6LN/O󔬴lXELOU'"_RR$zCWWpԅY1Kzo/%,;|6/SޤyYLE+4~ Vd'. p~r\ur Ԓ}[2ċ`'*<3߱8 2cBࠣ"0C%cE~&^sIɰч|)vTPl7l G4;t'Yze{ehJ^UTĄ]YYCiƞbn婰qF>F>y\t.Y9Po!(}vSOe-S|(>63J]?mnAWvD8xiP$\ !$0lx(@cx]kleDdU5FjzHa~h\U`ަ*t/sWot4?Лi'vSuQIrC& "GhGn| O]b2"/q+\e ~hiYw04'8^LKɜ)S͈-{H8.z~jTZ)4uB? `eɠ @jt?v8r5HA|Tzd2N5OC̅ga'zg͂NU(` ++s=' o.;0J6!~.9]xĒ$נeIw.i.[MgqL2aLW#sJy<-j:4_ݥw. ۃcIi}$;xh AxrvXAWWax| paٚ:&8)9 eo:)Nώ$_dw7,AiX! ӛCK[ш'!.5?c5#*yF8Vߥw)X"_+S^T!?H7Dre~ق<; I<-$C Mp4 e!F]JMk';iP-͏ +8zߊ>}z;ZIN4 \^rD'\E(*%L01Y/_g Wf)ưrˍ0Y~]/ z jSn]NVd;Ta;UR6#]T#Y 8RJlg0+/z'N`xgI}'_pLC<y3 X_vl*q~;Sx]S<`B %lQ)ת|ˇtbrMrK3TEq< л6 ew+|9؍^̨ W A@|?t>m-(F!K &WQ6(uY׳VgY7 TɩY \oHjC>HxuJPe0Qh.>ͪ%RBS,bL^Vt# 8]ޖu֘[?Zq/ 0U=~kWvYidG9‰IɁ<|7X:Y"K* ?TWWNiyL8U ;_ؽBjTY|"O˃ cf%&G 6&}u7h-~)W/T3 靈ND0lR5V({-?^XC~!`V D>, 'pK'S=:gRKJ=׵:I/oyyb3 cӘ"¥J}ۿ117l y72:X4:C1\Wc1,Șr$lFtА0"OTŇO{Ϡ&7O1~;:sRf/ƹkM~^p~ X=Gs:%d:CK)gdk*L-УQ-abj:>L<3i:ON*wٌvۛ#g.J}GvJd?U寥zųXFQݾ _G~fO1g{1tLw^M uJ+C箆0v:qcn׮^ ^̮sqt(8!{?Leqϑ-aWqWȸvjeH:;6znI*t_MhOԂp5 ;rkJ.oW=L-R@Dbp۳!@T/>YI'|'!29JTw0dE6s3Wɟ-˞%jv\|cM2g\}H'\ >'>*jol_ΐMxD#ץ^{ ܳ6Q P%VeɔQ ĒQ d# m\K$cԄ==SmHF{E r[5-jUKg)nr-A]訛xR,1c$&^+<ʘ@ T\jp/Pã0](P-V}Y`Y2Pv=ť.8R6Q~r7qhtö&6{v.|%+B8#T v֙AEZ^" q;ʹ+UjaHqUt YEZ@LKzM ZxE"pOv̭\"SpGYN̽Wڒe3ZC)Y^$gܩq.+. V*,&:Í8x̯mRB#iΕMF%0CNOmUҏ^Y4W.6723ձ!i =01䒀0`(Ltjv7vV-OnQqAP  ޺YuI肇|J HAM}jr)PeV=#+˩ xTO}W9tvtADhW~.l0z1z `HseE;EfMNjMb[$%k;b\\@.{H4ڲ2Mz,>Ep1:/_HêSڷ)^;̺s5tE/3nc^?#n3#ʣRh ;%?MN [^:;CÒ dH 3S \K;Q1TypX1!l]# l1׃!]7h7Q,,jV$3 M~ pI Y$d>($aC<}S"7=3u-.Z0M'&r+҈f Ye}շVq?\ys{!6bHb:| &go>0tg 5}/|H֬ka0WńfDdv&.as шM:Z $%`^o1 f\zi/RL)5 NEy/GpqCs6CChcLc]*~,rKRc>[GdsۘNw95Lw(mcܻxr=zM .B)Xv!up gWabL sNoRiS2,Dk?Z:hfbljۯe+c%y-aXaAs BWލJ\YwzKC G<\( [o }whl]+)zVɛ&U@Y:aelЌHpuza{z/CKIKN]+/;Rh#H#T16~jf*q60`BˎF+'i]s{]=9-?0Vh->x[~Ki`g̹>A>ʂۊLS0xjb+6a_XYu mi' =YWu5 B e*C/}kp=bB"PCɠ-GVPu'9%Ni茉n~*Z]jՍt@81<)_ޞ߂t0(= ᑯa\d/#E/ܕougcڥdWA4ݱh,Ҋ!A3#P}oValUQ/ndQ-vB8>D*<(fbP]!U^h'8Vy䵱9}r::r`"'0NIK;̈́?KDu ]/݉@OfŨ+OVj xBt ݅g[LզwK8e^K@ExP%Lڪ= >غ`Udl3oyhM2'E}uRq'ʠ2GS/DM# v~!PMֲQYPqw!&{vwG >nT]8 Ayͅy`ǩ(?  )gG&Wf+-+E4"ڷJ6X?\1p6q`o dT8M*rH)%߽FYL"^{1IH|vk QshV!+?j ]Y4 ĽG=zAH-P3ST@ʲFذ;UP-yAry+ZatR}AIR!TOᔜ BjX:ʬ>6"Hpr?a;.C֎EyuڭKl*My)o!㿋zvI|:%9xvػfv"8ls } Q\I!R<9 7G"$O"z1j 8>ca(+K4R\D&wD"VF>Y#tA+ o:"Bxl76 fn[!ʼnw5 O_\ fYa1"j ^a*JLcȡ5 VqUyKͥ]pQWT[%ajGe0`H6`u!&lICB }9;t2&Fj ׄ>&k4 _ a=O>;k-8{*BH"1M{1- 1N,i q?ŢWͯ,U=F$ Q!!vg1mH{ۡbƅGѫd.>*9.E!-$uD\WI#;5N|=*p]УS`yJ~k}F'#سβK@,QLpg1RyY\VuFјRW Y 57[R_^(R,]%Q =tV?!,x{E'(Sme\eOʶ]r_yY'^FZuUD mmSy* U;OכrHrgaγؾe|+&]`q3^5q#D|g{#*A<["!xdPD#ʺ_;;"W"^S^! a \B@ `pTI!I,3[;ꌯE{ %Dp\xH&L4J>Gh QXS:@" 'f@re,_!bTc%-Kk+mֺ\W*,P" uX &fBX2[}̄W!!Ŏ$T/{3LKFry]>*NzO4%+(kȀϻT_.3gDnCc <ճ lo$$cvO] }*^|~G=I#m+} \2{W! ['R =7v Q+5{hӫ9"]RtJ3{ݝhy@]Vo%֡*Rzce!8 &`v-f-sU\~ClJi7?Dj bLP[_S%1 :ۻ$#b1{㑇id#FV&_P{ÛxA!̤6%` Hf,*)pŢ6'Sセaʼi>k@ 7t y"qbܩ)#tM:]^nhiW 1]ٛ/i9=lv[+ g5=;O:!g>s!~Q>''M&bd]>63`*/CPAڶ `r M$ C(XB<W'~n#ߥBU3榏<%[)'>82t|; Xb5. ܍̓"-i|}ZK`3=%uoyS~]u$2ol4+%Kۈ4g3] @)9KXV 53W|#95Ż p!aҚ04PюKkϙuJ̵Mi[Cm٤mr48uKp9>Bo!Q5 ovp`z1.#ς^ZkK{niv r0+ ]GxŬFe/qGdL* z ~6/T27Y 6 kkM|0^z|q|TΔBl\iP=){#.'U nS**/<pe4t\]E|cUmӕ䲌kR6xX|c+5nhձCz - Beq)[ w]bX;Z nNjD9;,?QHlۧf㇣dt| SF`"I1UiVgG/jɁ9E1h6:~ DR rNP.\h8'HIUZ7?˯Ꞟ|` JU?Nh!^)l58~qUA~ H+l< Θ'Ni9ujOF4/Ri&TJwKcN]Lߣ/DP1tS/:5N7wyv۟e kV673jTMƱ-۟gWոgK? 9X MWgE29M,=y_-vz ҥ3#@|-?T ڛ`Eudn .#XK4c\ob pd2)$hȓ;ޥ%Ԗq"ɳ|oiK'#7.4e ?0G~sٶ@lXIL#ƈPc@ae GO?n,3-|@؃KiDuQӣ}‡X^fɀ H %/QS&W=ݮx2=t@[ &܋}li$l:mޤq9{:K*EP"RmB|rJ 5._}]/DJDuHZ-+@MfC%^<~c*NaIC۷dcL^yBwX] _FRDOB,m 32x(7a=G, oҎ ߒiB\z W.ѡEcn3, w0*pfPxMł)nSBND,L'v~Vpder Jc D̹˺W {T\i!A)en-++AJ18vōkr@̸VU*5"ᅱ!ȄEԤz\3|Ia.37.sZb}8Y-:}.\ +cء+t'pС$I/#o6gD&$9<&x!?HEpQD"~Vj˜Ο_U&}[9Y!vEB=8n%:}87O=6͒GppCM` \Lgz\׊H&I==K,+63a?mwSs_~k4Í2Jwƫ4s%ogsl2$ 6kuH6ZtycH#->^A6@8 uNu {=搲8P$NeRw<] ~boLLigkȰSSSfkj1DJ3Ƴy#+ v-7_R;t /Q{Ϙ=GXrNx*xvct-ԡ}{fѽ]$=*9a!RG$P$7P/4ֻgz$ ? Aw, L.d@1`;_w{ JUeQu2P4#@ֿ 4dZx<,$ kH}o\1(|X%+>9΀,AK\J'zg)+2h"Cpi-@Ch&-/R\)92#HʓH4G+4ys  9VTcԋ@H>0 /^uJط:7>V&ѱ #HKz` W7po5ТhCh8]u~Yq+A-8A(ֱHrxneoPt@e9dz?RފգaH_cb:=snK<(] fJ` Sj-thDǫTsϑYKixEڏ3Qs, zh/Rv!)1RaKr ɕXCUf `?Inܕj%[2p/r!<&bUf̳Cs͙v~s[w5@汾|ӈCq9Z#(B|P zw(%<V1_$F !2HF 8 T*"]yjw: rbp#m,];=#Xe@S@[me;u9FJ̤Ys=Jp[1Qu`L"JYd[ Ir%jGTmm5m˱cjJQ9AWXJ`3GEG~>ͧEm"Ւmβ`/U`h//7lq?)鈥OQF@ Oc+#=)2ڝ3B.tC B)҉lsb|%yCqmC0N0!XA3T'Zg.J1:c! 0/a12 fJ J)vB\wɢDO$ f+E=/ !|:L-?WAk:ߩՖd#%1+ FU;4J*m$VҝG6ذUl"e^2h!#3FVKLmk֦)\]3ՂT ώF{2͎DR|r1\Ao>1qrKyeލwٳ)^Gk,OhQM<_Lf}ҍ/zEU+Tҝ]N Lu G+B"^ =}4[:Iwts N5KΖC"֏ѠjuݵMDX=?5Ty"܉c^~hƉDSN^ .1'K+DL$9a)9JYz$t)yS8ʘWn %WJjUP:PbŃBz ⭹U#[\j*U9y5$|-dx3O]2f4CO+\9>J.Kwew5p>3EtLr6]ԗDjQE/E~׋ +f`i,ʧo2/"HRLӇWRsJ3evm4XЙ!U >XM76(cՕo;آκ(EaV & FNNgfI%:Dv@(ߗ- p cD|+HCn[b?J,;|o:( Șto*]O7w;J)V|-gѨWNWzg:Ɯ3dɧ8 Vq-db7=:#g@܃Ş[ ez9nය;2g%@8/1:Lŗ7 \?JN?$i*P'Y+"9$T; I>Zpn"|i y=0JݥA7}r~Jkaɐ=`\7)JU^6R(pIR:[ V5]W7ODnd|>6ʇE\tcy[F~ F^%3Vv)|DG3uH )W0k!BY,U$$΄`٩j%]5b+Cw9@WR7͋(4-(7MhWۡoe*t 1Yڄ+;/ZY\^++ @#hCL d04>aj$yFٯS܊4ZY/,6e)ʋpD/4E o+)ȃ?0~"Y*^$k:`26p(#&NT1[ʡUE0`i)^uFs0p260f 9 {f&X x٣^6] 5- u+)m2,F}j{*ZE){p`emFvexef%ޜRXa"Kk >8ǿoBYIf)QdDS1cʽyB~t,LLBJup G󳸊es^1nMD)aN?[_!,񭊟$=7#z[? Ӎkn, pH< L(ϼ 5{+PY zUa7,|ag*ep)#Һ;yMۂLdmę@w nAiJJTG)ڦ9%ν^ cKtVWS#=6OAeSOk؊mu}y~LaS_8;? %P#p)z;_#2@Uڻ#)~alR+4OyTYJPMDbi֯ ^Eg? xRʉ ѪGS̘tƘDH06mkT= [*=L\D'Ҝ$jޭ{{ Pưx78{}H慟,pz}5OH$-C4wPP&QDMxf!F( ǑvWڞ{sv3i@0NTs1(sZ2 8 ]L#%dGQkcyIN:%h;j Jo !>˽ג&\ =TtH?>8CƬQn#F١Cls?pWö,x#ȎBMyo=rN_VY6AE;+5Qai~\8;Ӫj+ĠhƘEpcp ٭)uUHRML$/`v cP8O!>Y"3wsw k ux)ָb܄wytCYŅϤoz|@ e }b|\U:3U_{rޠpۨ3 kuz'սB([eÅ8?ɠ5-w5 bntRo*=ӲMy&,660]w4iN]`S)ʙL!(EV"?#4m684Tx 5[~-qZX {f_wA^|R,ϼ>9YV Pp>=)0Qzps}tD4nci dg2v1b!ndիx-7V9OuDSVw#F1DXeqًPm`J %3[GxC?t24u }cu YеFmiG;GQڥŎ~^U8 mTW$S,}x/c[BɗFSMm5j$pV)ս 4;$k@Aj%}ng(fb9R[YiL.E`>|BTeХl c3tdңN>8 ςRKpsCQ/G2@p ,HrQ*vV_ J%bD~#J-2})w޽Jƌ<.OdN| ?6e"(kluY&gM)NNy9Nk)(E1Pъ"{FX~5"y1b>!?upR6`9zLWMC)Aӆ GN záX0gX vsSmj1|f#Ks^N;ԘKAVcLg@Y>IBGͰʩ6z<YiIJХ?i}xݑ!ף1Fg7ך/ ͷgBo3M.m/`47܄<<ɶvT+G-OmTUNE5y=xK5j۳RE/]a1789< WYR *0#ѻRGoUawD:nxmF# ,ڸ0 ;V5o69j̹ZȵWvWi;-Dڗ*MX(%@黋9Bev46e!",|@t|@6q1tKJ&"փ-ުf A/_eCqW`fru2}wl|(f*`҄སR jQ"vj`n ZDC*S`lD|ԅOZ:NһIm6>,z$3V)tI ݷ, f}ȴ,>ByVf5WevƵ$B)L-Xl+?դWܪgOq^K#aSyT= x?󖥲 @ Po, ՘5pd(!V˖Qy-85AA4W`wW(LŸX&V[.#@uB5KI!z4w\KwY6a3)](ɓnnؖXt{{ DW+YjVȾ>FPons{{-vh 49رlƋ(.0rGs~L53wlsI֌ [^ТAx;Ѭ* $/ +mѰkq**m?mڙZCB\}oF~YO2p(;ݢrSκNK &=0Zu%pکeA6\r'.Sl3sYJ(~bAR2b-r܊гjꓣQss0Ӭ* cxx ƾ9ky5͞r5|jo${|*[ޞ&@d9(_7(`cSOml91"xVl+[,uMU ܄N*k-ט j|t[ـWDj)qMA淜-x"x)1E¾6V V}$ ^cR\H2$;q"G 7MӳLx/^=b Ώt%iJԈk[%HTw:5eVh} Y7wͫi_80v6愔kRՙ SqOb} /0dMȽVVtҴx͐[PO(vj?~\v_5@Mӏs?RSL6Jz/p!9˥xvw?V8sϞ (kW=Jvdj!Vwт yV5 E/CM6,Ӹ۸ۑ"SZbN>SK@%ݜ&Ϛ;D_>*oلrI*;G4WWuѭ8^Fmet m'%6zCaw%-g[atЄ޿7M%ldOnJJj Ukʍ Kf5%+܁~fjæ+ mG$dwcO$%` !=]c*`͉j҆aeU-)!Dp҄%Eq1" Cxݥnmx߷G i 33u͚A3!ZARTВyLF=J TVV};~/Z$IõGp3_mzEp/}hʘ6wY̽J,_ dd Xex dY묥Y0' V.߂%p m9'cG4MWMF%fBr02aMe~wZ My?mAS|h̻ҿ6v ؜YS 0&b^B0Xyx6lKObs50$]f\ n0'?YN2T 뻶4 z4p AHfОK0+gz5i-HW ȕ4WڧtT8}d>@FT†RS:y0[52% 5O=N#j]rT6mbbsoٲZht=*9An{R-}:K tI3XfiM< x2(亯>٦*64S0To^Yu+>;V R"8E=S֬,n":6K`$QS,ߑY0z Omq*J7T(t' [738 e{)}"vGu>xrEv3֐R a T"ip*~DG4"K_^5AX _U/ 8[b/>lۋK7 m\1S=6.7MA(z cwSےYB(]/6GV򌆲PW0>RDUOOc 2#5^$=|R@Y|mGI9p(fϮ d 6f_@L)_v]3~,THE%v"f嚖o:rER1ݪ (f|ܕ[f> $?@&"qS n"@Â3\eW\U:n]Nd\P岝>W?$,S}؆kj\^w|Kۂ7B2_o}Q 1#=uS3)iV([ ~wl8D1؞þElG)Fq݇ Nktn|};!O`jjnVٴN#:ʿG_(EnǴG+{CyoSF:$4Z/u~铳/OؓGcw7ɷ-[+qe ]ЂW  I!lRJ4颕dD#VIAݲM9fI $KyNOR~.~%d"_fm ޅvj 䴴 .M2I83( m}ra/U^*tIXeFOF@Qz&RWx`S59P.e9Y俈=;mÏʋhM >`' |el6\.!ƓD?qWK(G=a0 0&am}q_ Mn-5ox ҿ_apÅO^t#[jzeNsqnrexPӷ) ~te4ah }c/ӒIM6YZǷb; BWD;U|I^-RF FoTr]X2LpmuiʛpCi*p9 F! ,r [DV/B{OF59Z o@^cB3 WZ}f3\bGL}*:^li%(g_$R7"xz T(6d{~|ڃ"y NFtA[_1N"dtTOC/Y|)ʨ JP#o{r"d56l ӀxICNKda0>m|s0ݫEd}7hEYEUfVzG !=()R K jPy&/GniE{66P t}9DfIsk_>nk VDH#PS8 Tbwq c`>rci?#;ٯū!ԫgC'Dʼn77B^^E Bj;`-&Zܪgo'8ԻRѴH.tӎA˱ Fm&ױ}<|g2ۍeSJ) "Yc6\y?kglRm27.4nߐ7軽 /70{aA5̝rIk|dj K,ťvHՐ YwVDy$UݲK>ه >Ǿԏ$mD5W)i+/*"Mj}}D|U$lMuݡ{tIA>"9F 2,%?^4ヘC@⟢>5T8W 1í|!>(cL*Z +ج28D=*qdeɚʤ_>yPugјiU4Zl5%ߘ.^nEhEJD9hR]ntuec 9Ͷ{"b^{sc` KI˵/uS;7ZnLIw˝~MJ E^K 脘3-,c= Y: 8<-dU抧]|bt!6" S/b9)<a/`J+Esd\LXay횮!)Ƌ4)MIA,;~0<]ezLm-w x{q<;ΊaTbm>v*G%.s:B;N@9GlGu[.⾋Petb(K&D&#fe0[c/HtG,%p6 '~CW@D5QUxiA.02s|>RZ4;G2Wo<ƭ|!_(ynf`Q(Bl N< |I[t[_}3LO MnʤRN/#_i,?qU_[JѦ =Mq<u]+c' ("T5sR OKx\%V 8› IsR}:k˟& ~]O(Wjb\&\%E N*=QFh {6@ ]1J| U",QmI VUmBK"n\ȕxG#?Z 3L/=7PH5F-utRǎ)Jֻݘ~/-]V5b,v]߯HPp M{l;iWwI CYXW`aTJ5.tvGYs y)a:l)(6t_7ZB<9yY@uT5HWuuS?f2J}?e`H*QG lX%F1n@DM"/Bxs r~'i %b/JM{D_,1==-@Cv1vp{3sZfSXI__,k-}# 840u~r6$νlm)Q7CE~mxKbb(h6PB)B޿1\"vF>mL.exr$L0t+8a_#夐.N:QǬ۽z ƚ! 1 l G`_IŔ^>.p%H0K_H@{8?'0_عf=FMo,x# <|m)jU:JU/•=l?P_f曁svjU-Ft!([obإh57,=ۑkN?Uy̥܌9@.mͿɮt3ۜXNqIB9w;)`~k_0^!@xx@S5haSxk aQ@gnQϯKŖgTٰpGg&9 Ȏj9ѱ:ITF~pCL`)LQ*T=ia%\f/MdLkn-.+KYg"]'՛䷽cXMtHyw?嶥{9-2ť⮒,1c-21wa4 ,|?{n./&汉9tz:G@{Da*+le+|C$?S3}.襞M0΂!`R / ,+zɿ=K G/$lꒇVzc<3,%_KIuf3qBSFZd|o.}dJn?~/S5 J1[w lٺi0ϛDy9(̏=T0w(NKp/F&э*# Ɨ:'~+<7jm!B"7RM*A=\2 Rk핑,*$G;bu@,6䌝9@Z)|dg/eZ^(Ȯ躓J]v+C1 V樮(os%͐ 3hK6M&68I1U#/Zu}J05.'~m<&& ;ږ9}|>!s KB[&$OK'L`}+3:4}HGъg^"4(f5dtLoy<L0bN#FD1l&A,(:)0N3juE:j=N,\u-B~6V/\BY}oW| c$t9a>`ٌkkM&cުuj==s Uwu0_w(=o[=Ζq9F{ `sY?|Hqb2TL/ډ.GPR`6ҡ&0H&+T]Qwx.o[k$ԍMb$DiLPX)[/W)@u7~,yĈoGBYx1w:"_#ckGs$e=`{2Pnx}K2>TrU<CKR9XO}>g <`’ B>*lx*b,M7^W4 YGow`K(#xrUBKJ/==$o+|)@QKF{HtۗiHTPBՂu1 u E_!InjʂyJe9Be(q#ըlNz49+DZiV5 ̹:'_ yW;ȕw0#U\^y vr,kţŭ.mg# )o4oEvEH3BqYNpyaDEcg)^`14h.pNRE^uHY,AwtBs$аpEVIi 4{mȗ@I`k+ lTB LETb.9$z2{k+ܼnmgP"U7׭\i"-Q^)@R}*8]'xxMڛ󂹽ѐfuZ:9Y.7NjqY7]hy'8Xe5PC!YjpVyZzgfV4Jh@D%\RW#9& FwMّpj;vg͂ר$x`U\ָ{x#;T$fl7vU%xt}~;65%R'Ё ųkwyLzI%5asLxDU/i^z 2ahM!l1,-I(qNajECKBmSʙ„Dv3,Joax/*t蘰 @ِӋn g,\xWwSys"P \93dy=KBR90cS/C8m*yU}S 5%x>vp",xG!c //ȱќqի{}36{/""**j(%^YmBs5}B "-Q:u-%A,NM9@Dޤ5.i\'pU>˄.:E#ic0bBwb^EX_?C]"jǬAyFYܹs DdJz/K)cÜu?Ї(ap=̖0N#Qm̶zDK\>Zp,daЍ ejT#߂IDק# ōhq;ٻ󳳳D=iw6 i֯X Zk`+m.ߌl̐ȍQ,1oZKaK~JBr ؤ)7Wd)u 7j1U^OXtosfyN߲&Z\%ͅk_Ps&QjvQB7!dbrK8״ʷ hGf= ߩHh~34}83rUZx:p!JͺWP}{ Gn<ѫ9vX_Kʆ|^t Ql?#T/2/#gVq:/qnʠ0Ƙ)~3NICZ( agBiQٟ  ,,㼆eWO˺0, D m*-{=c@g8/G7,E_uc.٦kȶiS !4LE߶ |OKщR$gsl܏ ͭ|ݟ" -Q6X޻5FKglZtI`؃るH=UӖLo .c|j޽Q`N7D5M,'zSEyddLf/Dmf'X4iFhxq߹g_n& G[V)ᆏjزږӪt ܉[i8ܔݺ Y-6kqX0[~9i\6:>x -GҠpm>tv[(Ї%=͹|LaC]w~!Fm:آU:95Iʭǝ! U6aNx H3,Ifwʚv 5yA6>Sq;rtz"o1Yago w 1.h=bORJg9:S4d[PGLF< 2wT88ɐ{Έ>`~[5ٞ"{FY4ET3!U,HS?q [2/eR.m-f9R$Ç/3 JҴ :`}G&Ui̤1l?,3Qa6m%?`gL,Rs++ckC532WD!"7,R)PGMnl$G@5b |,n|J;A;we$O2C'7p!F#|떿&kGX(:M pm¡{뵉,g$qec!FI jlr:AQE8O-FBte"nwSKD=,wdbu9dhjCg4X[XNT9o0,ݝͧ?(m^NyZwf>) 1-t0bG)oGIw쳚j&QmDouj U z n|c_bNp  3_b+q,||XbRQ ac)uH_IygAH${ײu=n@˭Ru112 Ɨy@|>YQy|9oEF0`;g]s^/tg*xD(')`Yȩt&3 xy_8_wmI¦om y]ڡmx@2 A?.a9$T\H벋L)1WM[[9Wb'hfO\mP3jelͷ9n KFb|Ӛ*UMc+2GB69UNFG'!&UCr$$jJkz4 O.)2!D!7Q8$mK #<~p!w)"iOA-1u_I8~866]"mt=5ͷx<yfM6eN8u8d zWوٿ3qc4 &7}oҵ^ɽ:]MՇs8v rLGX'>^yeD/߁}j2?ԝ"x'[0#_~bxyc٩`kuckHNJ"+/20FycL%,3ls۞Xح2Q a ^O+/ӚغQ\Z9YF1ד9dVtpp5gMSBoKrkaKuXVq;x{GbUR2 z^y*H4/˜sZ7jKÕ&xsm<єce=*f6mkԅgFa]d@`fc,5)P]mH2DW11OQ=6{9I˞+㣃UɈ(=R q!Wұ-k# k/zÆ UUM Nvɨj B]KTM?LkBͷL "l2=hصcvE}84fR(A R/ )~":s9 )k:ue7 aR8w@ 7ܡlבCEY영txLo_GH\x{a^}pd16Y( g|FDi胬!N!c{98dPDZu o,2=ngw'`Q ޹bk\~OnvUXsly)&q;[{j?tEW IF26|[ wha j|8iZLk%+-'.7)}bBk?G1?VZ$^3;] u4:%{ۡ~nZ꩷px% avFi7A:3F9%gMkdg+ 7L_u(쥜Dp%-e퍶>SB1|0cV4ʌ+.Ӱe!jrO'D}7K}X7nSj(riš*ƐE|-~:;hM.Rd6!}Vqrk{7_&OUq$].p ÝTxw3eقi}E0*~u.jR֓Erf|d6nV <[}~ v*fˏ||dx.IrE/o 1mYZhRsy)+-ʲEJmYJ_z_3ҪڸceZ Z+ܮ"#N`SӧOɒś598\UKw2Lx<Ö5:P0ի AvNZ1g8*yjiC/⻙@!-0b|DF]` t,P?[h~N5n[z3tK.%|(n 35cXS̔&QR"_9QJr)1`?N?˳X;_QdmڦD1 pʘyHBo ‚?:Bi @iKIuJL"`܍)]= T1 J8ZiA??^0^P׸nŝB&1!*NSxavM%{0Of!Kp[Dm*1ylBpnO؛{][b\.ň#cyOٙ+1ǨM*մΪn[vB.1ebe eM{O {gK㶆.*g>D2w-#^|L#$kSe])˞w>t"-ER ) 8 |Klg٭/ xfxғ72J^]NQ%}C?jNzIɹ#:45b^< 9xKHxr7k9YgmXk8oDnUn"zyCmd6T/f!ĺ3j/nAߎ˦3kLSQ3o3-|LGFEUGO:obuG ^5wÅYT\*ø3egi:FT{MrQbmptqAʔ鲊 'I$rEԮr5dy`^c V6L;"|Y>9k/s,UC |za\=GwM1UAu|Hӣ(|Xf }Z POm/i[wV ~`Vr@F R@{DfnBmR}]܂{yD[@@S>L[8eerk}d'nx!cag4VN{Fld!Ҿ!:݋c+Di 3XyY)F> c-PS 沺f_}DIOm8]ؓi35[(.p9Go*OեW9#Fȭ|ts e 9"}az2xώK~\R فw|I61]Z ud#mDE,y1qa{$~^z0kOf} (f(Ph,гgBid0^uB]:캘I$U;Ёk_evWm+xiy@XFՂ8bVJ Z9-:T8{燳/O᳃b~ٍV\R2¬ ZGr82v> jGޮS vſ8ʹi0X@[ 5hI~*]7D@E+m[*-A%Ky#뎝ԔDpL^-ӑJwyK~/XXc5RI.dR"{I^.Knh٥]*J^Fe˱خS4- FL@ג=s0$-ӻZj]To!N4x$raڻry6NGTVU/6d0ڲ Za5ʟ.E6Dk1k GH8zV?fM8^ʏn0L&srF;䤒=Uٶ~m s"$XP觏Qd(ll(~$n\Ctbh?]\&e2C|%#30}2v쥷x%n@襫gݷOc7uhÐ}` :N;JڤG$~ fFw]Ĭ8Ҋq `z`"0E>]9<$E"RD&ZR-H"Cw:ٙq+'.1kܙcځm+׹6$,'mò2 )ޏk?;aK%us*cG'~Q;d7#!JcZد@Ȇv  @cYZ("ɡ o:]y CjyBpaKz_RaN 3x*'ZRޞ[VI0۩ῘψDQqD껢O g8ZC>%%A$fʤbN4~SL\0?j)H~)e&{|QYz+ͧ>eᄜ̦E.zys}Hׇ検v4d16EH/ uY{Db :$o4P,` 8#K TίlO8+Y.u]Inj͐>,V\Cf1uumie{tS-g`sH0WD @p_&)h8x0쟠NOxKOI¡d†!.g%[4GQHZ5Zf-ϽIłUkok8Z!p{ǥ?}K0H9^ENx͛[+ϺOiJ,'fH"1:ߞF éLoe|HVx8˄BQ> X+OCx| }P6^pRQاXX1ܶ qM{IKD&*2|̧gaWJMO'^-ԁ[Hl+*?߳?,w}$kѭЎeJK#o[p AF* qگ'א` _Z:'_$, *#azPbͻ,!~];|Iu>Cb5HcYw/?ËU:XF,W"$E)k>I!]1'\V8:*O|.<$-`>tSHQTK;_ !u-JNAś\Q;آ%$}jse3b sý Z?ki\:VLˍsvw* B3v ܩC 8shЕ/U)&ZcXBSHBq0Wxlڰ|")b"r@cU°wZ6Ѹq;[U_a8%j@yJE>kia2fڍLΓV/(RU!픬 Oلqb) H!p}=I[P߯wRU\U¹udTrQTf ++hu50hX9b[%1@8xDEBO+6Bw(-]KFisJOZ,;?daӍUE@lw\2&%FʧgFHAB4߈kdjrʠGo\sӴpP>W/my/v嶦գZGKӃ~5m 9502db|lX*ض h N%#ځh$o_9/{ᴜ!)߽PJGcPUZd/h"oHF2\t-)4n#"!n7jtlj (vؘ@3KS>uqJsڡ!0 6 e4~p>?v5FsU<埤#ɇTmA'hkaiӚXt1 Y:p,Y|'vǦÎ R;#p0DU;K[tVBi 䆞LBgwuI3CEF핞]!ۉJA7ͨ r>^ޱaj5Jy^x% ۽ZҞ'=Kb*!YM,8+O( g)6,`zot aI^' 9APya9ó.n0]ws)Bб.r/LF嗶3foG` 9b?MA}3ibws^| NBQr$ 1ӎ2U5_c=eۨ Nt] ka',ZBAf _6& /c]y7Vo扜VcҶ5Nđ4 û0U{\ LiԳpamdt7?,{rO7'a$sE;%Ż5[6:PMka>{yu=ie&$j8o%8:d)V  {xD2\ƁdI]Gn]]fRh'gvΉjJ 32%~0K=Y~30†Ȝ]4M&MǰqٕB|)78 ~z:H6G=[h}QbpԬ/eT{ED'yEJ ˅(pLlFIB&yGyx#]s?Mߋb5 Nd!3 sK7YmqUIaMŊ]ʜQ \ :hR'æU biĮaH d.S`\7?(?E+a]Al${ Gc~[x" fqguKR]T;z.p32ӰP*~շ,hP>jn|iR6_Τp'U nup[0#ۜ$>"R,."7JU^WE*\QlT x[PLHI}a +s-j\ eyt]6^w8&Gr`_ܖ`16Q".#00ss.lCq*ZRg9<4/gH)ZN_7^Yž2f=RAgq9B.k#PMUЏ(0JݐA",wIaz**E(ɒNʬ=֚1ȧ~C9)pB׮JFT|>{lD^ZD\tN^vC h609aZQa5ɖ\iKܿ%sA*a'(tݣ ;:H݌IA](6$b)uSYMCX,h@,̫7d*y ݐ/!M㭜 q٨qiȬdժ]‚wepy?J;o5p%9WD[UX7=jF"+J1w?.\"KefI|M/S/NMU(H9 ls^ /itO-YpF]׈6x\t2[\̈gM6gS[/pZ~5Z[fU%2ci*0mN-=AtܺDMApUBB:QwL|I^Xun Z㟹꾳aK ?`hQZw: cgJJ ՀK.<@ ]enWI"@5SO)Ӈ\h~=OU9Մ1<kq4K uTugN4Z}&$s(ed ULSq;ĸ1Fhugpۜ^gΘ03zc1uma4zNqNEXWJ?0((.Enfcᚇ2a6nQdƑ&?BZOv- 𓩽0u}_}ܺ3!=9J4+(:J_ u@E 1xq-fy<3ӑJy$(AKD/1X0JD&/iBɴ6͠N|s5F=I>swZ'r}j$֟:)a}ꛨ*Rc~(>B?^)",аFb4Lb[:H5QѤq ) Pn)Ig+*>IOcC3o沉^DHr-`o:@TA[݇ 3V^n?vF˩}?uYͿQbnڌTU[e6 ԆgƲ ^c7RѪbf6ej8v_GE`ǰ9]&1`Nix&7LR8/MB{oF>L`}شS ŧ)wi?pG\+ ;Q<htDDX{Vߥv@>`Nj$!57b{_ @ds a(!:3yg ;1ed*y](`ZgV7e⿄iduy8?.@_[VV6f#$$]VZ`؁cJw_Lœf䐃\[;i2,Gs5,x mr;ofBQ^ s>ikdo-gpԳHX 7%+ /tN ٧[oHyiDwWy#nGW\k'*񤼫UK–;T'hQ)𸎺𥇪*Ym/ײz_rԩT2+\zHӘoHՔ(:86$.?Ḋ8Qe|DـwTl{uB[ 2NnovQyGB[#eҝc&uQ6p&]bBP|Ŕb6,ɓƓ<ػaXBB9Ƃw;*J? *I/\>jp-l\(eOˊAP?-~{P);al0ǿ{3N˵q?h"͖\U;1kPԮ˔DN`ںF&woUO \MCJ:&P \^Eϔv9SZZ5q߻?ie `Pn%35x;F]i 4']UkI eDLw6$I7._֨r" aYg`qf{lnCw5Y.|\@ܩktvN]-@OEWPJ ʇfV KC ۓ(67itǒf}9DihnF֩sѤ#1Eޑ&-RCYWn5M[ tymK3fY,'b ͋zNggB֑*?eDnC4n_ QwӚ57z̑8#J< Q<ǹKfU6%Z*DhJMR@D@C*%fpFwOß nNxfnket!JnDu6g?1q?.^ 4wLtR,1K#vQҨiabvOe_K' gxHg̻{Z WӽOckW8ǭXla! wY&fkkQ }evgզo8xS "sE6tR jR^*5Y_Ӣ ZHքW\j^>y'v q5B;t6ߟqja{4fcXsa#lr\dP}=qcw.rlݬh K-~1^0K#=2dd]T/P=Lh:\=XBzuӅJ% IV\hIۀ ďXAJr=p&Ȱ(q`[*ݦ44פcj_\OT ZyY?D}f,4=i}+LCx.d,O"gourAJwh ]Enα D Bb1EzuߔJzz0$w7\k]jCzDn696I=6Xxt0>\شj0>Y'8xEC" -2.i*P*.^GF%c4rWv.F5@o&!^Ȗ- swf%?Z'FìYs'R!.EAB"0dmU'j`r7d0?e)@,,>kӚD, 컂>O,0`ɽC>?{s;cdc[am4>"K3F 7</oW{pW7GE,(cR3/˥?ä˅dUylsLMwn}Z&j=Ι )rҧE"`E -:BYQ8ɨHx2䓛gS#KR-'OS@"90~ݻԪb1/AZkͰg,xFVؾ45ORNxr0Z8>">NV_P@Փf吖㢑nR'WLvE{H)(j?gz1zzж.Cلk0#m͕c'}0CUho?ŨxVƗ4e⥱|?bh$rO +XO9-'h"XL]zij%nOܟ?#Du=*,8AlFs&MX$s ⹐7?Wc52碃 jMc~CgQTU e2 @u:i&ھYd/b $@:W ı9YHFbK$e3PE~+:%hqh+9-ؤךH(&K(>v ZDZB=|em쥭!gƽEF/@ߛ I ّ9e1&8nFjcg=g,m0`t8jg8 !Yh- V3XBὣc4Ս?~Tm_n0y律ҋ;KC2pWs36c P^&#XiEe O? ?g#ˆ-5`x2ƤCa%(8]/r"9 )u\? ๖1KWӟsik[hP冲 ?du/*a wugͅNfꘄ?~ ߿T1n_&` O(v_EN?s{X >|A)8W8/8 e4>0ϬL \y++Xs~v];:DAR 5opV"z=b>:M^/Ι,= y?*6pKZIR'my(ȝ*0i v (Q=% Q̖ LWxPVTEn]!#wx9}>$bƘ*qR}`Rl{Y-R^{0SӖD4A4rѷ䘪d4laҥh'#WRW-8$i?=]J[ޤjھ[}\n+EIZZ/1h\ta[MqͳᗔlS`[|(~!h CBr_bͽ"Ntsn`̉Z[ԅ)1_-%ڂz3}ıslg8'}dQwmJ/%ERtM׫T*!Lq7[$ ͚}+4 LPJ>ґo2e;g|6I d^Z%W 23lsoF㸲rP΅M/LPm7= 3JOV֤(IFC o ¥pUV:(.{`m9}S-UL؉^ZX۞N)%]l.vg4eQ+abdtH|!7yh͚ A\<m4av#m` 0\.'k0)w3I1Ob?4Δ9Q,g1ɼmhC;0Yg) ò5ܹQUז#Bj jPSze y!.TQȄF~,нȰ&~wYMV?="/AG@Pu@vi0:l:So8TQU ;"JےT8&dID'[c K@P^W`B8mxZ u9mW:˝JJ"I[ͱF-fĞߎv(6ư|rJ#Bc5IG(0޺ad*P|7eiyZ.6i`P5sy.nϘ3a3 ,{JU/LHYD~Es{iElΥV{&qs!mSQK=R0WeLPD~n-}83 Lw#Kkb;dy'\'o S} 9FeM.d T9Em?'Y Rf;N4uvtðb[t6 ؖ7n5g UX8.D:k`#dG\ZfQk2wڊ,EM{T@U`["_K:C3/jFepvڞfҢ4- !%To3jP7^5dQojP:7a)ޞ^{(8:vXY1L YV`\W-ná~lNb&.b̒&[i_ws?~ƂY԰zﴏZl(akDtۦh4#⛤0zR]6]<&Z}Cm_ez1X:W"uvNG+t*8UjuSmR ?9"o:Ǜ"g_u9)Ϥ+j3݆/m%%EIFőh1_6{O{*=sh7t?fpMUԫl&eH|2l)lHJU] .kVC* 6--׼{f }$X-a$妫=̈v^<=81h Zj' YU0w8n}˸/=)'#n~M=ϖJֆ+ 8]^7V$9_@<ϳ G,*"/hmSF!Q wOk;mBYdJfPEh/!u2?ۙ*! İ\91iŗEk\ƶT8(~@@3זy u!-;RƤpQ1i4kYMgKDU(߫> z!x갉|Wcn0b"@k=Kd>ehP=V%JJaaKQb\_,K}$RS$[@ ?re'J \1 i2_ ]H!:krb9^6dj gkfBRd8m֊U0sDg*9&"X<0^R*r|n'.+ 7>zyb귝U?S-ٻ>.>P? ^3SZ_[~MʏIPB-`ELB=/ԯ}0"zsfS?jǁo݇N"|x?G4^YО) 5^0բ53db^Rfx`xHoЯB XouIr_ x}\;O ,Ac;~d6Y[{"#_5בЦa)Sϲ L׵~O 'D; lmiB}Ië?HMH|TwtxC<,{ 2ޤU <4-`_5O3?Qՙp,,ۓS[mx~U ?G%a 4z{z _IS@\+8>S06>~pڴrUf%P5&A~Ϳ#Ry/DK޵LRȑ.6(Up<(\U(1@ >,|&ٙV{IKj" 1B%kw@PH5stp"CW̙<ЃJʋ7&0 MߨȽLFxee`љ ,Np'H)8ӏ"3Kjcp?xYh2{7GO7v:&)MJ+ioG y-++R |fkY `p(ױvOS$\Bc<*]zvB|e42YJ?V=x$5u쉑ܶ s0xի)F}xAR `dY>g"LRMZ.p&1ϊs5vͩ5rܽCr{k5WS<歯~c>vo+GVp';>tb(O$H@{S'\@eâ*͒Y{&Y8_8<՛^8N錕RO(?^tX%DV<Sù Jq(:e -&W=NClUVf#idb ݎQ00)Q+fEM'ixW{ٯϝ,b2%AZMc ѭU.!í]K, Ը#JD5A> <00}}x [FNy:}4@lh"FYYtL1(w ©1ĦLR>QqFCQG3%pg!mb][za.)ERrHx]C|Zׇ1))JdzI}1}+?[ uYzDkeL@GYi^,z-f}َo$u6-NֈNeFm?R"csgܩUG&~FC- .LmˍJ!5T |r=䈿vc x{'F3n]^oQ?XW \La3`MwvCg$V%!*[[f\ J˖x|<=DRM޼ǹ%zX01ƾED *5c=olfb}?zd#kDrm֕uwSX׷B ;54 &"jF+ژ8u56n ) B=ޜ+F+)*w) XVfS9r'zS!c6k{$I(if*&C=j2%1cYCV%Y̳coToׄ '0L$%#`I1rh_<֒9X" ИgbUO6!< !:PB:)˗`KLͪnPtkt6Kxjw"b6f[z!Ue)Zx?MVҷe},\ NC"Es4F}+)7o9a$'a_K|#. _s42^Jb,cdBR7 eGrg#SI3N57gg:E~.ѢSø_Ľr?jwhU / ;nkŁ淬0%hhB.:]Tq9#1z?I uggl3CqP:"NcEN8GRIRŤXa^%gaűi` ljz\:=06dc#.&LFa7\|$]JĨzhPz1Gq}g׈!xt 悘ry'R^c|S(.?l6!5ۇ)g@QqXY(/D"}b1Zw$ԩ.v>_Sjw݅`,tGYo{;!(HrɍBe8`ו@>c(1Aj==H()^* jx>e:!0bT*{y~Xʜ{c),O@$5ДU;ࠛZԄYO""2aB:2\sBp@uJ˴{z<Ӣ:؊7YՂ!$[^6H?2cޫm:L_J-8d8Jx,r>WMO`j4S;% Q3RlH>6ܬ.}nlAD+?UP2(LЧ,I缤O?k]ldX3u|mL (z\E y,0CP*G/F9Tueޱcܔ|Y5@xKxgN~Ak0xv6TIs+beqob`IAyALK;, v-V~tdzI?YԑgNe[Vv._+rM ѮqȺ(TD6.HX3یi2C}]՚jpȖ! DBښdn?}f׽Nr$eԻjIiσd{P㳑&R֛؊|W]盛[Z!;HnMAjW|zpMӹ+I׿$z-UI M^XW_+z'(|p CK/'56'FqI/ڎSX6񛅡p*&!$r8Nc_)^;Yh6/5Vd/:s9XE|RJ θ,O[Q{Kvῢvc6O7ψTC!AB)P cIU|7( 5EpkcD㿖I^p\]IU4#Ē0'Wz="/|GI?䴥tڅu弫ZQb+a Rh.[i/')>+{P3vh: EfoG&eK3kh=#+oܰb(F[~DZE P|xl\iDO19uGM2( !‡c~D!qHG-k>uR<%ge1b: 2I$ --fЮfϪn_Ud2G|Z^z3%Hw\xpg&T= TϏ6>}Qx<0a6PdJ4Uƒ5f5DīUWS<|?蹶y]w3 ޤx1byt0(NN]V?Fax%Q hN.bP.O&#r5x-ݪ~H)Wc_JB Ewr΃]Z&ol9@a2lrՇ(1sIKM`DK%t8tĹH`?W(w;:l&&dٓ9WߓVP\%z#R6[`;2h+q6u/vaqZpWiFj#lW o|_NO2OEn]KF [MG$8iT/8.cc?E8N9Cl_ Rേ uĪ'ث`ѣJG O+>[fh[6 ua hVHg[9x~o&b>I~A H| R"qahB=u"?J`BjVۄL1 5 Ȗ0bbTa(i߿-CA(dƠ<5 ˡiw"F}+C!{rFr׆@ H$L>'{Kd&YyL_z~`WhɱjENV_HXt"sP>ߕSz`l>=:<%ETBk!@hWnL8>^xNJfNr+gqkJI3:Գ'٨f[rqu}xDغaxݣ'@u*]5gYRCȺ -)X7{WTO9ƒw .05/rT}T}Z%n?UqwƋz9csh̿T=O2}LhC>"ݹŝZp/rU>/ 3kSo]9e)P޳ '{1@QD=T vcfغ2IeAQwvx?G4 Ք5 {0ʧ)iãb.׆bp?bΠ]|PDSb]M͜/ 4y.o]"֙KG[<hz]D7,p 4!*b zVRFkӸp}O0IEm^Gϼa Vbd 6[:B:9`p r$rH4W${ jݶ"X~JKڣ tK׽VXqNH3|vo%Ml\_ uN[)D[IPaAʘUrѬW>lfi*p"Tu)@Η9V6SuAsz΄i F;1~Z!Q{Qm5> >+v3d7'[gs6I5oW~w |P6I 7Hs}8)%$Q!=WTJ~Ow]ݢUybOb|ٴ[SP4ec 3hJBta-#x( a1`mDKS#9*qԶ՜.gRK]He=7}zJ Ȍk'8!/Ckky"O$+ŘxXD8$ぉ@oW^ vC>UB풸枣n|=Z=[z<si;utG҄+!xI=2:¾gERGR W5X5WPnE%lL߳oNYv>_$>ad @B>i JNH>ͅkQ'Rl˿7?&72!d"9r( *;Z@<ҊL `$E&,_1ola75ALF {fh{pxzzFKڄ0ԐoVb2ƪ }}#i_<;Ub|Sh58V R|sN_UJxLZ|oG=76ބ* eAS6 J1D&8z*&Rr+A꣆/öڧf oS'jj lln~I}@^1p_o{'@{󚴋j8`7HꅱZc֋6 V֥͠ )n7ЦMt֣RKmƂjoS=CnoWO-oq@*6۵OOKe[:A ")ք՞` A}lמּsQ))VQ~zI.`0y[B˹HJk%if!AA 2|˸^H8*sbpfq)pG3*VfTXa< #'\b/cՈI҂6쀷P%Gl -pu[ ki)9W?nw0mSw0ek>$i:6ҘLjR8kռ(\Jc 8ٙ磦ŅIHi5ÛJ{Cpg^}u"uT*5wyZuq~O)]d:TݒxIT(D[q %T t<(h.N$V2yM*:=oy?wmqV$B"i qW"Abny',ܞjL a{'EA[+9LSR2`ɟ~<R=)prSӳYj>}|e7Jy5ƶM oMc d-R3)Bh\nW PddjҏpogU`?HDժ-D+1jDn.Ӎ0Ƞ/JQP #ow82Cr6ƪGTmqPc*\~ ~DkIvAf.fz♲AgrnFb7ALVU4,C-#WT.pT*=>n[rF6%Reƹ s>oӘ֧޲3mf ŵQ0}:,ehB҆LջS.=IR 1w!%hOl҇0(ħ'9E>1k7Ւ Xjv*05G=RϓeΝgł'MZ;OfLs+/q Hq\ |d0.z6LRWGIgՌ91Y$ȕsZ{S'27Iav e"Y[m<y B/<{?Oyq-kڧVt<6/v"TMԘT.؋8#ўl}e=]$b}1˸ZO5\_!A܅准_V_r/FDc&"ߋsXQqFq+O -OdF3N6%첅C~2#`K?^jThX?]_HQF;wԚVİyT@s%_nSc/_O頸Z~%&nS'٭ԛ0IuVTj0[I[S龸(YxsڮĿm~[fowye-_GaKR#熝xR ^,RJYX v!T$23{/ϔ6[k.8 '蜆 UR#X{n#E'0B:/5TfW0ds36&؛ڏL\ tPI*0$"@GHKvUZ#5m67T CJ$o"[$As7ymw鄖h?Mr"xr[A7@. µ\>VqBQ eF,|0 ZمM *$ɗH۟r ndKI|m UZL_ 2u5A]Z US0c0OOY0")`FOD 2fzk+A"&Q]'v=ܺ _(3ao7W%֦1d$_g5\7 6"j0з `R=)AlG~%=ZO ч5N /oam,Q]K}SmBx8߿MKn:$nq%Fj)m4+ %=~8FaDbGH/8t` ś"$Dt.N݇2]>`pk'݁$Ld/fnq[۵U*񃃲pCS+8䮉v;⊵;)d$OLf $mUuC¬;MZ"O1Lo728@Xm (gnwl>#$3r8nlsN'6 %Q#7hdh@=oNie'Y\fB_jqUY@7R=aCԘU ~s.$ sm0dx/|%cK\|GxU}Uk{ ,ʾAd[tkb7 ~g}=ڦ,׼Ɇ*T.C~Fjk׷j[em6+ 1n.լ4N})"87ui{$V&Te {qQɽۧ+C<,w*pN tީ)~A4Na]e,!H-ͦ7L$ =29?6#:휉Tނ|316ŏ`˜yb`'5NkomoY4AmԻ9NT&l#h:5 !xn\sO.k]ffT(ȟ^,[PޔMA'MTjNIIBmeʸ(R9Q$\fvLUwd7BGVVA{9#@@_,KEz}0qᒤ 8lywǐ$3{7j[Dp&2<+ , xJ8jѸc|~p_n; J>@wGBƣ~\Kdk1gYCɥ !ocV=hB6JLa;#82S_-xYLDTSr5F1b  D3LϲtE"x5Q#S!h0ܰZ}>&V+j.#Mb&)[U{wo%X^^'IJ U;rpĴ#(. fP`,ɒ@MN.C;Onr\Tt`Juɒ~( N_yl24pɞ3!Έ>K[Z` jF7 NJMͰfV_!aM6_e)<)AIqe _^dA$##*T831KQUb %!Ə;k!H~Rڰ1:c^W)@;]U1J2Ys(MD/|Wp',a}[y?(sTܓǼ4r*gTXv;S焹Š#h`r ~(#mP=j2R]Q)܎ ޷U|̑a W͡p]} "W485=WgW$ߚVڡ (^w=`EStbW"yC4`񤵫5H`kM3?~{0TRJv!nC:SZ76) /ʛnG2%7%>08ךmROnK Q5'Su%/S 3[Cd ;4wr)650&juQ@2[A@)uo.YzIӑ'2Iԃhi pEӞSpOr|r8GkSýQCۉ  j!*"Uݷb'-?>"X~.\^R>4L}BpUiTu?fZEgov8-n<Ǥk_/lz6ZNsX 玳Y{# 0J9nb V2SJ?jߔHq-œQ_hYi2iBaVhoxc ~)K6Q;J؉<$1.  f(嚇c*aH:#%`-dEF]c=$ |,ji= Sڂx|׷<(}^(de$2l 5 d_>ܧZ\Ϣy>V`}!§Æs}sQOǬ1Flqcm5ufrû^1f`0uEFfR f211vl@w(2s3˪I3Qֈc + l6]6ݘ_;8jP;H1QF ȥ4sӊQMkW=K(*xmV0ƶ:yƋltsH?usO{ aP 0c & ALҮR7vL6%nA^!VJGN KaA}kA7̵0jeBUq!g|3%@$w>„~?]8s~IqښV1N![*}xҾ{[%O > ;\u?rLtFvC,LIbX>n(3F6¢F5iG' Q#pI[[g9oLN3V' ,V#lXu uy0+l!$&}M.oFsXrڎK; .F n1O-ꋪ4iQ.w>R4=X+piݓU!^E ITVS~q5i/_GtK?͋__f^.k%:+ X]XC @M)@C<`۱ւW5͂v}shQʷi&|,ɭuOc_uUVo7iR<ث`穦,gddtO1 #c6STg ?!HIX8Db-tS[nS#;=:Ai7MZFLMpGW "2puyRrFNq&3Oox{& 0ٖ+կ.>veKVXjfKA?;5 cXѵ`ßB P6ǁ0_T"տЇ!H//ܽC36 W)íKJYg+=GeUp#'hc ,Ț(WC v}SJMń| l?mC/+{yo=Fjb\*Г6k pp ;C/R GgIkjp78ZkY*[C[A;aK-/%m0y>Bboʛ]ihm|]ڡi*"gtW2d9P$5s{M - Ap3KXRGHAP9T_üG gZRx``DxBFOU )j$X4EIT{=_5k?ϩP}Myr Zh{):HdїH T>}!#Ÿ~[ jLBDJ;&81?6F#7癲jEž|'d ^KN ! O(:pk5i_E|ӊJq+Xnzw7 uB,dI3K[bM /wpgL8f{zj{%H4l/a9'pOK\փxS/ W8lDO')VtKERbc+4x{.423/\&(J3yl?O ЈՐ2K5Ϝ.q80j8P7X;uq+Ab1 T),3~AOvlS"qS_94JN`\/f T!'},Wm&6y7 /[1NIqIZBAk!POdNlv#'@ yFup. f­ӆwP=W#icDRW/s'EdVߓn@~:g@oDHŢpJ]v%/rj̻\&>X3srj.bUMng߆#L0'. [Û%]eS'ȋ r ԰봈`hflPZ{ȟ L-A!4`> bPwgO }V)DK ayZ⢘f4Eg++~UWl5E)D"ԉl?&V#>!6_g8eG~%`9k󣳤?93~w 6<w+0%=w P,kr2 :%۞]+P.Wg?-_%{"{&!*U*5:s<%G$Jj^^Qd>:KhJ%k0NUER'0u:>f:iJ [M ZĢ+<eP=|/bd+A*?WɺႶC4,vQZb\c7Rk-o . fk]j1 o(dP v)]rl"SlS$F] svo¦RJb4.}wǗJ^i%a [:3[@C2xg).o~`#{9jjb/y܅WhQ\Ubp?M> w)Ӑ.6~8;ĆIб:T1ph 0M]%_nr#5\@G ;8z,Qg#!w.g@I(*hëч QOuLR䲰{h2F!G{1Q\0!y)+=IHHSG`"M&y瞕8s\ƿXy#.>=6#0XùʳgJaL`Qy)y՗їh~9n%#6zD4IK{<E$9e&C~ X vLٟxZH h&~"x1` [:Yin,'|CLa^u׼g0pݸ蔙Yy~钭X TGP.H2a8M\tXcsq1 y`˘OD\{LmXT6+rh @>ygp(*{ ㄂R!>EZ2"S$*#Ũ>$^V՚ke)Q&JԂ~RHشE}(aY @)d4ze@ ;E]x-9Tͺ=/r4$MFS5KfRNf:v;?)tigN 27 a4ïSxYDܖ&.__Q噲iэ RXMO;~WEbP}/tpyt5W_;*Q]ĥ. g%/3%qُ1\SgK$Qa/K&`[k4Y\ <Vގzщ'xFOb҈PqeU؇p*3Mk+zvν֮)M~Ʊ./9t@QqpT1 W_B~l| :oMOGtIu7M ?DR)?2Z;I~Z>9=1, R|s ycd|*NVX p۶[^YI,o0^S[CJ`hk|R<҉4pq}:V ziTF2ʺ'ڍуY?G/pLz[(<>+xt㙧m9[*2efb5TKRςs'1EFL}x֛b$T%4'7mĐ٘ #N!|x')|J`v>; B5}Ś$t4C6-Kp1TF t-slTh:BT*0Z{U\^/tRV`)a#Q,[=G#1tSć:w45(n|Q|C|3$cV1fgyCx-X Zc M,="Du==Q~yuk?D=;lPU+dzOS!ܛ3"vVە<ȯ!gu;=c”&ؚ%D$Q5 d%C0˪ :*TQ죤x3[&##XXq>([ fp\_}ޫ #u;1os@;QW,\y) z$C<*MIor%KeN6H9d}^߬0I$cgX'&YЅ:Vd3YL`#fX.qJkS--o6Ml1*$2V[x&'ęnS Mpٕ ^aSlC:%*60`xA'? mpT=d.*otfL I:m FG_C(bbsoWɝ V*QFn 8yuh\L27//_a/uLTM{W"h?*%s ;ߕ]ǁp2%BQ5 CR8!؝L#\dis @U}-i}VĬeH_ 6Y܆.eWM{x/O#0p8v8_bĒXa ''P$|˩6ST{ "on <*l ydfg9/5 Bߖ<}*OWGa +1WRPg2ƇG뮆*BX޴MRP~b}M,em4&IoSR;>Ħ( r;uu_+V LAL$M<[f{#u]2 Y;+[!&:Z WHd(9fŰ%N˅ ga9NbeY}vZXQ TTb< ϯ:S`Fx#FOlCPu((JC^~(; ܪsaO<6O?RPpÏ`в?Et|)\#?-T>.L<_LZÕwVh-$ɩ XzR(%q_=  xX2J)Æ`ũX+k񌳯0zG9cRk$uMΆWKr;C{2+ٳߔp 8ŌiUYu3NgxAy 9fћ~aﵿ9y po(\5lBH-:}vJLOëS`R'ȍNNh{Bs>7N.j6m{cMC"NDjO@^O:3}@fk`0Jr oK0Q;'$l\2-mieN`*mG弇gmto 8k97 tkeXim?ZsؕC>;M?)3z #fl5floyޑaJg=o^4O*Q6/ӏy8Z k^!uz֛֡i׺LrYy} %3LX:Hטj#*qrLxf7biU9Ѳown%SHXy3K<"!DgˠCQYI|֢9v[Aהw7F5-?$A̵5rA[KWq!LRmx{Av Ҵ/%;W*7HQ?xs,+M'`F7;׀W2?7(ؗ\nKfIC'',nE)ܣh=j(a|KV $ބ:$:Q z7jIto,NCmFxEI¾g{%T0nɲg= l:hK)Q ݓj}}Ѥ`y>N$#~;_EWQbߘ8Lv%aiLZolsv| n蝤Z\فY9֨][Y*}["2<^b+}R%\h(KuR@*/T4(.@ڴp&oh(IEnbr4(fLhp& \yNY@ilR:<:V^3--0d!xLYLr81t[ʾicj *qK*4#cᒤ {\ejf Р$^Ni_mњ |J$@3/zɨ>p!'աa]$5Ԗfί6(O +evA0CyXgEt0r@Sz>ܽkMT&GWD 53. M6?nCC(e7p1 ~eHk:A1GƈoqFP3#alpWQS#̓+USOo4 R_@sR}icf0&DQШ,5/ː>T(WJZo}qIiaB*,bwQ Ѧ&X\[#}?F/?҂ZXU˕RU_mmXYL1V݋{,BS]]C rDć  }ęT=6}@ w,Y&^U qEQf*PF%>DSlQX~{ Kr]7Uhnx~h˜ shf9 -QcE{0f 4rK1}ULUn~qO&[z]*"U_6>7Yѻj]F;ܹnJS4ݿ. 鬴3B{RxLqn6f5}c.cl?۪@n/¨GC-O~Le2 3f68wᘈℇ \ΘÐ&}x~^Gݪ$8!b@ЅsQ0M ɛӿJ7}2-TȞL 6e07H=hZH^-+H<R@L拜lI“9^㤉: zyG?Ǜbz${!y_/jc oEknYOru6IX#"hgpw!KJzrORw?}dNp!m#~[@j;S(SpIPgu⾆xQ1v]Ă)_bPgXUtUfYia8lf MuC.tG(GJW: ,O|=aPCŗz'QC f04X# El339f]&\FVvR:l)Xj%Eڸa}x/9pA5KX;uyf>^T_/ F :`&keo><^Vp{ZWT0\Iq'c>1x I .R{wrv5|R/h"G#%C*.K$Xp/ <2N<\^HoXL@Ηg?G|_{AG -v<[FRЛSpqvF<lqT54g vA؃ T3rm~8o <8;t3/.~﹟~ɴ_ήF_*`6݊M&/JɄPt\tz. UfI=k3;`?7'*(Daa0ede? .+z<`98J1A4[~c9xTs'>Z\D4l?O*Q\,OX ~˩ p--VY#}z%1(rŽN8΢;ϒ'㟰n|h&yTkr/:{9qM }Heo Y7 ~96NɰSWvHKXz,6okʶHC셌І7(<=:1g0֎S$,"p0sKWֈ?h+];KxȔBt;hb-(.nHEQYN!ϤEI>G>4\sir=yz"n8 p#).z 3FY\z2SNp9m%@f} Z*f(<4 0]l&Mʪ}}_ohP'gг2/()ۭNYr"TV6%k-KtqحM5qI.NI!!Wh{ v5$+Xv. I aΨ27ʛ[^XՕK0qR%z1׸StY3 \9x˺@\"tg5$6l(reqIMĖV1Zoם/o3-by=Ͷxwzg\ c^KN) i F_@&Mҕ5'ND>٤3lKNDWFaTBX3p'>`KK:0D(?a017tm-kR_Гr^ww@t HWi(axiCʱa.FBHgH1!˳ۺP5wQ:rE* 9=tEpkT?(zÞʛif vr=6OբHE{hKemCr@,]3rY,.mUKk{iXF(%ĻvmĖ;E٠@YN i! kHz^3iy#x}t5\7"9AYj^n{ZD`$ЅY<ɓ/t-3A8/"YU8JaQ šbXcƻd&SL4@lgF9yn!LƇZhA%BŮCMdݝowʺmc *f ?ER)ǟ,q~2ygB>>"oFJBXe_i^AT<͠٥TDC-pS0f1Q[IRmj@{v>S?%BmuSG;nK&X_fveS бCxbWnEB(<:U'1 Prq%J@nlVJWD/TJ 9ΰoKeDM}sF6-=g‹\^nPK9-X" ΘˍO,&0&F/lCm(Z~ "OeteZݛ`\ DMHQxuOY\tI6;?Zq?IovnQQ~$q[RE0Ȕj=WqgfmB<七ij袉nY5b!#3;\a )I7Rrj]9"Hyz\> !ZjR>C-c% lK| RJ X]Hs?ly `L0Z]qJYJ>)j0s}T5JB|d rVpo}mZGg ~S`"[atļ ZqYKy>Є8-OaO69XXRK@S-tו*[䡥O&H،ŻKP6q%ޤxYL(`O) CY2iRP YeP܇sUnίFRmW #hnc VJUs+0'F*Ō9衇JX\4VX!4DJ_U &j˨sW9ٓ{O{ËVO>\'&GNW9 JOvQ"&G'z2Š2/ٳT^?긾M݃7VMڸ5e-qjZHB4W^,"&L#`ۀ^}:V׼*vh/V>N8Rd.uvb'+"U : ݰ2`Tӣ+#%9"08:e ]mُ݂!X9K{p[1p`33 ^n21SMUC"Cusnź'X"aB>N?qW _z;k,H8L @m<{Ԑ_+x[XkB D)ܸ`!4ߎb$5,Oq@r`*hV^I^1ֺwJ?W_T0MF6,LDmNG ,`IDK@]aRY Bt.^gz7Wt,p gOmZ:!nz|16 wR#dGދ ? E3 ɢ@ZhUW+C5.lY', 9wLNnAs<,u?2!ȆU>Jr,TVތ`(-6d% nnD) C$`$}%}%g,$. D`xN˶KHت"Fov:g$O XV g}T2ڻȘeeOEUȦ{^OY}-Т bX>!ZA085x?6P|Z#{bc+.]&t})pLk3=) a-*O3ydeЁށjjgz@rzFP\~2m`' 9CpIYYrFэ_H;yYBRrmԏPOKT֓HL"="տQj(p5.}x%I6᜽u1yĖ:gߡu9*0.w B \OAদ0XF^飓)ʸPDL^K J֬R>:TN g{#XMHE;7Q;?> n{2.cg cKit,[aĊ`A9g:|ҥ3?{ЍX~^fnZ+zt&rmˋ.>;p>ZHȋo.bWNI N hMبDA󻒍y@[,uZ&‡A].? p)I-fEkGu PW.%`8KtecG ŬMnԩtU]sSgn~bRDd aDuURV9(ĹZV\{. |}qGB]&桃J,}k3SDaԎAn./b7ejEI,8|WĎw ϑӨM-*wi~ҟ[|| ?eR?x)ӼMfG!t[r}QPM|(YC[}K  hlQ 4I86WsP[@ fq4lp' Oӽls,m은|}T KqƔKz5Kpz&xRmۑxBe0b~7ev!וeH}Ռp' ߰a#]!3<6jV$p$QڽH*8fE?ongx(K5*4E }Qn\k3\19 y Pa0A([՞ Q8g\&zTKץ"j%B5)Qn 1g=<5GQ`~-gdA rq>3esmt'0y- J:Ѷ NXM̓ +`eLbek;kYVkնXc\;^izUZGcJ4C&xe)LH mQÛ w]]7BcIR܏2XvxA Y;.6^͜ڴoc4;9V% ph5^) Ec| IR$^vhfX@yK NےG?_۵ 3n,9|$nx=#NvyȂTm;i'|Ud)ќ O,­~w)Rs=sY!/$RƦs,4W 恥 >ĢݺW]؁ȧkM U91s ]*u!r)oFD c15:3A W- 8u7|5b[\w2ĉMLmy뽔/sČp @zNH1> !qQY2GǮfl с;ÓB]3M]RTG̕YǽWc$'a5zCKC~% ꛪJ%w2a:D vlq4"c?k=XhP4%-nQ*4K SdFV1rҦ[rzG 4MGr͈"~=(n]=4)+/{]"Q anf"$e"G1gKl?35٦ϳ:TDuU3>:@q;IʂmAvsm%=4>RgvrkhafcvEqjLƫXGޝ'VN$.TlG2la6?"s?(v~/WA+…->#^'?~X*{H| S09'!ޥ ,v+=LڗA0򕩠_ +؆Laf|~Rj%J: n#yl1..?U C%xx.(!)uu&=W Wo+A{A.f!+bϒ};\-5с./s> T_>]!tcnmgJ r0?0]DaD0`EhHC"ty3CFgȫPiw|4@vg#c|]̀QX?P.$:1!P}۰ wIiFŔq`ڻ<׼@4bL؉/C8D3dcw1shIg>pD~>H鍈X%:!.ZωhĥY6Smm+yBw|I5kK~ITE?|_dW"/FҤY ͣ&6D9"1фghjnLw/X=Vd84Xq3fj69$I=04M|=s0&NWj%>e(Bu;9Ei1oXB43u\ 7G.E }SU|-pIJSIP#z1Hm M߸Bpg1ƔFXrL>ݧnǎdM9x]Asf]V01^F2X r[3A3zB/Nkc%a#8od;5^e_]ъ^)m9mLjVG|H;ͷu .k5$_TkwHOqTx څ7XaF:jς:%J=Xn{:U"ہ`b:ULY%_m&j ܋7#lFG%1=u=O)wb #Dɝ.\q[c<,=*o%;PXtʬi4l>!jfV鶺9t]04Omw|zgJQ7#\y$ۏh$ج74 OF=͚][3~*/Fxﴸ#.;FU1 ǡaUnJN2X$⾨FY'+Rq3ӗ_ABN@_MBWМ;[6qq:X[I9P{8PРnl1b^2 =(dbepu8Y8L=!d*#t|9'L׏r ٬c`_) Nk3*`s1w<| ].S~Q7@c> @͔ߛ4%G|*,dlaapxڒb݊e= __|;!~܌ӪmB }J-L=:9niWH-OZ_K2َ< m(D8OLdbREVMumJkC_.cSFmq彉a*i->ݪbW3uAjO2/yf-lu< ؊ous2Hnk3\Ț_# {~;eѾ1#ͫ[XhSC5s0t XIN]TWөgeTXiBw$)(fE#:k\\TОP90Z9T"*St<*CSI 2Oq}묺-|%1*dkfgf&hvBڵh F<] aztPZl0htQ z5hӪcqĜ@f#@FPnM+s $M 4>'pq?,OsȻ#X/_z %T:n&*VCz<ގ+# 0JElC1ڍ}yP&na&#4G hl]Ź*LֲZeAd2e!iڹ2J7I4T׷΁!M& Sg>> p0Wr3 BH` )b˲PKPInWWl~:X_pL.eE  ' C, j_hcßO9$D_mW/C18W)A' ]ΞW:m8#=ty KlWs2{Lᓊ2 bIq'ꕖāsba%;z8%MU·)+@ɜW`CEP-:&!>IC_G-6O~ko°/H} ]~!_a`Qtz>yC}uL1Mʍ|~(5u emA~LmН>{3!S)׸[bJE,&=yOoUSJp];騡6Fz7J5tHNU}n!|ka3eamc*~g sXyCYpa.Ҙp2XFY, آ4Y~ZYW$m=yB{)WϏ%l it}2HU ޜasbD9UH#&`XPv Ms(?&[+ ARpc5J2~ '|eLf( d=rv:g{)jwVu8Mچ|îXۯ탕UapU%&VT(ev8(T1)#`1Aߝ12kP>ռ^;Z ZR6J~+ (`3bN 7&t'? t@[>!ls1YǪsuS&M v}C[9lb+`:7,uPQUkTuΉz_h/1'$Tv;)DkGb>T!28c5M'@3tʀi!yo XUSv aT lH vPYY'ZLUG _āJٓ#$=k\lsf FK{$FЄJ{!{9CƪFj> amۇV|wH̭!B ?wȺ+JА4?݅e;6eXRi{8%gSI6SWNL8s^`k4xhɔ{{q3p.bElx}K+^ŏ*UF.%]2-F{VBJZtz724uZk(@3O@ewT8B1m2Ή>ufflj=cIj^a;:MALf9Gr^ΩQ4Am)rCϗKoZhiSgԥ-ϨԎqaPl<8ӏwyc]naU21x$as_2yc^aTvzLn*s* [b EGM&j[Rxg=p< W>q,":Ք\LJ)M"euM岛e_O^?3elO=u("ojdzm ׵q ȩtP(>va+*_Hڣ[#r|/:qdJO嚖xJx1#Ӷ+y$U \of?Z,!߱  !5[,nRl?xTI/byHu# zMzaHVDèy_;,`Į@=}U) (ʤn6d8.sǷHlq:E:S@)Hal:t~ד=+>k#2U&:p %kov Ovޘ~D `:g>V~9$98gQ0IWoR,2Kwz*]5ZV N3$F,YX^-L ,O}_]싣MΏ#G7xͫr;3۩Ӊ :Vzost9NKnf5 3ӗ=3M酉tuTra-:n'Z:7$Bl$q%R6' Oę)"7ap۳4\Zh4ޯ'ֶD<]"'%}[[{|\@ |rT#lSh!<P|M(@لMͭG]LĽ17כ5nyN/P}Bu~)=O_ye9T* 5fnL^$y~'8+C,'4ABK`no8z A˱S6fmPHIB"lSQ́\5V1G4k;ЀW[I0D BWK ,E:'Ma2b7!fPsh[5r@B]ijyڙ;-m$B{̜,L摽u?5-wb!ljEx ###爐*V'ec ;,2l^nTCݕ{ zd }-4s%]ΎS >\j{tꭾ<$%]*WIiW V=sKMUxv-/ 0$YL]>ElB}nĦh AXTDTrb BrFjj1OBZ:3\s2=iZLbLH#y~ t{6`W} U~+J͠Mt.~RߋJ:wtEaHs|l@ci ྫqjS̈/syAB%ߍMG^-} aG᝸^ReGϧ l]cb Lݿn^A,T{YԸy%)! /ё4L @|]r7h-B}3+t|5*2åbVE/*?/Yݭ+%dƕ'b~ј'=\]i6?0=]1(EI/Y(.YGg8ɶJϾt|pRʣ~RhnҡVݮm#[qJR RFl|Ί㥱>tX  G|!x|I.Jp7[4sL_l#18V6nLv%ā^cDtC~s4^8 }}ϓ(Ya}CtHʺ^"Sϫ쀋~[X V8'B?Ԙk:<jX&Mpcy4޵aXm(j0Yꈒr1P ҕIQJAwGYl)Pr=QK~ D iB'mO]C8_j*cr)0҄\N%;VBp|ΙSV5Bq_sVQ"=?mIU5 [GUwW&a?=g{% 'ݵ؂:u_ 0-6(ѶQao8Iʹ{Þ;j`&LR24/ٮd*v"]zaqINA7| FH(?'q]ZXQ7Bp3WzǡxJixq晖z1oˈѓ"NgՋ˚SǴyif3g~#|M7*vI&҉zHщ&u0By:W#'EcGre17q[EfsLèI0KboVAADb悊If$V=6 ӄ ;LyHj5쾛 xv8#(eتHb)<-㰧3c%ɖP: ެ!•WQW5m0LZ,ݤ+ @r#s!5R~Cf=nR<.YsJ 2'C=@V\X{nr# p“]b@߉<<+-si<]gN>,nG!P~uYvBbpNAH]b>}֙?nE݋%{{ k!b76FypR8>܋>ms@D |<(7]v}q 7FBjeVc\L8Ɵr`Lflց9$B 8Z2v4<$h"WwjM41 X[Y'O^R`ԏ0S,(I8Ȧ캩G*㹍aPΘ_Ge쫮2<-v ~ѓ=6{^{:ij,7ϥ`7.Ag@gmMًWTwWd9. ^՟[f@r YdzIh݋ik%lj})l W88* ~kx'&;鯊pѯm,^l z/\߆VGD6aUW ?mqrk>ԥq--E o*;oFAa b;CO[jaR?ZV 8Nu봰ykT/,xDr!~IZtSZT>cz q##XѵX jΏ^ E{Gt-@'Tg5d|h,T]̜6i5}uz$9Aݫ GK/pV/0WJ^4JZÚρfIS.3&;1릯91A@' $stCeCr즠O%ZᴺhQ|B4r}0edXضqU龕n"ұceꍈZQ]ME(MJd6vĽ#(}3r߳6K.G`Bag,,L!7]màE)N?3AS)30bfN'.NPUNVq$?.]U &ⴿ*Pd#oxDNX\~ցuɳ~ԻP 21*2.lF]b 1 ,x2ֳM)U3>bV?9 hjn Y"b4wSW٪.e;؊i\ʏl*Aށ0;G.vYZ+kӬm5;@?t'q{~C|FmSP[I;R YDMBhzb */1WQĝPf/cbv+.1TloqI\{8Ś.+<,a&Яïa |WqwkZylCGyxd`+/̌X'ա{umu0u7'9N򍒔FLv@t^i]@(j"T( @, ԘAQYf֩ }CP`>PΠgC;4d. &@@ dŶdbH#+Н 0u2 GHRu+7P~=eׂp~3kOlYsm#YYń`rS=, wgNH[:`'85@uzxsN[VRy]T~IW nI켌KEOr ^OѵMrsAuƋ*:(xϯMr;##U#U^zS&EsZdG>n*ϔ(FD}ztYh^Z `fVВ'PpH"\k`Z1Ad; ey Sg(t֜Z" FgϿ*l/=PZt8O&d=J\LY|g耙9pU8S>~J,n{Qpc,N8&K4~%IA Xɔq4pr4uZ28CL@1֯9'F/N[1iA7ųx:Nv/Xkt>Lܓc _F =ÖȲ4܃smG!mS5˿Ҋ7!k1r>hJ׭uo53:BNNJЁ\LtcG WXeirVq=mDd2޸.#kr5DmwN)C6CASEL+lWT&Urr" 1n fOM`$w9ete,֌|&7/HPuRU2xvuߣine ?%Fc~tDvk -.׭[PD9dvJ 'vKi, "7ȯ! J ؑ:LYC7a 3 ڸ^*W,cATeRk`t(^wV`{Vsܑ̽b/§jYȝbDT \{kWq_9NHLa"ϱ[bw 9wƻi/Gزu_0Le)"v ~U% MK:?$qSv8R3SYrS\2{ R|MXJ0tkTUoM?Ix!v1G:TF"Hؑ| ^=̐z3㺩yK?,%^1ESm(y)Zt@U,a}vڜ=gRCDP6^^ɧ_wA10](܄5<ߢ}@S:q>>{/ eq7 ;f)~&s+7QxkJ9TрׇN"n!:sw*'W{佈 `Ҍ2 Ga6ϧ~ R N[w8Pn NaAM[;hzEBjt^suZߦ-ILY,XO+O˫L*Lf![5piPD7 <(H$i}A~RQ-ob~ ڑyXL@߇$nA*Eݢ~'oF Io?(io7bR%ӍP7\:r@e#㜂]m,^p R|ef)344R4yaFFk|l9He!/ Ůh&`uMھ䙬xa Kj(4Dr:svM{f *.=gڭ[cvOR" ]YBb5ڛ`.,ZCp[w,r_Fto;"ps%LoT'E{바bx"i\i NQ` o)y( @OoQ! ]k^=pQfUEvyhH3zm~&ݥ8P 6c%a->dXXˢ7{qSάa! MUx$*,6ӧ]d4>Z(&V:a_ ֭桜MaXniR}!Ƞf9gl)! r6jY}W$+ڰ3bx 4^HwW ]^#mĖli4{XFt9h!sa Nf$ X(8&~KD,&OwyIG}(;F')* [:UHhLmy7*S| hhҗ7C1(Ta,`@CULeE(1<xS5 3 OI5цa "^K:ʐ '2Yi W@~LN:;1>#A]~ms-:*qyiu} X#F3]*j̤[/ + "?@l⏍?rkFu\3]7{XƂ^7qTPsD6T~1做Tv5cjL_0|<0-JDdx,ݸ˳g%k%T5"}jfZdh:,37x96{ Xڞ 8?ߛI1I-e͕$>f?)"Vl>&EI 9OxoK ߋK[xڃs(~gD}$RWV"2!S雮)Z3#Yp&bGI2{S)VPFƺ>ZQ`R#>?WF7)l'"eQ7W (#AlQr<\S^8 Mpq+;V>cE+;PV$,2ڬ $oץ‰52uYݱ+C04m#7F _EC r#_T<("a0L-m-> s}w::^XWB| X_g,e|(TiCG:yk"IJ 0hv 8-| 90!U.}pb Ƅ]D"G\%t\g>fnǙaZ{m+vz4&QHu>srXso'fKEoTV&2pj)t azιU^DK5}P"&AzcС S_ㅼٔt\^mD)NQ3xdڜ T>w;eh^b)kdM"9()>S21p{ɪU<Ĵ).;:bExҨ h)!h<lvĠUmsm-8X7Mk.7L2c{M!ЪV @3dg|, :u' (*fiȄȑI^+VP4I)0bܕPQżlʌ=Mbvױݗ ]Oo#õoXkvt_~eV4yDQrVK0Dօȟ7y>QMÁ+śC.>NWo>YduZAox7.^07Ϊ?I7q~%R?xHUc"r$<8t:|^ ;\ҧ(olK4}ˆ3̚LW^'jW$z0]U/4ݛ݁DJ_t^G9 ҝNJe 5"> %M7}f%]< '/VXbjdn2M DJ^Oke?X5$[H}I*yZ,L9e*HARyX>m]k#"7j)tٓ죟&F;#iwֶ״\Ut(88(OSGUTEBJ7|:`ӤfW נ\]Rq|K 4p9g Ә Yf'd'3˚rsֽ"6tL:m!5p𲅜6K%koۣX)E3eoZSEl>4ٛ33 F4 ɤd<Û7թ@yVocX* MM~b1C.]GVaE[SPNbiv4tCQo*,j\I!9Ѩ GM+eȵU<(=?Yn]ZISxz4SKM:1_9Y:֑(д Llh8qFI.EsXFos.6c"UE ݖ8YӎJ_׾|xDq]S^B~]<rcLiI*$'u5L_)loz1Fê8GΏF}MhHbQ].Mb;ţeXoXbJj7{ēq}D>nڔhJ-PɲQmUX+Ȁ|}:T&B10J;^'*» Kh 6opx[_%j;cPy$aщaQk :cQDHʭAјN'[˫sԬ,B8PڑṾx/>6Jb4φzǘ&7rv]ϦkAB% "@dl_,8H@ Ůe険V_ tRmS;f;Q]Nt-S+_$IE?_ɕ *mSU)[y$nf|O@*G_;0L$[bQy.%}Hٺ9p>6!:}YBNgS%ͽ8_9pQa#7 p;ZC5*ʡExa$ * V'8T Kh>H9PX@?5)4ؒV0|t\rnԊ.BR,:Rx#$Nm={8r&C$ d\&"U׌7pUfar+ KVQ5P_!1yb qd+a~2(̖"f* 3W>0>wjdҊe2fIE=tt)yKrT}5ڋ[z_RI0%D _qەҞ{kJwؒTx ;?[qZ k7FwoEp._:k:0e¬܅IIk5S9E·R>YL<ž5JbC)pUBsq 6k9o&\hYE8fIr' UqO\ߘUw^ ?O<dpˆ8g 6boߗvڮHYwCjD2|su\H-Ya &(/FfM!ӡh4[m*(;e<_Jܒ$ߧX{ߒ6{ p 5Ldhm ծKIK 6oh<}p,!+GfR: VVF`I(-8 MoU^ x۝.z'IB=(d̻`ӻ*U퐤y(%OW;BEQcMe~n& "b16lXM:E|MM<8(9lI69AЭ1P(8&-,].D[Eս$ \b+ uI; g5<P*SseGR_v}igk0X")QM]ERdO߭dZ2Y 3;Ox{2xTVa D/c~Z7IQv%CqVm+UH:5VXYz!\J9ː4^Kh4$v@KNprlG J񿬽$s @;)d,sMl]{&#%̀:g6S])Tx[Jd*Ժ#O@˥!I ٗ5}QÛ=bړ@J5*}X`xOZ?݊^9IN SKբZ;t8+yjxZl<<̀-t7cN؇_WR+cF}I=Cڑ; =ٿ:qna9^mֿZh?!f-3vuבj-+b/7F#Ut>0kIEH5لK*q\'E]8]\y_n`(y-˸)0T8(LoYaOZ4 X[<Y`c)n$3%ɨj3V%XâlNn*ڕ+=/S qu2Fa'ji^Z:p4BJ4;z}/VޫMۖj7W 6wshzklzkZB0ZB9"5 Aَօ8 N?a[䎪 Eoڵ2t~=QmUsIsfjRwkScef|qȈڗȞ.bՌ8MdN[CBgEgScdE-:j:h&pCKdV2;Μh޴rڄSsBo [yNZs0 !7L0h@ϜLHj+$kZm:xmlBioc40*[!A&vO>Wl'* {` #pJ>5`5j]s}kx!,)FΤ,_K4.IU|OsO[`2Nկ`Щ%m\ 0Gs>ϏLˆg%(v:H9bFlM"1&1gQ$.z-&:CT+Vٿ-mW [pDw]T4SNtQ߯J]Ek&u)քU4i?-~py)>^SO{9Cy[= [LJZe¼Y5|dkԓ@س43)3PZ =mF񃲌<[`b 1idS85PUv,τ5Y9P\\%ϖgD#o,0E (b-6_Vx[ة  WvTfSڶhT9QwX  6g]1q2OĶIOY,$eB,rgXE& '4lt̓S} /_kT!cft=jpx`o3XQ'vs{෹%Cq?AmYi=FI]Կבٶ #n[]GBPQ`^+9R(&9ԴehUhoFDi#,g@c@1f=TP#,߭Q*NT8 W$ J[tSɷ㘒D\EyBxr6!Nb]&SQ4J.PK4olJ~K|1]1X~1n)ŝ5OOJ@6ꌮN;`Ԭ1ROal&@%._=@{oTcVJ$8}UuÑS,'D?GY3GjQpcNA 7Qy??a Np?tM i//ȿ<r53=t8zbAaqIM5DtAmo*5"PZ|KݬATCSZaanfR%ŧC?h1hQ6 $zlʌ 1.M.'8z8vkT-PiLWCcAINQ~Yжe鷁;^*QM4fh_˩uj,Mk}R;TOIi'趏ruʗU4추CN.h 4Ü24Μ}0Da UxCh"JWJ`qɑh,>|,yUKLc5s0lŬђiؕצk`J uVy{Aų!N.)^}sSxAB;%M1n( I,zv$}G]]2d,G_; /|'7]|&B F tζ<s|F߈\r\Aw-Z2z`MWp?[žJ `A[T:\ao*Bfy%ᅵ_O r,rrt4.ˆ= f"b{=n,.j|qk e;K $/0ԖRR>WֿAQ YG%@W#P?1$ͦ$ꄮ6q G-^*ܯiӤ]?0>zpwؤ;qW X",i 7d1˫p qlk~[q)Ogا,T:s!TAOwqWW1wT?SDƤCtajSNxt 8GE3tx1ыaĮwO䈹H}7+h : uOΨW`/YZwkːT6E,ԇq?U%ȲTCEa{Rwu<eOES),/玌NuMuγIn`k}A) jIiN& H躭>?bBpd1 W{XY)YTvn4HB̄ 8QǞi :Aِ0r/Z_^,#ЗKLH@"Ul~R:SO|Tlj AJ.crz\ ܜ~Ux{g,BJqs#5|"IkۡB0.W`]cAG mj೐1J&h f0Akn2羓 Qt=gڿ磣QXᘋL7p>P ;φG\ecAsą8@̋r෡GqU8PwMR: ?RAp A;㣝]>5n Ɛܥ2?x;Dmk)^X(6HoO=(sw(ٴc(jDO)CP-7$i.2r'(K5A+P)<3Koɀ,\4Y:y"(T>R^'f뼋 ! ̛ t74\~w+]R&IWH'c:_V?a@?SQA6Pj!#== LvIHTiCaap}]^4;W^ZX XˆGƜ8~O$Z)5hcE"9i9oR MgzHb @e|)!Sƃ?zХyS g0=z{=ґxicȦ},I`H'h.{ TVUj& oXvÈd UW.>^9 Б vJ>vrlF6g }lu~H6k^dzۄ{$2YnQp 4_X롍a`2JsgI;+ĺ̯Q$6^|@QW.h#v@n0?ep3oJf'VmM(F<^(ސHM,酚r,}~ۨ0Ĉѽz+FI;b\T ,6Tz1h9V3o*u[AgI87eJ6Y%ZyͲ! rsº8 yw :`5ŴoB%KqvطMϛrA}r X8GvdWGtF 6$ܕL8'>Y}ˍe˃!5dUSWo98kZ2I%,YKǃ` {"î{V|h~7 $nP" 7<֗*Nh>dBy5{NʃI9SCl{}Xe1y#ی~yRXp/Q4QM䳰ʒ,y9IfܣvKn5c7z`d[GVkG7kj*@͍8daL*TGS3w*cr*,Pm_~ߟ,Ըs#bO57N${4ƕsQ"]ҎF{S?l ©9UI[ڍB5\/C싘'ª z1\- )@F&GW;@6G0δlv+r_C:2<| >ш)Ԭ崣䱣KzCմrNOtd4%)%pQ &$7?Yr7I5'k8poL, 6aGDeφZNDiK^N&*Bi}wiM+hZzAeK";E,Рi+RqUc"PIrOO!֠7] 5H  ZRJh*0&n_HPOvq|EЮ$ۂABty愠bh{@1v1')@Lz@R|Ve7te_0ƎQ/:3[O"Dߞ֘gcOszC}mDDW\ĹݶM(6\?!.AlmcLK@`xK7I&48web : E8^iNb y-CkVW̻͢ 4cpppd)M՜[7bȴ?,%MBɞSZnȤaڼt$:;s }.aYkL(* \~%m+SjC|$ܟUclu/yyd' C=F? r=LyCf 7x'Lj• rbzɴƙi 9>2(:R|6ӏCuVs95,u!D*Y`TO$՞iJnpAPhHlB<$e3B7 GDՑ$ +cإa3@!V62+Z 4g^JrEh >ٯg^?AK ފJmGS֔QtA$GMUu{=t5fms+Q4rK5YN`R7"͒aԲs"Pk+OdF8qTX;^R?t#"`A5qE 6}shqy|{sO~ -z55Uu7^)05! %>w߳["Mls\^T~i̧9zc3R{d(UhT訚?WGح" ɋqn_,Ȑm>mf5!O% +9]9wSlO&Iq:CV@'rkڂej'Ny"Axt P0bbPQ zC=cN}ۃV =۲P<'3rWսu:#t+-6Trf\jSR^]Li 1FɄ{ImeUȖtqR"`ՌAD f-1Z^G8` 54 p2 k J_K_$qN,ÝڜFX^baAwGFwV'ěb{RXFn }%vS+;Γ߰ |`H5ǾªLn\G(ZVkh5他DId8"@Uxd<ňt2^ut;ގz!|ӝ -*elySeN h8nC ?."WopiN͝59 aP-UJe:k? Dv p~*Ь)Rrя 73x>hq}˪N,: MҪ=ʨ+ٚs>yśa32˩P|E%oq5`0"\TuռObRUA5:$x94ҽ`3Mw1Pt ,'_oѸL^UZ cC/^Wxd31F͖X1h`?D;Էt MgwԼ[jŒey]/wO.F< A kaJV/ %T.)ߚNPQfOţψSV2)%lܞrG#3x]zT9N(fa% ߶pH.vi|x̧jBkɸ yEj.m[nn$9~PGEMIDŽ'Aaڥ`/\/]%wi$kɎ֏ďD\'JőkbK5[9]S͹su/:.W!%o! UX4 K ( ,")qv~0Dowq뀨VUޜiC4$y 2 i)6 tD" SXY'Å zH|Xq~*̼.hԂϼ6f'O@[#ٵd Urbh=R`R[C_ l|bCy}8]LrϯyY%D(Vt $xog= 0&PRQWvh]w<{ ,>Xz%@d]zDd~(3W NV'MSUu<1:B O# 3'|0Lz d|}#3W 1n7gf[ع1݀dF""86(:0:9af̀AXC\75x0Pr]3:q1i08'@@#\^o̵үesyxd'>4`7]$;kfw!N_`XHrB5魿6q dh֟ /Ә %{e\kyBy6x寈:ֹG#loۀ.4 +]O"@rX:6ƆN7`X1 bÁ)7c!d XHtx/+d^hmWoPPF,5ʬM@+M~bth-7 jMfK'$)ϥ>SE{i!0->_5Vwpx,,5(pJ|iqQ,2d`J5n L| tוmI_PPBl=[9 W|?8 *D&BčL(;{"?.b" oMP,ʃ2h8Rz U,[>TO!! pr4TYAEX|}5QKj3+u$1pQJ" D Py]SH+a@4/pJtWf-Hף:PNޝsSͪKqPϔ##)z'}}窳;j}M$^T37q8xO-[g lqV UYvgTzl(|TIPZqپzJndVs}>;M7mgfLBz!9p2V?E\.j~F) z :߄Vwekٍ(ۦL֍y7!ϭPu>H~b3rq;,2U9w@Tj}l>n}iQLJ. i\ vٚ[KHkQebl-NޛsոX2[_=$Q?G)σ{瀸3CvCM0b:D d6aAD]hK4:,L(^Q ;q+_/ؔI)a)"9H<ɭZ=n;̯)tw3jcn0b 3p}C<ކIۓ.,11"2 "q؆q\o=Ú뮣J( g'OmVtk]%+hŽ9?2E㶪._gvIVF `qX`|GTy9IiŒ89{*Gu:~T$ Jy4z[Yf!B+g}29ZtZ,/VJԒl;ٗٯ TUSA{4W]K& Ah[ލkm1Z~'^E)'87$,B#E 05liA Lh"ݽ̏;aQ\HADM | $.O$ .YS.:`t wtKIqYL-Yc4:; w:El `:_VqJ8m[f֛[I{#s6;tœ)J[O&ϐe;2,w i+qՖĪ.uw]9N?/EFY9Y8S,qMf J >csǔ+)'FB (mNMA H_No?;iue_"6C" +OhJ@h~.29z39LjZ9&fY= m2|Rs3zjVŏ='Ē +JӔFB_ImNHuŽ/J+f`mҍܞ莝t2 uɩT ErFR4i%u_NmUqx6ф{yNϧ<|D|6<ƔAÿF ̿k)LgQ.UW:KV(l( _ΘaL*`v@ƞG OSl5j^a]ϋk/~0@]D$_[# qI^-욙Oc& Gt~:8 T9ZetƐ@~|Gshs8k:L}销(%A􂴞NU4pЊ+:04݁OK8 5C619, ;TOʼnR&'9$Bm\U6,U^j-;,Vgu#?p 0<JehU'ܽT U'3=ј-5.嬃61ɖ@^9E^+,dHߚ"']Ԡ|?PPQԹ^!\)Yk6>dk+m Qh1lK\AWBǞJeL/@Z[u?fS Λ!ASl| *0"]>|CxLJXN 3ur mQ5H:S(M)6%Nd gh!"b&~mx,2rYWzL}9l讍xVI^O"/6l?4 M9O ^W)߀@]YH^1D[7NZP||Xށi@;?W*t=Cs:KIr~#Q@? _zQct47:cS1д)- 2G*cZW잞h*JM͔/07(DZ.2g"`SQf{{Їexk+#UsVU+gSGa2+,PcS+4w5 G{) ½ ] um=XɔzЋd[YheeKl) )Br97#JsɶeKm`Mdd:+t+ }z>$#`% B,Ild%pF hV#"z}}z֠JC`,2Mכә w)b}" "[j<>bG]B̢dEO6CJ0FSĶy(VV8N`aߊ@V2[+Ɠ|J ("} K7c6O $n q }2a }M]j^ xl?:F rЬaWzں ) FU5[ G*H\sa&$90 lvEs{(dח3kw,1>`V(ᴬ;Խ}4b|y=;7AdК!KjFmTT9wI% d!&xWb} Q$XdcC>@ZRRuVFd]q#Ojg;#nսӹ]/|Q nĕ9;!$MS!Q2T'߷04 EG5wI+"*׍ "7tKF`9: ?l(v(.]E;F檅-t/L6͏D{Wy ǭclaQXiB>X-v~ XsP]oԡ31<>[M)zŁwDNٟB|:zk7[@(l(zSWَPΏ#`dCq$= qnAnL6ldZa vQ\C%ٜ/u}N4<*[x7clo,u`kZ>eAvTw֢:D- -0ZiĐͫDDh-\~lɨ( ]85C䗀[%fDJè)wr cZ,XD;pX\f0}t7+ՔIA, 73-?w*JHONcZuvcV`aL(_"6PeɣB@ 0`?1i\ZFXƲ,p)Pm:yig0j!#c(} c% YSiHԥ/2C.@2HY'RD=*LΜg>nAZ8]@egpNMQro'eÃʥ-tР:˷ϋY4kv0\,5L[[hQBd3=AGO- exYk"cx}0>!h^> kr}gri4͹BXfM:lxz[QǨ23a_Jo(wO[[A6b, 8yGoNۋӴ3;=x,c}sUHN;en< :FKvw}H'W# o˅X)d  H.:Egt=}2>N_/W$C%,rظDrʮU%kk;|qC:eXqºc' ̠gEލῢ<"km?HS;i"Sdz_Y"ưKq7?.5LzՎ ?ΡoG9z1kQW] 8fJ,DkL5#6p넟07;Vsj2bD ]Q hB0kĭfYDx1by`ڹ-2ȎveWH1Vce;I#fD@uhY(͂Ou5i=| pj= H%옆MBU&29M,FwGjz z#91gj?o~\-xb-`{\ϊ,Ψwq{[*e({# qZCU0Ꮷ1/>b0&r2;J,pSN4'/~R(o: {#&<^{}@G"o^MY _$O,TR 80"M8 Y(,*|27W_ޠg #cg$pR`_z2'IEr6W[C7En/}߄z 7o_HCC$ $,"7AQ $0:FMY"7="b3$n+Ϧדkql>rW?k*x,VE/(Zdc/A_VKOo iPbB'n6V_5)J-cʽGӶL6S+hXώgR; UL$T5 ߲n$~?Fz :ϱ`F3S4{B7 d|[9G߻.5 oJ5鑏QQsʾTw2-F>Hٟg>h;nN