From 39a1812c1ef76b6a792f00087f1e507616bbbb25 Mon Sep 17 00:00:00 2001 From: tzafrir Date: Thu, 6 Jul 2006 13:47:05 +0000 Subject: Tons of updates to the Astribank (xpp) driver: * xpd_fxo.ko (FXO span) is now operational * Remove obsolete .inc initialization files (we use user-space init) * Added an install target to the utils dir. * Updated README.Astribank accordingly. * Using RBS signalling, as caller ID did not work well otherwise. * Better handling of USB protocol errors. * Fixed some procfs-related races. * per-card-module ioctls. * fxotune support. * opermode support (set through /etc/default/zaptel for now) * Userspace initialization script can also read registers. * Power calibration works (and implemented in perl) * some fine-tuning to the regster initialization parameters. * Leds turn on before registration and turn off after it. git-svn-id: http://svn.digium.com/svn/zaptel/trunk@1204 5390a7c7-147a-4af0-8ec9-7488f05a26cb --- xpp/Makefile | 29 +- xpp/README.Astribank | 15 + xpp/card_fxo.c | 337 ++++++++------- xpp/card_fxo.h | 4 - xpp/card_fxs.c | 339 +++++++++------ xpp/card_fxs.h | 4 - xpp/card_global.c | 40 +- xpp/card_global.h | 1 + xpp/cmd2inc | 48 --- xpp/init_data_3_19.cmd | 7 - xpp/init_data_3_20.cmd | 7 - xpp/init_data_4_20.cmd | 59 ++- xpp/slic.h | 6 - xpp/utils/FPGA_FXS.hex | 1044 +++++++++++++++++++++++------------------------ xpp/utils/Makefile | 24 +- xpp/utils/genzaptelconf | 49 ++- xpp/utils/hexfile.c | 8 +- xpp/utils/xpp_fxloader | 63 +-- xpp/xbus-core.c | 229 ++++++++++- xpp/xbus-core.h | 3 + xpp/xdefs.h | 50 ++- xpp/xpd.h | 89 ++-- xpp/xpp_usb.c | 23 +- xpp/xpp_zap.c | 320 ++++++--------- xpp/xpp_zap.h | 13 +- xpp/xproto.c | 34 +- xpp/xproto.h | 42 +- xpp/zap_debug.c | 2 +- xpp/zap_debug.h | 8 +- 29 files changed, 1594 insertions(+), 1303 deletions(-) delete mode 100755 xpp/cmd2inc (limited to 'xpp') diff --git a/xpp/Makefile b/xpp/Makefile index 1355cc6..6b32add 100644 --- a/xpp/Makefile +++ b/xpp/Makefile @@ -1,30 +1,9 @@ -EXTRA_CFLAGS = -I$(SUBDIRS) -DDEBUG -DWITH_ECHO_SUPPRESSION # -DHARD_CODED_INIT # -DOLD_CARD # -DWITH_RBS +EXTRA_CFLAGS = -I$(SUBDIRS) -DDEBUG -DPOLL_DIGITAL_INPUTS -DWITH_ECHO_SUPPRESSION -DWITH_RBS -DSTANDALONE_ZAPATA -obj-m = xpp.o xpd_fxs.o xpd_fxo.o xpp_usb.o +obj-m = xpp.o xpp_usb.o xpd_fxs.o xpd_fxo.o xpp-y += xbus-core.o xpp_zap.o xproto.o card_global.o xpd_fxs-y += card_fxs.o slic.o xpd_fxo-y += card_fxo.o slic.o -GENERATE_INIT_DATA := 1 -INIT_DATA = init_data_3_19.inc init_data_3_20.inc init_data_4_19.inc init_data_4_20.inc -clean-files := $(INIT_DATA) - -cmd2inc=$(src)/cmd2inc - -define run_cmd2inc -if [ ! -x $(cmd2inc) ]; then chmod +x $(cmd2inc); fi -$(cmd2inc) $^ $@ -endef - -ifeq ($(GENERATE_INIT_DATA),1) - -$(obj)/%.inc: $(src)/%.cmd - @echo "Generating $@" - @$(run_cmd2inc) - -init_data: $(INIT_DATA) - -$(obj)/card_fxs.o: $(obj)/init_data_3_19.inc $(obj)/init_data_3_20.inc -$(obj)/card_fxo.o: $(obj)/init_data_4_19.inc $(obj)/init_data_4_20.inc - -endif +ctags: + ctags *.[ch] diff --git a/xpp/README.Astribank b/xpp/README.Astribank index 5e49176..f6f995c 100644 --- a/xpp/README.Astribank +++ b/xpp/README.Astribank @@ -35,6 +35,13 @@ install the (externally available) fxload utility. Installation: """""""""""" +apart from the standard 'make install' in the zaptel directory, +run: + + make -C xpp/utils install + +Alternatively, do the following manually: + All firmware files should be copied to a new directory: /usr/share/zaptel/ @@ -45,6 +52,14 @@ In addition, the file xpp/xpp_modprobe contains optional modprobe settings. It may be copied verbatim into /etc/modprobe.conf or (better) copied to /etc/modprobe.d/ . + +Note that loading through udev is not yet provided. Run + + /etc/hotplug/usb/xpp_fxloader xppdetect + +to load firmware. + + Loading Firmware Details: """""""""""""""""""""""" The Astribank needs a firmware loaded into it. Without the firmware, diff --git a/xpp/card_fxo.c b/xpp/card_fxo.c index bd3e141..d383e5d 100644 --- a/xpp/card_fxo.c +++ b/xpp/card_fxo.c @@ -34,6 +34,15 @@ static const char rcsid[] = "$Id$"; DEF_PARM(int, print_dbg, 0, "Print DBG statements"); /* must be before zap_debug.h */ +DEF_PARM(uint, poll_battery_interval, 100, "Poll battery interval in milliseconds"); +DEF_PARM(bool, report_battery, 0, "Report battery status to zaptel"); + +/* Signaling is opposite (fxs signalling for fxo card) */ +#if 1 +#define FXO_DEFAULT_SIGCAP (ZT_SIG_FXSKS | ZT_SIG_FXSLS) +#else +#define FXO_DEFAULT_SIGCAP (ZT_SIG_SF) +#endif enum fxo_leds { LED_GREEN, @@ -44,39 +53,19 @@ enum fxo_leds { /*---------------- FXO Protocol Commands ----------------------------------*/ -/* 0x0F */ DECLARE_CMD(FXO, CHAN_ENABLE, xpp_line_t lines, bool on); -/* 0x0F */ DECLARE_CMD(FXO, CHAN_CID, xpp_line_t lines); -/* 0x0F */ DECLARE_CMD(FXO, RING, int pos, bool on); -/* 0x0F */ DECLARE_CMD(FXO, SETHOOK, int pos, bool offhook); -/* 0x0F */ DECLARE_CMD(FXO, RELAY_OUT, byte which, bool on); -/* 0x0F */ DECLARE_CMD(FXO, DAA_INIT); -/* 0x0F */ DECLARE_CMD(FXO, DAA_QUERY, int pos, byte reg_num); +static /* 0x0F */ DECLARE_CMD(FXO, CHAN_ENABLE, xpp_line_t lines, bool on); +static /* 0x0F */ DECLARE_CMD(FXO, CHAN_CID, int pos); +static /* 0x0F */ DECLARE_CMD(FXO, RING, int pos, bool on); +static /* 0x0F */ DECLARE_CMD(FXO, SETHOOK, int pos, bool offhook); +static /* 0x0F */ DECLARE_CMD(FXO, RELAY_OUT, byte which, bool on); +static /* 0x0F */ DECLARE_CMD(FXO, DAA_QUERY, int pos, byte reg_num); static bool fxo_packet_is_valid(xpacket_t *pack); static void fxo_packet_dump(xpacket_t *pack); static int proc_fxo_info_read(char *page, char **start, off_t off, int count, int *eof, void *data); static int proc_xpd_slic_read(char *page, char **start, off_t off, int count, int *eof, void *data); static int proc_xpd_slic_write(struct file *file, const char __user *buffer, unsigned long count, void *data); - -#define S_(s,l,...) \ - { \ - .lines = s, \ - { \ - .len = l, \ - .data = { __VA_ARGS__ }, \ - } \ - } -struct slic_init_data { - xpp_line_t lines; - slic_data_t slic_data; -} slic_init_data[] = { -#ifdef OLD_CARD -#include "init_data_4_19.inc" -#else -#include "init_data_4_20.inc" -#endif -}; -#undef S_ +static int process_slic_cmdline(xpd_t *xpd, char *cmdline); #define PROC_DAA_FNAME "slics" #define PROC_FXO_INFO_FNAME "fxo_info" @@ -126,7 +115,7 @@ static int do_led(xpd_t *xpd, lineno_t pos, byte which, bool on) BIT_CLR(priv->ledstate[which], pos); } } - if(!(lines & xpd->enabled_chans)) // Ignore disabled channels + if(!lines) // Nothing to do goto out; DBG("%s/%s: LED: lines=0x%04X which=%d -- %s\n", xbus->busname, xpd->xpdname, lines, which, (on) ? "on" : "off"); XPACKET_NEW(pack, xbus, FXO, DAA_WRITE, xpd->id); @@ -151,7 +140,7 @@ static void handle_fxo_leds(xpd_t *xpd) spin_lock_irqsave(&xpd->lock, flags); priv = xpd->priv; timer_count = xpd->timer_count; - for_each_enabled_line(xpd, i) { + for_each_line(xpd, i) { if(IS_SET(xpd->digital_outputs, i) || IS_SET(xpd->digital_inputs, i)) continue; if(IS_BLINKING(priv,i,color)) { @@ -172,10 +161,16 @@ static void handle_fxo_leds(xpd_t *xpd) static void do_sethook(xpd_t *xpd, int pos, bool offhook) { - unsigned long flags; + unsigned long flags; + struct FXO_priv_data *priv; BUG_ON(!xpd); BUG_ON(xpd->direction == TO_PHONE); // We can SETHOOK state only on PSTN + priv = xpd->priv; + BUG_ON(!priv); + if(!IS_SET(priv->battery, pos)) { + DBG("%s/%s/%d: WARNING: called while battery is off\n", xpd->xbus->busname, xpd->xpdname, pos); + } spin_lock_irqsave(&xpd->lock, flags); xpd->ringing[pos] = 0; // No more rings CALL_XMETHOD(SETHOOK, xpd->xbus, xpd, pos, offhook); @@ -228,6 +223,7 @@ static int FXO_card_init(xbus_t *xbus, xpd_t *xpd) { struct FXO_priv_data *priv; int ret = 0; + int i; BUG_ON(!xpd); priv = xpd->priv; @@ -237,41 +233,34 @@ static int FXO_card_init(xbus_t *xbus, xpd_t *xpd) if(!priv->fxo_info) { ERR("Failed to create proc '%s' for %s/%s\n", PROC_FXO_INFO_FNAME, xbus->busname, xpd->xpdname); ret = -ENOENT; - goto out; + goto err; } + priv->fxo_info->owner = THIS_MODULE; DBG("Creating DAAs file for %s/%s\n", xbus->busname, xpd->xpdname); priv->xpd_slic = create_proc_entry(PROC_DAA_FNAME, 0644, xpd->proc_xpd_dir); if(!priv->xpd_slic) { ERR("Failed to create proc file for DAAs of %s/%s\n", xbus->busname, xpd->xpdname); - goto out; + ret = -ENOENT; + goto err; } + priv->xpd_slic->owner = THIS_MODULE; priv->xpd_slic->write_proc = proc_xpd_slic_write; priv->xpd_slic->read_proc = proc_xpd_slic_read; priv->xpd_slic->data = xpd; #endif -#ifdef HARD_CODED_INIT - CALL_PROTO(FXO, DAA_INIT, xbus, xpd); -#else ret = run_initialize_registers(xpd); if(ret < 0) - goto out; -#endif - if(xpd->direction == TO_PSTN) { - int i; - - // Hanghup all lines - for_each_enabled_line(xpd, i) { - init_waitqueue_head(&xpd->txstateq[i]); - do_sethook(xpd, i, 0); - } - } -out: - if(ret < 0) { - clean_proc(xbus, xpd); - ERR("%s/%s: Failed initializing registers (%d)\n", xbus->busname, xpd->xpdname, ret); - } else { - DBG("done: %s/%s\n", xbus->busname, xpd->xpdname); + goto err; + // Hanghup all lines + for_each_line(xpd, i) { + init_waitqueue_head(&xpd->txstateq[i]); + do_sethook(xpd, i, 0); } + DBG("done: %s/%s\n", xbus->busname, xpd->xpdname); + return 0; +err: + clean_proc(xbus, xpd); + ERR("%s/%s: Failed initializing registers (%d)\n", xbus->busname, xpd->xpdname, ret); return ret; } @@ -286,11 +275,43 @@ static int FXO_card_remove(xbus_t *xbus, xpd_t *xpd) return 0; } -static int FXO_card_zaptel_registration(xpd_t *xpd, bool on) +static int FXO_card_zaptel_preregistration(xpd_t *xpd, bool on) { xbus_t *xbus; struct FXO_priv_data *priv; + int i; unsigned long flags; + + BUG_ON(!xpd); + xbus = xpd->xbus; + BUG_ON(!xbus); + priv = xpd->priv; + BUG_ON(!priv); + DBG("%s/%s (%d)\n", xbus->busname, xpd->xpdname, on); + snprintf(xpd->span.desc, MAX_SPANDESC, "Xorcom XPD #%d/%d: FXO", xbus->num, xpd->id); + for_each_line(xpd, i) { + struct zt_chan *cur_chan = &xpd->chans[i]; + + DBG("setting FXO channel %d\n", i); + snprintf(cur_chan->name, MAX_CHANNAME, "XPP_FXO/%d/%d/%d", xbus->num, xpd->id, i); + cur_chan->chanpos = i + 1; + cur_chan->pvt = xpd; + cur_chan->sigcap = FXO_DEFAULT_SIGCAP; + } + spin_lock_irqsave(&xpd->lock, flags); + do_led(xpd, ALL_LINES, LED_GREEN, LED_OFF); + spin_unlock_irqrestore(&xpd->lock, flags); + for_each_line(xpd, i) { + do_led(xpd, i, LED_GREEN, LED_ON); + mdelay(50); + } + return 0; +} + +static int FXO_card_zaptel_postregistration(xpd_t *xpd, bool on) +{ + xbus_t *xbus; + struct FXO_priv_data *priv; int i; BUG_ON(!xpd); @@ -299,42 +320,48 @@ static int FXO_card_zaptel_registration(xpd_t *xpd, bool on) priv = xpd->priv; BUG_ON(!priv); DBG("%s/%s (%d)\n", xbus->busname, xpd->xpdname, on); - if(on) { - for_each_line(xpd, i) { - spin_lock_irqsave(&xpd->lock, flags); - do_led(xpd, i, LED_GREEN, LED_ON); - spin_unlock_irqrestore(&xpd->lock, flags); - mdelay(50); - } - for_each_line(xpd, i) { - spin_lock_irqsave(&xpd->lock, flags); - do_led(xpd, i, LED_GREEN, LED_OFF); - spin_unlock_irqrestore(&xpd->lock, flags); - mdelay(50); - } - } else { - for_each_line(xpd, i) { - spin_lock_irqsave(&xpd->lock, flags); - do_led(xpd, i, LED_GREEN, LED_ON); - spin_unlock_irqrestore(&xpd->lock, flags); - mdelay(100); - spin_lock_irqsave(&xpd->lock, flags); - do_led(xpd, i, LED_GREEN, LED_OFF); - spin_unlock_irqrestore(&xpd->lock, flags); - } + for_each_line(xpd, i) { + do_led(xpd, i, LED_GREEN, LED_OFF); + mdelay(50); + } + return 0; +} + +#ifdef WITH_RBS +int FXO_card_hooksig(xbus_t *xbus, xpd_t *xpd, int pos, zt_txsig_t txsig) +{ + struct FXO_priv_data *priv; + + priv = xpd->priv; + BUG_ON(!priv); + DBG("%s/%s/%d: %s\n", xbus->busname, xpd->xpdname, pos, txsig2str(txsig)); + BUG_ON(xpd->direction != TO_PSTN); + /* XXX Enable hooksig for FXO XXX */ + switch(txsig) { + case ZT_TXSIG_START: + break; + case ZT_TXSIG_OFFHOOK: + do_sethook(xpd, pos, 1); + break; + case ZT_TXSIG_ONHOOK: + do_sethook(xpd, pos, 0); + break; + default: + NOTICE("Can't set tx state to %s (%d)\n", txsig2str(txsig), txsig); + return -EINVAL; } return 0; } +#else int FXO_card_sethook(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate) { - int ret = 0; + int ret = 0; + struct FXO_priv_data *priv; DBG("%s/%s/%d: %s\n", xbus->busname, xpd->xpdname, pos, hookstate2str(hookstate)); switch(hookstate) { - /* On-hook, off-hook: The PBX is playing a phone on an FXO line. - * Can be ignored for an FXS line - */ + /* On-hook, off-hook: The PBX is playing a phone on an FXO line. */ case ZT_ONHOOK: do_sethook(xpd, pos, 0); break; @@ -353,7 +380,7 @@ int FXO_card_sethook(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate) WARN("No code yet\n"); break; case ZT_RING: - DBG("%s/%s/%d: (ringing[%d]=%d)\n", xbus->busname, xpd->xpdname, pos, pos, xpd->ringing[pos]); + DBG("%s/%s/%d: ZT_RING: %d\n", xbus->busname, xpd->xpdname, pos, xpd->ringing[pos]); break; case ZT_RINGOFF: WARN("No code yet\n"); @@ -361,12 +388,13 @@ int FXO_card_sethook(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate) } return ret; } +#endif static void poll_battery(xbus_t *xbus, xpd_t *xpd) { int i; - for_each_enabled_line(xpd, i) { + for_each_line(xpd, i) { CALL_PROTO(FXO, DAA_QUERY, xbus, xpd, i, DAA_VBAT_REGISTER); } } @@ -374,23 +402,75 @@ static void poll_battery(xbus_t *xbus, xpd_t *xpd) static int FXO_card_tick(xbus_t *xbus, xpd_t *xpd) { - static int rate_limit = 0; + static unsigned rate_limit = 0; struct FXO_priv_data *priv; BUG_ON(!xpd); priv = xpd->priv; BUG_ON(!priv); rate_limit++; - if((rate_limit % 100) == 0) { + if(poll_battery_interval != 0 && (rate_limit % poll_battery_interval) == 0) { poll_battery(xbus, xpd); } handle_fxo_leds(xpd); return 0; } +/* FIXME: based on data from from wctdm.h */ +#include +static const int echotune_reg[] = {30,45,46,47,58,49,50,51,52}; +union echotune { + /* "coeff 0" is acim */ + unsigned char coeff[sizeof(echotune_reg)]; + struct wctdm_echo_coefs wctdm_struct; +}; + +static int FXO_card_ioctl(xpd_t *xpd, int pos, unsigned int cmd, unsigned long arg) +{ + union echotune echoregs; + int i,ret; + + BUG_ON(!xpd); + DBG("cmd: 0x%x, expecting: 0x%x, pos=%d.\n", cmd, WCTDM_SET_ECHOTUNE, pos); + switch (cmd) { + case WCTDM_SET_ECHOTUNE: + DBG("-- Setting echo registers: \n"); + /* first off: check if this span is fxs. If not: -EINVALID */ + if (copy_from_user(&echoregs.wctdm_struct, + (struct wctdm_echo_coefs*)arg, sizeof(echoregs.wctdm_struct))) + return -EFAULT; + + /* Set the ACIM register */ + /* quick and dirty registers writing: */ + for (i=0; i> 8) & 0xFF), + ((lines >> 16) & 0xFF), + ((lines >> 24) & 0xFF), + echotune_reg[i],echoregs.coeff[i] + ); + /* FIXME: code duplicated from proc_xpd_register_write */ + ret = process_slic_cmdline(xpd, buf); + if(ret < 0) + return ret; + mdelay(1); + } + + DBG("-- Set echo registers successfully\n"); + + break; + default: + return -ENOTTY; + } + return 0; +} + /*---------------- FXO: HOST COMMANDS -------------------------------------*/ -/* 0x0F */ HOSTCMD(FXO, CHAN_ENABLE, xpp_line_t lines, bool on) +static /* 0x0F */ HOSTCMD(FXO, CHAN_ENABLE, xpp_line_t lines, bool on) { unsigned long flags; int ret = 0; @@ -398,19 +478,18 @@ static int FXO_card_tick(xbus_t *xbus, xpd_t *xpd) BUG_ON(!xbus); BUG_ON(!xpd); - lines &= xpd->enabled_chans; // Ignore disabled channels if(!lines) { return 0; } DBG("Channel Activation: 0x%4X %s\n", lines, (on) ? "on" : "off"); if(on) { - for_each_enabled_line(xpd, i) { + for_each_line(xpd, i) { spin_lock_irqsave(&xpd->lock, flags); do_led(xpd, i, LED_GREEN, LED_ON); spin_unlock_irqrestore(&xpd->lock, flags); mdelay(20); } - for_each_enabled_line(xpd, i) { + for_each_line(xpd, i) { spin_lock_irqsave(&xpd->lock, flags); do_led(xpd, i, LED_GREEN, LED_OFF); spin_unlock_irqrestore(&xpd->lock, flags); @@ -420,32 +499,31 @@ static int FXO_card_tick(xbus_t *xbus, xpd_t *xpd) return ret; } -/* 0x0F */ HOSTCMD(FXO, CHAN_CID, xpp_line_t lines) +static /* 0x0F */ HOSTCMD(FXO, CHAN_CID, int pos) { int ret = 0; + xpp_line_t lines = BIT(pos); BUG_ON(!xbus); BUG_ON(!xpd); - lines &= xpd->enabled_chans; // Ignore disabled channels if(!lines) { return 0; } - DBG("Channel CID: 0x%04X\n", lines); + DBG("%s/%s/%d:\n", xbus->busname, xpd->xpdname, pos); return ret; } -/* 0x0F */ HOSTCMD(FXO, RING, int pos, bool on) +static /* 0x0F */ HOSTCMD(FXO, RING, int pos, bool on) { int ret = 0; xpacket_t *pack; slic_cmd_t *sc; - xpp_line_t mask = (1 << pos); + xpp_line_t mask = BIT(pos); int len; BUG_ON(!xbus); BUG_ON(!xpd); - mask &= xpd->enabled_chans; // Ignore disabled channels if(!mask) { return 0; } @@ -459,7 +537,7 @@ static int FXO_card_tick(xbus_t *xbus, xpd_t *xpd) return ret; } -/* 0x0F */ HOSTCMD(FXO, SETHOOK, int pos, bool offhook) +static /* 0x0F */ HOSTCMD(FXO, SETHOOK, int pos, bool offhook) { int ret = 0; xpacket_t *pack; @@ -470,56 +548,26 @@ static int FXO_card_tick(xbus_t *xbus, xpd_t *xpd) BUG_ON(!xbus); BUG_ON(!xpd); - value = (offhook) ? 0x01 : 0x00; + value = (offhook) ? 0x09 : 0x08; // value |= BIT(3); /* Bit 3 is for CID */ DBG("%s/%s/%d: SETHOOK: value=0x%02X %s\n", xbus->busname, xpd->xpdname, pos, value, (offhook)?"OFFHOOK":"ONHOOK"); spin_lock_irqsave(&xpd->lock, flags); - if(!IS_SET(xpd->enabled_chans, pos)) - goto out; XPACKET_NEW(pack, xbus, FXO, DAA_WRITE, xpd->id); sc = &RPACKET_FIELD(pack, FXO, DAA_WRITE, slic_cmd); len = slic_cmd_direct_write(sc, BIT(pos), 0x05, value); pack->datalen = len; packet_send(xbus, pack); do_led(xpd, pos, LED_GREEN, (offhook)?LED_ON:LED_OFF); -out: spin_unlock_irqrestore(&xpd->lock, flags); return ret; } -/* 0x0F */ HOSTCMD(FXO, RELAY_OUT, byte which, bool on) +static /* 0x0F */ HOSTCMD(FXO, RELAY_OUT, byte which, bool on) { return -ENOSYS; } -/* 0x0F */ HOSTCMD(FXO, DAA_INIT) -{ - int ret = 0; - xpacket_t *pack; - slic_data_t *slic; - struct slic_init_data *source; - int i; - - BUG_ON(!xbus); - BUG_ON(!xpd); - DBG("INITIALIZING DAA\n"); - for(i = 0; i < ARRAY_SIZE(slic_init_data); i++) { - source = &slic_init_data[i]; - XPACKET_NEW(pack, xbus, FXO, DAA_INIT, xpd->id); - RPACKET_FIELD(pack, FXO, DAA_INIT, lines) = source->lines; - - slic = &RPACKET_FIELD(pack, FXO, DAA_INIT, slic_data); - slic->len = source->slic_data.len; - memcpy(slic->data, source->slic_data.data, source->slic_data.len); - pack->datalen = sizeof(xpp_line_t) + slic->len + 1; -// dump_packet("DAA", pack, print_dbg); - packet_send(xbus, pack); - mdelay(1); // FIXME: check with Dima - } - return ret; -} - -/* 0x0F */ HOSTCMD(FXO, DAA_QUERY, int pos, byte reg_num) +static /* 0x0F */ HOSTCMD(FXO, DAA_QUERY, int pos, byte reg_num) { int ret = 0; xpacket_t *pack; @@ -588,22 +636,16 @@ HANDLER_DEF(FXO, DAA_REPLY) if(abs(info->data_low) < BAT_THRESHOLD) { priv->battery &= ~lines; - // DBG("BATTERY OFF (%04X) = %d\n", lines, info->data_low); + // DBG("%s/%s: BATTERY OFF (%04X) = %d\n", xpd->xbus->busname, xpd->xpdname, lines, info->data_low); } else { priv->battery |= lines; - // DBG("BATTERY ON (%04X) = %d\n", lines, info->data_low); + // DBG("%s/%s: BATTERY ON (%04X) = %d\n", xpd->xbus->busname, xpd->xpdname, lines, info->data_low); } changed_lines = last_batt_on ^ priv->battery; for_each_line(xpd, i) { - if(!IS_SET(changed_lines, i) || IS_SET(xpd->hookstate, i)) - continue; -#if 0 - /* FIXME: We don't want to affect the whole span */ - if(IS_SET(priv->battery, i)) - update_xpd_status(xpd, ZT_ALARM_NONE); - else - update_xpd_status(xpd, ZT_ALARM_RED); -#endif + if(IS_SET(changed_lines, i)) { + update_line_status(xpd, i, IS_SET(priv->battery, i)); + } } } #if 0 @@ -635,9 +677,15 @@ xproto_table_t PROTO_TABLE(FXO) = { .card_new = FXO_card_new, .card_init = FXO_card_init, .card_remove = FXO_card_remove, - .card_zaptel_registration = FXO_card_zaptel_registration, + .card_zaptel_preregistration = FXO_card_zaptel_preregistration, + .card_zaptel_postregistration = FXO_card_zaptel_postregistration, +#ifdef WITH_RBS + .card_hooksig = FXO_card_hooksig, +#else .card_sethook = FXO_card_sethook, +#endif .card_tick = FXO_card_tick, + .card_ioctl = FXO_card_ioctl, .RING = XPROTO_CALLER(FXO, RING), .SETHOOK = XPROTO_CALLER(FXO, SETHOOK), @@ -676,7 +724,8 @@ static int proc_fxo_info_read(char *page, char **start, off_t off, int count, in struct FXO_priv_data *priv; int i; - BUG_ON(!xpd); + if(!xpd) + return -ENODEV; spin_lock_irqsave(&xpd->lock, flags); priv = xpd->priv; BUG_ON(!priv); @@ -830,9 +879,8 @@ static int process_slic_cmdline(xpd_t *xpd, char *cmdline) len = parse_slic_cmd(p, &sc, &priv->requested_reply); if(len < 0) return len; - sc.lines &= xpd->enabled_chans; // Ignore disabled channels if(!sc.lines) { - NOTICE("%s: no enabled channels are marked. Skip.\n", __FUNCTION__); + NOTICE("%s: no channels are marked. Skip.\n", __FUNCTION__); return 0; } dump_slic_cmd("WRITE_DAA", &sc); @@ -852,7 +900,8 @@ static int proc_xpd_slic_write(struct file *file, const char __user *buffer, uns int i; int ret; - BUG_ON(!xpd); + if(!xpd) + return -ENODEV; for(i = 0; i < count; /* noop */) { for(p = buf; p < buf + LINE_LEN; p++) { /* read a line */ if(i >= count) diff --git a/xpp/card_fxo.h b/xpp/card_fxo.h index 49078d3..762f47b 100644 --- a/xpp/card_fxo.h +++ b/xpp/card_fxo.h @@ -51,10 +51,6 @@ DEF_RPACKET_DATA(FXO, DAA_REPLY, /* Get status of a single DAA (for debugging) * xpp_line_t lines; slic_reply_t info; ); -DEF_RPACKET_DATA(FXO, DAA_INIT, - xpp_line_t lines; - slic_data_t slic_data; - ); DEF_RPACKET_DATA(FXO, DAA_WRITE, slic_cmd_t slic_cmd; ); diff --git a/xpp/card_fxs.c b/xpp/card_fxs.c index d2413f3..41b503e 100644 --- a/xpp/card_fxs.c +++ b/xpp/card_fxs.c @@ -34,15 +34,21 @@ static const char rcsid[] = "$Id$"; DEF_PARM(int, print_dbg, 0, "Print DBG statements"); /* must be before zap_debug.h */ +DEF_PARM(bool, poll_digital_inputs, 1, "Poll Digital Inputs"); /* must be before zap_debug.h */ + +/* Signaling is opposite (fxo signalling for fxs card) */ +#if 1 +#define FXS_DEFAULT_SIGCAP (ZT_SIG_FXOKS | ZT_SIG_FXOLS | ZT_SIG_FXOGS) +#else +#define FXS_DEFAULT_SIGCAP (ZT_SIG_SF | ZT_SIG_EM) +#endif #define LINES_REGULAR 8 #define LINES_DIGI_OUT 2 #define LINES_DIGI_INP 4 -#define MASK_BITS(b) ((1U << (b)) - 1) - -#define MASK_DIGI_OUT (MASK_BITS(LINES_DIGI_OUT) << LINES_REGULAR) -#define MASK_DIGI_INP (MASK_BITS(LINES_DIGI_INP) << (LINES_REGULAR + LINES_DIGI_OUT)) +#define MASK_DIGI_OUT (BITMASK(LINES_DIGI_OUT) << LINES_REGULAR) +#define MASK_DIGI_INP (BITMASK(LINES_DIGI_INP) << (LINES_REGULAR + LINES_DIGI_OUT)) enum fxs_leds { LED_GREEN, @@ -52,14 +58,27 @@ enum fxs_leds { #define NUM_LEDS 2 +static int SLIC_DIRECT_REQUEST(xbus_t *xbus, xpd_t *xpd, xpp_line_t lines, byte reg, byte dL) +{ + xpacket_t *pack; + slic_cmd_t *sc; + int len; + + XPACKET_NEW(pack, xbus, FXS, SLIC_WRITE, xpd->id); + sc = &RPACKET_FIELD(pack, FXS, SLIC_WRITE, slic_cmd); + len = slic_cmd_direct_write(sc, lines, reg, dL); + pack->datalen = len; + packet_send(xbus, pack); + return 0; +} + /*---------------- FXS Protocol Commands ----------------------------------*/ static /* 0x0F */ DECLARE_CMD(FXS, CHAN_ENABLE, xpp_line_t lines, bool on); -static /* 0x0F */ DECLARE_CMD(FXS, CHAN_CID, xpp_line_t lines); +static /* 0x0F */ DECLARE_CMD(FXS, CHAN_CID, int pos); static /* 0x0F */ DECLARE_CMD(FXS, RING, int pos, bool on); static /* 0x0F */ DECLARE_CMD(FXS, SETHOOK, int pos, bool offhook); static /* 0x0F */ DECLARE_CMD(FXS, RELAY_OUT, byte which, bool on); -static /* 0x0F */ DECLARE_CMD(FXS, SLIC_INIT); static /* 0x0F */ DECLARE_CMD(FXS, SLIC_QUERY, int pos, byte reg_num); static bool fxs_packet_is_valid(xpacket_t *pack); @@ -68,26 +87,6 @@ static int proc_fxs_info_read(char *page, char **start, off_t off, int count, in static int proc_xpd_slic_read(char *page, char **start, off_t off, int count, int *eof, void *data); static int proc_xpd_slic_write(struct file *file, const char __user *buffer, unsigned long count, void *data); -#define S_(s,l,...) \ - { \ - .lines = s, \ - { \ - .len = l, \ - .data = { __VA_ARGS__ }, \ - } \ - } -struct slic_init_data { - xpp_line_t lines; - slic_data_t slic_data; -} slic_init_data[] = { -#ifdef OLD_CARD -#include "init_data_3_19.inc" -#else -#include "init_data_3_20.inc" -#endif -}; -#undef S_ - #define PROC_SLIC_FNAME "slics" #define PROC_FXS_INFO_FNAME "fxs_info" @@ -111,7 +110,6 @@ static int do_chan_power(xbus_t *xbus, xpd_t *xpd, xpp_line_t lines, bool on) BUG_ON(!xbus); BUG_ON(!xpd); - lines &= xpd->enabled_chans; // Ignore disabled channels if(!lines) { return 0; } @@ -132,8 +130,8 @@ static int do_chan_power(xbus_t *xbus, xpd_t *xpd, xpp_line_t lines, bool on) } #define IS_BLINKING(priv,pos,color) ((priv)->blinking[color][pos] != 0) -#define DO_BLINK(priv,pos,color,val) ((priv)->blinking[color][pos] = (val)) -#define DO_LED(priv,pos,color,val) ((val)?BIT_SET((priv)->ledcontrol[color],(pos)):BIT_CLR((priv)->ledcontrol[color],(pos))) +#define MARK_BLINK(priv,pos,color,val) ((priv)->blinking[color][pos] = (val)) +#define MARK_LED(priv,pos,color,val) ((val)?BIT_SET((priv)->ledcontrol[color],(pos)):BIT_CLR((priv)->ledcontrol[color],(pos))) /* * LED and RELAY control is done via SLIC register 0x06: @@ -195,7 +193,7 @@ static int do_led(xpd_t *xpd, lineno_t pos, byte which, bool on) BIT_CLR(priv->ledstate[which], pos); } } - if(!(lines & xpd->enabled_chans)) // Ignore disabled channels + if(!lines) // Nothing to do goto out; DBG("%s/%s: LED: lines=0x%04X which=%d -- %s\n", xbus->busname, xpd->xpdname, lines, which, (on) ? "on" : "off"); value = BIT(2) | BIT(3); @@ -222,11 +220,11 @@ static void handle_fxs_leds(xpd_t *xpd) struct FXS_priv_data *priv; BUG_ON(!xpd); - priv = xpd->priv; spin_lock_irqsave(&xpd->lock, flags); + priv = xpd->priv; timer_count = xpd->timer_count; for(color = 0; color < ARRAY_SIZE(colors); color++) { - for_each_enabled_line(xpd, i) { + for_each_line(xpd, i) { if(IS_SET(xpd->digital_outputs, i) || IS_SET(xpd->digital_inputs, i)) continue; if(IS_BLINKING(priv, i, color)) { // Blinking @@ -282,6 +280,7 @@ static void clean_proc(xbus_t *xbus, xpd_t *xpd) #ifdef CONFIG_PROC_FS if(priv->xpd_slic) { DBG("Removing xpd SLIC file %s/%s\n", xbus->busname, xpd->xpdname); + priv->xpd_slic->data = NULL; remove_proc_entry(PROC_SLIC_FNAME, xpd->proc_xpd_dir); } if(priv->fxs_info) { @@ -304,31 +303,45 @@ static int FXS_card_init(xbus_t *xbus, xpd_t *xpd) if(!priv->fxs_info) { ERR("Failed to create proc '%s' for %s/%s\n", PROC_FXS_INFO_FNAME, xbus->busname, xpd->xpdname); ret = -ENOENT; - goto out; + goto err; } + priv->fxs_info->owner = THIS_MODULE; DBG("Creating SLICs file for %s/%s\n", xbus->busname, xpd->xpdname); priv->xpd_slic = create_proc_entry(PROC_SLIC_FNAME, 0644, xpd->proc_xpd_dir); if(!priv->xpd_slic) { ERR("Failed to create proc file for SLICs of %s/%s\n", xbus->busname, xpd->xpdname); ret = -ENOENT; - goto out; + goto err; } + priv->xpd_slic->owner = THIS_MODULE; priv->xpd_slic->write_proc = proc_xpd_slic_write; priv->xpd_slic->read_proc = proc_xpd_slic_read; priv->xpd_slic->data = xpd; #endif -#ifdef HARD_CODED_INIT - CALL_PROTO(FXS, SLIC_INIT, xbus, xpd); -#else ret = run_initialize_registers(xpd); + if(ret < 0) + goto err; + /* + * Setup ring timers + */ +#ifdef WITH_RBS + /* Software controled ringing (for CID) */ + ret = SLIC_DIRECT_REQUEST(xbus, xpd, ALL_LINES, 0x22, 0x00); /* Ringing Oscilator Control */ +#else + /* Hardware controled ringing (no CID) */ + ret += SLIC_DIRECT_REQUEST(xbus, xpd, ALL_LINES, 0x30, 0x80); /* Active timer low byte */ + ret += SLIC_DIRECT_REQUEST(xbus, xpd, ALL_LINES, 0x31, 0x3E); /* Active timer high byte */ + ret += SLIC_DIRECT_REQUEST(xbus, xpd, ALL_LINES, 0x32, 0x80); /* Inactive timer low byte */ + ret += SLIC_DIRECT_REQUEST(xbus, xpd, ALL_LINES, 0x33, 0x3E); /* Inactive timer high byte */ + ret += SLIC_DIRECT_REQUEST(xbus, xpd, ALL_LINES, 0x22, 0x18); /* Ringing Oscilator Control */ #endif -out: - if(ret < 0) { - clean_proc(xbus, xpd); - ERR("%s/%s: Failed initializing registers (%d)\n", xbus->busname, xpd->xpdname, ret); - } else { - DBG("done: %s/%s\n", xbus->busname, xpd->xpdname); - } + if(ret < 0) + goto err; + DBG("%s/%s: done\n", xbus->busname, xpd->xpdname); + return 0; +err: + clean_proc(xbus, xpd); + ERR("%s/%s: Failed initializing registers (%d)\n", xbus->busname, xpd->xpdname, ret); return ret; } @@ -343,46 +356,139 @@ static int FXS_card_remove(xbus_t *xbus, xpd_t *xpd) return 0; } -static int FXS_card_zaptel_registration(xpd_t *xpd, bool on) +static int FXS_card_zaptel_preregistration(xpd_t *xpd, bool on) { xbus_t *xbus; struct FXS_priv_data *priv; + int i; unsigned long flags; - int i; + const enum fxs_leds color = (on) ? LED_GREEN : LED_RED; BUG_ON(!xpd); xbus = xpd->xbus; - priv = xpd->priv; BUG_ON(!xbus); - DBG("%s/%s: %s\n", xbus->busname, xpd->xpdname, (on)?"on":"off"); - if(on) { - spin_lock_irqsave(&xpd->lock, flags); - do_led(xpd, ALL_LINES, LED_GREEN, LED_OFF); - spin_unlock_irqrestore(&xpd->lock, flags); - for_each_enabled_line(xpd, i) { - DO_LED(priv,i,LED_GREEN,LED_ON); - mdelay(50); - } - for_each_enabled_line(xpd, i) { - DO_LED(priv,i,LED_GREEN,LED_OFF); - mdelay(50); - } - } else { - spin_lock_irqsave(&xpd->lock, flags); - do_led(xpd, ALL_LINES, LED_RED, LED_OFF); - spin_unlock_irqrestore(&xpd->lock, flags); - for_each_enabled_line(xpd, i) { - DO_LED(priv,i,LED_RED,LED_ON); - mdelay(50); - } - for_each_enabled_line(xpd, i) { - DO_LED(priv,i,LED_RED,LED_OFF); - mdelay(50); + priv = xpd->priv; + BUG_ON(!priv); + DBG("%s/%s (%d)\n", xbus->busname, xpd->xpdname, on); + snprintf(xpd->span.desc, MAX_SPANDESC, "Xorcom XPD #%d/%d: FXS", xbus->num, xpd->id); + for_each_line(xpd, i) { + struct zt_chan *cur_chan = &xpd->chans[i]; + + DBG("setting FXS channel %d\n", i); + if(IS_SET(xpd->digital_outputs, i)) { + snprintf(cur_chan->name, MAX_CHANNAME, "XPP_OUT/%d/%d/%d", xbus->num, xpd->id, i); + } else if(IS_SET(xpd->digital_inputs, i)) { + snprintf(cur_chan->name, MAX_CHANNAME, "XPP_IN/%d/%d/%d", xbus->num, xpd->id, i); + } else { + snprintf(cur_chan->name, MAX_CHANNAME, "XPP_FXS/%d/%d/%d", xbus->num, xpd->id, i); } + cur_chan->chanpos = i + 1; + cur_chan->pvt = xpd; + cur_chan->sigcap = FXS_DEFAULT_SIGCAP; + } + spin_lock_irqsave(&xpd->lock, flags); + do_led(xpd, ALL_LINES, color, LED_OFF); + spin_unlock_irqrestore(&xpd->lock, flags); + for_each_line(xpd, i) { + MARK_LED(priv, i, color, LED_ON); + mdelay(50); } return 0; } +static int FXS_card_zaptel_postregistration(xpd_t *xpd, bool on) +{ + xbus_t *xbus; + struct FXS_priv_data *priv; + int i; + const enum fxs_leds color = (on) ? LED_GREEN : LED_RED; + + BUG_ON(!xpd); + xbus = xpd->xbus; + BUG_ON(!xbus); + priv = xpd->priv; + BUG_ON(!priv); + DBG("%s/%s (%d)\n", xbus->busname, xpd->xpdname, on); + for_each_line(xpd, i) { + MARK_LED(priv, i, color, LED_OFF); + mdelay(50); + } + return 0; +} + +#ifdef WITH_RBS +int FXS_card_hooksig(xbus_t *xbus, xpd_t *xpd, int pos, zt_txsig_t txsig) +{ + int ret = 0; + + DBG("%s/%s/%d: %s\n", xbus->busname, xpd->xpdname, pos, txsig2str(txsig)); + BUG_ON(xpd->direction != TO_PHONE); + if (IS_SET(xpd->digital_inputs, pos)) { + DBG("Ignoring signal sent to digital input line\n"); + return 0; + } + switch(txsig) { + case ZT_TXSIG_ONHOOK: + xpd->ringing[pos] = 0; + BIT_CLR(xpd->cid_on, pos); + if(IS_SET(xpd->digital_outputs, pos)) { + DBG("%s/%s/%d: digital output OFF\n", xbus->busname, xpd->xpdname, pos); + ret = CALL_XMETHOD(RELAY_OUT, xpd->xbus, xpd, pos-8, 0); + return ret; + } + ret = CALL_XMETHOD(RING, xbus, xpd, pos, 0); // RING off +#if 0 + switch(chan->sig) { + case ZT_SIG_EM: + case ZT_SIG_FXOKS: + case ZT_SIG_FXOLS: + xpd->lasttxhook[pos] = xpd->idletxhookstate[pos]; + break; + case ZT_SIG_FXOGS: + xpd->lasttxhook[pos] = FXS_LINE_TIPOPEN; + break; + } +#endif + break; + case ZT_TXSIG_OFFHOOK: + if(xpd->ringing[pos]) { + BIT_SET(xpd->cid_on, pos); + ret = CALL_XMETHOD(CHAN_CID, xpd->xbus, xpd, pos); // CALLER ID + } + xpd->ringing[pos] = 0; +#if 0 + switch(chan->sig) { + case ZT_SIG_EM: + xpd->lasttxhook[pos] = FXS_LINE_REV_ACTIVE; + break; + default: + xpd->lasttxhook[pos] = xpd->idletxhookstate[pos]; + break; + } +#endif + break; + case ZT_TXSIG_START: + xpd->lasttxhook[pos] = FXS_LINE_RING; + xpd->ringing[pos] = 1; + BIT_CLR(xpd->cid_on, pos); + if(IS_SET(xpd->digital_outputs, pos)) { + DBG("%s/%s/%d: %s digital output ON\n", xbus->busname, xpd->xpdname, pos, txsig2str(txsig)); + ret = CALL_XMETHOD(RELAY_OUT, xpd->xbus, xpd, pos-8, 1); + return ret; + } + ret = CALL_XMETHOD(RING, xbus, xpd, pos, 1); // RING on + break; + case ZT_TXSIG_KEWL: + xpd->lasttxhook[pos] = FXS_LINE_DISABLED; + break; + default: + NOTICE("%s: Can't set tx state to %s (%d)\n", __FUNCTION__, txsig2str(txsig), txsig); + ret = -EINVAL; + } + return ret; +} + +#else int FXS_card_sethook(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate) { int ret = 0; @@ -417,7 +523,7 @@ int FXS_card_sethook(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate) DBG("%s/%s/%d: fall through ZT_OFFHOOK\n", xbus->busname, xpd->xpdname, pos); // Fall through case ZT_OFFHOOK: - DBG("%s/%s/%d: ignoring (PHONE)\n", xbus->busname, xpd->xpdname, pos); + DBG("%s/%s/%d: ZT_OFFHOOK (ignoring for PHONES)\n", xbus->busname, xpd->xpdname, pos); break; case ZT_WINK: WARN("No code yet\n"); @@ -426,7 +532,7 @@ int FXS_card_sethook(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate) WARN("No code yet\n"); break; case ZT_RING: - DBG("%s/%s/%d: ringing[%d]=%d\n", xbus->busname, xpd->xpdname, pos, pos, xpd->ringing[pos]); + DBG("%s/%s/%d: ZT_RING: %d\n", xbus->busname, xpd->xpdname, pos, xpd->ringing[pos]); if(IS_SET(xpd->digital_inputs, pos)) { NOTICE("%s: Trying to RING a digital input channel %d. Ignoring\n", __FUNCTION__, pos); return -EINVAL; @@ -448,6 +554,7 @@ int FXS_card_sethook(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate) } return ret; } +#endif /* * INPUT polling is done via SLIC register 0x06 (same as LEDS): @@ -463,6 +570,7 @@ static void poll_inputs(xbus_t *xbus, xpd_t *xpd) { int i; + BUG_ON(xpd->id != 0); // Only unit #0 has digital inputs for(i = 0; i < ARRAY_SIZE(input_channels); i++) { int pos = input_channels[i]; @@ -478,9 +586,13 @@ static int FXS_card_tick(xbus_t *xbus, xpd_t *xpd) BUG_ON(!xpd); priv = xpd->priv; BUG_ON(!priv); - if((rate_limit++ % 1000) == 0) { - poll_inputs(xbus, xpd); +#if POLL_DIGITAL_INPUTS + if(poll_digital_inputs && xpd->id == 0) { + if((rate_limit++ % 1000) == 0) { + poll_inputs(xbus, xpd); + } } +#endif handle_fxs_leds(xpd); return 0; } @@ -499,11 +611,14 @@ static /* 0x0F */ HOSTCMD(FXS, CHAN_ENABLE, xpp_line_t lines, bool on) BUG_ON(!xbus); BUG_ON(!xpd); - lines &= xpd->enabled_chans; // Ignore disabled channels if(!lines) { return 0; } DBG("Channel Activation: 0x%4X %s\n", lines, (on) ? "on" : "off"); + // Make sure we use normal (low battery) power + for_each_line(xpd, i) + if (BIT_SET(lines,i)) + do_chan_power(xbus, xpd, BIT(i), 0); XPACKET_NEW(pack, xbus, FXS, SLIC_WRITE, xpd->id); sc = &RPACKET_FIELD(pack, FXS, SLIC_WRITE, slic_cmd); len = slic_cmd_direct_write(sc, lines, 0x40, value); @@ -522,20 +637,21 @@ static /* 0x0F */ HOSTCMD(FXS, CHAN_ENABLE, xpp_line_t lines, bool on) return ret; } -static /* 0x0F */ HOSTCMD(FXS, CHAN_CID, xpp_line_t lines) +static /* 0x0F */ HOSTCMD(FXS, CHAN_CID, int pos) { int ret = 0; xpacket_t *pack; slic_cmd_t *sc; int i; + xpp_line_t lines = BIT(pos); BUG_ON(!xbus); BUG_ON(!xpd); - lines &= xpd->enabled_chans; // Ignore disabled channels if(!lines) { return 0; } - DBG("Channel CID: 0x%04X\n", lines); + DBG("%s/%s/%d:\n", xbus->busname, xpd->xpdname, pos); + //do_chan_power(xbus, xpd, BIT(pos), 0); // Low battery for normal (non-ring) operation XPACKET_NEW(pack, xbus, FXS, SLIC_WRITE, xpd->id); sc = &RPACKET_FIELD(pack, FXS, SLIC_WRITE, slic_cmd); pack->datalen = slic_cmd_direct_write(sc, lines, 0x40, FXS_LINE_CID); @@ -552,14 +668,13 @@ static /* 0x0F */ HOSTCMD(FXS, RING, int pos, bool on) struct FXS_priv_data *priv; xpacket_t *pack; slic_cmd_t *sc; - xpp_line_t mask = (1 << pos); + xpp_line_t mask = BIT(pos); int len; enum fxs_state value = (on) ? 0x04 : 0x01; BUG_ON(!xbus); BUG_ON(!xpd); priv = xpd->priv; - mask &= xpd->enabled_chans; // Ignore disabled channels if(!mask) { return 0; } @@ -573,10 +688,10 @@ static /* 0x0F */ HOSTCMD(FXS, RING, int pos, bool on) packet_send(xbus, pack); if(on) { - DO_BLINK(priv,pos,LED_GREEN,LED_BLINK); + MARK_BLINK(priv,pos,LED_GREEN,LED_BLINK); } else { if(IS_BLINKING(priv, pos, LED_GREEN)) - DO_BLINK(priv,pos,LED_GREEN,0); + MARK_BLINK(priv,pos,LED_GREEN,0); } return ret; } @@ -617,33 +732,6 @@ static /* 0x0F */ HOSTCMD(FXS, RELAY_OUT, byte which, bool on) return ret; } -static /* 0x0F */ HOSTCMD(FXS, SLIC_INIT) -{ - int ret = 0; - xpacket_t *pack; - slic_data_t *slic; - struct slic_init_data *source; - int i; - - BUG_ON(!xbus); - BUG_ON(!xpd); - DBG("INITIALIZING SLIC\n"); - for(i = 0; i < ARRAY_SIZE(slic_init_data); i++) { - source = &slic_init_data[i]; - XPACKET_NEW(pack, xbus, FXS, SLIC_INIT, xpd->id); - RPACKET_FIELD(pack, FXS, SLIC_INIT, lines) = source->lines; - - slic = &RPACKET_FIELD(pack, FXS, SLIC_INIT, slic_data); - slic->len = source->slic_data.len; - memcpy(slic->data, source->slic_data.data, source->slic_data.len); - pack->datalen = sizeof(xpp_line_t) + slic->len + 1; -// dump_packet("SLIC", pack, print_dbg); - packet_send(xbus, pack); - mdelay(1); // FIXME: check with Dima - } - return ret; -} - static /* 0x0F */ HOSTCMD(FXS, SLIC_QUERY, int pos, byte reg_num) { int ret = 0; @@ -683,7 +771,7 @@ HANDLER_DEF(FXS, SIG_CHANGED) } #if 0 Is this needed? - for_each_enabled_line(xpd, i) { + for_each_line(xpd, i) { if(IS_SET(sig_toggles, i)) do_chan_power(xpd->xbus, xpd, BIT(i), 0); // Power down (prevent overheating!!!) } @@ -695,15 +783,15 @@ HANDLER_DEF(FXS, SIG_CHANGED) struct zt_chan *chan = &xpd->span.chans[i]; xpd->ringing[i] = 0; // No more ringing... - DO_BLINK(priv,i,LED_GREEN,0); + MARK_BLINK(priv,i,LED_GREEN,0); if(IS_SET(sig_status, i)) { DBG("OFFHOOK: channo=%d\n", chan->channo); - DO_LED(priv,i,LED_GREEN,LED_ON); + MARK_LED(priv,i,LED_GREEN,LED_ON); BIT_SET(xpd->hookstate, i); zt_hooksig(chan, ZT_RXSIG_OFFHOOK); } else { DBG("ONHOOK channo=%d\n", chan->channo); - DO_LED(priv,i,LED_GREEN,LED_OFF); + MARK_LED(priv,i,LED_GREEN,LED_OFF); BIT_CLR(xpd->hookstate, i); zt_hooksig(chan, ZT_RXSIG_ONHOOK); } @@ -770,7 +858,6 @@ HANDLER_DEF(FXS, SLIC_REPLY) return 0; } - xproto_table_t PROTO_TABLE(FXS) = { .owner = THIS_MODULE, .entries = { @@ -784,8 +871,13 @@ xproto_table_t PROTO_TABLE(FXS) = { .card_new = FXS_card_new, .card_init = FXS_card_init, .card_remove = FXS_card_remove, - .card_zaptel_registration = FXS_card_zaptel_registration, + .card_zaptel_preregistration = FXS_card_zaptel_preregistration, + .card_zaptel_postregistration = FXS_card_zaptel_postregistration, +#ifdef WITH_RBS + .card_hooksig = FXS_card_hooksig, +#else .card_sethook = FXS_card_sethook, +#endif .card_tick = FXS_card_tick, .RING = XPROTO_CALLER(FXS, RING), @@ -826,7 +918,8 @@ static int proc_fxs_info_read(char *page, char **start, off_t off, int count, in int i; int led; - BUG_ON(!xpd); + if(!xpd) + return -ENODEV; spin_lock_irqsave(&xpd->lock, flags); priv = xpd->priv; BUG_ON(!priv); @@ -984,9 +1077,8 @@ static int process_slic_cmdline(xpd_t *xpd, char *cmdline) len = parse_slic_cmd(p, &sc, &priv->requested_reply); if(len < 0) return len; - sc.lines &= xpd->enabled_chans; // Ignore disabled channels if(!sc.lines) { - NOTICE("%s: no enabled channels are marked. Skip.\n", __FUNCTION__); + NOTICE("%s: no channels are marked. Skip.\n", __FUNCTION__); return 0; } dump_slic_cmd("WRITE_SLIC", &sc); @@ -1006,7 +1098,8 @@ static int proc_xpd_slic_write(struct file *file, const char __user *buffer, uns int i; int ret; - BUG_ON(!xpd); + if(!xpd) + return -ENODEV; for(i = 0; i < count; /* noop */) { for(p = buf; p < buf + LINE_LEN; p++) { /* read a line */ if(i >= count) @@ -1032,6 +1125,12 @@ static int proc_xpd_slic_write(struct file *file, const char __user *buffer, uns int __init card_fxs_startup(void) { INFO("%s revision %s\n", THIS_MODULE->name, ZAPTEL_VERSION); +#ifdef POLL_DIGITAL_INPUTS + INFO("FEATURE: %s with DIGITAL INPUTS support (%s activated)\n", + THIS_MODULE->name, (poll_digital_inputs) ? "is" : "is not"); +#else + INFO("FEATURE: %s without DIGITAL INPUTS support\n", THIS_MODULE->name); +#endif xproto_register(&PROTO_TABLE(FXS)); return 0; } diff --git a/xpp/card_fxs.h b/xpp/card_fxs.h index 5eaeb13..1d81810 100644 --- a/xpp/card_fxs.h +++ b/xpp/card_fxs.h @@ -52,10 +52,6 @@ DEF_RPACKET_DATA(FXS, SLIC_REPLY, /* Get status of a single SLIC (for debugging) xpp_line_t lines; slic_reply_t info; ); -DEF_RPACKET_DATA(FXS, SLIC_INIT, - xpp_line_t lines; - slic_data_t slic_data; - ); DEF_RPACKET_DATA(FXS, SLIC_WRITE, slic_cmd_t slic_cmd; ); diff --git a/xpp/card_global.c b/xpp/card_global.c index 0f81f2c..dda4480 100644 --- a/xpp/card_global.c +++ b/xpp/card_global.c @@ -62,13 +62,10 @@ static void global_packet_dump(xpacket_t *pack); byte *pcm; byte *start_pcm; int i; - extern ulong pcm_gen; BUG_ON(!xbus); BUG_ON(!xpd); - lines &= (xpd->enabled_chans | ~xpd->no_pcm); - if(pcm_gen != 0) - return 0; + lines &= ~xpd->no_pcm; // if(lines == 0) // return 0; @@ -117,32 +114,44 @@ static void global_packet_dump(xpacket_t *pack); /*---------------- GLOBAL: Astribank Reply Handlers -----------------------*/ +HANDLER_DEF(GLOBAL, NULL_REPLY) +{ + DBG("got len=%d\n", pack->datalen); + return 0; +} + HANDLER_DEF(GLOBAL, DEV_DESC) { byte rev = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, rev); byte type = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, type); xpp_line_t line_status = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, line_status); - int xpd_num = XPD_NUM(pack->content.addr); + xpd_addr_t xpd_addr = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, addr); struct card_desc_struct *card_desc; + unsigned long flags; - DBG("xpd=%d type=%d rev=%d line_status=0x%04X\n", - xpd_num, type, rev, line_status); + BUG_ON(!xbus); if((card_desc = kmalloc(sizeof(struct card_desc_struct), GFP_ATOMIC)) == NULL) { ERR("%s: Card description allocation failed.\n", __FUNCTION__); return -ENOMEM; } memset(card_desc, 0, sizeof(struct card_desc_struct)); card_desc->magic = CARD_DESC_MAGIC; + INIT_LIST_HEAD(&card_desc->card_list); card_desc->xbus = xbus; card_desc->type = type; card_desc->rev = rev; - card_desc->xpd_num = xpd_num; - INIT_WORK(&card_desc->work, card_detected, card_desc); - DBG("Queueing xpp_worker for xpd %d\n", xpd_num); - if(!queue_work(xpp_worker, &card_desc->work)) { - ERR("Failed to queue card description work\n"); - return -EINVAL; - } + card_desc->xpd_addr = xpd_addr; + spin_lock_irqsave(&xbus->lock, flags); + DBG("xpd=%d-%d type=%d rev=%d line_status=0x%04X\n", + xpd_addr.unit, xpd_addr.subunit, type, rev, line_status); + if(type == XPD_TYPE_NOMODULE) + XBUS_COUNTER(xbus, DEV_DESC_EMPTY)++; + else + XBUS_COUNTER(xbus, DEV_DESC_FULL)++; + atomic_inc(&xbus->count_poll_answers); + wake_up(&xbus->wait_for_polls); + list_add_tail(&card_desc->card_list, &xbus->poll_results); + spin_unlock_irqrestore(&xbus->lock, flags); return 0; } @@ -156,6 +165,7 @@ HANDLER_DEF(GLOBAL, PCM_READ) unsigned long flags; int i; + BUG_ON(!xbus); if(!xpd) { #if 0 int xpd_num = XPD_NUM(pack->content.addr); @@ -199,6 +209,7 @@ HANDLER_DEF(GLOBAL, SYNC_REPLY) byte mask = RPACKET_FIELD(pack, GLOBAL, SYNC_REPLY, mask); bool setit = mask & 0x01; + BUG_ON(!xbus); if(!xpd) { int xpd_num = XPD_NUM(pack->content.addr); NOTICE("%s: received %s for non-existing xpd: %d\n", __FUNCTION__, cmd->name, xpd_num); @@ -215,6 +226,7 @@ HANDLER_DEF(GLOBAL, SYNC_REPLY) xproto_table_t PROTO_TABLE(GLOBAL) = { .entries = { /* Card Opcode */ + XENTRY( GLOBAL, NULL_REPLY ), XENTRY( GLOBAL, DEV_DESC ), XENTRY( GLOBAL, PCM_READ ), XENTRY( GLOBAL, SYNC_REPLY ), diff --git a/xpp/card_global.h b/xpp/card_global.h index 9cfaa68..5ab8124 100644 --- a/xpp/card_global.h +++ b/xpp/card_global.h @@ -24,6 +24,7 @@ #include "xdefs.h" +DEF_RPACKET_DATA(GLOBAL, NULL_REPLY); DEF_RPACKET_DATA(GLOBAL, DESC_REQ); DEF_RPACKET_DATA(GLOBAL, DEV_DESC, byte rev; /* Revision number */ diff --git a/xpp/cmd2inc b/xpp/cmd2inc deleted file mode 100755 index f1aa9c9..0000000 --- a/xpp/cmd2inc +++ /dev/null @@ -1,48 +0,0 @@ -#! /usr/bin/perl -w - -use strict; - -my $input; -my $header; -my $comment; -my $len; - -@ARGV == 1 or @ARGV == 2 or die "Usage: $0 \n"; -$input = $ARGV[0]; -$header = $ARGV[1]; -open(IF, "$input") or die "Failed to open '$input': $!\n"; - -if($header) { - open(HF, ">$header") or die "Failed to write '$header': $!\n"; - select HF; -} - -while() { - chomp; - undef $comment; - s/\r//; # CRLF -> LF - if(s/\s*[;#]\s*(.*?)$//) { # Comments - $comment = $1; - } - if(/^\s*$/) { # Empty lines - next; - } - my ($slic0, $slic1, $slic2, $slic3, $op, @data) = split; - my $slic = "$slic3$slic2$slic1$slic0"; - die "Bad slic address '$slic'" if length($slic) != 8; - die "Bad op (op=%op)\n" if $op !~ /^[WR][DI]$/; - if($op =~ /D$/) { # Direct - die "Bad input at line $.: @data=(@data)\n" if @data != 2; - # len reg data - printf "S_(0x$slic,\t0x02,\t0x%02s, 0x%02s),\t", $data[0], $data[1]; - } else { # Indirect - die "Bad input at line $.: @data=(@data)\n" if @data != 3; - # len data1 data2 reg - printf "S_(0x$slic,\t0x06,\t0x1C, 0x%02s, 0x1D, 0x%02s, 0x1E, 0x%2s),\t", $data[2], $data[1], $data[0]; - } -} continue { - if(defined($comment)) { - print "// $comment"; - } - print "\n"; -} diff --git a/xpp/init_data_3_19.cmd b/xpp/init_data_3_19.cmd index 5c85bc6..69bdb80 100644 --- a/xpp/init_data_3_19.cmd +++ b/xpp/init_data_3_19.cmd @@ -104,13 +104,6 @@ FF 00 00 00 WD 12 FF FF 00 00 00 WD 13 FF FF 00 00 00 WD 14 FF -; Ring timers settings -FF 00 00 00 WD 30 80 -FF 00 00 00 WD 31 3E -FF 00 00 00 WD 32 80 -FF 00 00 00 WD 33 3E -FF 00 00 00 WD 22 18 - ; Automatic/Manual Control: defaults - Cancel Power Alarm FF 00 00 00 WD 43 1E diff --git a/xpp/init_data_3_20.cmd b/xpp/init_data_3_20.cmd index 6bff2ad..203a39d 100644 --- a/xpp/init_data_3_20.cmd +++ b/xpp/init_data_3_20.cmd @@ -104,13 +104,6 @@ FF 00 00 00 WD 12 FF FF 00 00 00 WD 13 FF FF 00 00 00 WD 14 FF -; Ring timers settings -FF 00 00 00 WD 30 80 -FF 00 00 00 WD 31 3E -FF 00 00 00 WD 32 80 -FF 00 00 00 WD 33 3E -FF 00 00 00 WD 22 18 - ; Automatic/Manual Control: defaults - Cancel Power Alarm FF 00 00 00 WD 43 1E diff --git a/xpp/init_data_4_20.cmd b/xpp/init_data_4_20.cmd index bef7534..1b3fde2 100644 --- a/xpp/init_data_4_20.cmd +++ b/xpp/init_data_4_20.cmd @@ -17,53 +17,44 @@ ; ; DAA's CMD Reg High Low +; Start with a software reset: +FF FF 00 00 WD 01 80 + ; ----------------------------------==== 8-channel FXO unit initialization ===----------------------------------------- FF FF 00 00 WD 21 28 -FF FF 00 00 WD 18 99 +; 99 also sets ring validation +;FF FF 00 00 WD 18 99 FF FF 00 00 WD 06 00 ; ----------- DAA PCM start offset ---------- -01 00 00 00 WD 22 00 -01 00 00 00 WD 23 00 -01 00 00 00 WD 24 00 -01 00 00 00 WD 25 00 +FF FF 00 00 WD 23 00 +FF FF 00 00 WD 25 00 + +01 00 00 00 WD 22 00 +01 00 00 00 WD 24 00 -02 00 00 00 WD 22 08 -02 00 00 00 WD 23 00 -02 00 00 00 WD 24 08 -02 00 00 00 WD 25 00 +02 00 00 00 WD 22 08 +02 00 00 00 WD 24 08 -04 00 00 00 WD 22 10 -04 00 00 00 WD 23 00 -04 00 00 00 WD 24 10 -04 00 00 00 WD 25 00 +04 00 00 00 WD 22 10 +04 00 00 00 WD 24 10 -08 00 00 00 WD 22 18 -08 00 00 00 WD 23 00 -08 00 00 00 WD 24 18 -08 00 00 00 WD 25 00 +08 00 00 00 WD 22 18 +08 00 00 00 WD 24 18 -10 00 00 00 WD 22 20 -10 00 00 00 WD 23 00 -10 00 00 00 WD 24 20 -10 00 00 00 WD 25 00 +10 00 00 00 WD 22 20 +10 00 00 00 WD 24 20 -20 00 00 00 WD 22 28 -20 00 00 00 WD 23 00 -20 00 00 00 WD 24 28 -20 00 00 00 WD 25 00 +20 00 00 00 WD 22 28 +20 00 00 00 WD 24 28 -40 00 00 00 WD 22 30 -40 00 00 00 WD 23 00 -40 00 00 00 WD 24 30 -40 00 00 00 WD 25 00 +40 00 00 00 WD 22 30 +40 00 00 00 WD 24 30 -80 00 00 00 WD 22 38 -80 00 00 00 WD 23 00 -80 00 00 00 WD 24 38 -80 00 00 00 WD 25 00 +80 00 00 00 WD 22 38 +80 00 00 00 WD 24 38 ; ----------- DAA ONHOOK -------------------- -FF FF 00 00 WD 05 00 +FF FF 00 00 WD 05 08 diff --git a/xpp/slic.h b/xpp/slic.h index 2c12330..ea49441 100644 --- a/xpp/slic.h +++ b/xpp/slic.h @@ -67,12 +67,6 @@ typedef struct slic_reply { (slic_reg)->reg_data = data; \ } while(0); -/* OLD SLIC_INIT data */ -typedef struct slic_data { - byte len; - byte data[40]; -} __attribute__((packed)) slic_data_t; - /*------------------------------ SLIC Initializers -------------------------*/ diff --git a/xpp/utils/FPGA_FXS.hex b/xpp/utils/FPGA_FXS.hex index dc150de..4ec2790 100644 --- a/xpp/utils/FPGA_FXS.hex +++ b/xpp/utils/FPGA_FXS.hex @@ -1,8 +1,9 @@ # -# $Id: FPGA_FXS.hex 1152 2006-05-10 13:00:37Z dima $ +# Description : ECHO suppressor included +# $Id: FPGA_FXS.hex 1492 2006-06-29 10:50:25Z dima $ # :020000040000FA -:80000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AD6FF4000E06008006AD6FF4000E06008006AD6FF4000E060080000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4455544455557475577775577675577775577765566665563625523235D2E37C2B5111155111155111155111F6 +:80000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AD6FF4000985E08006AD6FF4000985E08006AD6FF4000985E080000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4455544455557475577775577675577775577765566665563625523235D2E37C2B5111155111155111155111D4 :80008000155111155111155111155111155111155111155111155111155111155111155111155111155111155111155111155111000000000000000000000000000000000000002552222552222552220025522225522200000000001AA1111AA1110025522200000000001AA1110000000000000000000000002552222552222F21F11211 :80010000122F21F112122552222552222552222552221AA1111AA111001AA1112552222552222F21F112122F21F112122552222552222F21F112122F21F112122F21F11212255222000000002F21F112122F21F1121200002552222552221AA1111AA1112552222F21F1121200001AA1112F21F1121200002F21F112122F21F112121AA102 :800180001100255222255222000000000025522200001AA1111AA11125522200255222000025522200000000CFC6F66C6C4F42F22424000000000000000000000000001AA1111AA111000000000000000000000000000025522200000000255222255222000025522225522225522225522225522225522225522225522225522200255257 @@ -19,525 +20,524 @@ :80070000CCCCFFFFFFFFFF3F33F333334F48F8848425522200CFCCFCCCCCFFFFFFFFFF3F33F33333CFCEFEECECBFBCFCCBCB000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004F44F444447F74F44747355333000000CFCCFCCCCCDFDFFFFDFD1F13F331314F44F444443F31F1131300CFCCFCCCCCDFDEFEEDED1F12F221210000DF3B :80078000DEFEEDEDDFDEFEEDEDDFDEFEEDED000000004F44F444445F54F44545155111000000CFCCFCCCCCEFEFFFFEFE2F23F332324F44F444441F11F1111100CFCCFCCCCCCFCEFEECEC2AA2220000CFCEFEECECCFCEFEECECCFCEFEECEC000000004F44F444444F47F774743AA333000000CFCCFCCCCCFFFCFCCFCF3553334F44F4444454 :800800001F13F3313100CFCCFCCCCCCFCCFCCCCC000000CFCCFCCCCCCFCCFCCCCCCFCCFCCCCC000000004F44F444444F47F774743AA333000000CFCCFCCCCCDFDDFDDDDD1F11F111114F44F444441F13F3313100CFCCFCCCCCCFCDFDDCDC1AA1110000CFCDFDDCDCCFCDFDDCDCCFCDFDDCDC000000000000000000000000000000000000B8 -:800880009F9CFCC9C9CFC1F11C1C000048000000000000000000000000000000000000000000000000000000F09C2300180000000000000000000000000000140000000000000080020000000000F071F8000000000000000000000000000000000000000000000000000000000000FFE40F800148000000000000000000000000001400A9 -:8009000000000000000080020000000000F0A225000000000000000000000000000000000000000000000000000000000000FFE40F2800001400004840012800484001280000002800480000108204140000484001002148000010F26B52000000000000000000000000000000000000000000000000000000000000FFE40F0000000000F1 -:80098000000000000000000000000000000000000000000000000000F04FFE80840180020000001002000010024001401102400100000080020000882880080088280000E06E0A008084010000200100000000000000120000400100004001000040012800000000F092548084410128004840818102214860118002211A01148002211A1C -:800A0000041400B01281041480028004148828108204808802214800CF5506481800280000000021000000210014001002400100000080020000882800008088020000EFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000080020000000000000000000090120000000000800200000000008088CC -:800A80000200004FD20400000000000024000000100200000000120000000000000082000000000000F0E33E000000000000000000000000000000200100000000000000000000000000F07CBE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000B7 -:800B00000000000082000000EFEC0B000000000000240000000000000000000000000000000000000000000000CFEA0900000000000000000040020000400200000000000000002008000000220000F03161000000000000000000000000000012000000000000000000000000000000F04BF2000020020000000000000000000000000076 -:800B80000000008002000000000000000000AF6605000000000000000000000000001002000000000000000000000000000088F0CFB7000000000000000012004800000010020024000020020000000000000028000048F0C3A700000000000000000000000000400200000000000000000000000028000042F0443E0000000000000000AF -:800C0000120048000000240000240000800200000000000000000020087F3304000000000000000014004200000000000000000000002002000000000000004FEF0D0000000000000000000000000000000000000000000000000000000000F04FFE008001000000000000000000000000000000000000000000000000000000F0291400C4 -:800C8000000000120000000000000000002081010000000000000000000000000000F051B700200100000000000000000000002081010000000000000000000000000000E07E010000002001000000000000000000000000000000000000000000000000004F49070000000000000000000000000000000000000000000000000000000066 -:800D000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000012000000000018C01220010000000000F8 -:800D80000000000000002FC50900001200001200000000000080010000000000000000000000000000100100D05D0B000000000000000000000000000000000000001800000000000000400100F029FE0000000000000000000080010000000020011602000000000000000000000000CF680D000018000012000000000000000000000070 -:800E00000080012001000000000000000000F0C56A000000000000000000000000000000000000000000000000000000000000FFE40F00000000000020010012200100000000000000000000180000000000000000F07973000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000802101E3 -:800E8000802101000000008001120000000000000000000000F021BE000000000000000000000000000000000000000000000000000000000000FFE40F0000000020010000000000000000000000000000000000000000000000002F8904000000000012001812008001180000008001000000002001000000000000000000CD26000000B5 -:800F000000000000000000001800000020010000001200000000000000000040013FDC0E0048000000000028000000002301188008000014000048000000000028000040011002BF850B000000000000A011002081218181A111000020810100000018200118000000000000110014F0E2D10000000000000080018021010000000000005D -:800F80002001120000000000000000000040012FB70B000000008081010000000020010000000000000000000000000000000000008EAC00002008001220010012000020010000001800001220011220010000000000000000004F510A000000A0111A0100000080A11112181AA1110000001800001AA1111A21A1111A21810100000000F7 -:8010000000400100703D0DA044802408A0111AA111002A828102A0111A21C1122B111AB112018A0988800115A1111E11005A25810412180000A02280020000242110F2DF140048000000A0111A01281AA111001AA111181AB112A111188008A0111240A1111A01A04118001218000080020000100121005FE90D8004420000001A012812F0 -:801080003A01A0111A81A1112B112C81011A08821A21011410011AA14118421A21810100002820020000104202AFEF0E00000000000000002001001200000000000080011800800100000000000000005FC50E000000000000000000000000000000008001002001000000000000000000E0C404481B21B01122B411324219B24291212B18 -:801100009419B24219B14229F24291222F1429D212A9421CE922C4812E4216E12264192E4296C1429AC2421B292CB49142B29122B49132421B282394212B8419B24218B14228B24228B2422892822A84E822B42C01481B61481B21421B2123B41132421B212B8419B242BB11B24228F24291222F1429D312B822D412E922C5912EC21E8170 -:801180002E4286E12265193CE418C2521B282CB581C6521B284AB19132421B282394212B8419B2429A212B84222B84222B842229B82294822E425F28032088040000000080020000001003188008000014000048000000000028000000002501EFD30F00000020010000120000000000000000000018008001000000000000000000F023D9 -:801200002A0082200800000000000000000000000000000000000000000000000040810214F0742A00C200000000002218000000240012200800001100004280010000002002000010C12240018FC30600200800120000000000000000000000000012000000000000000000000000DF170500000000000000000000000000000000000012 -:801280000000000000000000000000F04FFE000000002001000000004200000000000000000000000000000000000000007F280D000000001800000000800400000000000000000000000000000000000000E062070000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000078 -:80130000400200000000000000000000000000F0317800000000820000000000000000000000001800000000000000000000001400E011070000008008184800000000000000000000000000002100000082000000001100F0274E00000000001800000000000000000000100200000000000000000000000000ED9D000000000020040013 -:801380000000000000000000001200000021000000820000000000003FEA070000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000009C -:801400000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000820000000000000000000000000000000000000000000000000000004FA10120B8 -:80148000080000000000000000000000000000000000000000000000000040014001EF3609004800000000002800000000218001880000400100800400000000800200000010022FD40F20082008000000000000000000000000000000000000000000000000110014F06922008200000000000000000000000000000000000000000000BD -:80150000000000000040013736000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000020080000000000000000000000000000000000000000000000000000F0141A004A044882000000A022800200002421B012018A0951 -:80158000880050114001A0448004000000A02280020000242110F2D2FC00480000000000280000000021800188000040010080040000000080020000001002D0FB06800442000000002820020000104282011A088200400111004820040000008002220000002124D02E0A0000000000000000000000000000000000000000000000000004 -:8016000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F481B21B01122B411324219B24291212B9419B24219B14229F24291222F1429D212A9421CE922C4812E4216E12264192E4296C1429AC2421B292CB49142B29122B49132421B282394212B8419B24218B14228B24228B2422849 -:8016800092822A84E822B42C01481B61481B21421B212394212B1419B24299212BB419B24229F24291222F1429D212B922D412E922C5912EC21E812E4296E12264193CE419C2421B292CB491C6421B29421B2923B481324219B24298212BA419B24228B24228B2422892822B4229E822F465820082480000000000280000000021800188D9 -:8017000000004001008004000000008002000000501214FBCA000000000000000000200200000000000000000000000000000000000000F0479B008282000000000000000080020000000000000000000048008008004200000014F0B49D00C282000000002002000028400220018200001001002004000000008222004200002440013FD4 -:801780003904000000000000000000002800000000000000000000800400000000000000F0714D0000000000000000008002000000428002000000000000000048008004000000F0293C0000000048000000800400424880044200002004000000004800000000002004480000BF22040000002004000000420000422004004800200400DA -:8018000000000000000048000020044200001FC506000000000000000000284200004200200200000000004800000000800400000070E2094800A02400002200220028222002004828480048008004002004800400200442000000480000481D7E00620000000000220000000000480000000000004200000048002028082004000000EFA9 -:80188000A40E0000002800002880048024040028000000000000000000120000000000000000008F670D20028002002002222004208404002248000048002004000000200120040082002004420000F0F9E88004004220020000002082022800002A2404000000000000200400800448200800000000482FD503000020044220040048288E -:801900000000200280044800008004000000004800008004422084080000F0CF248004480000002200000000808404000000800200000000000080280400008004800400BF8C0A220000480022428004800428A024808204280000208402000000480000488200000000C2002004DFAA010020040000000000000000000000480000000053 -:8019800042000080044200008200880000006F32090020020048000020840600420000002004000048000000200480040042C80000000000EF620D002200000000000000008004000000420000000000000000000042482004200800DF1A04800200002800000000002004424820060080240400008004004200000020080082484200F08E -:801A00002A7E000000000000420000228002004800008004800442800400000020048088088004200440018F170E488004002200280080024200000023A2421842880022486014800480044800420048888002480048110023048F2B0C008002422248282A0200A04248004A0600A022200442A04622A04400000000484248424880A888C2 -:801A8000CA08424A8CC4410046014784800220040042A044002024042220A2446A8204482A0400482880044842000000420088004242A044002084041C047FC1084A84820280042800A04480840228008024A4644280840442A04442008084044242428024A44842824880044882CA084A0800DFB409280022200442200442000022200243 -:801B000022000000000000000000004800888008000000144880042B11A0442A02A0C44A84A6666AA644424AA4444AA4444A86A22262626AA464222A02A0444AA4446A26A4444AA4444A240400A0444A24048A28A8CC88A088A0444AA4CC428A2C24A48C4F7C0D6AA6442A82A4844AA4646A26A4444AA444684AA4646A2622A2246AC222AB -:801B80002922B23203CA0D884AA444421F140446A1444248004AA4444A24048AA888CAACA24AA424A044CAA48C13E42CB84284B4C2FC8336A02248A022424A84A2666AA244A0444AA644484A2422A264A0642B2422588008A0446A064E414AA4444A248404004A0420A48C4AA4C4284AA488A044CAA4CC4AA48C21488AF8661B002AA62254 -:801C00006A024A84A6662AA266424A84A4442AA46428202222B24262226AA7221A0882426AA6264E4130414A2404004AA4444A2404CAA84C4AAC644AA44E2024A8CC4AA4C8236424CA78BE0D2200000000000000480080042004004200800242200400000048800482A04880044800422024E83B0100000080020000008022022200280087 -:801C80000020044200200400000048000000002008480000DF7907481B21B01122B411324219B24291212B9419B24219B14229F24291222F1429D212A9421CE922C4812E4216E12264192E4296C1429AC2421B292CB49142B29122B49132421B682394212B8419B24218B14228B24228B242289A822A84E822F42A2380B411863411421B8F -:801D0000212394212B1419B24299212BB4112BB4222F1429F24291222D9123D212E922C5912E821E812E4296E12264193CE419C2421B292CB49146B291061B2923B481364219928219B2429A212B84222B84222B84A2212B4229E822F4C3F5202888040020010000280000000021800188000040010000000000000028000000002501AFB6 -:801D8000BE030000000000280000228002004822228004000000000000000048800848200448000000F07FFB202428014880248A8282248104004880040020240200224A0100004200002004000082200830411904C240018F3F0442C2184848808482022A042A048082044840022025A24800220011002024040080040000A20020144171 -:801E000001244001FFF20D0000002008282001000022008084220200005800000000000020048820044A088024044A0800DF1E04000000000000004200008001000000000000000000200400000000000000001FA30500220080020022000028008002182200240028A01200001200802501000000000028C8424248002F73010028002019 -:801E80000200000042000028002800100200280000000042200400000000008A84842404F055DD0000000000200200800200202101000020021200001800802101000000000028000000AF6C099011800280020020220200000000001A0200002001280000800628000000200400008082021B7600420000000018200200002228200428EB -:801F00001280040000200420040042480042488002800800420080F4A7D400000000280000002001000011004880012004000020020000000000000082A22008007F9D07100100808202000000000028304100228001200412200420020042480080040042008882428082025E6100128002000080810200120028000022422004000020B7 -:801F800002000062200280040000820028800880F46FE20000002200000000280022008002000000282A0118800142800100000000000020040000DD7A8004800200800200000048422A2404200400202204200200220020020000800428800C000000F0792C001880011800800200000000000042800400002002222002222002222002E0 -:8020000022002A842284024A022880F2A9EF0080018084222201800428200120030052001880010000180018008001000000008228480082A02842DFE40B800428000022000000000022000000200222000000000000000000000080040042F0C1D60080060018000012282880020000000000208201000080840400000000008200000098 -:802080008200275A8004001A220200480020014252484248802282A2428005006220840242800280248224820C2A084200820088C24888828FBA072088020022002212000000220000A04118120022000000000000000000000042000040011F97070048200AA0431200181278121800121212122B218023842881218101140018185800D4 -:8021000018000000808204808432C14A2218A22CFF7A03202C23228B0212282A820180058004183220A3241AA4421A012828A0422200800118001228004A080080840848A08C001422CFBD08428A0118282A2182A21300421880A112186AA4434A8481A213628024212121A231A0521AA212223A0122A012208622022A08008A86AC24428B -:802180001CA268282E818AFE54328004282820A4212A0442A0112212285242284A020048802284A412621A030000484A848221220400006820A486200668484AA8C88A24D4180412200112422004422024212401120080040000188005481A82A4214828800228422842284A88A2848008200A22200200DF6F065AA511283AA3554AA45504 -:802200004AA1756AA655124848126A86A4333AA533181AA3156A26024AA4326AA3263AA1647AA7773AA2743AA3332AA2642AA2776A066AA6EA8AAC884AA4886AA2662AA6421BA88AAECCAA8AE8A4071AA5553AA322221AA1444AA1332AA2554A8486A4443A023AA3333AC3122B115AB162A3668A096AAE266AA2771F14A62214124AA7378A -:802280001A21A4646AA611A066AAAAEA486A068AAA8C8AA8226AE41CEE2CBEE2AECC29F8C4558084A4332A02A0153AA7332AA2115AA4315A21A1775AA5776AA6774AB542A5556AA746885AA5322AA7336AE61381025AA4121A87A1113AA1751A012AA288A02628CA2CA44C4AA446688AA4CA2BCCAAA2A27FFD05481AA5222AA2115A25A4D8 -:80230000533AA3665AA5111AA1155AA5235AA5776AA6774AB542E525A1666AA6C51AA17D3AA7332AE217A5641B335AA4121AA7321AA1571AA3334A046AA688EAAA648A28A6CCEAAE424AA6CCEABCE2EE28A8A26FFC0A002200002082040000482081222104004A020028800200008001808481048A0448A048008004482008B0C807820036 -:802380000028200100000000000012284828008002000000000000000000004800008848003EEA80B51182B111A2141B212B1419B24291212B9419B24219B14229F24291222F1429D212A9421CE922C4812E4256E122641D2E42D6E122A52D2E521B2D2E521B2926B29122B69132621B282396212B8619B24218B14228B2422AB2422A92EC -:80240000A22A84EA22F4841780916158198291612B1219B442B11192921B6129BA11B64228D312AA422D912AD412BB22D412E923C4912EC24E812E12C6E122611C26631C2632C126B291E42234916A31912336812316B16238812B2419B24228B842022BA490A229B4426A285FAA0800480000000000280000000021800188000040010035 -:8024800080040000000080020000005012F0133D200800200200220000000000004880220248480000000000180000000000224800280082F0A88800A282000022008001000000000000002280021800800480810448800448800400408114014021F4A65F0042008002222002122200000040022021A2182004221001002004121A0448C0 -:80250000800448A042802282448184420286018F6E0980220800000000000000000042002220220480010048000000000000000000140080F42BD8000000200480020000008002000000002820044200000018000000000000000020044F66020028008001128002800118000000000068008042024A210100800400000000000042482082 -:8025800084022F7701000000520080028001180028000000800422A04224482001008001000000000000420000F0FE63002002000012280000000000000000280000001A04000048000000000000004220A424B0ED08000000282824220000000020020020022004004800004200480000000022800242484A022820F443B30048000080F3 -:802600000100222200000060212880110212000028000062000000200200220022200200003FFB0C002001400180010000002001002004000000000000002800000000480080020000B0950A008001108143A2128002000020812281023022200100A0240000000000002200800420A2242A048002F0CEDB00000020020000000000000007 -:80268000800400480000000028006200000000002200A0420080742D0F0080020000008002000000200480020080020000000000000000006200000000F0CEE200800200002200220000000000200600200100000000000000820000208424042004001F6E0E000000220000000000000000000000000000000000000000000000200400C2 -:80270000F0FB85008002A041800222220000800200000000420000200400428004480000800428224200000000FF4C0B000000000000210000000000000000000000000000000000000000000040F1AFB70000220080020080810200000042808402000018000000000000000080020048800200F083AA0000000080820228000000004AC6 -:8027800002482800002082020000000000000000280042000000484B3B00000000001212120000000000000000808182010000000018000000000028008002F0FB650080040028480022212828000028800221A0148088A22420041400004800128004480022684200000010027F57080000802182A2221220230200000048484820040097 -:8028000080A1221800000042001800820080040048004240018F1E0100222800200228182829010000002800220048A034281200008004000000482004004A842406002280B44F0800282220848204222E228002002280022242A0642A022002224280040000005280040020026A0642006200008E7F0000004200000000002220020000A8 -:8028800000488004488004480000200442A0842004000080044880042F6E06002AA2224AA4557AA3622AA2232E223E2221002A02282822284A046AA626484AA4664AA372624A014A040080048085A4444AA8C44A24848404426A062A2224A4224AF476A9004AA4222A061AA1372AA6223AE22262232302222AA22228282A6222214AB45236 -:8029000027A4D8A0A24AA3726AF241114AE4140400A0444AA44458484AA48488A024484848426A062A622423A4222B441F4C0F80A4222A02A0262AA6221AE22262212902002A0222224AB642042AA326C8A0226880C4114A044AA44448004AA4441842428A24084A82A4444A046A022A8214A266F05E5800482A22064AA4262AA4223AE2D7 -:802980002262212902A02200222A22B24244A276621AAC44AA8206481C011B444AA4440042001842428A24A84442484AA444426AA6446A8614E226062FFC07002200A012200222000000000000A02420044A024A020000000000000000004880040000F01FB300002820012880022800000000420048000000008024040000000000000072 -:802A00000000000014AFB302481B21B01122B411324219B24291212B9419B24219B14229F242B1222F142BD212AB421CE922C4812E4216E12264192E4296C1429AC2421B292CB49142B29122B49136421B682394612B8419B64298412B84222B84222B84222B842AA4842E42DFF40A481B61481B21B0111692612B141B212F24B811A2A422 -:802A800019B242092F140B2F140B2DB12B422D912E521CE922EC11E82264182E5286C1539E212CB491C2421B692CB49122B481B642B18136421B682394612BA419B4422AB242289282482B84212B8426F275E200800400000012002800000000218001880000400100800400000000800200000010023FB9080000000060212412000000B4 -:802B0000000000000048180000000000000000000000000000E05F05000000000000240000000000000040020010020000001820040000000080240414F0DE1D0042000000800129210200000024001220080012104102004200001200002002000020C44200F09EE2000000000010022400000000000000201402000000000000420000CA -:802B80000000000000B06E0322000000004002180000000000000000002100400200000000000000000000003F430A000000244002000000004200420024001A0400000042000000400200000022000000F04F9700000000000020010000480048000000002400002C0400000000000000000000007FC805280000400224002100000000A1 -:802C0000000010024A01000000000000002400000080020000007F3C0A120000000000200280022002400200000000400200008001000000000000000000BF6D022001002001000022000000002400000000000000000000002008000000009022003ED90000000024000000000000000080220121000000000000000000000021000000FF -:802C8000F01A818081010020410200000028002200000028181002001002000000000082000024000000008F8E0D820000000000000000000000000000000000000018000000000000000022003EDF0000000028800210021C0222000000210021122812000000008002000024000000000048005F6702000000000000100100000000003C -:802D00000028000000000000000000100200000000006FD10E820000244002240040022418241850220000001022120200212901180028000000000000000048F027650000000000000029020000004002000000000000008002000000000000000000BF9F020000000000210011A021200100000000002602120000000000000021000040 -:802D8000000000C041DF360F0000004002002100002800210000002400000000000000000040020000000000F06B5B0000280080828202000024001824000000212400220000000000000000000000008004F0D76800822800108281022C0100000024000000002100220000000000000000000000004800F0A3E3200848002110022140A9 -:802E00000229022381D122010010021880082440021412240048002800000080020000009042D0FF08200800100228225022001C8201181012020000258282E22203120024001220020000240000000000421C049F7105202882424242E2237222C222245022254362232C42C2122400004002291112B22212021821230100282800004031 -:802E800002000000208404485FF407000000000029011001B0322131120021242100400200000000002002000021210000000020042FF10300008008188001240080020024000000211A021220011220010000000000000000000020F4F7292008222A62282552222F22F312122F211102243553232D322D3225B2120124000080E122F17F -:802F000032122F23F232122B111A61212F21B112011A01282A0200E024E42414020000004AA444004FCC0FA044222AC682272825F222322F23F332322125D22252333D222D322D3225B21251222121A011E028D922E122F932122F23F2222235A111165322215A05482A820200A0444E422B22800200004E422B4490424FAE068024A22274 -:802F800050222B222F23921225B212512229521335F122322953222B112512120218C08225E223F232222E322F224221C1122480A41120A22200004AE424942200000020B44204F01951208824A22650222B222F23B222F122222B11255222357323F122322B332D122B1125120280011E8225E22BF232222E322F22E21121D12151222B96 -:80300000111A05422A220200A0444E42290222000020B442C44248DFB70F000000002001000000000000000000808201000000000000000000000000007F5C0500220020220140020020011224000000002B1280010018800118200200008004000000000014AFF307481B21B09122B411324219B24291212F2499212B94112B94222F1412 -:8030800029F24293222D912AC4912E421CE82264112F22E419E22264192CA4292CB491C2421B29241B29421B2923B481324219B24298212B84112B84222B84222B842229A842882E429FFA01481B61481B21421B294219A21619E22499212BB4E0140B4E91224E93222D912B421CF922521CE922EC11984296A14296C1439E21481B292CC5 -:80310000B491C6421B29421B2923B481324219F2428219A2A419B24228B24228B24228928223928226B2640E20888401000000000000000000800188000040010080040000001100280000000021F04A4A200228006032222484240030120040220400248400212D2824121800800118280000100200480000002004F088175016A240026D -:8031800029388224122021020010842101180060441992121818298202221818901245011440041181141200211841844122004D4142AE115041E2222430822D2125225182122322022901412011C2120012818AC212B022C122100180C1124A0122000014A10022001844408442822424F4FC8430220000208802000000001280040024ED -:80320000465421801118A22118281800D014011410040014128014024008004004FF470522800147220084264208008001200110088024044418440010A81200000040014048020014842012080042F011DE10062180013E8218002800278180011098110081104CC218212412468202411261701204102802002001400410386448200244 -:80328000F0E1CC244424001E22A0121828210024001880411811088450485022402241220218244424120090210084000014008CB22404208204FB3380021240042C4808812200898101008001004842D084811104424038241800440084000024120044810081420000DFBC0F9014814008A414248502122618121802002440861104220C -:80330000A0211844200140713832448420115824122B21C1284782284120020020044118BF1F0B280044100228005084220047A2000028A480416C441200001418401228041004200224184B148B214042081841002F842881F186B1008082014121842820410200004112840000404812088112104424024084C328404818041001181294 -:803380004418000040081FD703224941180421219CC22285028951822170220A0084402C1154488326F11228102C014C41D42182524244224F8102C41A3212806283161884C12C204104428E484781F0AA2700202211485428008001008141108401290200100420018001001810280184248443429C121904122480010000003F7F061034 -:80340000081200C01C901212A484844912140881008100C148948311A821C0214124200112488051841200A021002816044140082514082F880A00164482911C20323200A0122181903212490144D0480300284044442801000028128922820318411800892301802101528001BBFB241264842144C018184424000000204114044100107E -:803480000841122418250844008100160430240000890143024C0126248102005FC30B248C212282412802818312A812100218284018280129424418D48423032508120012808114014400A02181004942080000848444415FBC0A822921D148014014444884410845014461C10030188161442001211A420C10C81421448444814100840F -:80350000282800851408844018084140FDD7FC40084120021022931210120247912100328126080022813028891224024C01208102008190282A04104804001028044800F08F51302428002100848002225028221008004450428448460440140844810049044C112882B1246141504880030016080000608248AFD5450264104A0CC54294 -:80358000022485028150218416140810180421209144404222420826821462114048C428408821244198183014C12A41341852608180F1AA127024082E482290342A21121428C214181A02180028441A829112A0348068442A01164254184901450849A4211210082815382844800210441804813016F0116A2072842851A22504C167E303 -:80360000CB23A333282D2A8125B822524685C4184C11E88141D4481186921847463A63223A8152DA84437242828183F118498F8332188D1C83A1132E582283D38801224F41815344818D5872C54801FFEA47F21626AD126FC2731894181232182D166C4338382D22D11561818C311C165884893218264868C44568814D4A16D88A723A3482 -:80368000248544EA41514497418742444D1445AC214D188128188C321445FC1C14818181181220C11C4D4C7F5101E04152282AB314D2CCC33E894248F81212181E1812CD1E2CB13602CB224447424D184F2142B42CE444943985D44C5364ACA11143C114B012044381032A33242E244A524D8F81820183C1288447411678740C8D48253486 -:803700003C12EF4A0C008441804848024542484248062426482402228122812200100241289028412841844184400816088420014064834422A042A04281C749246F6951662D122721EF4A53CCCD344F427218C82889A3228B1113F11A384D2C4F43A3328782CFC1F314364F4252448CD288F66C5CCFC3F64C6ECFE2F12A22AF82722EFCF1 -:8037800034141E228F23A6661715282A56444F41F314144F42F244545F553124E082F11C1C4D3C8F82A2123AE386F358488F83F67C6C4F457516F4A4FD2465F64676A59E4AEF82FA28288F43F22E36AFC1711AFA1E34AF22F21A349711CF917126FE1E1C8B32CF83F13C1C4FC1F33E3C4F43B332F14868CFCCFF1C5CCFC4FF1C3C8FE3F2C2 -:803800003A22F7924FC3E161E2A3E746F711594CB338F73C1CCF43F31C1CCF42F34454DF55F1183C89D1C8F31C1C4D34CFC2B324F11C14CF84F178788F21F57E647E7C4F42F3CBD5244F61D162741A5A6AEF42D2CCF12C2C6F62721A58EAAFC2F32222AF817315F61A18E5FE1E18CB1289F2181C26782AE842D388B168F468C8CF43F668BD -:803880006ACD1EAF62F23E3EEF91F3141C87A31E6C4AF43161283A52CCCD34CF81F12C24CFC5F559118FC131288F81F31C18CFC1712CFC1C38CF41F15C188F85F55818EFC3E7C3F34C5CDF88457282F41266A5FC5A24EFC2F3BC2CCFC2F22E3EAFC1711AFE3A3CAFA2F31E1AF7F1EFD1D1EEF13E3CC9B31CF31C1426F81C3CCFE1D18CB134 -:8039000068F458E4CF41F5EC72EFE3733AF63E3EEF91F3141C87E31E764E54DF53D3C8F37C34CFC3F138348F81F33C34CFC5F779318F81B118F31C18CFC1F13C1CCFC3F11C38CF41F17C388F85F57838EF45E1C1F16C6C9D298001230223024B12204208120024400481128112441008008902814901223022001044B824412802400884CF -:8039800044844C028D249028C024D09C02E04112282142444208108A122A01804108400410044140480428211A0200001220810149810228188444120040080045E15B0E2CF4112485F2112C83F41124A7241FC1F24A121F41F24A921D28AB9455F84A9243F24A9147832F147924D81AF924481CF9244A1CF8254A16F1245A96E1A2655913 -:803A0000ACE449C24A1F49C2521F49D228F1912487161FC9324A1FC9B24AD141B24AF91128AB9451AB9443F34A9443F24294478229F92448984FA2F48887C0421FC1D62CF41128421F41724AF2112CE7241B21AF64D8C1F24AB2844EB743F24A9136F842854782AD916F82D418F926524E915FA2A8844F8265184D5A9E21BCF498254D42C9 -:803A80001F8CD2A4A5684F32E589726871913C4A1FC9B242C16CAF54F8112CABB459B24A38342F447924F842844F8294826F82948A4F22F513870082481200200100448002000000008001880000000000480000000000280000000021F02A420041C143518218CD12201108841058C1504221504244504824504824CC1244C214416D28A5 -:803B00009026496322A02184220010448881414888428821C11812891288F2272710328221F015228646114478222101121221111241E11542581C3215582810288111042218850421494101288CC12189D24901302A11412441424916646284181E4185F44C714032C4C418AF3102131124113314813218F1142741454248464A6181166A -:803B800041AA1870328C4146D4219218C485E642A13420C228838102C71141C1893331818932224216846162160A567838F48438100221444196542E10C828004008400264114445C824A4508481400412414C4282024425210128148C024002100441812A4464816083002FC3010018502800001225022450420012442004008551A44C43 -:803C000002421840524880021046480200202184041002201208000027489024254324B21232286D222A411698211001508310481208608485440624128544944623216342256242221A02490247A22449032112188D141034241E49644B218D347283047F440741212D142C62212829A212442D18271240015012C0184180040051258469 -:803C8000121264411092184C12D242021A022C02264C820380058440644289042932143846082F36022214008912480600244002618100248100835484848461184648324412630222C0224481414002412C21041816060013136C41262804F03435242225648838C422109214259324211002850244002224841044982444C3120880023F -:803D00002632482355480043042848218AA112402481A2411044443812C44CF1178C1420A1212100501411850430384901440090182564244150822061814014D241D2C2011887436212284F81B22221512411C45082288911481C54488C1208250818DD4C100423180424D0288302100100218053840080120425440221124100004004A4 -:803D80004410180C18000000000018001846F84B8E4016C412326022D04BC21385850281490125148203124382145C2481C1321614441C024D28A0124D62448321C2182A457C24B24141CC9200448444435148C942048443C14E17E730A212A342140C2031265062112C01400841854418022840144254A28982417424220190121A12448F -:803E00007424428C0124001E286081182628046081811281F0CCB460228481008911220200290240044004811044088150421008A141C44100A1002642064410880100100440247126381444428FEC4B02184D12282180026400400410015084112508400200240000000044448344041088020018C48584614200410022212F440682835B -:803E8000021800850324404241420410020000C1451854420010464412484814820100400881840000001004260800F0C3C10024008411508450C184401C41088450824440981200842485048C82420811400D818444256814812361412112403812814228122041381E47A29F790C21142081424808841048088441A4C1250A0049020087 -:803F00002618024008B480015022000044124D42200112124112814361421244A303F085E740888153A3122982C2224400288012991200103A282042420826C4428436429A2434494204400400284212000000400446080029B218F412CD143684020059614100104286420241400110140881000041005014812100840000104A0481406E -:803F800012180481C02489026042CFF10811272881848A11121201D1000010020023020021442014024424182400414924121418843442414800250218240023C1480094F0F3CD6081800420D8241104181CC11489D114028011024425042D14C0124188856461B014021601D0826221144011584A411424848514C824408895282814104A -:804000001402DFE94751222B19AD229313D2F37212E8424262112581722E44119D1740461436283028504CA53E64E518D88A522A855A68450861428352C822414D264E46144D4A107812425A82C469E442D284F139468932288D212D64BF970518136881A4869288874211A514D128312818916485D2245118A572291A7428E8C151CA2427 -:804080004302701462624F43126281BD2640761654C6503CA534494D18CC514A890118184C911889921C4E248C61421A41796CFAE97F243E258FA2921429E181A3115D32E141E54C78124158462508A518424854C2451444528250626C54C24341D8451326516413C21A144844A42D4881E38731128C11584CC331144E148423932447A1D3 -:80410000457C3424F14FA40040044424400224400224400314503800000000002128212821190219021D28D0810228C0284008008400148002F02C5CF037263FB2731EF81D118F81F12C2C4F42722D5D4EDFD1D18AF13838AD1C85DECEF21D1C955AEE75F5252CD5FA3C34C558A8A5FA2E2CE7E4E55AEEAF83F33C288F83F328288FA1F13A -:8041800029214D226F36F2361DDD2D5D267F52F26B613B55AF95F778382AE22313F21614AF81F3381A2B754F63F37E5CCFC7F33C1E8F41E3C1F1426E1FDF41F233327F77F73E3ADF92B738F33F37BFD3F22D2DC5FC1D1DCD1C3AF3283C5555DD7F61F11F1E7557F77FC2F22F2CEFC3F32C2CAFA151AAEFCAFB6E2CED8AEF81F13A3AAFA36A -:80420000F21913AFA1F13C3C1F92D275F2662FEFD3D19DD6E5F22626AB44BB66AFB5F77A3A6FC3E323F33234E1AF81F3281A2F85F724266F47F76434CD3CAD1C4CF1647EDDC7146F63F33373AFC3F33939CFC1F12B2BAD2C97D2E5F41F1CBFC2F3383AAD38D55FCEEFF151AAB55F62EFD2525EEF43F31C1C4D1EE5F62EAEE7E46556E6EF0E -:80428000E3F33E2E8FB151EA3E3AA457326F23F5173C557C2C7F2EF64E4C5F65F17A518FE7F112141E122B314F61B11AF13C1A2B754F63F37E7CCFC7F13C3CEFC3F37C5C8FE6D7B943F132225F52F5382EBF97F33C3CBFB3F33A3CBFD252EEFFA1F12B3EAFA3D3AE53FFE5FC1E1FEFC151E895FF2E2DEFD2F23C3CCFE3D32451ACAFE3FABA -:804300006E2E6768EFE1F11A3AAFA3F2383FAFE1F114163F723226EF43F51D3CD784C7F2E722BF96F6595E6F57F57C1EAFC1F11812EF81F31C16AB13CF62F15A788F63F37A785B358F83F33C3C8FC7F74C6EEF1C0D1880012D12A01210040000644006850685044450484014121814382430261004634278240243C248434228020040482E -:80438000044C02890244F0EADB602A0000004C12041880010018410044805184442144456A412212218301001A024400000000100422001044045084BFFF0D2CF4112485F2112487241F49324A1D24AB141D24AB9419F24A9151AF243924AF143924AF347924D812F924481CF9244A1CF8244A16F1244A96E1A264592D4A9E242D4A1F49A3 -:80440000C2421F4952281F4932481F49324A1FC8B24AD141B24A9921AB9451AB9443B24AB924F44292478229F92448984FA2D4980F3CF411682E431781873612A7341D248F34C1248F7619F148B349F2489343B24A3924AF24598429DB86D412FB245A1CD9A4EC157A246A192E4A96D5B2E449D292E4C9D2A2E449D628E44922E4C9724A58 -:80448000E2C8D228D141E664D9C1F242B25D288F2439242F24F92448AD924F8294926D482BB44F82B17D0D8480042008000044800200000000800188000040010080040000004004280000000014E04B0C414043283142A41814844042181818111A15921846084068844441472448242664424444442860914042484454582100400C0089 -:8045000041184F8241444844B8620312231A922444222B821352421B418C32311112618741200145224298244161284A02444D1100281682121182121461622480E1440181890190483A04813430141E41F0651F203142104CE42214F82211449B14C3227222881144094511127442423824C721418E244C3444417444132242922C172202 -:8045800042844C149128504213614141812E1844002A0150186542641112477210845232282C012A08250130111484A143112A0116982800304880422284811244941400E01201244461502C480040088C241494184303166844844C022280A1212128002502201122010041148002814844E04442088442002004106241B0114441042841 -:804600001884181200608100204244F8F2C71026C22890248441231124042284146418448C11D4421184A142105226812D1247822B2160412C82024511C43120120812321644011481182F84C118701428A521304842CF110C412883C122260444182524041221140041164471120480C44241244522312489034901285041601243211256 -:8046800009A012180014812440381880A41240CC48AD5C90228022018C022124002881124429018141302418890224418C562884214860228004641800521116044CC211841812128B1412C01C182082044F9E45014901498202284001142C62832D141821484880012C61458D16C028121A04414031429014244331144064421AC414115F -:804700008012942200B03404457818048D1244F082CF4082D42A0243110C2962224418512281110016042829410618C7224141224150825C024053184A0221489141811024B8248142231168888180022C028971970B182260111042144808800100850214120089040060A410485814428502200184120089822201129489811488084176 -:8047800000202431443F1D07182E148D224D114C138882C22B4412156281299111A5227441848122C158465448C7228D2483A461C18554422666244061116B12C1407428C5444B121601A8269B1817248321A84B81448D34A0344911E42E02A41082424254248400141A024508001220111284410260412100858114081614022C21210446 -:804800008B1284408421010084851414084008ACF4DF4500241120211114C8242211602118490118101648843118844110081810420C80010000181284001884122301214242480081421AB46F02128184100412280080420800632221E24481410800456B21810048E04281428421013840840232200400802102288426845224F0515C6F -:804880001024118102000018190280210243022A811184512100404814240241800140212294112883810240480125012D124CC1C4002021849227001504511004441211122301112143022E144422844420820114244064414A0215084AA1241815048014149864284400214220B214880249342284AFAD078284211004418443028082F1 -:80490000024961422002452A41498422420912202203442881444111001848100889041301118504A0184694444820F3AE3C8041011216A8218443810118842981028110022228801184014C44048441481C11A4248400188302224848008C140218204504122844E921D4D105A460214110240184228400254822011008401408414470E2 -:80498000420A8034122200004C4411048183216281800119B142022838288C4208007FB50F414336180000004C210281240031000010858122230112641003400411100426042218422014042042A8188304248C01F0682640880100001301854162C1D048421828119612C0291421818941E254084100121412704408190413018005439D -:804A0000235141114C1279484204444216082181EF3108F094131522C1141A21614243634119921227221E1144ACE12241E282F12874AB319F11711451882E24141F5134184B114CA2152B651A91282843C4551D251F15D11112B45805222A8201151563146781EB122AB788125CCC8B714FC6B11271EB081E164C5218144381921C4D1809 -:804A80004C53118D112289512483437416853114450884152A02C5CA1A65584284276241221B124D544C150143C2144CE182B244D488B144B548B6414182D121F16842161484CC282E224784A044BF39034197842F817124145844449311E88263238F816281A59816EB22286F43D2422271245D448D144B21C11F42314E6C04472249D47F -:804B000049D1446241811222124483A123F038385A721864818D492B114731A382A164DE844F47A1565844488F82F22F7F0025011884400850148426224124416281A041811230118504811921840100229014D01401149014008C04842601341AC426004024212401BF7F0A45F63528C7E16D4445F438384F41711DB538F339383AE383CF -:804B8000F33A1A25D28AF214349FB1D3EAF2162445565FC55C543E282E282E362FF1F1165E6F6151EE6F64F436344F43A3327AA7111B114F43F335648F83A3228B448B514F42F224341E181F2131225F41D18AE284F17A784F47F2E46C8F97B768F47C744F46A7653FAA024D144F97731CDF467414F438384F41F115158B31CF93F3343540 -:804C00001AF3183E2D1EAF21B13AF3393BAFA2F22E2C4D127F51D3CFF11D142D3C2E285F5AFA16146FE1F91616E5FE16546F51A1334F43F138381E145E114F53F33575CFC3A3338B458B564F46F23C3C1E1C87342D275D178D2A8FA1F17C784B674FCFFE6968CB66EFC4D444A4656F830A4F61F13576C7E1AF81F11C1C4F43F31C1CDF5194 -:804C8000B138F339388FC3F33822AFA1D3AEF11A184F62F233336F62F26624CFE6F33F1DED1C4F51F12C3C4F82F228AE2FB1F5165C45F62E2E25F426354F43A3334FC3A3111F41F534345F43F338394F41B158A455CFC5A7338FC7F3713229F21514AF95F56438AF87F7F4544FCEF764288F87F73E38CFC6F768785FC50B4F61F13F73F71A -:804D0000F1AF85D1CCE143D3CCF11D198F43F33D2D9FF3F33A3AEFA1D1EEF11812EF23F133334762EFC6F26C3E7FD3D3D9F11D17CFC27224F82DADFD47AFC95564AFE2F232346F43B334F334144FC362411D4555F55111CFD3F334348F85E484F56C7C8F83F318189F3551377D17AFB6F57E5AEF87B7F4FFF4F84F87F77C78CF87B774F78F -:804D80006878BD9B901400840041120022000084645048504840048912411442148412042004A0128001224800C0481400848054484881D048022F1A078240410444181240C81190181658228438122843813211400830182412002B52B02401181214165414284AE1813224C418C0124003003826084828482FDD082CF4112487321F41A0 -:804E00007248F11124A3D641B24AD141F26A911B21AB9453F14A9343F34A9143F34A914F83D412F935488D914FA2D418F8254A56F1245A96E1A27598E5A2F498244D4A1F49E222F591248D131F49724CF19124EB141F48B24AD1C1B64AD981F24A9351AF343934AB9443BA427924B842F92448984FA2F4E37BA0421FC1F62A534CFA6A110B -:804E80001F413262CCF26E1111AF76F911248BA41AF24A9753F34A8143D33AB835D412F93748A9E922D558F925C24AFA241A87182E5287592E4387594D421FC8F2245A8AD438F1916447141FC9B24EF1812429F1116C2F6648FC48B35B21AD87322F447AA4B84261822F44F9364829F8245A4F76032508480000400240240400000000223A -:804F000000800800000000800400000000000000000014F0CE26408341011889322A44421D2C1628C14181914E1844511392141638613024448181002E12184562413849A341001854445084C41140784202424502884222284480F247EAA024A22844872218242A61C300A8845412112A1192128C6214418C668868444845082304282299 -:804F80002C14411421430436781431411AA24836214891119042122893E1846884489CC44E8F5A0D467162982120C13884218D145141B82E4855981889A112903336EC31746461821E8C4934848C5484C07290212504C14813248111644241C3D484024941A2422054422381A2414A7848029483F1BC7A20220144872230221E24628C9232 -:80500000184001141944160510084222288400102211A4212E521B21490122441416C81111181B482661883413014820186982284924F424428F8204211A020012C0280021111440618185040028800144008444008410240400004C020040031800001220212408F05CFD902421472300898251214783C1836226406481202324044449E1 -:80508000A24242244830145062203224282A01282E1A444582D12282755422042420C118290188E6880C2041F455BA302229D1240320237128911881842641018521D14801482002424264481044141282922449A22580E2821112343221124C81440100168801882A8C048041F48152402402008440C2244522C2424024112882044064F5 -:80510000421A02003018400481000000411064224842212424121810021884924288006F7C0647243A440640022982316125982522211A24044140FC2412604440480442100441002A04C464402802404202411A82018421108C042D482238AE288082846211342216648884442869A11281A012161828A214248A038C010080214114D1D9 -:805180004A210120256142421890141A32241084422184789442282891422D34584AF1D3DB0044102441048213040081411082A21400814644182402644044085A62220000001654144489122285240100001A22011200F084D4E0443224701364212223312A997561C62A2281A14823038C0187448B214C4C588489028014141864454742 -:80520000222002414421CC6552D024E1212286848141811428D9823288421AB4488223F24D4E6028124302144441000013811184819438498422412463440041442112490126321818460812184C0212418C021614022001822524C1141221432184B4FD0A2100269412004140010010018002000000004810C444000000410010044904A0 -:8052800021C04400482141444426142634489F220F8420321180A2242881260400919021002841A0423034800200004004405848480020E6410246A4810000A041422A040010F49B27200824801221110100400400210028274141002220040048001C040000C0220080624422000010088C024608F0A89C400280049214400146942128EA -:80530000412024040000001044060020042044014004400123C14814440029048C8844880800B0F84A21021100000042800240014024022002008082040011004142002240040000004210248102800440F1BAAE00840018124306814528220413044120041848444C4204440000001C040084200420A23422182004490288C012828B24E7 -:805380002928249412DF7503601244430288808402400381002A042400001024022400284814480000000000862288B881022B4158828002221048E85B0184434885244261414621042A847448812404000000002810060000000000400280C44292128225220492008008828628F82F166086802481C8268149122402448002688002269C -:805400008201232282012EC241800260140084C041C029244284142848444228008CC41812800421487FB206483358542F41839891DB111501CD2142C0211544312120229222484604188062444904A04213B4442484840430442642026A62314B681BDCC217622458438CF41844C8422246D4182CB4820723728834216AB432C2212F4625 -:80548000B244364C444CA246429C145124A024E0628111A42243A22243C24223044141000050844140219267AC91448F2618024810A2D18CE884F1223C8D284E848A44E8C9F41C7D808202458161434826D48122A6421D21E18324A4646A14840263A122414C1244B6244202224248904144118114288144624B414AA21116A4822B844BF3 -:805500004442248B1D22E04A9862A14652281FFC0B20026182004148410084804401004440044440041002410000111011141118111C1114018200004C225148008285F4C62D142B4C5F44A2226B532F21F236A48F87E746F6686CA0441F24B462F449491D215F42B2615644242F22B222A2222A32222AE262F362424F44441216044AA4AF -:8055800044DF54049445F125619D285D257F96F675795B55DF96F64741867263F544442B354F48A8981E2E2F48C9262F648CACC42F64FC749C142B445D4D2E252F43F512927F53F37C785F16F6282C2AE244F641622B669714115F46B6615644224F63F366662B4447422B114F42E26AFA66626F444CB2261254114AA444DFD4F441414E22 -:805600004945F125619D284D246D285F92F36D784B662F44F4C1432B2245B452F594C48F8151E8AFCCEC6EFEE2E429EC84FC48DE5F8F4CB342F425642E226F23F332326F43F339796E649FD6F62C2C4E441734AF94F649491D414F564651442652666F47F766642AF22414224D862D424F641452444F44E41484A4444FC454114855F4250D -:80568000242E23CFE2F26624DF46F76477CFE6F7C2D4CEC23F34F644462B1547488AF134266F4EFD6C6E6F46BC82BC48FC4CD65FC942B3E2F62D254F72F276362F23F337B5DFD5F765659FD6F624244AF46163AF147649D111F464656E614544F216166F47F746644F62D24451444F62FA66626F6C14F224244D444E414AA4445FD4A444AB -:805700008954455F46E232F22C2E7F52F22D34CFF2F764663F1DF5C1C32F2CFE44462B554F49FC5818CFE3F2EEFCCFEEFEE6E48AE884F84CCE6FBB080022800149810460224800140080024C0200004E24002004004200002220822422010048200800824220042F5702212042142211024128420000A02400410044400400108402420015 -:805780000041002841B04401880048008064442668441048F168CED022F41124E5F21124A7141F41324E1D24EB141D64AF149921AB9451AF64B924F44A9143F2429147822D954F82C4954FA2C4854FA264514FA264194FA264594D4A9E24ACF491244D421F49522C1F4932481F49724EF28124EB141D24AB961B28AB9451AF24B934B44AE3 -:805800003924AF447924D84AF924488D944FA2B4BB0567B21AD61EB411726E21716601ED1119D67AC9642DB11D68AD962AF44A94222F747934F8428525D852CB5A5CEBA2EC51F8224896F5264A96D1B4E449D2B4E4C9D224E449F62C429247249E2447248AF24612288F62E948F44A3259D268B924F44A86A6F84AA622AD946B4AAD14BEF8 -:8058800042CDBB4028882402000000002800000000001844880000400140084800000000000000000000F05F2340012223219238121180440848914200C9922448462842283424448C04C41A54861A64442800E01102464146410825488124840422268881CC420081422F39054B2186018414144B288C5834890116480370514802859129 -:805900001720C12440484834555012284C42984260414121C41881432261121821121412415E8A004412482AC145F01BA2D014638C284820A28114444241201222A41450423443C442188322654243084915847528B4558224123814421248488594220023112624A614418A1302C82C41A21284126FEC011041628126711138248C48633B -:8059800081811668141508150826D848321181224410487848141158230085944200442712C41C01456181264148214101C0488922418424044684F47CED0000000010820240020020014004000010010022001100000021840000001004000000907680C121111902111C0100400220C128008820312460121008482002A7210030214564 -:805A0000110110414A4201942411119222004A48341800A4BD4B806112112240311110220200213028202108414C0228001001002800804211014002811440012541A11822008A44341800247F6501400811000000404204120000C01200130181200428241781211011518400101158220081604200440000005082FF930D139211266416 -:805A80004144203112812911280121412301008C04224181241440882114888212189421181011180200460214001052422C4248381800811F554302221012011312041C820580016021421100444810241408400C414014420444814424104418CA4821C018E04108418280448444F4B6BB404202A021210011009111648A0461120018AF -:805B0000008014641244811024C11200001B21418001811400000060212042041068226F124413712283321241213861112B128C551811439184122522146184184C924481472446D5815284C04C41412444615120038424104CD922840400D04251422482441E484038288F4A04221241442E11402111180112247042024C2101000000D5 -:805B800000301810A8121A420822124551C145220100848512011608822C31248942084142413FCF05000020111A911800000000111084015024141008445048000000A021141A120800210080011084010000F6061004110018182412812001856431811811101C4508002110121802816C82C123140023421281513A892102141042043C -:805C0000814441CB214D18002FE30B400800C01813412201400480110814446441814301002444401811280226420890222894502383210226442201400C80614110F2F1FD5088C304118011021608455C444303C11502130160A12553221E121B1192250810584215511115741A588987148013C112801148524445F424212A22420460EA -:805C80004141C722A552221AF1D77F0020211102004001104811010012141001440000000000212400140081000010080000180000D03805818C24840400004054144C32288C02210010512290124381298848044041414118C84846820544000044414C22922800000025022D145B26401882040000001444800210010000211418411950 -:805D000048040040014088814402002200400489020041200210029FE109200100441800504400000010012421A011140000814001508800000018005044A022001002002421A0118BFC2420010000000000001110090000400100000000242021810100000000000081000000DF640D1038444A118221010045054122838201201141122B -:805D800042A21120212818041001118588112A240400005044B02C022668218400401242A211A5068485888404001001504845848242431108101151262584E14191888800404143414858884C84240212004044D44492282A020000002556425FF90D0012004100004051284001810000004004000000002400122501120014008124003F -:805E00000084120000F014C320010000004001009400101101001400004400000021004002000000000000000000F01A31002901180000001414843184151358881C011411004014414414080040028091112922A111220000855882002181800200457444012021612110040011111181148051111111001445514441401804000024403F -:805E80003212121603400800000081244028010041F082FB3012C0141062411A01111410088558191042215111110011151504100400241032121864211004100110088184188144180000708A0D672227212AB112219112C0122592812F317111B189699985F888414E48D09114C1419518F94448874445B444E242024C02284554242ECE -:805F00002467222F21A2122B111AB882092C5923882F317111B189799159888B484E48C048805488814F84E4D40F6F225224181223118281512229C8131F2191819E8887118D4142464859111C54818588F44844C1492262424480425444286F2252242A21B31238828AC1112592823CF1111219F891888391484246480848848588F47A52 -:805F80007D000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000000000000000003 -:80600000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000000000000C2 -:806080000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000042 -:8061000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000C1 -:80618000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000041 -:806200000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000C0 -:8062800000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000040 -:80630000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000BF -:806380000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000003F -:8064000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000BE -:80648000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000003E -:806500000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000BD -:8065800000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000003D -:80660000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000BC -:806680000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F003C -:8067000000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE4CA -:806780000F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000000000000000000001E -:80680000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000000000000000000000000BA -:806880000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000000000000000000003A -:8069000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000B9 -:80698000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000039 -:806A00000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000B8 -:806A800000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000038 -:806B0000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000B7 -:806B80000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000037 -:806C000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000B6 -:806C8000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000036 -:806D00000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000B5 -:806D800000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000035 -:806E0000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000B4 -:806E80000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000034 -:806F000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFEB3 -:806F8000000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE1440511214A4842445084311068D1144244054C1872130182061810044D04A91111921125824542240012441456A82415014220014644CC222002001F0294A4F -:80700000404118485A4144C9811116210144814551619012258451122D185022D032C11316512181811D1890298722149C125A18D311283314286F12B11222D149437C24922890164F2261231E282183D186B18A02100110112A01400240041441244481211911080011144002182608401882021184409214241D22008D1184264104490F -:8070800001258201164874AB0900212410448611921149011D18814011548144408A81410A408491141021016C9224288511021602160841181B2138414424844942A221608200847FCC410100910081404404004400000000301200272124911200848114111011184104004441200220024004204102AF520914819150840085040000CC -:807100005024106221121821000023011450818111400100811044C824268802000041243022A0212400126309000000000000000000000000000000000000000000000000008004000000FDCE1400501284A501408108180020742118210144111211008415422141711242484805190216445121282881511C01814200800384702438CC -:8071800014F0928420531250480081901AC138298C61548031129022252C0240684264224400363428222C81C2246041848C2206181400124044318622210023A6184826F8152E142C01404D481108AD11C12C81091504182D3114272144434281012244284411C0262A9128837124C12426415448894201229441138101431411269232F8 -:807200004018F22418188CF2724520124102248400202882848104488180420800154844125821806111A440020018121468232201110081008200004A226844D08D082001112A41081508100242001A04400128002004004042442281840244220000304A822182420080087014881304F08D2B00111A1218C842181289922C2011528119 -:80728000248426B41844E8222484C16400248B248C8523218493242C03663421109A282CE421A6141181800412A041608422C8208804CF2C0B6011184068841818261808000040C45881484818000023840512A012412E1222108112228204405828802404000022560800F01B49008012A921241009431262214294244E1828106122224E -:80730000C06480048C12A8212446448223042E444C028184243AB442314388200812808538489084324928048BDE80814744E144124822422476228564215688654483C11243433824E964814E1342841AA221452294461E2422442528624640884143B4284108CC21B2884204C0442B244D482816821C18F8717140C244268801804205BB -:8073800040142822488882240200212081028141164808003226084222C0423048142250414838208102104244122422F18BCC304230112800000080011004008110081004144148001008842021212102121022A4412284805484800840480818F0C3A82446024C2261428128234264261C62841218442816C82247818181874410251217 -:807400004998148C71488254842222238221A1218962211361442A011A34398C86114424A2842D42604212432411F8B38180E141D2189121420015040012248E488B1449242481024C0289C14242E041A2424421442A014D1820C2240042502A1538680090884889014422874484818289022F4D01100112180081830448810081008100DD -:8074800000240042001248B02804428024021800382829024A810110A821981828800218D0D50B004D1240082800004843422434484064C24C02C148874484205548841284400828204188C26840284488032886A84100260881220081414FCB030026081038288B14801188850490188481001852442004212002211AA2438001000042FA -:80750000802407444A01A01218422A88011200E0EB0D208104004228122212200112202122010023011884422A04800100008004282AA161128018084B14188881008B840040028F19091880816381200412830484008C011212008084013048000010C81489A14300280000004800588282826849A68460281880E6360F221200100122DF -:80758000485082448001422200003022000080848484042841421AC6424100800228290A80022230181A22240229017FA40B4428848449021084C22400800422101434288994288354488514143858008C018142800184266885266884848CC418848C42C84884608800188C05C8D0570B128012216282201418810523810540882101462A -:807600008201001880220220214482A4210020012100C22248218800128C0828208404DF250A8C220442008112288C4444042842002221181210064C051A48820448C0212A01842023051A041200584C288282318C00B044081A1802360412168113CA349D284AB4683258844785E041E24114D88824B3185248841E1A874347C4A14B446F -:8076800042848395484AA141628F8484A41118228483E38431688CD32866848B38ADBC784F8731881AA8128E885AFA58B8222A064A44F463AE8003168833387028C814281B128158A0145AA11289F124141A62434A84A543414449B11285A226B04A21A1116044624A22C214681A3232181AA6C6428384A495A28F88088788A2481E181A59 -:807700009118481FE50D26A434C3B2114408281E482E588F449652878429058C244448981628608418465C888D48422E4E1848848D782E247E3A2AA6411AD128833638588B44728322A143B2A388D488B114B278B72481B4C4C3828AE42128F2168240044422442244000000000000810000000010082012080000000020220800800200C5 -:8077800040284428F4B8BFF024244F4452C85F53F51C3C5D252AF224248B335F77B312E121F1121480A7338B33CD162F42E182F2786ACF82F66C686F4554444FC454888D2A2F85E58525A4754F45E725D74EA4447AF1383AEFC2F728283E32AF8152888F82D6A8BFE6EF26FB6ADC8F88A821CF42B2A8FA2484DED8CFC2FEB8BA8D888ED85D -:80780000AF86F45D1DA0322E288FC3F235551A53118F82F2243C8D385FF6F21E1485B27221D488D788E483D364F126142E288F83F22E3CCFC4F54C5CC7C44F4CAD448FA7FF52585E184E589F97F664644E6BEFC7A5453E183E32EFC3F258488FA4F22A288F83F358588FA4F6D2748FA2FA4AF88F84A911CF42B278FFA4948BFC4FC6AEFF15 -:807880002B819ED88F83F36AE2A0226843F131358B319D21CF42B278B538F31D37AFC5E1A5B11223F118483AB738536C6D3C187AF73A688F83D7CCF544444FC4FC18188D2A2B744AF558585E714FC6E7A5F5667C4AA7738D1AED3C8F86F6783AAF85F668386AF348AAAFCEEE2EFFCAF88F88F988984F43A3BBCFCAE88EFC6CCCAA98928B58 -:80790000D86E58CF3B024F42B328F23C289FD6F31C3C9D29CFC6E287B378F77D77AFC5E1A1B152A7558B538B518F83536C6FC183F178788F83F65858CF84F44C4CCFC5FC58188FAFB762A7545E488F94F6647C1F25F1767C5AB638F3283AEFC3F358588FA7B372F768788F86F718FAAF8FFFF8EAAF8DAD988F88D9CCF3A8B8CFCBB9F8FF03 -:8079800074FC8F8DADD48BD86E78BFFF040018804128C248C048400812400816480420E144028744208421048324228421840100184800221A24A241200912A0492848281200430C80021200200128188001428023029038205484008100484218A0128004C02883022A41088400C0488190280048280014CFB5062D421F417228F3112410 -:807A0000A3F69124A3D441B24AD141B24A9961AB9459F44A9443F24A9143F2429147822F54F924481CF9244A1CF8244A16F1264A9E252E4A96F5224A9E24ACF491242CF4912485F2912483F49124A7241F48B26AD141B24A9921AB9451AB9443BA4A3BA42B9447822B944F82A4944FA2F429AAD0A2A5612E431F81786A3111A71419F24E03 -:807A8000124CD27899618DB459F64A9443F24A9343F2489147822F54F926482D914FA2C5914F82EC51D8A6F498252FA265596FB2F498254D4A1FC9F2224A1F48D42CB591724AF29124A5F29164A7261F48E264F9812C8B3459B24A29FA4A34A22F4431B4274463BA42C1125E99608280040000000080020000000011188008000025014025 -:807B0000084800000000000000000000F0B3C6A0240020421842114801801142924420A224200412002A8421024220C24822A0142222412210220328182A8101232402800228A01C885FDA0459A1212E18228001001218200489044E1800148086E422042022840142462291521210223118122AA124A014A084801808C11812C8224A81FB -:807B800043014742E042A424830328121011981143012E52602441812248112C24826121A02C386880041B42A7241A92182C2404441228681852B094A421328421452881A124282E42328A24F9DFEDC01112800284210000001088A41480028024A442000012200412488081A21216282211820228008820240280081880013F3B0722C001 -:807C0000110011182822200242400100000085840441894208002A4104A042A0120080912142442722400260814A01400848009F5806008C022E11833222811216CB11181400813902221889344828448304422D24898201C04858484C31124185E1422101129018428858872190862CB228818464461868441DE480028C0313C2282A113A -:807C8000881191138004142002226084486044483028A7422800188CA4414830121E24944B2118302142C4239482421260411A228244B8440242412F660A0011805121202292182218140081310018107824088441424088012244004E3400008021011828C0128121A36824160842A04122F0D7F7242A410122431218311819D12881A220 -:807D000021103A184084242221A124104834224B1228688304804668414412441210084CD382E12441E42401830448414E14404448A24184CFB30DA042898201228800211855280248220000890423A112001008242881A0214291421048AC12200481A6C4288C02848302A01262408292143F3B0D00000089082002000080122831282270 -:807D8000A0428842844240C824584418602218002800818100180044102201464898424220F455B68041C1281A822202181633282B218342028C210283241188878295882CC4282A14E882D468A661C118224B61671110A412C41881CF24824122382821431428024256B84C1228243444BE3E30A2280041848541081230114028044C02D3 -:807E00002832814828224460412200004AC218001240088C0212811E482AA1418184248CC414438102230438846FD30910011B1210810212112826011901288480018122818C8284812422242204422004001228260880228292621210820468A042290240F2569F80814108282281100818808212182822010084420000421216282182CA -:807E8000228221022210082880010000902229618128002820F24C9A20081800001302280000180032001220022200004008002200802201812C1208212484000081002004F09AB880010081180022818C028100800120420840048400202114082200280020014228211812438204B048022B21A01200219F4F0D8001A0120010083023BB -:807F0000003038280016846181184400000030182084820222208221225182000000002242400240F1ECF14029420914E0111249214111482161124018A8424A02282588C2188480628528492164446044844800104802188C612244259A1880542841244C86841112D48A4F0114D018011C021818140040018001004200002084044828C7 -:807F8000222200182880012AC41881800400249012485840022023F4661E4021C81166C8119294808261115012402101281812200120020040081200841200200150824062412A4102C012002721002A04288FD20C26082A048308183618C128403418281608402802243022128C0188C02890284001124648042200181A42E281024412AD -:8080000089A24141120080012112CDB4E01121681289E612224AD18861113E183E19221870180180A1237A52A88C021A820280A6418CA2131E58682AA252322A22021E384A312836481AB212E122452264242B24AB16AB626E224A420234321B2910B181127131B88111B131B211322999129121111351813A91182AA2144981A412897154 -:8080800024145888482283B43875481428068384270428221E281E2AAB248963A24F22B21232182518A241484D1A1AB126B422A226184D42CF764521E211F118181C7118E811D38861128C4381521AAD291CA1128D283E288781001A31186E288166882124C438C0682A4284E4410244283A018382C11223B35803D086D32881D1246181B5 -:808100005221241A852582F24DEF0000000014004003000080044880544848000042200442224200402804460242602400480028480000282FE541E11AF211399F13D111F591119F99F129288B22919F11F229298F92F218189D191D398B328D182AA2764D146E788F84F61858CFC6A6264A012AA2628F86F62474844D444AD444A6464FC2 -:80818000C2021AE587C6288B676E528B548B2269B622C7162F24B442F67634AF827324F642526F74B212A3222AF26446EF9442F131311F15F729191D41BE319F917339F939318F81F119295F73B223F2393C9F91F111198F82B238A1332A53448FA293128CF5747C6AB2C8082AAA337E28CFC7F7591945E416F22C3C7AF164242AA2517A3F -:80820000A7558F82B232F35A5A2B662F43E622F7627A2F2191426F63F33A226F62B232F727262B312B332AF27476EF354EF121311D6197129F12D199F199191F93F2212995F811298FD27329F919381D119F81B138F338382AA2774F42E382538A8F85F12C5CCFC2D6880C223AF77848CFC3E791D444A4464FC2A6464F42A6223AE181E3C9 -:8082800084B638F23A222F21F352722F43F36232AD2AAFA4F442426F47F37A3A6F62F342726F65B152B562A6224F66F7DACB141F1BD31176297869D999F219399F93F229298F82F311299FF3F32B2AFF81D311F119198F82F238181E387AF734248F87D78AF14818CFC2F7246C8DC8A04A8B738F87F67C7C8F95F724641B664FC3A7774F8D -:8083000042A6227AE185E581F13838AF87F67A7AAFA2B332E326F34A7A8F21F142426F65F15A52EFE3F372726F65B152A5112AF264763F4A0A002A012A01221226618114841412608128168822912812830428001088012A01002A0122A012482A4128E2812402A04120C1228C84024A02009F950826112152812215A8128C02108812183D -:808380000100222880A24228418B24004828228100220000008446022C0146028901211229224102A04128227F570D2CF5112485F2112483F41124A3D441F24A111D24AB941B21AF1419B54A3924AF1439242F14F924482D914F82D418F9244A5CF8244A16F1244AD6E1A2645DACE44DE2A2F4D1242CF4912485F2912483F4912CA7241FDC -:8084000048B24AD141F24A9219B24A19B54AB924B44A39242BB44F8294924F82A4944FA2F43C61D0A2F511648D421F4122F4112CA3D441F24A111D24AF64F911244EA15D28AB9443F24A9143D212E982D452F92648AD912E525CF924CA1E814FA2641D47A2D655B4DE2147A217CD45BA91D628F49124421FC9724AF28124AF24D141F248D2 -:80848000961D24ABB459D22AB924F44894D042EB83D442F826482B944D1A4E914028880400000000800200000010021880080000140000480000000044001200000040011F2C0F20828222C21122841692214038180023A21410880228844A02004A2201843042838202208101188128942800009582C418800284A024282F4E093534915D -:8085000088130850211B21191284A11280188201841AC24140280180120844225084284100320080321410C2822082411244022811628044013F720241138EE2128482C121382E11493214262842829222008B12134412981812A0388462442810912289322820872101228428142C122422421279421228422142026621F116FA50121210 -:8085800082821041528124112091188220A11484200222A0420000121058844241000000124901A1820018400418808214880422EFFE0B008280080088000000000000000000000000000000000000000010010011400170E7451222144184114CE5241246F811114822859882169214396432C084185AC2484564383184288341B8831489 -:8086000088E14282281443A412C9C2854261A4382A64398D88211249A1482A48524AE084A241FF1F06A024714418811C22864238268A65118850A24129E42281C185122884448E415542E184B2194438828118444A8C12034C11CCA566922427812A81C48182F0424A412B183A4842048C3218EFFB090082800800880000000000000000A3 -:8086800000000000000000000000000010010011400170E705001840112112110890411412004088C34800100400801204228081029014602200C01200120042004004460428B0EB0D39C212136221384981011A02298281410489C5641A828482822104228072125458382C42084F22044A02222001365228438449022001424C722224E8 -:808700004284838114F8FC582419C21213012D11181A023224281A8401904826648378660818108402401491342884905423A242100412800246A218301200424226142612240128F0B2F10020222152411011081011C11480210400282004002829712804242220020038C02280119A16000012002012044E241842843F240B12302814F7 -:808780002A0112294151221A42514246628480110A6D22104208444312022440020029524830281A022001181A42044004280041002504127F4A01A04230182100222800402402284628220118290485A121A0242284420080D184A441004800902284244442482A44C812120090222B1460218FE406681084024181244784802802809178 -:808800001200204408520000004C22020010321600100200002800002218200400C83FAA0E327024D82983031688F22148A0212840C258184A8122F1462283216481142226A24222A02400002CC45616142802202102382024841428A2211841422118602C8F61044828004044225126908211214824228542080020444814041018861291 -:80888000022CC124002212244002890121281004122100809244006F5E498203284024C411122A810218280083048032440000292201009014800144000080218102290200413014430180084CB844A8826DBE404888240213810220810149C4143012E0441102224022021002000041004C022220810224308440020000004224524034B7 -:808900003F902200131121227124021848184002A041625828000020020026024012840200432101108401804202212280828402C01889F469E3C04828202401139412481141248D14905C1042480822901240021800201214021841630228001210042B284420484822C2846044448221882FAE0E822608144400002216013A041858C056 -:8089800012182480010000004004004C220100000022260400108241342422003084457159031280220220022880820228400A80420810028C01801102121812288184002800220021248606286048004624211484A421EFDB0F2400806624400841872483048745104208604400182082A2210044108892188042942441833214444961E7 -:808A0000818C08001200848412800310F818F1400880011CC2422229141151820081800142001840028180010012418001224400100428902423626A8828280028200484F0FC132004482117834C018440824246C82A4904200222241022831192A280114C4844E14112820148212228283244122341041A22012A211164424982542248FF -:808A80004F620118AE2820E447F1511426D126B322E643F12A565E182B11C3D4C4448231582F82B4245222A01127222C82220212504245C8164F817334B414524240B4188261421E3443F332862B2A10C28228122AB2146246269414444F14381C5B3A242B2281283AD111C2613725878352111B21214E24E483351AC03420A4220012709D -:808B000022A231188012A411234102182849A2322AA1221A712452688A82B122C2842359822E268741260443AC424964892E8CD72BE0250426D211122C8207C02146D128F22C481AD122E184B51AE422A435CC041A012827828C11622150C48B1344496242896342436262416041490238C145C28226C21418499914899874784E242B8D99 -:808B80008D442B6C8FAC0F000010082440410840024048020042002110020010181218044110040000414002004C48C884C0840040F45B94E022F62228243B515F14F51D3ABD215E7A2B314F74B762A7328D18818F8412F21252AFA2D78A55646F46A644602287822C512225B21251881648F222262F621252444554646F41F118184F410A -:808C000023C1348FE1F312B22B92AEA22427282BA14F48F99C9C4CA1D94F4BF3941418CD98CFC1F43841245E422F84E422F233715F14F1492B3D292F85A7335F66F71B161E328FC7D5CCF15C5C2CF54252AFA6B5627564F666642B54183A63222F2AFA22222D822B11CFC2E283F315132F63F33227EB224F43F2446445F6266485F814342C -:808C800043F324341E342F61D342B382BAA2DA22B882F814344F43E34ABBD4FDE4244F4BF586148F8CED8EF69383E023B622C6223F13F34D495F31F25F654FE7B752F77477AF47F72232AF84F7585A67841AE125F55E5CCD5C47622B222B111AE122712888682127212B118FC2F2343CBCF13636AFE3F3123C45D444D464F2162487814F91 -:808D000041E243E243D2E8F236B22F42EB2ACA222728AF81F8183CCFC1F1AC9C5AF574F44F41F94654CF84F96C7C7BF3245E62AB622E223F17F24D391F35F3777D6FE6B762F76577BF15F54262EF85D7ECF15E5E2D52AFA4F57E7C4F477764B622021AE122F322222B821E1227292B118FC2F2343C4F91F134349FE3F3163C4F43E242D66E -:808D800064F242248D284F41E343E342E363F3B6B62F28FB82A22F28DA22F88A88CFC9FB34344F42B3D4BD64FE34F44F4CF5C8D8CFCEF68BF2A01220022A81E432A141221A0412608144001A0480220180120218002818A012800122A012A012122602204822099228822892282004775D20080014400118112468425022A01448290200D1 -:808E000000602200204244420444C0244100004445022C894202004C22614443014150142FC60B2D421F4152281F41324C1F41724AD241B24AD141F24A9119F24A9251AB944B42AF3439242F14F924482D914F82C4914FA2C4816FA264116FA264192E5A96F5224A8F49D2A6F491244D421F49522E1F4932481F49724AF28124EB141D2484 -:808E8000AF249921AB9451AF643924AF4439242F447924F842944F8B84F9A44AEFF30F25F81164A9F41124E7341E2887341D288F24C1244F34D9C1F24AB259C2924B422F3469828D934F82E4147926D812F924588D916F82EC11F8264887186B5287596F927498D586F491286D481B69E9B49132461F89724EF281244F24D181F24A961D55 -:808F0000248F249B212F6469822F4469822F4469822F4479A65842BE427F3F0F8480040000200844422800000000128001880000400140084800000000002800000000004F5E471102100116311110618210C24A141012C84A2249024501242082044449220138438181A2128091151604282816023814002021011622B84C22098F2509BA -:808F8000484308122828422661811412421880C42418284E1880211201812424400A44414508281072214202282200502100444424648C120800144C72530A60C4E011041C331122911782431162C3209422818992724124541416028A91425084214C11116C4183632242282419818102281241122641840223E18241C8122446246161CA -:809000007FB208290400222014810180642411108481142882210210280221302410A42100A0213412414C0228002583024004640080688288228F69048002400123420884204132113412280000002200001084A2124200001870240243D2412202420011108402444004A8F0F642304216C11114328711172919C1111381120A44128437 -:80908000481822442A84210400001AC22244247024C224221052842111128C012C83026024E0810244684C2127849128BFCC03481C61111114812B1816981185012548921118A142181004124222000018284C8202644C82021881611443D241022829045021608222414420848448D8594E022200321CC121250112221840148121022202 -:80910000200600000028442116228402400244260218832182210280044901A02443B124012A81F2BBF600001824838208320000848381014A81012220120119068002281844901683A1420044180025BC44412406260526148804002181F0F47490122143820234404149020023A28428210046128421512816021622025841802161A228 -:80918000444522040080012D22860C6022002031844890824412FFDD01005018181813480221A884000000604212480000001241128440041002290284822001128100120024000030486FE60D290128912CF1192240F22812A08200848B812E128085E164E241A2413224241B242C013849011618847126C212411002128812253C521ACE -:80920000480815868142E82104480085C448FF7B0E8602411A024011410121842420040000005081002002481E242011241184128212440880C124A168001004C0840082008F4D03008432501200181828101241180222102201004002241828435122103214004302800221008002004C0228800100F0D3E2000000001810228101000027 -:809280002100800100200220011230246021244002200100280000163214124044A41210F462F620081111101233112410C221120000100200200181002444802102211841242E148021311418122A1122230400210000005FA545024002800110088421840022290100218021022220022400002841480028444122E141414490341200FE -:809300004118222100214F7A030084211260232884201208002382810212122001002420032210141204C144801144021088A421404482424484030040717301102852288400D01231181818188C020089211202000081212200126480224148222244840322000048108481A212410000443D1C4008A0128850829100A119421141813164 -:809380002800102201282880028001290244002148100228412121002430122489012582818201707F0921822294232168112111842450811884000000008022020021102402830200269414004A410818C014422200846C220200F02BAF40084800120000402EC22813612128841812002180018800222322424102C4C0421828C0646002 -:809400002185026C41A22124412602402283322214AF664A028318D112A21196D2230214255A2829823118141E12188F2202160200A022812B22282B122F2231222828104E4432246F65024922947464C9012321E545A511232152C23AB112A2221A4251449F2D0C2048528986021E112F11528281128F135193149931221284222931125C -:809480001880012642021682C2222A41062A82914821182836E442234258824C024C1246C2321AB32401269212C022F0A7C310028F82E22311DA121198199F21A1112F8253A1835381A428AF2282C1128021A1112A028C022260414B11676123F226261E14472165C426226F438171147212B61A012B172AD32201697224546E1AD266C232 -:8095000014442A01F0B3B100140000840000000040080000001008000000001004410000100424480044400244122041B4460A501115FB232B2371197811A222A5E88151289312BA19D1A8F32A282F83A21124291102A02285A83224212123A21345564664AF215262424084A221684AB41AA1112B315E722F23F146166D2443722A38280D -:809580002F21A1228083018A04214E488D289FB337129F91F13B2BBFB2528B1E1A6F41A2333F53A3119D19AFA2B322A3331AD122711292121AB132F32828AEA22B222CE82262222B235D276426F3262E2536462CF216441AA1314B726B55AF21B112F112345AE7217342F214142E22E57C28E421E323139222F016142F144F024885FA3BEF -:80960000333571197A1BAA33BF11B118D16AD32BB31AB3198151888781AB112B2218182B11A012228FA27822F222222F22B232A2134F7152662D24AC7212D64254441E1428286CF664642F81E181F112162B754E726F64F516144F22F22A3AAF2261226B324B122B322A91144F260E2189F4282A9F3753139FA1F13B3ABFB3F21B188FA156 -:80968000F11A3CBD31FF91F319111D11AFA3F13A38AF83B332D322B11291121E122AA3228FA2FA22222F2A52226F63F324344F7152627D244D3627616D442E2267653AB134E263F67664EFE151CE2B137AE721D566F414144F62D3CEB128E123F336326B322AE322D144B1E80E0022841C012E13404148628140484348022C22011200005C -:8097000010821282820121901410022A012E12122412221220011228122C0228800277B8308200502200282C01181100182218221800002260820010042144452201502410044148C11200244110044014040070D4052D421F4152281F4132481F49324A1D24AB141D24AB9419B24A19B54A3924AF1439242F147924D812F924481CF92464 -:809780004A8D814FA264114FA264192E4A96C54A9E24ACF491244D421F49522C1F4932481F49324A1F48B24ED141B24A9921AB9459B44A3924AF4439242B9447822D944F8284F9244AFB8CD022F4116C8D431F4122F4112C23D441B24AD141F26A9415B44A9B25AB9443F2429147822F147924D812F926482D914FA2D518F924C21E814F37 -:80980000A264182E5A96E5B264594FA2F4912C4D4A1B69C7221B4983F49124E3F48124EB1419D26AD941B24A9B65AF2429F2489647822B9426D842F8264829E8A235CF400848000000004480020000001002188008000014000048000000000028000000002541F15E53148A33127400148121903181190881400218220028588160120017 -:80988000C44429116421808222125442004128121A8601198111987421442314428C12A4424F6E4F02430A12C4812100901224121601250810481142180124901225110281280040022011688213110241000011200400485214F0CBF6A0122B341506441184215021C3C1812A8101A121188C022562821412601A24244144163821121037 -:809900002822064301814C21023841B0218141E8622144C2425028581416F2727E10420412818421001A0210528100001001A014845022121181241004212824502410884203184C84010014481004604422442AF41C92000000002800100100000080010000002002240000440000000042000020040000007F14040080020000100200E2 -:80998000981008180000002C0400008001000000288002280000100422800242005F350900000000400214000000001200004221002240820100440080020022480000444228000000EF790E008002002200000092400818000000000000000000000080020000000000288004F02BB6001214002260810000001001588100000000189031 -:809A00001480010000008001000000200400804488048CF2B441000021400344100A004002400180021008000060228043044400410022414142001042028012064100F095F800000000001200810012000000000044000000000044800140010000001004400400F03BE800121121C0226081301A00810021601184000000108401128043 -:809A8000014400000012225141000020141264224014280489F27DCB000000114004000000130148002800840000108412A2210041104484010080044002000044484400F04C9F000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000009 -:809B000000F04FFE004800000000448002000000100218800800001400848004000000400428000000002180F1F3B5000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000F7 -:809B800000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000007 -:809C0000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000086 -:809C80000000000000000000000000000000FFE44F020000000000818011040022218001400444400800400400602200004400008451428004880000CF68024014440881100810011100000000D084068502004800234282431204418112001240081800000000221008EF4B4502414400000010111801440020120212874450484004006B -:809D00002042C2241004442212001014080084114280042002006FED0E004008844008000012000000002800210083041002181002401802200100120044000082008170DA070000002410125112112410280100220000004C0200C01200124004122200008C0200008002000044222F860244284921121478111869212800254142461840 -:809D800098189012439114002121460218282781208201211A120269218392164922C1225211296549260840986426843228F02D68108412844214C818002D2140115222248341C818902212004002240028213022122410042428222632142624821202B0842102004E2444C028287FCB0F0012005021853112241140018504008011340C -:809E0000140021E04402183018120012602320614112009018A04111290581224008222241F0C5481001D0240200001841804284010040121402131106124280542630112544C411222C21A22149022711214118183011100224000048282F4C09121048084D2884182321124C8802C02280022140022011414404442012012881480041E6 -:809E80002002004400200100001002485FE9070024301421000014240084210049023241400444242444810042812901218041022092442C14110800281044A4241008F06CCE901140DA8482712214082901948421608100222C02124150414065414144486522E224419816131102234336248022D4244411081212224044A4240042709B -:809F0000CD070000618420011A02004124222140042D24002444002D425084001084022818A0126022131106181210410200210084A042EF2A0EC0158481181889011885221108B11054684084024902002301410040220221242200808222122426210380216141C0144E28256482288CF24D9F8001000024848502281002100800400268 -:809F80000040122401400200387048440422101494281800400200000044007FF30F002441250A101102848185442212080080021800002400000020010000004418002B1400002C22240420011FA60E0020013430186011604312901812233114290100212418841818182C818111040000181800A01424800118004100181820027FE993 -:80A000000482008C2101412400260240180300290120220200218001504350212226040020412402440018004180B2249126241AC218144C0B90120000100241250825810221C1214180110840024D122485024160112241800243022012828404220018211218818449022126F8ED8F3014455214105C811C4174141269114485121104D8 -:80A0800012C18485446441160441410044C4290174441825224104222218D081121802242420010010584841F027374041D284114111528219518400111212150280112823022614140800C01400224B1200A01200212111271122221129040021491102121840F21C7A5084144844414D184100004C31244C02442181000025024C0188C7 -:80A10000442400412501244D2844290400184C018041448103009048188302E1F0D28BE05131948578157A1452A1878137C1E55E98231279167A117226427818761C246181416FC2C124502E2D121E124CC11A90122480C3222D224818380069A221B71212213827111A91122B11212AB142A41326B828721449F2987F10C41245941A8581 -:80A180004995148D111A51238F81F3221A1D14656111CD161829518C80031A114614584647212371166E2117414352653A5144C445043A22614335B414A23630214A050044D0C851288F61D244D14831283FF10824159513444CB11A516324C014111283528815185286A42D144B2222284302100410844114F61226222524B336322244A5 -:80A20000242A8231244E5C8D463A6121502212414B114F2132346F84961416A8228CF2CBBD00210010040045020000240012288002444004001004006100100400148441400100444004440000BF7E4A7111E441D1CC711555691F31D1ECF11D13CFC151138F81F311318F2171197119F9181C4FE171163212C57C14D48CF2143450C44509 -:80A28000FA12126F61F1181A1AA1113E342A23A2132E224D16283AA7112F2111F2151737352F21B132F32122214E422341B21241F21A1AAF23F33A28CFC3F1381C87221FA943F115141FF5D568F11F57B54C586C9F31F1181EA57A2AFC2113BD37F77137911E18E5DEAEB11651C412EFC27224C414C48E9A27216F61781A7A18AC111F33E4 -:80A30000F326362772AFA2F232366E7A4CA2331AF132226F62F337333F35F63E3A6F42F321222F42A2551E3225B612E163F25A52AF61F5121AEF83F138348F23F3AC361417617F51F51F1FF7F1FD16FF51F11E1ED55119DF51C1249D218FA15333B5F91C1CCFE1F11E162B11C57C14F43E384F428251CCCD8A2B1145F61A1A6145E473D356 -:80A3800046B124F2242E27226F4295244F43A3112F2131221F33F36F3F6F43E763F123223B642CB112D164D166D122F17E3EEFE7F33E1C6FC3F238188FA2F31722145F61F11B57EFE1F15F1FBD12FD15FD1F957B1DFD1D1D9FB1F31B33FFB151FFB1CF41F11C1EED1E4F4171242CF13C3C4B134556ECCFA1F812126F69F11E1EEFC1F1146B -:80A40000142F33D3467124F4363C2F61D14ED544F22424282F23F226367F33F36A7BEFC3E763F123227F24F712122F23F116162F21F13636EFC7F71C5C1E18EF83F338388FA2F3EBBD100414D02201450100341648024048628100004C02810029418401430223026302210030241222122240A2410020C122482001F0949F20088D13446E -:80A4800070114842887111382212890174122011188422030021C01281AC012C8102C0120028182818C0121002181022014022912A264864121F75062CF4112485F2112483F41124A3D441F24A121D24AB9419B24A19F54A9243F24A9143F3429147822DB14F82C4B14FA2C4814FA264114FA264192E4A96C54A9E24ACF491242D421F49A0 -:80A5000052281F4932481F49324A1F48B24AD1C1B24A9921AB9451AB9443B24A39242B94478229F92448984FA2F4372EC0491F41D62AE4417248B111324A4CF24A1319F24A9428AF54BB15F24A8243F2489132AF143914ADA16B422DB12E5A1CE9A2EC11F8244A87194F226419BCE448D284F591282D4A1F48D62CB5917248F29124872463 -:80A580008E244D111D68AF64D941B2489B25AF2429F24896224E9426D842F9264829F92458DD8440084800400100400400000000000080080000140084A04111000000400428140000001002FF7607120026419928259211211548D182028001C48425021120C52400854442682200228002212D14182100C041830284000021C452251407 -:80A600000418F0411A00431808121504818311922A14230125741488018B12461228110844872220120418B042211294240041802281A31214232481815C22412229018160C1144CF4E612004614283219AC029118257126382332301218161CC8325021184A2141648A41404C825121584094242784122C01282063151722412003103635 -:80A6800022A584544A244118121F6A0F18001150412412A18414842140548400A148A110382440126822200280228202104604800122844216088A140220810144160849F4C3D22002230226019021001001800125628144128180A2421002C02449010024280000454204206281002100220080544820A4425F390671495121241293F1FC -:80A7000012282D181F426182222E1250C284166842E08211684260816481902223422222762234286383F1261216321422230338CC0223422842423414A123E184C2221A025048412F720863225132B0238141C828456182A012100C89912289712488C1281008A4C022001E2428004F21C22228162241321444184430220021444C3122E8 -:80A7800018892422420C414AB21C0B11442800B43632111A022234249018502480111804384316022128472260244962A22061412141282C02228982C21884221002A42042A214008944E4CC03008721286022812C0190243018240026180400215021121038368512480410849248262204C02428000049B41892144829023024002880D5 -:80A80000E18F0D2A0144401244942C401AA521702401AC321418C12041021228541604B01484818403188504874523012901004502C1280085021696880084E064F195A80021D0342152181002184011124AD842012412893224100400218D420020C14481241121001A0248006A2101101B04800222211283012FA7081E2250684F118236 -:80A8800072240129021829C222503481A743678264C9912832404402142781AB2525628549A1414B12812A113122162C2193166800629048121D18412518C226478822903816C8429FA5070018502284E1161C424831118D128400181200440011284144418141004241904650220028006041290185122424021228100210F413DF2012FB -:80A90000D6146122104438222352242604443180121402292222028128222881284138002D24260210281318382825846222403228420084620081284A31482FEE0540081110010021121121244901C0242100206222002C4102842448004002004440742822840144420030442410848404187FA60520121812C92250921190289028101B -:80A9800028110C4038328400404A024014465822494204446445886183448418410018160880C144490142184608DF8D0545381100000080022840144482011004401604430143022224008421808204408402001844418011042160220040B2D90682141588424802101202281140088C02200200188400C02222818C041034148424C0F1 -:80AA0000241812A04129614121232124028311A8212D120040F15A8220C2222215220226A121223260A1701104001A32281678186281A94298342883C218818C012C91181688C1284AB31224014008260481C4004014241222E242210424CF8F0E114441C450948504440021104251C2508218246042000043810210040010122452248419 -:80AA800000231102201118021248128445080046F8BBA1100126422852829011182418811C011961A138A4832211088941141A584A44A13018102881E2414242944818441843012C42628144831122012781282331241818F03ABF4048820454281C121C1114D84141880229024440041861224C41840816062128260181A4E082C4222874 -:80AB00002200504240C44228120044450820922AB0154F41B484D1A4417C24495C221E34D044312A8F81118A5184278216DAC4B322F128182AD284512487A241450A3E282247818C733A62212E2823C1262721A9F22A4626742CE442311A3E222483612127418D1820F15448521A92148B361AD6189418ABC260126C525893121B7C2871AE -:80AB800021E3329122182F32D28153549F41B118B22E722A42E821428AC238439122441E2AE12D2A2A7214A444848D146CB21411642243911E844D224FE2E144953218AD184A11A21249C1168F62C7161648044E28483FF60C197223B923D232C2221F32D2C1528A3D2426E2C112415723344D124C018D2245B41A313887424C7228BC386F -:80AC0000F22E14648741A5562A84A93216C332228F467214CC381E281A7318082147436502CD6A5A3412448165782EF8222669A4161A61A4EF2C0500100440080000400444120000440000000021420022200200220048220000000090281028018F934C011D11DD1B95FB282C155C226F61B113F11434AF81F3193A2B111AF11538A7E34B -:80AC8000AF81F128284FC2F238182F81F13C181E18C7E1A5DACEF2141C87A26FE1F13E3CCFC7E523F1122AEFC3F114244F23D3A6F23E3CCFE2D388F33C18CFE1D2A8F336144F64971AAF81F15A5EAF8414F214144F44F57E7C4F43F128187AA76787818D487F77437125F66172DD1FBF92F6282C95FD26256F62F3371447424FC3C3383E7C -:80AD00003215F71C1EAFE2F12A3E87A26FC363832F83F326384F81F1243E6D26EF687A24ECA3FB161C4FE2F27C5C97322FA1F332396FC1F312126F23F73E3CC5FC283CCFC2732CFE3E1A6F43F34474AFC1F11818AFA5F34A4A29F114144FC5F57E7C6F63F1383E5E522B761E18AF84F51D92142CF21373FFB3F32F22AD2AF55C237F73F35C -:80AD800016144F41F3123C1F21F31A386B11FFA1F13E2E2FA1F12C2EEFE2F23C3EAF81F13E1C8F83F3281C87A2EFC2FA181CC7A2CFE1F3383ACFC3E397F51A2AEFE3F1342E4F63D366F63A3A4F63F338384B33C7E12F61F176544F43D348F118188FA4B74214B214B158F57E4E8F83F12A1A2F87F772588F85D3A8F5666B1457627F73F70C -:80AE00001F3FFFE4F22B2BF5DC6FD277F337354F43F3123C1D32AFA1F31717FFF1F13E3EEFE1F12C2EEFE3F32C3EAF81F12C3CCFC1F12C2C4D2EAFE2FA3A1EEFAAF21E3C8FE2F2383C8FB7F51A3ABFE3F332362F43F33636AF417328D448F33C14CF63F23E366F47A7338F81F118188F25F55A522B114F41F1185CEFA7B73EF33E3E2F87D5 -:80AE8000F762188FA5F3484AFFA40F1470220165014722844712404248031412244002000028214421004A02003022100218E0222151244824000012244022A12400F09AD7202A0184D08102400222115084A112A143C12212001004611E2424442C8182847222024722C0122880021A228482014A8194121242321084221348F1DC4BC02B -:80AF0000421F4152281F4132481F41324A1D2CAB141D24AB9419B24A19F54A9443F34A9143F2429147822D914F82C4914FA2C4814FA264114FA264192E4AD6D5A2E449E2A2F491242E421F4952281F49326C1F49324A1F48B26AD141B64A9921AB9451AB9443B24A39242B94478229FB3448984FA2B4C901ACF41164CD421B2187241F41F7 -:80AF800032421FC1B24AF11124AF463911AF44BB15F24A9412AF543A24AF145984ADB52F81D45AFB245A8D914FA2FC18814D4A8F19D284F4D8212D5B8F59F2245A17892E5A1F49D624F4912843F6912C63F4812CAB121F41F64A941D2C2BB45D28AB9443F24A9484AF441B94B26F83B442F9241A7FDA0900480000002100800200000000D2 -:80B000000080080000140084000000000044000000000021F061AD00241211E0821118433811282870429218248116429824001668828435087048C464A31114822241B61482C22884846083268584224491148C411862418141444C85E224B2D50626A2299032265C2143810322B18429A181A024188902001140014284150A250846C857 -:80B080002421484A0230122D1149926844255224898181410210280210089C15F4E88214B052022611A412842D11A0214782282B12C6022829815382412411181A423AC9848445F848247041082883E524B244C122831352482AF428124D214394281A64526C311824842E148140C254181AF2618320022D12128352816981121851128496 -:80B1000024128981144808220081150800152254228351244C12024128008D1128814424901280014008004185048B2449F41E71302219021240182441E38182011412811228269822802282021420352244A0245850244461124048022AC128220000001002292282014A82E4DC0A1116B211523247B32661A3839226C028A7231E88A480 -:80B180004D1184161CE244D122212501542129124464224932122D241AC4181266210225941626524112442924134241292421C1148CC412263C2884B0FE0728122D1121AD1683722498182129C2321AD2129818153C1816443824182B2122284124221A1486829242692561611696212250C2212562412E18444200000029C1142A2412F6 -:80B200004C9828F0A3E510C3212813C1211112299225831148C8182412608223D222054818405112402412142683824408462401C01428130222212A11124189840124811823832224E45B0100102822028911124A941112672200C01710022384611160422522118201482181155C211A3411211215044E2151241331457022012B28482B -:80B28000421200408471FA022241901650288440684144246082D028110441184012442651828144142821542E14282371280446642246886126184242108403580020622212218412BF234B911210044161005140382800482D218421182225010068144128224484288421100284142822400218222200C012903482423048727031447A -:80B30000220164C9C1224312582814106892235162C023854226911214421644E324C22CC52231234C13425468844C7121941284212996254AE222C1444A81C221501212B84849A3924A32124668C524F74A20420410441822512C160C124068241648341144222100415021302400812E421A62221121D0149121892141924114D012810A -:80B38000840146022148000028F0EBC250625542020028D01801100911C11845CA2600124C44020041291254246430222880333A0025222222522428422810044962612850842180D484F2AB1A0000441654C1252403200180217122B21102201102112682021921C41811604124A021840028004C8431184674125148008110080084182D -:80B400004921F4E2E9002812401862C1412124004C1104414512019100001004514028014502659824814D21411461002561849470140123034145082816D24806F0FDA9C02C18D113011A0212E0C1022312EB2112619122001A02108264122C964424A04211111848118C64442C0400004280420414200410042200F05E7420486222C902 -:80B4800021C1122890140028106441104294283022902442800218104296648014022400418022C316E04124844242220230281844491208EFBA075014804208A48126028154A41C020026684128421C1402244905B014128402004123010022444024420416041AC24447812612240146286144481F934F82010026814281528141230125 -:80B5000040588240010014496111111415A21228C03146212191144011012E111828420040022C41850180430220A412442F930E2C81B228418142C1129480522418450240341818001A9431281410034427222C2422421404413036E0424102248C04704152241245082A61214C62224180021F3C012638181D448414254441D46242088A -:80B580004439823221260994455918260261268201194A1101406212181CD1B294241D4249144141411111592216148102831102A487412A4458828CF2CE21246467DA95C12C144D3487523D1E97538F629114267935D134511BCD124D21C18CC13A2F21238133413C32651B515A7212735852331C62412746774227443942B41242962169 -:80B600002B426CD2C627C64A13074456A4144D2AD0E2B21CE2477252C848F05E46B03492314F82F21C111B3227811D324B214D3269721A120333E1417211F53B161D292664131C74417521C54123F212254425E742D251A272674147224562A15B112658271D44733124413211CD4A3591425B1165A2122FC1C2148B21C12991448742CF57 -:80B6800042F124643FEC0E2961212F6111731C7A21731638282548081E22A55E484D1A2E28842763C51129B62415F42222112CF4262153921C6B4245E42295321AC5112E63CD562E3143E21253424E2119715853434B358C7122F71111E5382C23F326142A61E2A598745A7248F8BE7B004008602240230140020000100111420021002847 -:80B70000318100210050124001244001148C4401000024800200F0F551242F22F233277FF1F2123AEF41C2248B11EB2357434F41E181B12262527F11F11B38FFD3F33D3D9F12721CFF3B2A37135F527315F5616115F365675F53D345F21D159F56F475751E144F43F174545F53F175655FE6D264D2556311275255F57573AFB7F7616C1F62 -:80B78000B3F3333B2F53F115176FC565814B116B2285F81C1C4F41F57C548F81D1CCF45D9E246D127FF5742FDF2FF63E261F62721EF42E343F13B11651C22B22AD285D159D1DFFD2F32D34A5F436272FA2F332317F52D155F361731F22F2E5F74F56F654F6CD25DF77F727345F74F734366F67F52D1F1F34D62546B215F214262F52525562 -:80B800005F26F73E7E1FE6E6E3F3232A385D176FE4F4766C4F23B226F31414CB11EFA5F56E4C4AF3447C7F65052F21F23377ED3D9FF1731FF71D17FFF3F11F1C5FE3F33E3E2FE3B332B2115235BF11D173F23B3ADFB2721CFF3B381F13F323355E411F14F741427F36FE63613F46F67959DFF4F4554447714F65F772723FF6F747455F6217 -:80B88000F726167F527312D152F267677F33F31A1B9FC1F11B1FBFB1F112315F71F15B5D8782CF83F32E28AFA2F21E1EEFC5F57E788F81F52C7C97812463F11F57FFD2F15D37FF73F23D17FFF3F22737BFD1F13C3E2FA3F33222A7A1FFF1F1131D7F63F33E3BFFF2721EF72B381F13F325555F14F761622F36F657E73F57F7F776DFB7F713 -:80B900004D4E65F564474F66F776726F56F741477F72F322177F537236F722277F74F61733EFF3F3313EBFB7F33B3B1CD173F15B5F6FC6F424226F22F1361EEFA2F14A58AF879778CFC2F61DB2003022B02241C812162822210214164831110028122812288002281890138001230225012180014302224822122001126081282024E144A6 -:80B9800002AFC30D2B1828A591212692212011285122009012360822002B14121C42C2212216218292144A9246803111220012106124008C1482141251422618420832258404F0D766D024F4112485F2112C87261F41724AF21124AB141D24AF249921AB9451AF443924AF1439242F147924F842914F82C4914FA2C4816FA264114FA2F46E -:80BA000098212FA26459ACE449D2A2F491242CF49124A5F29124C3F49124A3F48124EB141D24AB941D68AB9451AB9443F24A9443F24294478229FB2448984FA2F48652D0A4F41164CD521F81726CF21124C72616F44C1119F242961FC1B2489A25AF6439242F747931F84A8453B2427922F842954F82E514F926CA5E857F82F4D8242FA224 -:80BA800064592E49DE256D4A1F8DD284A468EF32A529E7361F4932489E24E7141E24AD85CCF64AB159B24AB924F44A9643F2489441A9FB2648A9F924527F9B0D00480000000044000000000000008800004001400800000000400400000000812541F1186C80D12472247224116872C01400218C031429C114214522112494448044582491 -:80BB0000004C628444422F4211E4125124208141485482801104144A118404812044024F84924826F4561B502482811212840029810290184C11084400122D14128482442241442012E2820121A084D02818A41238409424281228005048444312DC84C24840053FB2071247268506895158214C911222213668435721124161458281C152 -:80BB8000424E14A041844318143424A4B051D22443C4114662848341E4816243814438432241E14241040043C2448D22ACF444284529F1C1A2502420F2112480020000100881120010D442018182442602002A44440A809284C0821200211004802204424558481018042034243F780D22100283421868C1000000002C012D24002004107D -:80BC0000D448020000009014100221302628A02142848180014048041822002F284F02008B21412C11041F41C21A122A8145381424102811842204D084021082812622262302283018283018506812812228004CF81822460489447A2428E1849124BFF50728240045484214C4318502180018245028184422800481302820A124222A2443 -:80BC8000810226042301901823C2242981A12410084B81A4448148844781188904DF7944020036889218818311848181A2418444201132240042004C42141402002002200181222140140826088C02003842404C22228231245E42241C210428001200412E14282781374244201152260021204138882062434820151E8284010000898214 -:80BD0000021221288422008100228C4144A41C8F270520554821400241212455381820829118404148229122811A72246248244588042180014190245A8262628C21048481444230240090188418808482F186730000C0180029634100008140018B14C024400800800414442244888012011002411048441401400189014CA212008982A9 -:80BD800011F84F94301112850489410263321410781862A1901484182D1145D8622291288428A4C442269C1548602549012A6411443821264494488C128C41018445018941D848C2182A014E284393483FFF082140820280211142F422112850853011C048210000C02400214A522428418318420428804262812200C42168000020810271 -:80BE0000891104829FD709508220022A112831183052212604004044484814484448084518020000440022008504810010081004418002004D6820F2B2212081A2212991148082029A820218308481482A142402200886322821A4D048022412182848448008440022824144A01841224482160420984444AEE40018008911842241028047 -:80BE800022443446C400846082004B211004004100000000000000200141200143025084001248EF830A2D280044C04200800186262838280086220A00002440480450428449026149084004A23024184302002002101408008A023FCD0A82440041160625B4121284F5124248488C844402002400009227424428400620C124102242425A -:80BF00000420C214120020810180921482A21A02F0F117C018324C032181101818088001001004850481A110428848588430280021800448418881100800848100104804800430282F5E01482480C528228400002883582286429446622F48344280088884404202860250424542024125224828DA84A818284C828208849084608110480B -:80BF80008408F0232F20022122234208222012A21460C420048062228C0200002210048912E821021024040044820020410841000081A8424116E111E4810D84214C140600482692486048B08202308482244882862428AA18802812C828A082142A486282222A2C322260424C11042226048C02808281421424B48222F87C65C072BE34FB -:80C000002E3643524A282183B12A72128CB1C2F41216CE42A3A844882B8A43B44A5222002E16502A2283322A455842244D1444242D4244888A524E4B22C7482AA1224B18C028C01C444444418F81F18484F0883454846D58244018D22221711C285242188F28A5441AAA442D844786214E44448E828C7428F8848886A888866A892D2645B5 -:80C0800048F8882247A226A8224B9225246E2226C2822658482E88874843E14262428918389C1849922C8B212885B824BC64CC219AB6D302322532145E244F82E366D188A27216AA2227232E128BA845C8C4C51CF64462AFC232244C1AC8848992884C528C2556442694288978127212B22452444B24284524A888B014C214E08103412001 -:80C100008328E24A5144224604FA694635010000824220248128011240480480440644002100008220882108C200888008208108888008888008810000FFAA016AF524362E144F61A15526D2AAF63E6C5AF2A4648E222F2B752AF28642ED22ED4E6BCC4B2626C8642BA8850C8AF8A2A88F82B2285244AEA22D288D8C89FAA4844F48F2E40B -:80C18000C44F687AA2F222824F6AAAA88FCAA88AAAAA224B1B8F895388AAF894184B1947428F8AF8AC2C8E288F82AA884F43FFF4B48F84FE5937242F27F4367447434F63F75CFC4F66D6AAF62E7EAF85F3AC6C8E262F22F11A344556EE65F4C4C44F66762AE842E2AA5AC885DA8AB9A2FAACAE4F42A2228FAAFAAA8E2D841DA14F4AE818C2 -:80C20000F268484CE2AEF422A26F6AAAA88FCAF8A4844F4AEA42E24B73ACB4A8AAA8C7884B394F48FA8CACAAF29C38CFC8F884826F4FF9D4B4EFC6BFDB075AF514764F63F316148F21F14266AFA1F35E1C8F85D34CEC64FCF2F2AF2DFFC6C6EF2CFC4E4E6F4CFC44626FC4F44C2E6B88E55C8C8F8AFBAAA8EFA2382645F6222A6FAA7A2671 -:80C28000768AF1A4242CF8242C4F64F4A2622F22F8A4A68AA8AA8FCAEA4AEA42F234B48D2C8F8888E2C17814F4848485F82CAC8F82FB28A84F4CF8F2F44F4EFE68F8FF6E45F272426F63F336266F66F37A5A2F62F21A3A6F66F35A38CF42FE42D2EEF2EF2DFDC4C6EFACFC4E4C4F4CFC6466EFC6FC6C6E6B8AE5DC8CF8A8AAAF2AFA2EAEF8 -:80C300006F42F22422EFAAFA2E2E6D2627184F6BD241E8C2E24CFCAC662F22FAA6A6F028ACAAFAA4A42E343EB48FC3F128288AD8C87824B424F2ACA84F42FA3CB8CFC8B884FCD2D44F6FFF6CEC9FFD0D2A016B1290162002200800400644488D2490288281822800218D24691838223024302410026B829084120022842041042812448297 -:80C3800044924C22F81F4C00800181001628628180D2280181844282000000888485048110081A2222240200228440081E242A01810041288440084301A22FB1092D421F4152281F4132481F41324A1F41B24AF11124AB941B21AB9451AB944782AF7439242F147924D812F924481CF9244A5CF8264A16F1244A96E1A264594D4A9E24ACC3 -:80C40000F5D1242CF49124C5F291248B841F49B24AF89124AB141D24AB9419B24A19B54A3924AB9443B24A7924989A4F8284F9244A7F27026D4A1F41D628F4112487221D64CD121F41D62EF111648F64F89164AB345B68AB144F8AF44A9743D232E98AC4952F82D452F9245A5CD9A6EC11FA244A96E1A2E451D294CC212DD81FC5D2A2F860 -:80C480001164CF22BC91B248F89124AB861F49B24AF88124AF44F18124AB345B28AB1443BA4A31A4AB3445B84AFB2648AB942E1A2FFA0C20880400000000800200000010020000000014008400000000004480020000005012142FEB0F00504841418122C02480014964212CC4D4C12002384400248514068100201114448231880085249E -:80C50000022001890100122002C1008CB4C70E428A0121242038142944C25290188182120061450841122220020040CC22442021A1122441E042810184002248208102CC12D884A318818641F45FEC20A41C404812246821484D224925216244A014430C41C3422231141A028612140440181104C981E12582318C60431828818021E2C253 -:80C580000118281885C428CCE2A8416818CB41EFFE0C0024444110C82400249018842C09295184210043020022812140486422800141400200C100002004002002124400F0A55A4002180000901210082100400681008400440024008024818422022001802101280000004400414A13048CB4FE0C43028120F122121240C42220851122BA -:80C6000021648147221A3444278400502826180ACC61426D12282524B2162421121838243828002031210044436182002844404CF429D23024218C018023018012AA14100242E443D28284D48204004423120A4528022724442C848482028441222218808201004116C42C002634744008ED4A0000201112026901002301188001184410CD -:80C680000840180824126449818281E241820181122218120000130200000000444447842F39086542D4410260820084248400418C9418304140080000D02401940000122E1485144202008444444722448118360460824C91140048188CF13B3580240400181218218514042162122121002122211256466A18008024018C1502810028A6 -:80C70000281190184840840122840060824B12212180F1E272C011000000A112420000004508200460440045088121008902002210880184003018220000180000C08840F43D2A90544459022022911A1668448124402461A1841490422260412424D4128125880481182149C22421B012029184184684813218121614886182184528025E -:80C78000838C41F41DC1503200001608104218028074480244484008209444814014420112228384210110082200C4C02C2100000041384311024078470BC01400800118002081120220443442214242004100100480922212200220022220022220820200002828108812F8A9C6202404200200A183082504820082004B48823082418171 -:80C80000A4811008000022128002402841287284081062884438188441008200AFE8070000000080140200000000210000004400120022100420010000800200000081002884F0BED400004082040081200421B014142221288805008608128425C89824124164C0884118B01808890281001008221881814018442408CF53078284000046 -:80C880000040020080428401100442100282250A0012222812000012608200100800004400004008B03405452801002001004044040010424A0800000040024440062828004C02449028004100450800822222302420F91681904290220040E224612118122929816321828AA448484888189280080000218001493112100480614910049F -:80C9000080180444A844444004884C08EFF90A0018402201218129010018100249010018000000200100002128122002440022220000808302B0840260486FEF474258624800100200414421682196022F2824092921180218842416D8225184244B8125C3A421C48D14C830181018144804108802100C000021F0EC63008E140090122452 -:80C980005E12B09841A2112858244F440896465826921888448FC83888851818582812002C3222324CE24228638926E8C96182266C8A2042481884C3182688A22245A4888C026FFB4772422611022412002D1880B142D82431922921D12238428E92C6A88480014018427812DE860143F214226B82167482341400811A922844818128886B -:80CA0000C1830822C74140188858C88843F988F980D42C840322422311522827A4611002222F28A15C49BD42C4C429A54D860240C2122D1620C9162F217B22E441C1224943A8114CA31285149428D044322424284126B41488928C261484B224328489F85F5800008062242064814A28E12428E12428011220010012000080211822882127 -:80CA8000981482188241824901008880084C084C28C184C0840040F4E9EBE024A4112A036AA4575A45F25A4A2FACB4D2049AAC489AF2C4462F2CF8C6C68FACF8CECE2BCC8A2CB184B8840824616F2858462F41A9822F2A7982F28E96AAEA4AAA2A9AAB8A4F42A3AAF024244DA4AAA88AAA88A8A89AAA9B2AB2A4AAAA288F8AF8A4A42B888F -:80CB00004FF34BF242424F6585A12226B232B142E424542AA7286F6CB4C2FCA2E22F28B4C2F494862F2CF8D686CE82EFECF8C2C22BCCB096B984E8A851AAEF88F88E8AEFE8F912941F13FAA2A22F3AD2C292244FCEAE3A4F417738F8ACACCFC2F2282CCFC2D2CCAAAA2AD2CCD28CA88849F32C1C8F8AFAAC888F8ADA24F2AE8CCFCAFA8ECA -:80CB8000989B65246D464F41A53380A2311E124E52AFA1D1A2E941A1DC1AE324E921F9C4D62F2DF9C6968FADF1DE9E2BCC2BD41AB184598C8D8A2CD186F116126FE9F812149E212F6BF336A66FC3A323BAA7A34F43B338A2338BAB2AF22C244F4AE242AA2289728484B834F21C144BAA4B222AA2AAEFCAFAA4244B982FAC46F242424F6137 -:80CC0000A5112AC2222F25B752E521F11A1AAFA5FD52562F21F192B22F25B952FD94962F2DF9D6962F2DF9DE9ECAB452ED21B184598C8FA1D8AAF18E1AEFA9F91E1E2F41E139F2B2363F63FB12349ABBB8A7B37AF3B8A88F8BFB3C3C8FC2F22C2C8F8AA2A2AA5A8C87C8884BBBCFC1F12C28CF8AF82C284BAAEFCAFAACAECF88F823B700B0 -:80CC800000004082040000400224822492002008001810024B121002210080014110040000002008008220F8DE63A0480000002044280400208808248280040000181004182002400412000040040000320000888048F1C88FD022F41124A5F2112487241F41324A1D24AB141FC8F24A921B28AF243985AB9443F24A9543F2429547822DAD -:80CD0000954F82C4914FA2C4854FA264114FA264592ECA96D5A2EC49D2A4FC91242CFC91248D821F49B248F89124AB841F48B24AD141F24A9219B24A19B54A3934AF443924AF447924D84AF9244889F9244AFF3F026D481B61AD52174185D241B448F1112427241FC97248F691248D225B4989A243AD853AD45AA8422D956F8B54122E5AE2 -:80CD80008D954F82FC18812FA254582ED816D5B2CC254DDA1D282EDA1D44CF227D11B46CD8C1B26A7981BC6AF1812CAF66F181248B345F88F24A14B2AF4441F84AB422ADB429D44AEB22F5896F0080040000004004280000000021800188000040014008480000000044800200000000E03E0324121212211002121800008189012100506D -:80CE000084488410084024010000806321161804004008844008002200C028009F240620080041100CB0280182850624181841520000001014021210021210020020811204A021C014241282008C014114819D7200420010044118F01428604A64842418184118102C341A60884014262111110289012344424804120081418C22721804B8 -:80CE800021880040420483F1D7E8402281211102218420010084608124004800000000000000001A82210100284100120020012260816082004FC60B2110020080028001002100102A08400428000084C092908428452251221221128988022800A04100448002004CA242ABAB003D144022E8218221D18401202301D0C228011E4461436B -:80CF0000210140441244084C1318C21826C284A24064428A2182014942242102002812001241890281CF5107505200213229A1218100181800C908A04188800110046181F01824200943088E2421251424282129424404220000188002608240F8C82A106221008800301480210250228041125C4249014120020000A4701288B286021246 -:80CF8000241E2212288180222201800522440012413024624FCE4D0241003028105282C98101800183111428281284840141008141B0220100841800121220180438852402109818808121C228892881F1E386000000290100508400430290822C01442A18423418428212008400002E1800DE2422504800004400002841000028414CF13F -:80D0000059BA00212869010000000084122180023012000044002C03801AD282420200C0242302128400200100004508430100AE544012249212903A0084C98101D04881218168238226343440040012813881294302A13212C0343812E190148422842001812841184508369888160487EF10024004400221100800248425440890824884 -:80D0800018844614044014022A082210028830242888001280020016088021422402413F290216028001186021901600602122004042042100000000213220129224223800002222222042084428801204220026F4C3150045025082444140082D8800401C968884290821444006602140220140823828002012341C49020012204124010B -:80D1000083412403121820F162DC00835122812901218100008800001024480412004100000028004044248181120441000000100400209214F09C940000008416120484403822414018C41C80810800242430120090224410044002001A62413014200183011220113C38222042F8475A2464401A04400844608800848081180661304418 -:80D180004100414184240040820100281850480092448C12484C0420528428002081F1423700808111542200602850428800240000000000000010842802264408228400222822200220810228800212C0246F83048001800826C41216A212128A218161610024002188604800214118126B1812208821812161482E84282008000010047A -:80D200000000902884841FD50B6182001240024488444018082021412409182028182281010021802128210230121218008002001024024004404971340340A4418445C21C1844404CE2E841D224028C410A18909430869012908C1002006711902225189642808A08169484126041E0810212608120014429025F5F4F42B29CD128311890 -:80D28000478845D24C931C259812C5AA118592188C024B88CC318282881A088810D22CC112E0210112222A3A242B21442F41A32AEF42E142A2324D244B224C22932812C528213234262831243238CF11F13824EF3F092D14231852C21E1216480245E4A9AA88A421165E2284851844D44421D844A4814728255224235184005062411672CE -:80D3000082586428D042A1A9431824893114204128C114434138144782838172144841F84383104426C11225D44A311227612C514C29B18AA8B8414D14AF41D122711AD224F112826D14214544844844341216127292A63296B682A1212A313C2212F0181816A4128E842A91282A11CC144138288D344C8203222E2849F1A44C00618421AC -:80D38000104418A42141126089441264122041244124480444002901189092800118908484419084124184400840040081400485741C0FF014148D18C57C98F8181C8FA353AAAFA3D2AAF8928225F89A8AA1EFA1F28E9EEFC8183E12884B89CED48AD964F8868464AB11CFE1D12251226F68F922226F629382AEB2F02236214F49EF8AA851 -:80D400009B1E343AA2114F41A1318D188D188FC1A1114F41F138188F837218F81C1C3AF12C2C2A322C5FE507245E56AD1A4FE1759E78187C1AFE2E2EEFC2F2888E6F68B882F8A2A2E5548ACFC8F88C8CE518B684F884824F4CED28F996946F48F88696AB11CFC11852226F68F823216F42DA12E2A8BA24F2666A2B221AE7C3F2BCBC1AF253 -:80D48000A424BA6B411E248F83F3383CCF81B114A3328F82F13C384F43F334343E12A782267836FCA26D242F21D14654A8EFC161C11E1ECFC2D2AAF11A12EF6AFB929629F11ABAAD12EFA1D1AAF19A98ED182F41F182944B992F44B484D864B982C886EB11EFE1B11261216F696913BE122BABBEB81AF212762F23F23436C7C2BAEB41F195 -:80D5000084349AFB14141E343AB318D3C8A1114F43A3134F41F13C1CCFC1A133EFC2A222CB129D6BF014161E56AFA1F15C16E7C187E1A5FC3634CFC1F1B8BE9E962F21F91ABAEF61F1161C4FE1F19C9CEF81F114146F49B996F9C6C445F284962F28F81686EF21F19E1E2F21B112F194964F73F3B6B63B3BBAFB14146F63F736364F6FF3AF -:80D58000389CCFCBAB334F49F394B43E348F81F33838CF81F31C1C4F43F134344FC3F13438CFC3D1CCA132EFC2F31C1EC7C2EF8C0B490121901280014182240000004022081244821042140200430200610090122002222002000040C8248002002F3902200100C425421408A1801814528400444100100400184002800228242880021E6A -:80D60000244004441890184301221884181608221845F868A8D026F41124A5F21124E3F41124E3D441B24ED141B24AB981B24A19F54A9443F24A97478A2F147924D852F924485CF9244A5CF8244A16F5244A96F1224A96C54A9E246D4A1F49C2421F4952281F49324C1F49324E1F48B24ED141B24A9921AB9455B84A3924AB9443B24A79C6 -:80D680002498924F8294984FA2F48A57D0A6B411D626F41128E3B41132461781E33411AF44F89124AB241781AF642A7B4877B4681436F84285278A2D152E5A5CE9A2FC18852E4886F5265A549CCD256DDA1D2CACFD8164CD521B214B841FC1B24EF81124EB841D242F44D9C1B242DB85B24A29F24A9443B24A3924AD942B42AD944F22F598 -:80D700006775508282480000000000280000000021800100000014000058000000000028000000002541F1F97800004440088C2112042088018381418C010040388400001820C194124400003024200118000000400420411814FCB69140A418862201120000008110028420280484184440841108008002384218249800122604002800B6 -:80D780002002101804481681B2490344C2881880018981421404838A11628181800824813014824308840030114B2110084230822022C1348011842202000084406284453118FFA305204142048400000000001845888104804148041200180082181E244812200144000000002002411084011843F2118800000000280000001800802101 -:80D8000001000000002001001218001200000021000000000000F0F72400121012280120614112001604121816068001120080810100840000002081220112000000414004811248009E1C00122410280122121604004301201114228101000000000000800100200280410200000044001800F08374000000000080010018128081010044 -:80D88000182001121200128100120020210112000000004400400848004FD40B004100000000200180019012000041000000124400180041001800000000400800800181849FAC0400008400400812000000200480014004001800842901210020010040080016080081184004440077BE000041302210280100001240880130182001008B -:80D90000200112004220042001002418000010080040080042F0533D00004184221028010012001884A0410020414404001880111C0200408401183012810000841018088420410481C72600100424001008180080012011028921010000188001204522058001000000008901002001410083048EF20000000012180000800100000000BA -:80D9800000008001001800000080010000000000000000DFD20B00000000202101180018802181010000000000002001002021010000000000000000D0CC0A0000000018180000002001000020010000000012000018120000000000000000007FC30620040000120043012A01121200181824001AA11192008001118011084200001800BD -:80DA0000100422000000400220D1F80C00000000008001120000000000000000000018002001000000000000000000D0DA01818C24840400004014C42422281200005022102281298808804111414118C84842482001004014C4242228000000250229F139C2400848000018004084810220010000218001880000402101841848800100A9 -:80DA8000004004280000000021F0D426000000008001180000000000001A010000000000001800000000000000000000F02995000000000000000000000000000000000000008001200100000000000000006F220381814242000018801194142A210212000024241A0112828200001113018181524200180000414122220000002424F07F -:80DB0000CD3C404888840400000044442828000000109212181A81880800C01114404888842401000040448482020000002121EFC90B000000000000001800800100000000000000000000180000000000000000005F110E000000800100180000000000000000000000180000000000000000000000006F430F000000800180011A8101C7 -:80DB8000120000000000000000000018122021210100000000000000001FA30C0000000012001A0180010000000000000000121A8101001A818181010000000000000000FF7707000000208101120012001A0118000000000080010012001800000000000000000000F0A1C4702612A2122B119012C0122582E8317111A1988659888E418B -:80DC00004E48D09114815489814A744854444AE242024C02284514A4326722212AB112A1812B99C0922582E8317111A1889659888AE484048C04488518A8445BD4F02222241812122180512229C8111B1119E88919D818242444591148848588E44414942422224480425444282F22428221A181232888512229C8111B1119E8881898484D -:80DC800042428480445888487BFA000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000009A -:80DD0000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000045 -:80DD80000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000C5 -:80DE000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000044 -:80DE8000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000C4 -:80DF00000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000043 -:80DF800000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000C3 -:80E00000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000042 -:80E080000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000C2 -:80E1000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000041 -:80E18000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40FC1 -:80E200000000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FF33 -:80E28000E40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000000000000000000BF -:80E3000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000000000000003F -:80E38000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000000000000000000BF -:80E400000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000000000000003E -:80E4800000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000BE -:80E50000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000003D -:80E580000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000BD -:80E6000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000003C -:80E68000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000BC -:80E700000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000003B -:80E7800000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000BB -:80E80000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000003A -:80E880000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000BA -:80E9000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000039 -:80E98000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00B9 -:80EA00000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04F36 -:80EA8000FE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F7 -:80EB0000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000000000000037 -:80EB80000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000000000B7 -:80EC000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000036 -:80EC8000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000200100000000200180010012800100002040 -:80ED0000810100000000000000000000EA0C000000002001000000008001000000000000001800000000000000000000009ED5000000000000000000000000000000000000001800000000000000000000E0260A000000000000000000000080010000000000000000000000000000000000ADF2000000000000000000000000000018800E -:80ED8000010000000000000000000000000000EFF5020000000000000000000000000000000000000000000000000000000000F04FFE00000000000000008400000000000044002001000000000000000000000000F099C42400000000000000002001000000000000000000000000200100000000188001F09F2A0000000000000000847D -:80EE000000000000000044000000000000000000000000200118001D381002000000000000002001000000000000200100000000001200000000000000FF3E02240000000000000000840000000000000080051880010000000000200100121810084D490012000020011212200140480212121624010041008081810180011890181838A6 -:80EE8000181604002200802201008400F0F29200120000008081011800002588014C810100410080212101521212121883013212000000000000128440083F280A10020000120000001008001200000000000000000020013014002002001A8201001200F09C2B004002008C110800008001000000121210080000000080010000188800C0 -:80EF000000000000200180F16422000000288001301400001800001002120010040080018C0100121800008001120000000000186F77060010088100008400100800180000000040051800000000000000000000000000002FE9090050820018180081006081002001000040084151200100001880010080081820010000001200F074B59D -:80EF80000000008C12480880010020010000800100000000122001008001200100000000000000F0C343000040180810084410480800008001000000848081210100000012000000000018180000002FF5080000100400001280410480911818008504008911881148088112000012000000000000000000008DBB000000000000188001C5 -:80F00000808101002001000000200112000000000000000000000000F0C3EF00004100810041001880010020010018181048040081000000840000400800840000180000188F810800008400800100000000000000000000000000000018008001000000000000142FF80B440044404C0481C4000000000044000020110410120880410889 -:80F080000000120000000012608100404808EB530084000000000018004004490184004014088C411868819018000000400800000000810081008001EE7F000000100840280184000000000000402401000000808101000018800100001220011800F071E34018C4480000410040042812000020012180218108000014818184800400182C -:80F100008400400C280000000021815FE40144814004C5440450CC4418811A2101A0118112180018C01812C11824878183011A2101800180210100400881901818181E180084948417AE0044810010088901180000301480816181504800D048E1C111088041088100800180410889810100000000001818CF650E0010548884844484000A -:80F18000121E18844C0100430141200141400884858841B818410820018130180018000000203118001800F08765000000000000200143014170140847815084508400008001188100008110088110088110088100844008001F840B455444C50CC54C5844C5FC1C1C85A8111885D8CC91144554444D148C51CCC7C1C55C84E55CCC41859C -:80F200005C884554282781852851881A01128F815188850884848F81A1118484850885F818181A7118F8181885A81185F8181885F8C776004F4454CC48C55C8850CCCFC151884F41018F8353CC4B2100457414DC88C112655484AD1885B88458C88F8158CC857A1A781989D198F11818A0451A815488878184848F81F118184FC141F8285F -:80F280002C8588A2118F81A1111A011E12A5A811AD18BDB950444D44C55C44C55CCCC55CCCCFC1514C1E14188B3149C1140018CD1484126185C418D08C78185CCC4544F21A188D198351881E18A0411A01F0181810A8118F814114885288001AF118181A018F8111F218188D18FF6605D04454CC4744C55CCC8558CCCFC151CC1E14B0182D -:80F3000093143E1450444D148B111E18CFC11156688445D48C78187C9C54CC857A1A7818A9119F81E181011AA4118784852801818F81A1111E1481CD2820F218188F81A1118F81018F8111E2215188DFE30300000040088420011244400444124440048504810010880118008001400800120000002011080000AF4606820010084008003C -:80F38000008400001800000050481800810000200100800100180000121800100840718F042CF4112485F2112483F41124A3D441B24AD141B24AB911B24A3915AB9443F34A9143F3429147832D914F83C4914FA2C4814FA264114FA264192E5A96C55A9E24ACF591242CF4912485F291248B141F49324A1F48B24AD141B24A9921AB9451D7 -:80F40000AB9443B24A39242B94478229F92448984FA2D413024D4A1B614D421F81324C1B21E3F41128EB141B21AF44F81124ABA45B21AB8443F34A8143F34A8143D31AB836D41AF824521CF924CA1E812E4A87582A65582D5B8F58C2521FC8C25A1F49C6421FC8B248F1912423F4912C2B141FC1F242841D2C2BB45D282B9447822B944709 -:80F48000822B94478329F83648A9F924525F1F0E8480040000004004280000000021008008000014008480040000004004280000000021D05D08000000402801100800000000000000401208121200000000000000800100000000F086CB008240020000400816080010880100000000000000001200800100002001800100004001DFB733 -:80F5000007200410021008100C22000000400220018200240013210181200400120000412083010000400220F1559600000000800140981800008418000000000084000000120000000000002001000000E06D051800000084400800000000008400000083010000400218000084200112006081000000006F120800400880011200800107 -:80F5800000800141001200448C0100610018000080810100810010080081000000ABF900008100100800800100200100200110C4186081240000000020210181901800100883018100000047A88001000018204108000000004410080000001004800110820100000080010000000000B094090010080082004008188001000000830140D6 -:80F60000080000008001A0121200002001180000828022028071B7060085220140080041000081000000200120010000400800000044004018880290112005008081F125280000000082840000001008000000000000000000000018000000001001400800004E2600103818008140084008188011080000000016080000400818001A020A -:80F68000100400001200005800228001FF790A0024000000000000840000004008000000000000001812000089410800122018280200E0AE04120000160884000084008400000000001004000000000000000000000081120000006F570C000000810000000000000000008C0100000000000000000000120000000000221F1908000000BE -:80F70000000000008381110800000000000000000000000000000000804108221200F06CBD608110088400000000008001000020810100000040080000000018100800000012002200AF2A07820000008001840000000000000000000020010000000000000000000000002E112F880A8400000000008001000000000081840000008400F4 -:80F780002001000000801188810212000000009FB70B004008814008000000810018000000000000000000000000008001000012000000AF690240180881100884000000121200000000000000101808000000000084840018C01880010000CF3809848044080000004480C218000000100289018800004001400848000000004C818202F4 -:80F800001200000029017FFA0520088548480884000000E081410800008011084004000000000000000018182200102801281228141AF2C1AD00848110981881811810080085081A0100000040080000205188000000002001852881010018A0110000F0983AA011400800841008008C011A1108800100008489010000508800200100006B -:80F880000000852801181A61818901008021F295A7004008844008000000840000000000000000000000000000000000001220410100709F0D1A0110281848088F810185081E141AB118A11118A0110000508885080000E0815188001A01000000F018188508A011D088D1880100A011226F54031AA144858844184818F8181850CCE0434A -:80F90000A3118F81A3111A011A012421901285F8888880080015F11818855988E0850548000000CFC151882E34A011128D188D18124012A2112B328F7F011A810481818185088F8101850C1A038B111E181A011A01100218848D88000040F118188548081A05000000F0181C85A821A011188D188D181800211AA1323FED061A81548887CB -:80F98000848788818518F8181850C8B014038F83E181A111A01100212450888D88200800148F81518984B01805420000001E1C85B814031AA111188D181A4101211E122AF2BB4A8001004008840000200116080000000000000000000000000000400800126081000000AFA70B00810000000000800100000000400800001008000000001E -:80FA0000000012180000000000F06D37C0421F4152281FC132481FC1B24AD1C1B24AD141B24A9921AB9455B84A7924F84A9147822F147924D812F924481CF9244A1CF8244A16F1244A96E5A26459ACE449C24A1F49C2421F4952281F4932481F49324A1F49B24AD141B24A9921AB9451AB9443B34A39342B94478329FB2448B84FA2F46651 -:80FA800081C04A1F41C6421FC122D4C1B242F1112CA3D4C1F242941FC1B24AFB15282B8447822F147934F8429147822D916F82D412F9245A1CF924CA1E812E4A96E5A26459BCE459C25A1FC9C24A1F48D628F5912483F49124A3F49124AB141F41F24A841D24ABB45B21AB8443B34A38342B84478129FA164829FA245ABF6E0C2088040066 -:80FB000000000080020000001002188008000014008480040000004004000000005012F0782400000012811008818181000000000000000000000000000000000000008001250800F0A6B60082008400000080010084810000000084000000000000800338000000000000186011F035E600C20084180081101CA812004008002400122019 -:80FB800008000011008120040028800210042200001850822C011621F19EC9000000100800008100008400000000810000000000002001120000000000000000FFB304000000000000000000000000000000400800180000000000000000000000F0D3E50000000020080083014008200100120000000000002001000020010000002001A8 -:80FC0000008100FBCF000000000000901800810018000000000000840000120000001800000000000000F0D8640000000080080000000000001200000000000012000000000000000018001008F0152E000000C01800000000000000000000000000000000004400200118001001000080F1F6980050280000200180010000000000000090 -:80FC80000000A0121200000000001800000000000080F15147000081100800280000000000000000000000000000000000000000408101002002973600404A08608120210200000000000000000000A0210000000044000020010000000000578C000000840000200100000000000000000000180000000000121800000012000028F02BB2 -:80FD0000AD000040080000000000840000000000000000000000000000000000000000003FF4070000000000000000000000000000000000000000000000000000000000F04FFE000000000000100800000000000000000000000000000000000000000000F0CD5A00810000000000000000000000000000000000000000000000000000E3 -:80FD80000000188FD90A000000000000810000000000000000000000000000000000000000000000DFAC05000000000000100800000000000000000000000000000000000000000000BB74000000000000000000000000000000000000000000000000000000000000FFE40F82820000810000008400000000000000000000000000000026 -:80FE00000000000000000070D70C84800400000040042800000000218001880000400140084800000000448002008001002901AB1A008200008100005088840000000000000000000000000000000000000000000018BF63022008000000000000000000000000000000000000000000000000000000002F330C10084008000000100840A1 -:80FE800008000000000000000000000000000000000080010018F0C46B000000000000000000000000000000000000000000000000000000000000FFE40F0000885088000050888508000000000000000000000000000000000000001A4101A011F04B84004A04480085080045048FC252882800004012022B11A0988008001501148508F9 -:80FF00004E48800400005044E042022800A0114012A2112971A40680040050880040048D28810000001002188008000014008480040000004004280000A01100211A81B1630C800442885088004004CD288528020000104282011A08820040011184904820040000400449022200A0111410E221014FD402000000000000400800000000A0 -:80FF80000000000000000000000000000000000000006FBA030000000000000000000000000000000000000000000000000000000000F04FFEC0421F4152281F4132481FC1324A1D24AB141D24AB9419B24A19B54A3924AF147924F8429147822D914F82C4914FA2C4814FA264114FA264192E4A96C54A9E24ACF491242CF4912485F29189 +:800880009F9CFCC9C9CFC1F11C1C000048180000000000000000000000000000000000000000000000000000002F8D02000000000000000000000000000000140000000000000080020000000000F0DBD7000000000000000000000000000000000000000000000000000000000000FFE40F00808401000000000000000000000000140015 +:80090000000000000000800200000000007046010000000000000000000000000000000000000000000000000000000000F04FFE800200400100800414800280041480020000800280040000214840010080041400108204000021BF26050000000000000000000000000000000000000000000000000000000000F04FFE000000000000E4 +:80098000000000000000000000000000000000000000000000000000FFE40F481800280000000021000000210014001002400100000080020000882880080088280000F0D136000048180000001200000000000000200100001400000014000000148002000000002F49054818148002800414182810820416012810A21140012810A241E3 +:800A00004001002B11484001280048408188022148008828108204F05C65808401800200000010020000100240010021001400000000280000808802000088280000F04EFE000000000000000000000000000000000000000000000000000000000000FFE40F000028000000000000000000140000000000000000000000000000000000E8 +:800A8000F017D400000000000000210000400200004022018001000000800200008200000082220000F0F9BC000000000000000000000000000000000000000000000000000020080000F0CEBE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000F1 +:800B00000000000020020000EF1C04000000000000000000000000000000000000002002000000000000000000EFBC0E000000000000000000400200110020010000000000000000000000000000007B69000020020000000000000000000000000000000000000080080000000000005F8A0E00000000000010020000000000400200120A +:800B80000000000000000000000000000000CFD90F000000000024000000000000000000000000000000000000000000200800F07F8C200100381002001800000024001200000000000000400100000000000000000000D04F0E00001224000012000000100200000000000000001400000000000000000000006F9B0C1800200200001002 +:800C000002000000200100000000000000000000000000000000880000AF3C0D000000000000000014004200000000000000000000002002000000000000004FEF0D0000000000000000000000000000000000000000000000000000000000F04FFE800100000000000000000000000000000000000000000000000000000000E027080041 +:800C800000004800000000000000000000000000000000000000000000000000004F160D0000004800000000000000000000000000000000000000000000000000004F160D1800000000000000000000000000000000000000000000000000000000007E82000000000000000000000000000000000000000000000000000000000000FF69 +:800D0000E40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000020020000000000000000000000000000000000000000000000F2 +:800D800042002F3F0B0042000000000000000000000000000000000000000000000000000000007F7E05002200000000000000000000000000000000000000000000000000000000BFA90A002200008002000000000000000000000000000000000000000000000048006F770D000000000000000000000000000000000000000000000081 +:800E0000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000014 +:800E80000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000094 +:800F00000000000000000000004001EFE10300480000000000280000000021800188000040010080040000000080020000110021F01338000000000000000000000000000000000000000000000000000000400140013FE10A000000000000000000000000000000000000000000000000000000004001EFE103000000000000000000004F +:800F800000000000000000000000000000000000000000F04FFE00002008480000000000000000000000000000000000000000000000000000FF53030000004AA44400000000000000000000000000000000000000000000001400007FEF0DA0448024084AA44400002A022800004012022B11A098800800150114004A0448000000002ADE +:801000000228000011242110F2368900480000000000280000000021800188000040010080040000000080020000001002D0FB06800442000000002820020000104282011A088200400111004820040000008002220000002124D02E0A0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000F6 +:801080000000000000000000000000000000000000000000000000FFE40F481B21B01122B411324219B24291212B9419B24219B14229F24291222F1429D212A9421CE922C4812E4216E12264192E4296C1429AC2421B292CB49142B29122B49132421B282394212B8419B24218B14228B24228B2422892822A84E822B42C01481B61481B38 +:8011000021421B212119B64291212B9419B2429B212B94222F1429F24291222D912B422D912E521CE922EC11E82264192E4296C1439E212CB491C2421B692CB49122B49132421B282394212B8419B2429A212B84222B84222B842229B82294822E421F690B2088040000000080020000001002188008000014000048000000000028000089 +:8011800000002501E3060000000000000000000000000000000000000000000000000000000000F04FFE00822008000000000000000000000000000000000000000000000000110040015FBA0B200C0000000020020000002400122008000011000042000000000022000000400214B0F2030020080000000000000000000000000000003F +:80120000000000000000000000140000E097070000000000000000000000000000000000000000000000000000000000F04FFE00280000000000000000000000000000000000000000000000000000002200CF110C20020000000000000000000000000000000000000000000000000000000017110000000000000000000000000000001F +:80128000000000000000000000000000002002F0489E00000000000000001001000000000000001200000000000000000000000000FFBE030000000000000000000000000000000000000000000000000000000000F04FFE000000000080040000000000000000000000000000000000000000000000F09538000000000000000040010054 +:8013000000000000000000000000000000000000000000F0DAC6000000000020040000000000000000000012000000000000000000000000005ECF000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000004B +:8013800000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000008F +:80140000000000000000000000000000000000000000000000000000FFE40F20080000000000000000000000000000000000000000000000000000001470630300488008000000800200000010021880080000140000480000000000280000100110023F2606200820080000000000000000000000000000000000000000000000000040C2 +:80148000018F730E20080000000000000000000000000000000000000000000000000040014001EF36090000000000000000000000000000000000000000000000000000000000F04FFE000020080000000000000000000000000000000000000000000000000000F0141A0000000000000000000000000000000000000000000000000080 +:801500000000000000FFE40FA0448084080000002A022800004012022B11A098800800150114004A0448000000002A02280000401202219F2F0480040000000080020000001002188008000014000048000000000028000000002100BD6F00482004000000800222000000212418A0812008001410018004420000000028200200001042C4 +:8015800002EDA2000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE80B411021B21421B212394212B1419B24299212B94112B94222F1429F24291222D912AC4912E421CE82264112E4296E12264192CA4292CB491C2421BF1 +:8016000029241B29421B2923B481324219B24298212B84112B84222B84222B842229A842882E42CB1280B41186B41122B411324219B24291212B9419B2429B212B94222F1429F24291222D912B422D912E521CE922EC11E82264192E4296C1439E212CB491C2421B692CB49122B49132421B282394212B8419B2429A212B84222B84222BBF +:80168000842229B82294822E425F26082088040000000080020000001002188008000014000048000000000028000000002541B1AF0C0000000000000000000000000000000000000000000000000000000000F04FFE802208008882000000000000000000000000000000000000000000001001004001DFC70528C20000000000220000FE +:8017000000400220018200001001002004000000002002001001400214708C09000080880800000000000000000000000000000000000000000000000000F0A7F8000000000000000000000000000000000000000000000000000000000000FFE40F0000000000180000000000000000000000000000000000000000000000008FFF060084 +:801780000000000012000000000000000000000000000000000000000000000000EF89080000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000140000200400000000000000000000000000000080F2BB490000000000000000000000000000000000000000000000000000000000006C +:80180000FFE40F000000000000000000004200000000000000000000000000000000000000FFE10D000000000000000000400100004800000000000000000000000000000000222FBB05000000000000000000004200000000000000000000000000000000000000FFE10D000000000000000000000000000000000000000000000000007E +:8018800000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000008A +:80190000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000000000000000000000000001414FFED0F0048000000000028000000002180018800004001FD +:8019800000800400000000800200000010022FD40F000000000000000000000000000000000000000000000000000000004001EFE103000000000000000000000000000000000000000000000000000000004001EFE1030000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000058 +:801A00000000000000000000000000000000000000FFE40F000082000000000000000000000000000000000000000000000000400100F0198A004A044888000000A022800200002421B012018A09880050114001A0448004000000A02280020040411202214F2F0D80040000000080020000001002188008000014000048000000000028CE +:801A8000000000002100BD6F00482004000000800222000000212418A081200800141001800442000000002820020000104202EDA2000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE80B411021B21421B212394212B1484 +:801B000019B24299212B94112B94222F1429F24291222D912AC4912E421CE82264112E4296E12264192CA4292CB491C2421B29241B29421B2923B481324219B24298212B84112B84222B84222B842229A842882E42CB1280B41186B41122B411324219B24291212B9419B2429B212B94222F1429F24291222D912B422D912E521CE922EC9D +:801B800011E82264192E4296C1439E212CB491C2421B692CB49122B49132421B282394212B8419B2429A212B84222B84222B842229B82294822E425F26088282480000000000280000000021800188000040010080040000000080020000005012F08E81000000000000000000000000000000000000000000000000000000000000FFE4FB +:801C00000F208801200800000000000000000000000000000000000000000000000010C121F0DD8200C20000000000220000004002200182000010010020040000000020020000002440012B3F0080018008000000000000000000000000000000000000000000000000408102BF6A0400000000000000000000000000000000000000005B +:801C8000000000000000000000F04FFE00180000000000000000000000000000002002400100000000000000A028142820024E1C0000000000000000000000000000000000004001000000000000002048810200FE820012000000000000000000000000000000200200000000000000000028002002AB3F0014000000200800000000004C +:801D0000000000000000000000000000000000000000001F2503180000000000004001000000000000000000000000000000200200000000005F840E0000000000000000000000000000000000000000000000000000000000F04FFE80110100000082000000000000000000000000000000000000000000000000F06E770000000000008A +:801D8000004001000000000000000000000000000000000000000000F0E3FF000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000AF +:801E00000000000000000000000000000000000000000000002002000000008F9C090000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000022F0443E000000000000000000000000000000000000000000000000800200000000F0689CC5 +:801E8000008A01000000000000000000000000000000000000000000000028000000C021F043210080048200000000280000000021800188000040010080040000000080020000142012023F910E2008800800000000000000000000000000000000000000000000000014206212F0126900820000000000000000000000000000000000F0 +:801F0000000000000000A0220000004001FF360A200100000000000000000000000000000000000000000000000000000028F0E14B000000000000000000000000000000000000000000000000000000000000FFE40FA01100000000000000000000000000000000000000000000000000001480A222F0CCF3005A0548000000002A022815 +:801F800000004012022B11A098800800150114004A0448000000002A0228000040120221CF8804A05100000000002800000000218001880000400100800400000000800200000090222A025F280FA0512004000000800222000000212418A081200800141001800442000000002820020010012124F05A3700000000000000000000000044 +:80200000000000000000000000000000000000000000FFE40F820000000000000000000000000000000000000000000000000000000000FFFA07481B21B01122B411324219B24291212B9419B24219B14229F24291222F1429D212A9421CE922C4812E4216E12264192E4296C1429AC2421B292CB49142B29122B49132421B282394212BF6 +:802080008419B24218B14228B24228B2422892822A84EA22F42DDA809461581B21421B212394212B1419B24299212BB419B24229F24291222F1429D212B922D412E922C5912EC21E812E4296E12264193CE419C2421B292CB491C6421B29421B2923B481324219B24298212BA4112BA4222B84222B842229984229E822D4270D00480000E4 +:8021000000000028000000002180018800004001200248000000000028000000002501EB5920080000000000000000000000002400000000000000000000000000000000EFFC0120082008002200000080020000480000002002000000008001000000008800001114F0D9DF004200880000002002000000240012200800201201002004C3 +:80218000000000002002282008002440013BB7000000002002000000280000200400100200000000000018000000000000001400EF660D8002288082010000000000002800000000000000000022000000000000000000F0A9FF000000000000000000000000000000000000220000000000000000002004006F3C0A000000180000000066 +:802200000000000000000000000022008002000000000000000000B7930028800228000000000000002200000000000000000000000000000000004200F0F1F9000000000000200200220000000000000000000000002002220000140028004800F065AB00000000000020020000000080010000000000000000000000220000000000F09F +:802280009D8B000000000000000000A0120000000000000000000000000000000000000000FC050000000000000000222003000000000000000000000028800200400180020000F012BF000000000000000000000000000000000000000000000000000000004200F04BCE00000020010000000000000000000000000012000020010000F1 +:80230000000000000000286F640720022022012002200200000028008002000028000020010000120000000000002004007A05008002288002000000000000000000000000000000000000000000000000005F34030000000000000000000000000000000000000000000000000000000000F04FFE000020080022000000280028008002EF +:802380000000000000200100001200000000002222200442147D9D80010000120000008002000000000000000000000000000000000000000000B02B0E2822280000228082220200002820022820020028222822000000000000000000000000800442BA0312000012000000282828000000000022000000000000000000000000000000B1 +:802400000022BFBE06004800000000002800002800902280018800004001008004800100000028000028003042F0CB9E002800008002288002000022002002000022200200800100001A010000000000222800484681F696288001008021010000000000280080020000000000A0110000A0110000000000000000F08AE2A02122282222A4 +:802480003218222A02282222A0222200222A0220A2222002208222020000000000000000000020024A044822FBA4000080022800220000008002002800000000000000000000000000000000004220D4BF0A2AA2222A022222122A2202A02200002A0228A02228A0222AA222002AA2222A0200121200001A8101000000000022800420746A +:80250000EF083AA266A0622232122A02A0222A820228A02200E02212022B332AA2BAA0A22AA2222A521140A1111AA14480041A010000A0228002A022224012022B227FCB0A1AA1622A0228183A022AA2222AA2222800A0222AA2222AA2222B222A82A1222A0AA0222AA22214001AA1114800A01100000028000020024AB442A4444AF41C24 +:80258000D2A0232A066A82A2113A02282AA2222A0220022AA222222AA22223E22282A1223A0AAAA2222A021410A1111A810442A011000000282002A0222220B442E424A462CFA2041800008001000000000000280080020028800200000000000000000000000000F01DE82002000000002200002200000000000000000000000000000018 +:80260000000000000000149F310B481B21221B21621B212396212B1419B24299212B94112B94222F1429F24291222D912AC4912E421CE82264112E4296E12264192CA4292CB491C2421B29241B29421B2923B481324219B24298212B84112B84222B84222B842229A842882E428F2508481B6148132134112314B16211B14299212B9619A6 +:80268000B24229F242B1F042B1222D9129D412EB22C5912EC21EA12E4296E12264193CE419C2421B282CB591C6421B29421B282B141B282394212B8419B2429A212B84222B84B0422AB24238222B8426F2D72900800400000000800200000010021880080000140000480000000000280048000010022DCD00180000000000000000000081 +:802700002002000000000000000000000000000022000022479E0000000020210112290100220028000000424082010020022480822102000000000000004001AF9D07200500000000303280022800222400322088043012100120024200200200002002000028400280F2D15D000000008021011200000000000000000000000010828220 +:80278000010000000000000000008F4E0E0000000000000000000042000000000022800100000000000000000000004A82F4A14600000080010000400220020014180000221200420000184002001800000000002848280000BF490F0000001800000024000000480000202201000000180021001800000000000028002A84F4F39600004E +:802800000000000000002002001118000000004828200100000000000000002082040000BD3D001800120000480032000028000020210448000000004242000000000022000000002002BF5C030000000088002828002200002228200100000000000042000000002002000000004870B80C18000000A028000000008200000000000000F6 +:80288000000000800200002002000000280020F8AF9600000000004880820120022A080028004280040000000000800200008002000000280020B8BC0518120018002002000000000028000000000000004800000000000000000000A024F02CC200820000000018008001000000800100000020010000122800000000000022000000BB13 +:802900002900000000000000200200000000000000000000004280020000000000000000F083E200828002282228800200200220020000000000220000000000A0240000000000000048009E6900120000120000002800000000001800000020820280828402002880022800200200220020D23C0818800180010000000000002004000068 +:80298000422001120000222082040020028082040028004828001425038001000000000000000000480000002002000020022220020022220000280080020028DF2C080000200200280080020000000000000000000000482002000000002800000000D0E10620080020010000120000000000000000008002000000188002200200002056 +:802A000002002200BF2F0E82802402000000002800000000218021812806002214000048002002000080020080048014029A0A20080000002812000000280048000080042002000000A014000000000022002842420014D05E01A01800800200008001000000008001182002008002002220021280022222220080022280022280F24B8E8F +:802A8000202121A12220A33122200200A0230000004800008024812221A2122880828282A6222AA2622228282828420022220022224A0422AF150A000082180000000000000000000000000000220000000000000000000000007FCA0F9AA1113A03A0A2002A02001A0100A0222A024A04200118A0661A013A8302002AA222A022A0110088 +:802B00002AA222004A04282AA2222AA2226AA6662A02F04488A0115AA53348A0232AA2222A02001A0328002AA22240120229018AA8446AAE11A0331D21E012A2222AA2622AA262283AA3222A022A8282A26480A2222AA2222A026E622B22B022F28BC2A0111A0500882AA22200001A030000004A14021880086AA611A0112E2100A0222AB9 +:802B8000A6222AA2221A81022AA2222AA2224A06A0222AA222A0662AB222022A9291A0191AA5114282183AA32200001A0122000000212400884AA46E1A011AE1120211002AA2226A82A2332AA2222AA222A0224A0422A0222A022AA2222B22242AF2634A000082000000000000000000000000000000000000200200220000800200000033 +:802C0000FD6500120000000000000000000000000000200200222002800220020000002800800260122F250F481B21B01122B411324219B242B111B24299212B9413B14229F24291222F1429D212A9421CE922C4812E4216E12264192E4296C1429AC2521B292CB49142B291A2141B2923B481364219B24298212B84112B84222B84222BAA +:802C8000842229A842882E42DFCB0B481B612A341162112B16112B1613B142B911B2423A112BA4222F1429F24291222F1439222D912E521CE922EC15682286C1529E213CE519E22235912CB49146B281A6141B292B141B282394212B8419B2429A212B84222B842229AA422B842392A22E42FB410082480000A200008002000014002100B3 +:802D000080080000140000000000000080020000280021F078420000223200208101120020141418A44200840000001A0218A0142001220000604400008880014088040028AF6307388A01814440341243089042E08104208105400C6830484008261204222200000080820122421008000000A22048018FAD0A1A220D83922400181812CD +:802D8000002218004489412446024628812408209216B0112222052084022022012604102802000081422400224F46050000185024308440A241C048808481045048800281100820020000180000002084040082200100A22008F0DAE700100222602200400200000020420400004400210000280000000000000000004470480481F0CF70 +:802E00003E10044C0141184112494801008140581481458844082848810022414428492202108402810010088820011608842011280300F062FD100400281241204801000084511084140800000044002822800222000010080018608110081884200481F028E400244C0144C02218414002100800818428412022140841225042224100D9 +:802E800010044008000082000000004438C100F0EAA32481608180047014628441180080014442405424844143C12800840040048100410000490240444428031281802102001889F278ED10A84200414C010040042840082110184802821250488052828022010028000026084481400483028400890210480842BDDA401116042C010011 +:802F0000004002414800410000004221840084168822020000000000A081001800443018200241F0EDB8401112044D521860214618840121448905444484C41098844146588284872281818C012200284100104844441884116881901840C4381A02228141816FAB04214C92180044400400000010820440040028410000284B124008009A +:802F80000080220200880012400810088180A142CF8F0900444124100280020046044B24444604524122400400608122000000120000448001841004124181508420819814E0C40500248001440000480085040041800124001004001002400200410081410000181018C81441608800818AF19B9E244184000040140884422084210442C0 +:80300000200400400C100484240044100200C412000000002812001888C18880F8B1B40043844102414400480081100420024100210043012200443024240044412120222202860426141804C02481C4008584028FF609C241004002222280040010A42141800180020044101C4404408211440400008441444088528444100810281808E4 +:8030800094BA0E00450A842D44890244442820C224000022400441800100101802000000101244080000841A42180800004048F41E970000301400430483028142001004410049021810044400224302100400401818A421800218A0282008202801C08470A901004006200289022688C2180020228202002644440800444922011004413E +:8031000000250200853414C018811216C814411004441241006FDB092D1C8004441800418440048C828492482044041002491188080020621200848024121428020060488002008428C02C10023FEB0D18828721644B11651262448D2442814A5488474412422262F044141634244352444504442881C962422D2400246144442912BE28D9 +:8031800021E24293144C028E184CF114881E14C5781854CC4391881849781CC9885FA84D5242C145048116B42412742428A222814A41684445D444D244A22200803212504441414C61824321125464449014502444C4CD284508490883721848044C5984406C884D28812604AF430949C444105662428584028D2C4688228254842AB64857 +:80320000817444A4414128445088160844454846022A02234104244008448116048D18209218C7822002899A148F4168C8884B18A90E522011226824204418C448C048800448800440040000002821001004000041001288802881288128832842240BA285E4AA074F45F414148FE1C1548F85A419EF86B46484F248646AA6265A754CF489 +:80328000444466F47C5C4F46F264644F45E16131242212D04851440045F614144F42F22424241E1665544445F62626A558C8CFC2D28C52444F4AFA9C988D888E884FC8F98CACC5FC84848FC8DACCF22CA88F8AF828AC4F4AFA24A84F4A034741474C85BA12F5C8582B55E538248F8484D244F268283E74C5D44464428FC1F524244F427487 +:803300001464412302295188CFC858444C4844F434345F52F2242434AFA151464E4C45F62666A55888CF82F23C3845B424F2181C8F81E9CADAC47118FCB4BC4F4BFB84A4CD2C8F837B285A4E47482BB2F735F044544D4485CE16C7C14F65752E7C2484F248648FC6A6268F85774CF444444746CFC735644F46E445E1413126439214D04894 +:803380005844004F62F214164F52722444F2121E65D44454646F62125A48CFC2F22C2C4F41F124248FC17188F818B8CD1CCD1C8F8BEB4353488F4AF82C888F89DBCAE848F82C983DA4244F44B584F4181A2F65F14A5E6F69518E4F46F4684C8FC2F2486C8F86F25C78C3A4444F46F25C7C4B264B464F45E141F124244D264554888D8C459E +:80340000748444F4242E6F63F322212A52216FE15146CD44B06252C885F4242CCFC3F314144F4AEA81F19818CF81FB849CCFC1F11C1C4F495944CF4AB83CF99CB8ED8CCFEAFA2C881EEA10040065024382044822000000C02412440040044450484120020021001042382410240886089244964864888504814004BE8B0000444200302832 +:8034800000848140044C02100422004008002244412800614441000016180400890144121800120040F17F75C0421F4152281F41724AF21124A3D441B24AD1C1B24AD981B64AF91548AB944F82F44A914B422F14F924482D914F82C4914FA2C4814FA264114FA2E419E2A2E559C24A9E24ACF491242CF491248D121F4932681F49B24AF15E +:803500009124AB141D24AB961B21AB9453B14A3934AB9443B34279B498924F8B84F9A44ABFEF0725DA41C6421D2C27241FC1B242D1C1B246D181D242F9116C29FB156829F834482D914F82D412F924482D912F82D452F9245A1CF924CA1E814D4A8E218CE558D2B2E559D2A4F48128ACF591648F22F59124C3B691B24AF19124A3F611242C +:80358000AF46F81124ABA453B14A3A14AB9443B142688925F49648A18E525F5206208804000000400400000000000080080000140084800400000000000000000021701E0C18218C0329410A80D248942283018021342400001024229228602144182A84028D3400182311C8148141580083820940282412084C4134888912F8D5FA008250 +:803600009084451264611E2881388C017048449C1C84416B14CC3448818904834416A442104824914C806423410030148C41C814848044984818828C88548481C04414F0841B00C2814532146548D48223C2444B1220D248341C4E1C4C12941443C442003248872A4142253418421383441C882304106441169858418149A241831218081B +:80368000288184855424451868819F59042C012A8108901210E881126A8100008130428481848744902841A012004C0285A412422416941284188441800181828084A14889884424018A84027FAB0900002C0118100423220112404824018428412840441828028042025800100249A1610000000044800200424508D0CD022B1212615094 +:8037000012153424256C22411822124449A8148C824482714884C14C00293264448D42CC7144B8164248043214288922021A3238224238488182888C41648449921887421862F0BB5F242800242441504228412AA1121230845698241260814F846241430664814C66428061A44D128442804211124884211208802304888218C0484118A1 +:8037800045188406AF9F0E121861C011142E1481442121004C01108844020081002884608425CC24286041200128283268182A8122041008418443022281621608F0FA8F9029254404408592184042A1241212C14C813444C0282412901884202291684129018485C42258456881811A12141888247118A41210341C83688244864854841B +:803800000028CDFAD0480189A121122212211840941128C12092228D12602464C44CA112491224B148321218283022214385A2124604892482882308448042882431841800248D844448DEA5244800108401471241444018822405004C01844028542281104494288446142402002838448321021088883482002848C01481281220F883D0 +:80388000B1F0443341812AC1144D1132E5211144C152B014944C2221562C6186444508482D286528E2A1F65824165C8246C42C43A242124C8231288F4461832E888903C0982C815884C9B418E2840A8644C4248608485FAF0D2190140028A0214110D28182418831144A022504A1128D14264804124120A22124508216BC2224312C1222F3 +:8039000044004A688180068021483414894118381444A2D7DA20A4284128200243C2148480810200430124800100008C11424248041A7262382480020040483484824028041884C0145A022800223FA101260425281118211122D4620248844E242D44412522324828004C24041072640242100212124C6481184289222204838212082A78 +:803980000880110400411218885F5A074362480021482D41000000844922145884201462441A0442404A982444904446280200281604008A12048228844284002281288A4104F04F842440420246244124912242422152800142218001103228248304006023504200304449C1284004A01441128381219884856488808858248C08F01C22 +:803A0000B8002222214E9211254272440884832404102404482C82228481241294422A1488046241184902490160C24200E28128888189214124C1841200908C41AB4D008120021628022002002301214120022011041818441812268804004243022002122E4C8305100843840200604242815220F2BBDB00400483025268248448128082 +:803A80000440386464A0144518481208004221252881430625480844188430248C818E08824420B944C8381024524830885F490E428684022933228531142846622140080040182285240123034210D4864624342448422001005084418309CC8422A8218B818200206812898CC811F0D35150A2C048166448CC9824481241402ED1C29280 +:803B0000122B412981B424012828A1818B34A14B850030148114C41A6486282A24614462224200C0348052488284844964840021F0E8B780748434282B214DC88FB291741AB228B16C162A14582A4C55261E54CF82F428422B5723A446CB14818B448F21247166F2244A25E4C314921483B31483C7442A62414FC372485C88123EA4874AF4 +:803B80008B828B984BDA478C1E8847488CC12CCE88148FC7BA8A6D91845D4F24288F289222442B351F4158694D466744258894582B714F84116644E7A44AB24682024FC1E1C1F422228C024E5C128F44B24884711498626D742E4643B214A2112A37483A22342C8E184B249A021E2881C74816F88484CB832E546EA84145C48149F84A2478 +:803C000070662652E42E1287622B2427172B161E62644E12278146CA4436A24150424C41A273005E48267246582E8D642371247A44E24666C7462A64448F8241140C49F42464CEFCCB448C4CE88332481A8991988384B114924482169814AAF2A34B00211004450324844048420812608124844008002144180090120080010018100420E1 +:803C80000100124400120085040044AF270B45D644F2282AAFA1F35A689F85765AA8166F66F746461A21F44A426F65F546666F64D54EA442AF27D12AD122F168788C51A88F84E4A4F51A5AEFE3F51E1EEFA2B224D6EC7476566665F65664457814D4CCC4488FC1D388F4A8E8CFCCFA84A4CF889A184EC8CF8DFD18B88D8C4F44F4B4BC4FDA +:803D00004FFFA481488BDD8F89F9AEA8AF69024D244FC4F6282EAFA3F55A6C9FA7F71B2829F36672ED466F41B148E567F74A4E2F64F446566D4C4F82F67852A985F16A688D58AF827128F888CE2F21F522A6AFE5F52E28CD48DFF1F776766D258FE6B256F67478CFC3F224248FC7F7783C8D488F8AFBFC344F46F6A8AC8D888FC3F9D8D8C2 +:803D80008F88F9889C8FCCFCBCB8CFCEEF1AFE88CAEFCDF59C9C2AF3ABF1F034766F4246D6CEB14AF75B6DAF85E626F67E6ECF64F6585452AF25F256564F64E424F51E544F46F6727A2F22D68AB122D388F1687A2B444F44FC1C5AEFE3F53C1EEFE2F234768FD4F65E2CEFE5F6367E6F45F434744F41F33C3C8F82F43C3CCD4CCFC9FCD887 +:803E0000C88F8AFA88AC8F88F3C8E8CFC5F59898CD8CCFC4FC3C3C4F4FFFEC88AABCD2FD8898CF8ABBF74BE263F32A622F62F27E3EAF67F73B37BFF1F34676EFA7F76E62AF45F54812EFA5F75E5E2D466D52EFC1F52E6C2FA7F532628F83F13474CD5A8FA6742AFA4ECCEF21F5BA76CFE7F72C62EFE5F55E7D6F45F75F7C7E7A6F45F43CDD +:803E800074CFC3A333CFC7F77C3C4E688FCCFBFCFC8FC6FEA8A88F8BFBDCF8CFCDFD949CCD1CCFC5F5B898CFCCFCECECAAFEC6548F88B924F291CFB02401002F2AC1484D1248472248A041241E482440C4486C22A1241244A0242094128F441232484B1283B42421B424012210C448418443A2482286089E48608844124C229828928524F4 +:803F000068EA200822841001281800004944848401420030488481840040C8241058A2009014128016A8418908202904409888844A084282608AD9012CF4112485F2112487241F41724AD341B24AD141B24A9921AB945781AB9443F34A9147822F147924D812F924481CFB244A1CF8244A16F1245A96E1A26459ACE549C24A1F49C2521F0E +:803F80004952281F49B24CF19124A3F69124AB141F41B24AB911B24A19B54A3924AB944B422B94478329F92448984FA2B49B0C2D481F41D62EB411724CA221A7341D2C2B141FC1F242961D2C8BB45F81B24A3834AF347934E81439242D9169D412FB24581CF922CA8D854FA265192E5896D5B2E559C24A1FC9C2521F49C6421F49B24CF1EC +:804000009124AB161749AB141F41F24A941F41B24A9B21AF443934A9B824B44A29D342F9264829E9A2F54DC200800400000040042800000000000088000040014008480000000000280000000014F0B5FC2012229114299428214484288905842C24A842464A1C1A0C8112812246046B142142224AC3128082632A8041481468418B21C18B +:80408000288A230881424241428B42428044A2C980A41890828B824CA54289641149248802859414448082C4421A84044E2420C214830281248572847868925400364A24041A044CA41E2784C058418A7429A481848B29921AD2C16211428FEB0D48232461688BA4382A1438194B244D88282287641E246224C127842CE4212484B1380414 +:804100004B2C16F45C221088D223473E488384A3A42F81F21244461824C1148F42E547984E3A281F846482CA11E8812664244D2856A1418F940222122412C04C214C04A01410088841832402450884108402100248402869221E2400000083044028028190884D411084688B381440F24F53000020C22424400200004412290246018084A5 +:804180000200812A01411A0244001810223128A0120082808488849844004C88840181412F88044941629129321485B1142261428CC12283256141904216CC4826088C024C14FC8268C4628554228331482183341848202311249158644A3124422232831141B828185848848CE8C2042A1CF84547104412186241C12634122416C8228CE3 +:8042000024C1142400F0284110882452284618246441212381048C0448800120315822C0248A04428309814B288181449024A02444C7F720011621823221183024001200412CB52C31480028604444A2818362825084872310C41820C12212169428C0164A0120A2213041888C04418CE8849858308884B7D340C242002698142A94364C5B +:8042800042C41493A6218C344418524508222446042A8592884112491214C2648428239148122E88281062442036284480120A44220050224E381698485B6F248B244885F112285012438164112885048C1204295242406824858282941C2534C42C9168A0122230448C483618256441200418424B1818441228D2001A3C288318C14288A6 +:80430000442AF866D4C0110010221218084602184200002C014148840042404804C01818211248800243014489322800208209818A0116A41219250810F42369242A1452812E1A83D214E34221C4352616282135444924B21244426862844C8634242F4462448C61C54982B322C142C48C3952181E241A182414142434B4228083B11A049A +:804380008A215F48898994C2F816948C9F9C0E9C012502247048E2C10248181D6881842412444781802444088C048444230241814B124222442D42302C1A42028B168C22648100888281412083220184812AF417120012004822512942142294180090121082132852482422448608C64484418882E242844354224400234418481488127E +:80440000024441A048169444302884182AF4F3160060614A0252A902284827824827818C7212140C424110024B4148A446C2C8248C410284AC414204382418224163468224A618422A2804898C4248180C4B388928F8DA552044884108444651628429012249022221212B12002A0142444841188A0200004440444214C46200400446CABC +:804480002244908442841841A2124082F1C1C34004C014100142569428180028439418433444212A118404000018A042441008821844280028306A818504862484888402282001182508AFC5082B4842830210120C2822482961812921011240942280012B41248944026C126421494222C5220070181224112418088A0123089018448873 +:804500001A484408C2F0DC3D200148D0423241C022002822000000848554828123219224904C2024324412612622018C010043A44143014394284C2484044C2A3848304826042554487F33058444442B6142A0128C0142704802C4604410982220444404811602282508261888141824028512041082A2121A2274180400200366088843FA +:8045800092224AF8E4BB1082215248222C028152122100242034444189058D5242004800842A24944243242321088012082810021841224C110420A4288002C012183FCF0A45188804444C01164418C41844A0212E482484322041841152242849B21498541088021C04C018638224220481526282504880E28104854404482C419862F005 +:80460000A61E242186C8346D1246944195D26CF338124C61842A86018D424D1245E266B27CA122AF247714447244E4846422CB44472983E266711464428D2449A42143514AE3D248C2642F47E446F4224645A876C9F142A8414A5C484F82973C8F85C94C6E4C47A18FCAB21C35C46F84014B458D14D088A6226F71F12461424F84B418B40B +:8046800012F75212A9F21E1A2B1289B44284C128254AE884C1142942F616C425A2C66D668CD6A27614E2A77432F88686B024C22267A1668272166A882A648866DA28B482182418E8C4E84AB22818982812CAEA81FBC9474024753C624749A42627C127832D242F263228857814084F457252DC48B11E5442CB11474389B454E423B42C728C +:8047000048E8C1C13C4E1830688D68184E362AC1361E1244185024818B358F44731CA4E92AE14447B444A58CAA14B44491B42A9914269A426E14004184404801450245020044842416480244004004008504810010180461302440420816180424406481004492008110F8AF7C242B114E1C4D1E6F63F71E1EF5BE5AF75864AF85F55A7C33 +:80478000CFA1D12AF32212EFA1D1827244FC1614CFC2F17E46ED1AA7A385FC54544F25548AEF6EF716426F25F612526F63F31A5AEFE3F332742F26F6BAB62F23E24252A8A5FE46443AF36E262F67B4EAEE4FF65C688F86B2F2BD94ADEC4B99CFCCFC3CA88F86F6CC854F48FAA4BC4F43FF76683793242B111E584F61F11634CFE1F31F3E8B +:80480000BB75EFC7F75A482B76AD3EAD3AAD3EAFA151822167456F43F37E4EAFA2F37A58EFC4F414544F6654AAEFEEF75616EF62FD3252EF67F72E4EFFF7F75676AF76F6A2BE2D166E6EE4AFE2F446646F47F37E74EF46F4AAA48F4AF25864AF87B7F2BBD4FDC4C84F49F9BC9C4F8BBAFCF65C148AFABEBC3AFF34646346B252D544F53CAC +:804880003EEF63F326245F33F37A7C8FE5F752322F45F7685C8FA6B61AF31C16AF8151ECEFC5F12416EFC7F51C1EAB63AFC4E544F54452EB62EF66FE165CCFA7B776F47466EF41F53C3F2F47F6726A6FCBEB23F226648FA1D3CEF254544F67F56E6E2F66F7FAF84F4FF7F87C8FA6B6D2FFC4C48BDDCB9DCFCEFC3CBC8F84FDEDEC4FCBFB77 +:80490000A6BC4F4BFFE4788B2F246F44D44CF1383EAFA37346F63737FFF3F33E3E2F27F76676AFA4F74A3AED12E761E7E125F65E1EAFA3F37E7AEFE3F33E7CCFC4F454544F66F46E6EEFE7FE561EEFEEF5764EEFE7F62666EFF7F77676FFE6F6B6966F63F32E666FE3F36E2E6F65F57616EFE7F77E7EEFCDFFAC6CDE72AFA7B752F744446C +:80498000CFC5F5DCDC4FCDF5F4FCCFCFFF5C1CCFC9FBBCBC4FCDFF445CDD48800143024B1AB0248124A2414008004844488D24B0480246048B2460446044188B2400222002188081048C04860896088A049240182811084A2278DC088200A014133148842B141E482304181608482502188418120044202122010080C5242AE141921A44B7 +:804A000022108232649A42A248206844324A1884A24998A220F8FB26C0421F4152281F4132481F41724ED341F24A121D24AB9419B24A19F54A9243F34A9343F242914F82D412F924481CF9244A5CF8244A1E214FA264592E4A96C54A9E244D4A1F49D224FC9124E5F2912487241F49324A1FC8B24ED1C1F24A9219B24A19F54A9443B24A9D +:804A800039242F447924989A4F8384F9244ADF5B0B4D421D68581FC132481E24C7341D24EF2491212F46D9C1B2489B214E964783AF3438242F14E982C4956F82C4916F82C5954DC88F11B2247C98A54296E192759891441FC9D2A4FC9164EB421F497248B291B248D181B24ED1C1F26A96118F449B252F446982AB94437B424498BA2F8317 +:804B000094882F22F5B9914008480000000000280000000000188008410040010080040000000080020000004001DF5A022011588158842111F0244A60818120C448A145222222794428932828225084001E4429220222103228188024E2482406284281A01C8744424B184828828A01F056251442330838893234907C3814560818428C81 +:804B80009824128B5218444122008582944230228B2C2212121E421228122CA128821A22842221781208C84460281220BA888434489611F4FC2460241F8441E882B448C21421130246764428B12881A468874625D8843132419666442AA12189B2C282D46808262837131A829518224AC1288A23A84248C81888E148E220C58423C58448B6 +:804C000068C6E2816C1947218FEB0E003011188C021E4C2AD1818241081008182A042260824008240028C84422408242022C012021C22462A012101884C84820816A8800005FD80D40240200000018800110140200302481482002848041440200221082022840048021088200202124432441048F6E0C49322188A9A3124832AF246122C9 +:804C800043459812C018907270423244669448524284A912622448668242288381911221221A622818452223087A08488064844DD2228A0488A847844286F8D895302426A52823818324023044248081014907426314045E24488C44224282C4222845C812120000188A02206148A0E112888034488E1228984218808114F815B300008954 +:804D00000280F14A122823C118124048022121A0248C0484248C024881481280021682312228230223C1262200004220084C044820CAA4461C24F8E2173048488C18688190484D2200651868812A042142274280642281490100AC01002504222184182A04604100108412048A862808880000A212F0B96F30284812416285012188284154 +:804D800080524A90382584C44870184204640028461402822084F822188A9242A082222A0118C0824B4818288C140484182A1414C444828CF8AA75C012284F12881144A21281839C1818002084185828124301006822424218812B24841694122004122129012026A2C1400800A01862888281888400A764A016283601CB43144A71288403 +:804E0000E42241088CD1840421CD428762584CE1814218E4648282B468A114A12A74826C612C052AC52212B0128AA3122A041E442AC84812C2814182890E2A5C4849B8682899888FA80524106CC140782A02A18418842420648B214881481084010010062100282C089828211004A021889082008A84280192001004D02801A0180040425D +:804E800022810426025220E46102482582A414002880128214A23421108245082118218041280280242822011284221A2488288218F83ACA2024045200844200C028200420140800182442422004100242482120012082048004C8208204C82A084C04008001FF2107200800001216020024206181AC01802404002123240100100224305D +:804F00004218008022042008800820048882820080F281494008482024814402B012066152A100201504305241000018800112800100124004808422880842004AA8140000001F730F481820180818004842008004208101001842200200184B4180034800208224822222A4422002188083088604888A82C8216F430A00004682542200B6 +:804F800040C24483446821E0847228449218121614322A48816229A412212848B012248315D8220121424242008400886A812804008004F06619000000888084850183014008C04222240021000080C44280214402100418200100808824142408402481041812823F23098482008258420018181A2441082400280021420042224C03805E +:80500000240100243800C9C144180000102804420080028301F09BB6401888040012002724456842222D12B04882311242120021242C438209804202146024848004001004804404280012824800882192BE7420A4598085447242E225C152482E521A74186221218F21F368425AE122022440A266422F86B6622192422C2231422B44429E +:805080001E4821A981B132839424484A84A46283A4A88AA4948AAC42D04488A88A822AC311AAFA265180240830C82B94582140B25AB22201585AD58224B12CA4112D1C29911452259C42241E624AE42391522E14582CE12185A3551606244156A4244442428822281A24A431CAAC58432D048AA888F05BB4008400A041168824B55211F494 +:80510000482A4B56A7848568422D1825BA42A4455A248145C222004901722F2424A121212724242816028B142AC5182A028AA848428314A412CAC8184A8205881E481283F163C600180080090024844048020024002004100200002100100241200222200222200200281200004A02286FAB069A21A411488FA4FC52122F2155222B144ADF +:80518000F45E12AFA2F34A1487842F21F362222B364F46F62232A7A12F215144488FA2A6628FA2F422126F66F222222F26F63434242F2252228B224D462FA6F322222D12AFC2D244A1224F46A222F06C68706888F1D4F492EAFA14144F45ADAA8A7888A8BAD0ED0C1A41A811488F84E421B14235122B1129F162142B762B1623943A7E22B3 +:805200002B776F47B432D3AA91426F41A5118FA7E722F2A8DA2B124F666E216E624F63F251432E624E437E3A4F61B572E72392528FC6F644542AF664242A86FCECEC888FC4AADC4F4CAD88FA7A44F454D42ACA82AF89A8BB29B1A2075AA5511A018FA4F45252AFA5751ABA52E524F44A26AFA2B24A7348FA1A1A2F23F65A584FE6F7223276 +:80528000AFA5B41251461AF1283A2B428FA2FE12526F67F222222F23F346443CF472722F21F132681E426F62F722322F23F37E2C4F47A3274F46A2666AFAA8AC2AF248688AF99494FAABAE4D441AA1A28AF8EAE8AAABB29F1F06DAB518A111428FACF452D2AFA5751AFA52522F25F57A32AFA2F34A3AAFA1F12A122F23F67A7AEFE6B562FE +:80530000735ABA42F144144AF5687A2726AFA7FC32526F6FF652522F27F776762F31F532723F24F572722D426F63F732322F27F37E6C4F43A3454F46A2666AFAE8EC6AF64C488AF9C4D4EAAABF4F44F454D46A8EF8FAE8BEB2AAFA65AA0000004800A04180041A048C0416081A0412422004420018421842184218008081941448A048205D +:80538000084880041A048200003FAC051880012001122420021810A2414A022100002428A021002428002400122228224422200222004004A8008028884AF1878DC0521F41D228F111248B141F41B24AD141F64A121D24AB9419F24A9251AB9443F24A9743F2429147822D954F82C4914FA2C4856FA264114FA264192E4A96D5A2E449C256 +:805400004A1F49D222F4912487221F4932681F49326A1FC8B26AD141B26A9921AB9451AB9443B24A7BA4B8427B24B842F9344889FB244AAF630CACF511648D521D244AD14192181D648F24D141F242941D2C4EB25D28AB9443F2489722AF547B24E854F926488D952F22D558B926EC11E882E45D72246A192F9264592E4A17C96F82F491A0 +:80548000448B421F4932641F89326E1788AB161D24AF42D9C1B64AFB8528AB1443B2426A882D344D48ABB46782A9FAB4427DDC4028880400000000800200000000800188000040010080040000004004000000001002FEA3A0140081831488410884D0820152001A2424062604002200904240A2422D38415860220042284881412A6482BA +:80550000200198800868284782200ABFC60C602800282024012981011884410010A814162814845422622A212123040068802461418C0118243248418A014812428084928C424A08144CF6675280648C21904881528C4142582416283248412025344812362614E4212432E238301242241B2428B048015244898124032391444CF43488F3 +:80558000A0421852A04822CC0A87268028F3C2A680014028020020810118120000284881000000184A024032184B42808492120020C42880028001880020A4424C082849F436A100001068C1000018112180018504424130248004240000206241804242040080C14883042A01000028222093982280F4E87E0021188901408822210480E2 +:80560000014880E4842281928870150829C2641A3468222A242121228421818202683210242102002084C4884984049048868872220610028160810012001002421004008908168934222E428084A242803224007022840228121285240528002084E4821884246381628C28B4C505004A2111481488024218452121820189C468524C02C1 +:8056800026440412411AC4280018181248898301482084024881281200220020068018082AF1A16820224204E084A224444A02840090442006404808A028001048C848008001480000008C0418860818882008184220014283F835F600200180211102220000200149420840548483240248002812001084A12122808281023028304842A8 +:805700001841302420022AA42480F6DB28004002120000420000181044C11400180000224180110832002280012002008002004008288C5148002A01DFEF012822160212468815A4242200004118625962810012100800001E688C012A81011AA2213800320060828A0252124184222AC118411AA4241A94682F8E0C0041001A62220048AF +:805780008100A01440044484814185A44A28A02445180800004448002002228C0412818C04822048044A42880228827A0222000028000042004800834408004880040000200180012212000018800100810080082088821408DFFD0D1260410010048C32280052000010042800224122C9121484442824810200208111088002A081908864 +:80580000004212481A1488220CAF710C12305400284110480841182A0410084120022032145048444148890112228120812401810028001038A8008218425A08908818BFA80C8D288B444A2404008082D24454444B622A22024881002442A0151A212B020090418051888D288B444A24240112200141982AA22222200400872268481AE10F +:80588000B10F000000200200008400000000000020020000000000000000000080240442480000BFE20A818CA4144800000044414C228202830418485022901216C4B48288003814111484818C24840400280044414C22C228100800502290127FFC0B84800440040000448428424810080010021880180400400140081A240120014200F8 +:805900004480020000001002BFD304A054002001005044A0221008000000B0140100104408420085084A0500180000002A42080081122008A0118FEC0D008001441800000000002004000020820200000000000000000010084800002008005FA40A188B444142221200004514B82482242234488480042445A211281282824484221011B9 +:805980005188B04884212402000010B424022200000024241AF18994405888484A04000000444584E28282010000109212181E14A8A80000141440D88885A44480012200404C84A2220000001012B25B0900000020020010080000000010041048840400002001800180010000002025C488180000F0E6F3001212002001000040880400DF +:805A00000000004400002800000000000000000048000042480000BF4F0C000020A11100008110084840288404100441436282444C44A822000012A01100181228480000460818C08842A08800F06B542081A11100440000008442813048810000504426848202418120040000800112000000816084428C0418480000BF47072041248131 +:805A80009214A022000081844E484AC148202104000044B0240222180000A0112081021822001008004842811A240400F0F94D7026B212A2122B111229012C5122881E1317118B98967948F888414E48421D4911489518F8444887444F42B444E24222C224805244412A7226B212A2122B111AB882092C5922881E1317118B9896F94888D1 +:805B00008B484E48428C04488518E884F479B1F0262245A21232122118182592821CB11191819E8883D118246484941D4148848588F44844C14B246226448482425444282F2242A212321A38828A81512229C8111B1119E88938188B48C2464888844458884877F600000000000000000000000000000000000000000000000000000000C4 +:805B80000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000047 +:805C000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000C6 +:805C8000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000046 +:805D00000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000C5 +:805D800000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000045 +:805E0000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000C4 +:805E80000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000044 +:805F000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000C3 +:805F8000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000043 +:806000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000C2 +:8060800000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000042 +:80610000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000C1 +:806180000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000041 +:8062000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFEC0 +:80628000000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F08D +:806300004FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000000000000000AF +:8063800000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000000000003F +:80640000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000000BE +:806480000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000003E +:8065000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000BD +:80658000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000003D +:806600000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000BC +:8066800000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000003C +:80670000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000BB +:806780000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000003B +:8068000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000BA +:80688000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000003A +:806900000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000B9 +:8069800000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000039 +:806A0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40FB8 +:806A80000000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FF2B +:806B0000E40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000000000000000000B6 +:806B800000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0084004588842121A24220E14201444C064800892221210140048981A124831428142804C048180000008222000080A249280092EF8B0C2AA41416984842C14F82F424484644C4242284442A443824C9F328141AA6410081441AA2121C +:806C000018406881324226280456688130488994684E2862722A8112084A628622728321A2818CA91C846FAF09A0411008444902A04241128130448422412004124008222011081A0200001E4890484281842280210100628400200283893418AF9409228001C4481843251424021A0220048C45889278004084E142011884488B243028D7 +:806C8000420016081800202402A88902208422C518C80092D0D70148810000428100801244248212848201001800000000400880040020A442482842000000208222210980F8236A00108884444828C224000000440049220100180000801128212414080010084008200200800200800200EFC90100000000000000000000000000000077 +:806D00000000000000000000000000000000F04FFE0024842021040028181AA214418441422E1418C4200200804124C14820041A8402248C22C3486848281220E48208908420240280282221F29A42001240B448828212241122048181422244001822460841814022A2422094221800004400848400A01818892514884248988430148C74 +:806D80000548CFDE0C008430784A220218284A218355484243024C83C11C288C0600C012A0258C44228601280025A8218C8496482818A0948C2B04C928122882084B188C22A142FF9409201142040044240010088160440000004181004302200480050043024008000090184800428444001A04708C05400428004128421008810000840D +:806E000081222800478240280428481224822011A42149280116048C060048888C04004302484A0100AF850869818293121813022001881C0200D08421A2844883344445088984421898442848212A110C7214222880A6128092284A2182018488478212C122A0244B82687EEB402422B22201002800834841080016C4288A044842814445 +:806E800080821468442848241281122644010042128400428019480845088442422228F07D819012441220C12144A0140022000084102836284444833248848420228411A28241A0141AC2A41A021E24224A823228186280048822431384222134844AF211253028288B1200000042440010484C0845084044048743222281C048418381DC +:806F0000A1214981842103CC02482024A618C014C38804438202224921A141F0FE2890184880012884126688C2448B4100002A6141C024248C828202812004430280022281304428428002004490284200C800160482004D750021902848844122008428100C00006082200142442001100884000010088181000081423018A84034242094 +:806F8000584820F4D223602322123628C428C1128C04893438400C818CC214C02428224B2180C624B01804C952841289218302184B1226C848C0282024864828C44480224C044902C98104ADCB003028000028226880041018840185048145082A51488428004840880216840400434228040018901886B84821C824224C22C1948218485C +:807000004F1D07400428604228844C420442004004200441C145881428110841100400004810440880024A420880014C028D3418440022289B9D2004281810082800004280042002002200188C22440800490420040028124849048001206488C41880A848928200F0FDA38003506281814604201488020028414200008002000081402834 +:80708000828424144408442881411A94144228C382E14401891D88020012985BCC001A024064248181448004101418881404C40041811044A84248480048892112848281A1524441100C00100420029028A04A82425FE70A4126682282002242102432480080020042421008284180C224814A026084200484448022840442188480248418 +:8071000001D8C0584280029F250D108401892102A04240084840848402855448004A0284C0444008814D484480628220026084223028842282400C8C2205008A2224088F960924101424024200200444424014188802444508892424250200008122004034280081411230484C0660814C1444F4C81444412848285BFAA0212081826264BD +:80718000814A02282828004181224932288022222222922822812E48282302284C524880221248182482228402C048008C04628C22820420F4841C408C91445662410000004490248904409844688148290458908443044084D21804E082014C84C1640080628828460C4A02824782102434343012F04694702484A3312A72141498288BD5 +:80720000622684A2248B2248C0448782288145B42CD444B22412EC82A642C32136644D28F0244442859848A0362A3414C7435E482AB624C2244AA217684840D484F17414CCE442F314244FC2E6460180F27C45C022C1E04181526427C2424922E482A4444142414B242AF4442483648481C0648146C8284D4889D64844424868465E284C07 +:807280008414A4228CB128224438648B4349A4124E28CB2449514889B4F8E289AC548A81AA823AAB929D15A015367424D626F42A186E684A4428544481205444878444C126E8824684D4C864864289E242D5484228766888F22C446843B268428452C8284D14C5F44844C01C8F887248B828C8488F8DA4458E2849314C8F8A38584B484A5E +:80730000A6484AF4186F0000002410040000004484008100001008850400102401120040088440A88212888008288400208102F0F1DBF044666D1C4D266F617548FC2C4EAF84B268A2644F4434448F844254444554444F44F44464CFC4726CF82828CFC4F4244C1A24A2748D688F86B448F4686A6F46A6444F82F22C6C4B364A43B834F3E7 +:807380003464CFC5F5484CCFC6F64C6CCFC3F7BC2C878F8F82F2C8CCCFCCF4842C4F4DF9C8B44F45FE5494CDAC4D346AA611BAF85922F024266FC4D664F23666EFC6746CF64A488D284B644F42E244A4226E644F44F44C6CCD2C814F42F24C68C7C2CFE6F66E68CFC2B67225A2BE8D688F823C6C87A66F46F641417AF37C7DCF86D744F159 +:8074000074744F42F23C24C7C54742C5FC4C4CCF47F7FC24CFCFF2A8A88FCA7E84748CFCBC944F4BFB44644FCEDCCC7A44B662A6BB2B66FF170E4F64F736546CF23636EFE5F12E6EEFC4F26C2C4B644F44E446A2244A56444F84F46444CF44F64C64CF46726CF82C2CEF46F62C4C6A25B248FE2864CFC6F64C64CFE6F666648D2DCFC5F769 +:807480007C7C4F86F654644F42F41C344F41F25C4CCFC4E446F63C3C7E388F87EBC7F3A8A84E68CFC4FC14D44F45FF54B44F44BE44FE2CBC4BFA2BFF7AA59ACF25044F66F72A644D266F67F27E7EEFE6F26A688D284B644F42A2662AB2445644CFC6F42C2CCF44F66C64CFC67624FC6C6CEF46F62C6E4AA7227AFA6868CFCEF66864CF6695 +:80750000F46E6CCFD4F64464DFC676247814F43474CD24CF43F27C4CC7C245F41C1CCFC7F37C8C8FC7F72828CF8CFE5C88CFC1FC3CFC4F47FF4464CFCEFE2CBC4F4CBDF2EF2FADEE3F53092A012A01618C04844382244208484484284881200442A0246044B04812B448024243223424100441001064882286089E48449E48A041280080E3 +:8075800022F827F1100440848112820200004190442042044CE2821408812281202442848462820044418C32482822CC1484220483044443912841424382A848C0419FF9042CF4112485F2112487241F41324A1D6CAB141D24AB9419B64A19B54A3924AF547924F84A914F82D412F924481CF9244A8D814FA27418F1244A96E1A26459AC36 +:80760000E449C24A1F49C2421F4952281F4932481FC9324A1FC8B26AD1C1B24A9921AB9451AB9443B24A7BA4B842793498924F8284FB244A2D5FC04A1F41D62AF4112487241F4112D481B64AD141D24AD941B64A9B25AB94222F547924D81AB924D412F926482D954FA2D518F824C28F11E82264592E4896D5B2E418C24A1FC8C24A1F4826 +:80768000D628F491244AF1912C23F4912C23F2114CAF449921AF449B25AB94412BB4478AAB14478329F8164829FA245A9FEC0284444800000000002800000000001880080000140000480000000044000000000021F06635002444100400488142800414228D442240148402490249024822832212822205005024004784A0428085220401 +:807700004E844C4248A4412624B8448182F282230040884192148D212E444588020010085041E084C1284141462802842290448044042C22040048808862819028901844004230288426B828781811F4752D0042A1486041990290284304224021D2844405502C2614248332A4846228262C32432604898224046442202882034F8582B2E8 +:8077800028044B844902443028872287472E1816F45A1C0010245124004C364C002004810022F0144828004D4800008004005810020000C30483040018410083048B3441888220F29D67009016282E129014100881004004546044C02441004048A45228430222003024282112004160244862A08420040028402482029F540BA0122810D0 +:8078000084023034222092582901498112C228C18400602442388141219014184901232101244322C22842902818460848806482818B48226288C1F0B92600F022149034221604C3221228D2280144445722E0844248080048278444464804C01412494142A412006922120C488100822084942881C820844A08AF5A0B80032824008001C1 +:8078800000481220011044C424410000322A6122430222008003211200224890626AC14842480000898262423024F01D89B048816482122002413845489438282314943A20114474120241182684C21284A9111402181624220142281E4449214204402484220428478C102C42414484F6EAB850484304414C080021424C218403120049A9 +:807900000442A4C4381884402812042800101488E144011008188C414404293284C19822C458C0422800AFEE0FC0222022C81422220000400410048032641800400441801344242222018A0280029048828381822208000088811998188449F82BE860414D22008023922460848023C1444436084A0166B422658141C0242604C14D184C86 +:807980003126442A213334A02818201124925892438162248249588422E658844B8428824B214149F886F1800483E241124404B0224184C14824C012401444048514840381301827222002004180211184326416084481848002482049048941284418A842BD6A008280210180040028200110042249022141220044466244000000284331 +:807A000002002C92242200C82800201A480C80088142EF2C0218812428C024426045001222442741229012200143222301E02221C31226220180012001122818128004002200001014448282083F7206200C400400004092142002183821800100201202002064412001C02228001A44842202420020088168220042F04C55E0A2614240C3 +:807A80000412444E244084040010043024004012A412414812484200282289020000000010048002802902840060822F9E050030445248004248800424802482020041222200402412044004282248200622430220CE8800004400608C88828814CEFA0020028A4204262403842A418201122100282604009024440090242A11224184012C +:807B0000480000000081414420212802200422F044A6000000181A0200220030449014102201C014414022024381114284011800122002000042004880820300222800AFCB06308422C0842E824A0180A2210044809228440028280000522880818304001863811304418004424028046880022082828422F4AA86408882848382D484924A +:807B80001820018D44498122C154101814C4141821C034128848212A4432241C8202842248182001224A0260468023A14145082210481822F2263D00822A42E44A91B4EF410148122A2282024C11F424344311B224912422499114266442416E124F4764652A43624118CC227264A422292142F62434802282B428044304B0284A84A22439 +:807C00008225C82148F77920F1A66C90245A62444843A7244B24E024C11418E045148A8242E4426141282E2480A2531A0222446B432A2223A2211218168422034B42A0848A4828044AA1819281F0288C898EBE28B828F2826A8003B07211A4436AC26C4B1190581E6843711636762A63212E1A47421A2291263606284D122F44924629916A +:807C80007223E1449214281AC11238126A02381A84A2466887444A922412284B7ACCE182E2420422228A24F4441D00001882800400120000004412000000004400000000220000200200000000000000F0C8DD2078440C4F41A1644F67FE1A4889E746E744D58C1268424F61F156344F64721AD48893124F41F314164322F1162445D46472 +:807D000091244E461AF534361E124F655546701464216FC682F134742847415E146E24A0ACCF8EFA282826F444545AE34AF5BC9CC782419F8AB8E8FCE8C8AE882781AF29063AD2C4044F41A3E54F67F37A6C8B146E742E348D4C8B731E344F61F156144D66EF41D188F326144F41723434264F43F2242447424F68DB44E226AE514F67F31B +:807D800014165F74F636241E21CFC3E321F32674184F41034F43F354344F46A222428FCEEA86A6644D145AE14BF7BC9CC5B844F468688F28F86A48EEC82E38AD3150444F4256444F43A3544F65FE5A488B744F47F744548FC4B74884F214144F456127E7618FE3F316144F41C3346B221AF1241426D464F8266465B626F716762B554F75B2 +:807E0000554670147C24F626641AF134341AF314144F47F564644AA4A88FCE5E88284F44A5153ED4CFC3F92C24CFC4F4C8C98BCCAF8EFEA8888F84F5246AF0A424CF427224F414147E744F65F37A788B364F47F764748F86B378D324F1121667454F63F71E368FE2F326144F41F224244B224F43732464424F63FA26746F6EF636746F67BB +:807E8000F756544F751536114FC1F124266F43A3334F41A3334F43F374744F46A666EAFEE8E8844AD444A115BEF4CFCB5BCCCFC4F4E8E88BAAAF8EFEE8E88F84F463FC00200249012AA1410020011200288002208102004604428002002002222002222002228400A04828800228A024F0F2810028220028414C04282248004449440430E5 +:807F0000340000442212221222444112000000001844000042004B48880010C84800DF4E032CF41124A5F21124AB141F41324A1D64AB141F41F24A9219B24A19B54A3934AF1439242F547924D812F924485CF9244A1CF8244A16F1244A96E1A26459ACE449C24A1F49E222F591248D121F49724AF29124A3F68124AB141D24AB9419B24A85 +:807F800019B54A3924AB9443B2427924D842F92448984FA2F4DADCD0A4F51164ED421F41F24A121F4116DAC1B66EF11144AF64D8C1F24AB259F2489243F34A8336E8547824D812F922482D954FA2C5B14F82EC11F8224896F52248C6F5221B96F5264A17C84FA2B591D62EF58124EF24F181248B121F48B64AF18164AF44D941B64ABB159F +:80800000F24A9443B3426882AD944F8AF44294678AA9D9A4F521B7402808000000004480020020010000188008000014008480040000200800000000004001AF6F0F4132411810A42180220490485220024C2422010046428402280068214C228402004004184481002024A494C80089185C480046F8BC3E2027284284A461824382084217 +:80808000002001008082C2244100484046242481020020430200802224822802880030242222C24214F033BFE045224D24012288202834446046421800208243624241522182606280241691243028A01600410044832412242206D24A0828C0242C04141AF4DB2C00282244421E442AC124220010280122904400280040A4420044203103 +:808100002280040024008081028008A048001094A8848D844840F8761A002008880080080000000000000000000000000000000000000000110010011400775EA024231245A412894223544245A8312AC48182608169A1482A0874188F810248C2748588A245843398484D146A820871442A91684E83104298242AD418294808619AA5823E +:80818000186487812849F89ED350224A1241A412C942251446AA22483C0129688149B181A4821485E68181A288444944034E211E4811235888184E442D822811442A912C5C281444B822A3413C281842B814A1482A884136188C025F5201008280080088000000000000000000000000000000000000000010010011400170E705210000A9 +:80820000A01268C50218480044484C010020820244222822442004200200006302224880240400802424088E482088085F580E4C024426721C622100E08284060020014A82024024C444222024E124324422262414241406642820440428888A2205100480F4448880266684F0CE3F7022044428A991121842414AA21600004841282200D1 +:808280004122414C228282612444422842441004444024140480280A00802424F84488898C824C085F760F000041242828854208480044181248002022240480249224482241802214022422290228422848425200410048004822C8F0424E30482AA421814004211222108C120A22400200290200222200002823216422120000100400E7 +:808300008C188402001008841288A082DFD2048D2648802244E84402284604498213042021040021414C010022009041441064244C6622004A81020010044312A482C241000084705C0950242001002A01008200481823042222000000400216044480220400284800282614040088008001424048046F5A01472426A6212E1842C14A025D +:808380006042302812E148181A44022880020022800200414168224A1182922242582222444186081044848A5C48C0481281C4A85F140E22000050241AA21248200800222148280040140480420249012E42126044214C02001004220000820020010082004FC603410050842249012190222800000022004180820290264200200443022D +:808400000000442822124C04C8624848208226A125424C08183B6A20024C122404222848430244428094414222421122193421614044D42194218084020022C0220000482822880041884B848880082A084688B4E40A4A22022902442800800465420200842022242282014823044323140428428082228282868224810668288004800448 +:80848000484934188A1404BDB900100490184C14140440148802482100100121111122172120842242624400140044206412004081388400220028002008EF9C088212A042E024112803490100428061424A11840200490210A22420024100004841000010040080B884221404182021246C124FD146022100200A8001182084430458A0B9 +:8085000016009042484C924413011211442A44044C4444844434144C4224844464484448411443A282488443C1C44110F49E77002688020042468882042002000014466142114410411114044814000000000040046A086811008024282C2802007FFF0F424042040018441842229012298563828D320020040022281230141A32112264D3 +:80858000C04400285200220048200848004C8282020048BD317012081A4482049044624A0244418C2202000013942671114C11810C15040020844228C241122621644440012244800200000010025F120B4F22A4294CF222244638444A3428C042204236426815A2268C011B224326025D554CC22713D4421684C4252AD242064534242641 +:80860000A4224F4262426E244CC43436C52411EA38414744424B244B68223AB874A44443D81498144FEE4EB242121824143238CD241AD744F334144A857244A811413A94188B234E3146014E415F52A422111B421AB7647153A51212486245A242204434125E5148114890C422484BA8C84848224AEC8485B834AB44C262BFB40818222E88 +:8086800012414984B3227144A6464A2242A242A42B144A9144426B42D031D6458212722431446517A1724F1432641D14414A84D24186420128414B26624A26B6C48E82045B8AA6A48449A2284C63884C9848484FF306442200002002000010445184144100000000000020021001111001111001111001000084400884F0162CF044726FD9 +:808700008583F322262F44E462B356F678684B555AB45425E2E6F4564C6F45E715F6755557712B551F16F625271F14E614F667651F16C4331F77B563F731151F56F371613A056E263F14F441411F5232213E514E711F14E644E656C24115B1C4FA81211F5E2CF481C12AAE6E4F46A2DD8F8BFAD888878C8E88CF83F26548246F26F7367895 +:8087800049F32666AFC4F4283EA7854B557E747AE74525E2E4F6525A2B554F57F57151DFF3F376745F56F661613D611D215F57F761611F38FA37133BF65F13F761757AB631D744F46167A5F844641FD4F625243E314F557141F141614F57E317F565251F5CAC6A8A5E55CAFC64C4EAF464248F8FFFB8A84F6F7E86E48CF86E28CF570D6C80 +:80880000F312742CF32226EFC2F27C7E2F44F678683AB354E64383F24862A7212B551B658F93F17C4E7F57F721215F52F243611F14F465751F16F661E73F31F532743AF331755F57F634552AE262F6666C4AD64146F134341B544F42D251E245F17534AA7A41A5A64AAE8C5F54A4224F48FCB4948F85F574449A9882CDC44F86F7A8FC24EB +:808880002D36AF41D124F34626EFC6F63C3EAF86E647A7715E343A83F24C42AF25F516541B574FD7E5A3F173715F56B421D655D615F265745F16F665E33F31B1F6A7371F55F774644F53F764241F66F6262C5F54F4296445F534345F47F725254AF674345F45F52565CAAAAC1F1C7C45F5C4C44F42F2E4E44F47A1BFCFCFF8ECEC6F4CFC30 +:808900008CC64F86F6233AB024012A01238214048004400244484C82C42411446044114E242014C224114A22022242002220822482048220088A048A84A24889A2418B248283047F9809A228242862B028811604220084004A02302130254C02302510C424A021000000000000004A0888822088220812188048F165ABE022F41124C5F27B +:80898000112483F41124A7261D24AF24D141F24A9219B24A19F54A9253F24A9157822F147924D812F924481CF9244A1CF8244A16F1244A96F1224A96E5A2E449D2A2F491243CF4912485F39124A7141F49724AF18124AF14D141F24A9119F24A9151AF143924AB9443B242792498924F8284F9244AAFBA0727A21F41D62EB411724CF2113E +:808A00002C87261F4172687211D468D841B648BB15F64A8253E3247835A8844F82F4429167822D914FA2C5914FA2CC815F8225FC261A96F1244BD651869E286FB2A469CD438AF24E119A724EA129EF1281F66A954CF24AB128AF5429F24A9443F34294A6D842F922482D94AE5A3F9B088480040000420044000000000000188008800140FF +:808A8000014008480000000044000000000021F0BF5410922425C834C32421322220820100420000138202004002C014809224224F2401A021412694644449441444048001004449C28422414C62434974F304462258240090121044042A2401812001A312042A64412E44C0244226263224182444A0612A14020084601242488222C89065 +:808B0000C441880046088CC481F0FFBF80346681C0441622932240142462433048200184282C2222E141024338426C922426A4121D26281889C4624A4184E24442C8441C42141424A21E00414004842449A41A43F568B9100265E241120800412818480000002912054844482002200100444D421A02284004444024848408004E84C084B5 +:808B8000224CA84244264804CFDF08200128004014A42100002042240100120010010018003024000012188400424800428220024881120081F01D6A00434206491684A2123880A61242189016222822148C766811080028F021146C7624280152681228224448281922828282044008C084A041412684944442FF55078041064C44044C34 +:808C0000818223842284016B1244384011F8284100400120A225278212905448200220813221A02448004200224908C0148024045B68004902282820823214208201002002282086110800226051444100222818206241488420022242008608004289054302C4485F7C0D814382024220A41280912218281142003800902218485648042C +:808C8000324148142021224722A324184C04688184448924044C04C918040042443822BD3E10824494242002C02446044384312820628510982800412D241220850420D1410210880142258422418831418182412888202201824460844812CFC30324002052422800002810020045220190180000918126381821814004001301840028B9 +:808D00000040010012100422180048DF834A028092242822686042642818102824C2586C018C028983018C048B412E182250128118443220012564C6188C86415884481420043A48442498244A11A86170FF0D86C22441602444A021A04180C61211002092180040B4240441144885C45812430222422C81E2122101008C6214908848300A +:808D800084508418000049042AF48DE124282A010028180020810600301400284004104408302C00200211C018122220426442144848620000448084120CC1F0B72E40022C0228446042263424C0140024382228221880C3240041182840081218000011184C122404461404440011001200202424F5E9B520088002180000221818001876 +:808E000021800200180000302C2081020000121084011004000000004C011004F059FC000000C0241812182014848201806181606320624120111424011004432101C04520011214A024304141110000C0440040F4AE7300168242222201444C0248002141A02100001840041400182023810214800528C02C4889028D24280010842118EF +:808E80001828024440F14357404428014480041222182082020040A42100A4000022000012004081260100200210018C420100004C268404DF1E03252242026042200200284002002211800141400414471111490100000040110141111508408802001200001004CF3908200822004442000012128002124220021800414508800200006D +:808F00000080041828412220041411000048800490449B4340488264244328880210244204282A011081618430243184181588D9810181114001124D18800485018180048942148802100830440021149FE10A218728122CA22A1841184391145AA254006301282A01263824674226494C54894CF1141C8D1426081260411F111124812120 +:808F800031184F41F11C44D01956488189145C18008D9430444144484D454F44F4667C4024CB2222414F414884E6420122223012282CA213125A228183C214184114412E2149524832441A0280A1141438174289024D24444B6428142601511810688166A442463448F0276C2426923223924225A4226A732484E24282A1214B13C0123AC9 +:809000004194214F928127A1114F21120447418711113629C111382A010015F811241B4245212276293164226A3461104101208184364C4180F178FE4004442200480080040041244301518100000011004440044440C4114414004814488004004110041E4814844008FF1B0E2CF236344F61F326644CF23434584D241E344D243AA36786 +:809080003654642F21F134264B215F51F175558F87F3343636F41D19418558448F81F1111D1F1151C45F52A3324F4353445F51515145FC34355F53F321218F83A3228FC6F6292885A8669F925641D5CD21449E948781C7C14B222E28C5187854F89ADBD066F276744F63D34616F434342AF714344D241E344F42A2331E3665F616164D1646 +:809100004B111F13F371514F47A3326743DFD1D1CC51C85F58F818195FC3FB1C118F82F211115F53F324241E119F9151514FC1B531A2228F83F3282CCF83F36C6C1F1252C8CFC6F269299FC252DD55E541F1989CC7C112DFC2E2E6F64E4C85F4461C8BC4F024266F4367222B2245E443A3554F42B214D144E247A7761A7314D646B136F304 +:8091800032343E311B448F87F334346D34DD3D495188DD8D8F91F1311D1F12E281F1313147513A03179149F111551E113AD344F23C3C4AF6292CDD2CC5EC44D699D611529955054B998D184D144B2289944E8C94544F1C022F22F232723E32272645B434E345F524244F43B124E245A3364F217112921269F112142E315F45F45C3C3AE305 +:8092000043F33D39C55CC8DD8DCD195FCBF13C31CFC2F211113E214F435345179149F119155F43F23534CD2DCFC3F34C68DFD2F26525C5FC686C9F96D69D52DD15A111CF89D9CCF148184F42F22824EF44E4E4F44444DF740B430223022302411222122212002041044480220100408481921428490149014901189014800143024048012F +:8092800014001008830481F091C420880244412800181604281812642218802141343489014018081220018021011260418190181934482004814004852441840400F05376D022F4112487221F4132481F41324A1D64AB141D24AB9419B64A19F54A9243F34A9143F24A9147822D914F82C4914FA2C4854FA264114FA27498E5A26459AC56 +:80930000E449C24A1F49C2421F49D228F1912483F49124E3F48164AF14D141B64A9961AB9451AB9443B24A39342B944F82D442F924484CF9244A4F370F2FA2D441F62852174183D641B22AD141B64AD141D24AD941F64AB259F24A9243F348915392BA4B422D917F8294922E5A5CF925CA1AF8214A87491F2264492E4B96C54A9E2CBCE475 +:8093800048F628539674687191346E8AD41AD141F66A941D44ABB459B24A39B4AB144393828CD442FB22482F44E9A2354E008004000000400400000000000080080000004008000000004004280000000025017F3602962202414981022AD48421321200184212160481445CC16480022230284D21D04201908841808201261104004008C8 +:80940000120042009028288482F0FB810086240800980041808201001128608240A841844141001A04004C042084110480011400004241400493024442881483E2650412660448412892624126341428262481844101847015528458324443088149034C1141C4888160854301001001100C2E544120042830242E424061837FB50F2420D9 +:80948000488401008901218001004C21024782A0424008222062142400424084840260121604000000004150814008868808DF7F0E00400412800200800100000000000020020080020011000000004200480000000080C42800288002490244200200800820820412002E4C2822008004488024211402008094241A0488280088418828B8 +:809500001244203284445F5A020040044B21604200001820088022041800C3022820024200280010030080442404C200004480821104604841A80022800200002200000000000080240200008004421242000000281800222024088800002820F4A3230000000080010000001200008002840050482A04288100002800000000000082805A +:8095800004008200DF594D828282420816081008000000002024814208411054480010840100004084010042000041100400408424F2314A0000000018008400401102000014800200000000000012410018002800000000400400F0A6DC80024008890140088400002100202401262812045048A0242082010080018021012002001024E8 +:809600001884044400003F6D0721282200001218000040011800001302100844504800418100002244410000480000000000308442223C0D0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F80040000004004280000002B +:80968000002180018800004001400848000000004480020000001002183F5F0B0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000006A +:80970000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE008B +:809780000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000100400000000280000000000000000000000480000000000000000C4 +:809800008F6E0E00000040080000000000001004000000220000400240040020080000200A200400F0815B0041188011280200110000000010048400400848400200000020028004001200800840084220047E2A004400004008000000000000100400000000000024004C02200482000020A882000000F0EF8D0080011884220040010084 +:8098800000000044100800812004282100000000000000120000008148422004EF620500000018008400002002803214000010140800800400181A1284220280046800000000282A0410089F570DA02180A2418C01224160812200000044284C82246182260441604622130443644212002200224A820200A048000026A84188898804487F +:809900001BAB000080842101000000200210042800220084208602424822002A21220280840248008200002228C2811008830DA012808241082244818321020000809234444212814C12440444601440148481014480828282042800480000814A2182280442AEB80042001008188400800248004180024420241204220011134404A042FD +:809980002004280000228AA42444624818420080240CF01924004344082244002005C18B210000120000001200000011202212880400000000C024200100000020F15AF8800100008400418428000048000040058082040040044004001800222848120000000032220084F0B49280018180124408844345688212800448188002501442B3 +:809A0000284C2204001142004C2202800120222224810420240148808102C884F05531004400400812000081000041001004000022001044240248002002008082880620240180024200F0C6E8000018100C000000812014040000000000801404450800280042000020049048000030480022F051AB0022104804208212080028280010A0 +:809A80001C011018011018A424281005404141014A1291412004141C02C011848400000020F4FCAB0000001841412A0449820280040000100441000040040000000000000000484200488100004822AFE50B00204204001828002228B0451225021008486880044828004262814848804408224218428C05220080428822260228006F1DF6 +:809B00000B8248608440C828815618088484812200000000800442100480440480040040210452301438168421812121014A2121011CF4BC552021A14100001220040000411044040028800100004844801668820000C0214228004442800248000022009F3504282228223820110400000010C121004001228413044C9248190683922825 +:809B800084131201282866A1241001111312111858818382A2424822284828F0AFE900102831184C312489034A32288400000000402422010000445428000000110080014A0148000080813118004A015F8D0F26082A04200200004C022848198202800210624418802854411148C0418064822248008460828002CC011C428141C84881BC +:809C0000208411028FEB0128F228814B3187C1442E345A436842890284224B4441491208844470248404008CE25462544D21474685A8440028116822808281826382814295A1216AC4588185081AE31224B435048032283E288149B1182291482A12688281A0641F4212410113024189840280F424444F143421484E448C8694281D411C4E +:809C8000022A12B14126F4515842835515905483A11226D888A1266AA147182238489F66043220A114442843528C228B4428801208145C22524400142AB25144E8141428644249146482812815A1262290484641996180D611A5421B71421D5984890183818423862484F2BD8C004088410884E08104844008480044841426484148414893 +:809D000041C8218450850000005018501810281128011E481412200112202124016F17071AA33189A233CCF134342E2C47415E58488CA222260C284D2445F4212581911B22C7C29D21DF42B221528895511DF028288F86E646E646A6446AA6662A52882AF261681F96F649499F16F768689F94B529F221291215D199F128288F83B228223E +:809D8000E58622A5263AA222EFD6092AE282A6223AB234F224244F43F324344A21B424A2224480C22445A4229511F9292AFD2D9D21FF47F729289F9C5C19DF165C8C9FD2F26D6D1F16F64C6C8D488F84A4662A56889D491F96F661699F94F449414AF4414195F521298D2895D99952888F8252886A628446B262A2442B555F7608221AF7A6 +:809E000028283E38CD1C8F43F32C2CC7438F87B728F6282C8B228D2881504445F4252545E812528877524D2C4F5657CC1F144CB864F44D495F46A644CFD6F66C644AE482A6221F12F6212185A8228197141F92A3371D119F51D791A73117919F91F128388F87D388A1558D187AB362A513188F290FB028F228288F83F33C3CCF83F32C2CBD +:809E8000CFC3F378788F84F6282C8F82528C8528564445F5242455ED1202ED2C5D2F4F5657448F845C914B4E5F14F4296D5D45CFD6F66C6C8D481D486A7621F129291F16F221619F167249F151595AF159599F13F731798F85F118191F93F138388F87F778787AF778787AB372E723A7549FBB042220024901490100220000C024001008D1 +:809F00004220142114411494282004421400004081044822004814840028800228F05D432008002A0118281848000042110000003024000042A024430200222002800600408102008489A242A04200281CF46C2EC0421F4152281F41B248F11124A3F41124AB141D64AB9419B24A19B54AB924F44A9143F242B147822D914F82C4914FA2DD +:809F8000C4814FA264114FA264194FA26459ACE449C24A1F49C2421F4952281F4932481F49724AF18124AB141D24AB9419B24A9945AF143924AB9443B24A792498924F8284F9244A5F2A08ACD541C6521FC1A2141FC132421FC132421D4C2F44D9C1B262D985929A4B42AF1419F14A945392B23F82D44AFB255289F924C28F11D824F4980B +:80A00000215F2264494D4B8F19E2227491CC4A1F49C6439E2C46F1912C271617C9271617C12D841FC1F642A15F81F64A8143B34A3834AB8443B342783698824D5A3F850C840040028400004480020000001002008800000000840000000000000000000010029F2404B0220129830428001800001045148112212104282241202424212430 +:80A080000222414812002242424818001C0448002848CA822201128394C700821200841200100883040020022284288044A84230244382922148C144162202182084C228281024084A08802209008334141C28F234A9004A22B122211428010045088B4280424424822262A1222061824B2C80E242A4121B42190249921C424A012024C245 +:80A10000282812414968142A0480A2924288281E4A441876F898FE402201002002200100001110011180042A040049040048850430228001224842480000884800004A02208108476400302200000000000000000084282A042242481004301820011024611215382884201108004008220000003F9509806181188CC13832C0182A012230 +:80A180008024211219E8840248380011842812222026239444221A0228282004326285015248830882004880041A22F23A15001283218121A31200220020042814844608200240618248421084A41246082822001091498CB218221409121008830880044280032FFE0C408202818100898101220018400822209418282A048022810222ED +:80A200008031441218C024382200202211888424080022000080F27E43004810084088021880412812840300834208B048220500842840840118814142803518480020084422816A61820022808122F51D11004880228101180018411826084028840100812081045200904144892212283248814004490148304816644200806182108809 +:80A2800002127B362001000022608142A0240000200230140080022002442082044112002820828202180020082004001220048DF820011008002A412824018C410800283028160481682248804288024C96148141184481838231244AC2148085086048842266088430183862F0B8B6000028181283021812A0610044328148181008406F +:80A3000028048005410042221A0228004216082800C04818001A041228220080B4930A188C021A06188002A0412001812212208184060000848021820118421828181200400818C126080000284400488001CE478002288422842884400820020022001880028110080048448410080000840060442842120022128412A0218002F0996701 +:80A3800000208284011088C128000018008092281280022004004008410060822002262404101824220448282818000080B6220A84000028000000800148200220844488840180048480840222228004100838000080020022008004B0E4078A021008812838001220018022031241800220040018281885840118A0251830242042182834 +:80A4000024618300000020810440F12BB120012001000080040028002248182800802114880444484248422004480080044C0528482868A0420000282002FFD30D008190281281102801120020011281002004102844081843A212B02801180000002002004C0180018418802102F0DA2300280012220012188001128981011822830280B3 +:80A4800002480010381C15684126A42120012248263428A012284420242404421881802282A45222CF56098480840200182002448984020010082014A21418184A0820A442221C042A440848104894288304628354488022048122000021F073E420628889E28294181638288483618158128B1420218523F128188C25A1248C3248B04822 +:80A50000152824B164F714246AF1142489218121242152848B22488C9238C4485E181842685AC1281684A1232AA54414421F860AA022A0142A9228B038028B1280818231282A03384AA2214A84840440081078187448F8144C423E686AA2418B332A81241264843AF444446A6484A04248800289021828A016F0F92EA03120B21822A112DB +:80A5800028181828522021C118202322312C2A2222A2414A044E488C8441E81295282A2584A12200D04842BC28921832C9F228348B624304422AB428E1820120A4221AA2225F2D0100842284400816080020240100008002004210082800410020020041008400200148281220011200F043CEA0236AA222381E18E082A2238CA1114AA5ED +:80A60000118F81A14587817AA7332AF338388D584D544AA44420D4880489F418188FC1F15515188FC4F158181AA7551AA1232A322883F268488B62CCD644F278788F8222A5444A84B428B228A223A0417AA5576AF6E4FBA0232E68842A8682A2223A83A1114F45A5118FC1A3548F85A5333AA3118F83F338584F6131428F84F44A584AF4F5 +:80A6800088C848C88F81F1181C1F51F1191D8FC1F358193E785AE581A5222AF22824CF42F268488F83F714744D648FC7F72828284A24A42783B228A2222AC2622B555AB562F7E18BA0232AF628288D388F83B318F328288B238F81B138E341A1118F85A6111AA1763AA3133E188F83F754542B448021A4C44E488F84F418188F44F5151560 +:80A700004F11E145F138181E685AA5513222CD28CB228F84F64878CFC5754CF4785C8F82A3354AA4442AF7383889A1332AA1132B463AA572FF350490288F82B268F238388F8153888F81F318188F83E341A111CF8585A1553AA1111AF118188F83F754542B4624A0444AFC48488F8CF41818CF47F5151D4FD1E341F339183AA7558B313ACE +:80A7800021D2C8F22C2C8F86F67878CFC5F76C6C7E788F83A711A0447AF738188F81A1333AA3752B663E522AF67569A0120080010000000040089028120000810010889128224220840122302420A241438224C2488004008428A024A024F072F120082220022A21212201800118800318844A028B2484C0484220941480654526280128C0 +:80A800001810481808400400002A140800428041F18DD7C0421F417228F2112483F41124A3F41124AB141D24AB9419B24A3915AB9443F24A9143F2429147822D914F82C4B14FA2E414F8244A16F1244A96E1A2E459D2A4E449C24A1F49E222F4912485F29124C3F49124A3F48124AB141D24AB9419B24A19B54AB924B44A3B242F4479249D +:80A8800098924F8284F9244ABFA209ACF4116426F2116C421FC132421FC132421D2CAD941D64ABB45F81B24A3924AF1439242D912E482D956D482DB14FA2E514F9248A8F11F8244296D1A5A4294D4B8F59C24A1FC9E2A2F481448D521F49324C1F49324A1F48B242F1112CAF44F91124ABA459B24AB934B44A3A342F447834B842F8364830 +:80A9000029F9245A1F310F848004000000400400000000100200880000400140080000000000000000000021F061250029014C022800222220014820828126812414082800004200002218441008441884401C08124200220000809424F0B3C900A2CCC2124840A821844038288C81014200418416248222A4246280226142904410180404 +:80A9800022448921227441A421008384648120741234348D6448414B4160114B24AF6F0B20C528414222842AC1282245688236280428186041424502221A04C20048001304899218444A12084C2264145048814118360846922412452844E421044B211E4497A8408212A4212100000012200148A04240A8142608224A220222124302410A +:80AA000000440041160812C11A023048484200124CA24200444820F25B9E0028210020028110880200220081A024200442000022444183014A220220B12441240680042044082220C21449840281B0A701001200228023011A1408200449942822284422282A84820628388004624112882A010028440084C84800904416C488A8208584D5 +:80AA800024F2E56600281800222880014A8102202412C42822222022A6424868802283820456188422A22180312422220048000030249028438A84242404AFDB0B0021000038811048080080048130640020020000444128A01488002011644400814A28244408484C21881184038128BF1A06A042A0120048810028402C024028040000C6 +:80AB000080C48881004860443088488220044C010020842444041A044200008A0183F51DF300482820020048004244222002414008444820018A2404850428490410882401604181121008402402004B1488184800127FD404246011004034148418000084814100121248200400000012184400000000202301180000001240082608CFCD +:80AB8000EB051042A112226044C96184182800102812684490181248800484898404CC0476C45482420012406441811812568804001A044241828084992883F4EC6900282A010000008014084048040010240442000000004508880080010022001A0400001A84211108002F3A0B000028000028008100000020820420420400412002002A +:80AC00000081418004401414884408838404000000424FE40C00810081890181302800008120120800488044080000488184480000008198485800180080210441188011F4FD6100009028180000000000100420120848224842843044002014880400000084A014801404418100000084EF680560462004200100008002008140080020B9 +:80AC800004800240044C0242400420848404188444408401808484010020F11A11308484200100000020140880028305818092688182444120048C3448000044848304C048000000004200840000AF1A42420884608128844008844480440800A024000000884822C084490200002004C04860414412202104200100430112E0E5072280E1 +:80AD000094283018302830884318180C101808408818A8840000800448008088080000804188051889140858100418802104CA4AC2244100002220020010882202812810280A10C814432482648242444842001054840060844008008C84030018444924246445BFF90B8428482041040000448002200A8004422302188100282002548197 +:80AD800040088C04000048004480820400004018024D12244D24834898282AF3182C3E188126B828588481000028898282A422484A22A422CE1445142C44CC2466742404200C8147448984E484A4D1C3F1145416842191184688A14520D18431148C2191147FB608224420010000A082008428840020146888C0488B4441422A02209464A9 +:80AE0000895488CE4800448420048484848448C784CC0444B04404444248484C74FE0B214B6281428781188128811008C784831438288B82C48F847128C88883A6C22284858884A4624B464B488446A8440041451828048183E444354858802584A7448C0118C014A01483F5775400001820020000800484400848892218288802810000C2 +:80AE800041008188008441484008844100842001000000004F724152464485F838388CF23C2C87838F8272287828F888A88D2800818F82E288DA88E285A766224EC8F068686E484F84F444444744F068688EA4CFC6E2C202CAAC445048F0484848833418468CA1155AB158A5555AA1554AF45454F01C1D4F44F418585AF544447FAF415223 +:80AF0000444FC656888F835788CFC37138A822878287824CD288B268068912F888888D285AF7486885B24AAC46AF8527F4CC144F44F424446AF46C68CEE4DFD6F464448F947448288444D8C474482864844A3448CF45E145A1158B771E585AA7444AF41454F01D1C4F65F51A585AF546441F5D487226F4246485F838388F81F23C3C8F83EF +:80AF8000F128288F82F228288FC8DA88821258888B228F88EA82E287F76868EAFC42C8C88F82E786F444CC4F447444A4628FC2E648FE6C4D47C68F84E48CA88C4885048F8484B448B4C8ECCCAC511E14F058785AA5444AA4444F45A511CF81F15454AF81A5444D544EC52467424F4256883AD388F23C3C87838F82A2228F82D288D288B21E +:80B0000048B448742858888F88F828287AF728688F8EFC4AC86EC28F86E786F45CCC4F44F424646AF66C6CCEE4CFD6F664249F84E484A44450CCC7C48F84A4448F84B4C8FCCCCCCFC5A5111AF158785E187AA5444AF454541AF11C1C4F45F51A585E524F44F4A68D30260000200222000000800228100828100846044A02284322044200D2 +:80B080004008008C040000480000004400F09FC62008818440981884811008810080024008A024004800004E24224484000044800490148C0412890120A1141218121880014F2E0B2CF4112487221F41B248F11124A3D441B24AD141B26A9921AB9451AB9443F24A9143F34A95478AAD914F82C4914FA2D418F8244A87114FA264194FA263 +:80B100006459ACF49824ACF491244D421F49522C1FC932481F49364A1FC8B24EF1112CAB941D28AB9455F84A944782AF447924B842792498924F8294984FA2B43904ACF41164872215B46CF11124A3D441B24AF18124AF465141ABB459B24A79A4F84A1136D85AB8A4F44AB163DA1AF924528DB14F22FC18812E4287594F227418D534FC89 +:80B1800098252CF4112C4DCA1B694D421F8922F4916C23D4C1B246F9112C2D841D6C2BB45F81D242E982F4429426F84A944782AB9463B24AF9241A5F9C0E84800400000000800200000010021880080000140000000000000080020000008125013FBB0D4441800200441008402804004440A824814248C024400846A824008120240200D6 +:80B2000000428384081200001816284C240242411F970F2048040084120081201888018902C1005084284142285084284122004604C0288100818022840248428144838444014D18874494F06158403444442200844C0181C19088838403844484E02214984448444B1C2210EC84A242190281C1424AC228000048424A9824124242894293 +:80B280008414881454A4C3D4183414EF2F02000000000000000028404408102802224008400400420040081008830200000089A1411C083800F01B942002211048088481000000008444A0148481844200000049410420020000622004008882008845188884024A027F970D4A01C02212228C81026A21E884010010AC42818306522A0560 +:80B30000286230649024432202440060828332284008414B81A01812008D14CCA22C4A02488904C83F94051800102A028181528884000041688448121E4866182804800444414400000040084608488604988A81084D1849F284680068424888DFFF044A02212818818981022280050010481834284280012868902480222243140422C02E +:80B38000288C2202281084010000C088906842402822F477FF802146A41248002218818484162402811400C48128002828200220424444C442858241889228421200442042A41283240130882826A81489A46177D14022542880084183010042442A0422400824103838211200440000004483084280018446C44822818941742408228203 +:80B400008001488230181F5E44020081860C008142121884100C4841442001004884180000222422000000002820840500001244800100F07A66D0220185B618C24840A421128184464888442C92410085361889C238A02481124C0200282422488001228C216481418C6444818C024D1880A381448B8128424A0183F4F3D1002800410043 +:80B48000848148181218008450844400000022000028414441442D82100822006880A2141200830400209128828324E2B2098001A02484802402428021A14189011212008002812004004984A141C01412188141C447844218008184008322044C0896240240F4F44A80022812808401A01622481008A04200A012188002004E321088221C +:80B500002402289024A0214820018002280048418988042A04484222EF2D4E020000100218180000000010045822002001122200440042002112002848200648000000100440F84B88200148109818818906488032688183122821022242006082462A04A400004C34488C02200428188081C1148364422880911400189884002B4120888E +:80B58000012003008062821241420084802201840000200240346C4480314444C0244C84E1820448008004484130A44C232A1488054F6B078420018190382222004481188100180080142204802104462426015200A021004880258288010080848104800920F423C38042880200481800124200A0142A142484042858808404181AC418E2 +:80B6000012802582828193441098280020C4882A08882008848248288800AF1D02232482A161181200004420018004480012001842008542021084C2264841200218412822200F004A28084308444144821441AFFF0F16488404604222A04180644148281A242201124242212180128808891204281412448C12C85418220048288042A4E1 +:80B68000182818188C14881401422388F1A43CB022E749A12290288D5689B32824A4428982B548B45881B418B428A61180A344482A06878430428CD388D4C2E243F254144E4447433E644B444C61C32F41C244160C586AA4962AF328284B74808DE188994C4CE845C754C246C1242F350A12898281C21860854A810142221E28848F878110 +:80B70000A11149A211442C2282012A76488824E4211204844B322443E442713488332422CB222828128A74180488C88441160462AE81BA8AC4C1814F314F0220A1513AE4812282A2235AB3242595140066288424A6441AE185011A06481AE12394128B414B442A26A1748CA12128414AF15C184AB4782587A2218CAC8420A8245EC4C3E47D +:80B78000CE981441418D88184B411D4520240222208204482001008002800480220110080081490141003024302484490100608800200848448A040020F48D89242B114741008788CD2C8F86F66828A0118F87A7778D188F81F148488F84F558184F47A3331AA1118F83A7554A048CA4448D582F25B55AE544F4585C4AF644666F41E34523 +:80B80000053AA12283F474348F84A4555AA7758B3189A299CAA4514F41F51454AABA34F33495CFCBD988A8D94F42F2CAC5243AF314742A825688C5FC28288F83A355528FC7A6778F86F518188F87F768588F86F274347AA65524AF8724A145818BDDF0189A2FA57522EC42F4595D4B644F71F4766C4E444B441E344D648D442E3887845A72 +:80B88000A5315AE7CDA7EC9AAB4CDAF154544F4165484B7B5F4BFB9C9EAF88A8DD6F46F32C99242B774F41A7221AF24888CF45F368686AA2555AF1486C1AF748785E588B448F86F178384F45A5517AA542AF82A6774A054EC85AF4387A2FA5F75E584E448FD5E544E664F4161C5E144CF434142AF258684F45F758184AA2446AF558548B3F +:80B9000064DAABCC5AF5C4D44F8DBDE4BE34F384944F49F94AC89AFD2474CE82242B764F41A3225AF35818CFC5F3786887867AA5378F83A7738F85F518188F87F468588F87F374747AA7576AF47A583AA15687828F85AC458FAFF7527A6FC3E346F7585D4F47F775666F47E745D544E642F374248FC5F6447C8F86A7764AA3778F8FBDE866 +:80B98000AE9DCAACDD4F45F5DC9CCF4CB8F4FFF4F4FEF4AF8CEC2DFD44646FC502218001188C842121028004480000200120048120849128292124024B12A0120090148422482248228E488004480044928D248200AF15070000424883020080140889A14180840100422200004240142404461424118422840212200100001285240200E1 +:80BA00008420F236CCE022F4112487221F417268F21124A3D441B24AF11124AB9419B24A19B54A3924AF143B242F147924D852FB34481CF9244A8D814FA264116FA27498F1244A9E254D4A9E24ACF491244F22F49124C7221FC9324E1FC9B24AF18124AB141D24AB941D28AB9451AB944782AB9443F2429447822B944F8294984FA2F4B565 +:80BA80007E7024FA114487221F41746C321183D441B64AF11164AF467811BC4A9A25AB94412F144BF842B54D48ADB563D312FA245A8F14B924F818816FA27498D124F488254D539E214D481FC97226BA91342C1FC936461F88B242F1812CAB141D242F44F1112CABB45B292B844782AD1432257424B84A7936B84AF92452CFE70184824871 +:80BB00000000000000280000000000188008008044010080040000000000000000002501DFC5062C34142001A18004A280842401208284B21C2401490240224468242081115228282441003024424142430882000092414441184142289F940A188A6242C11A828202128440081001008C014A2204002284424332284E22224624440428CE +:80BB8000242002222A044E28228B42888004221312A142224049F46621C042430F16EC224188228431A84142220000423846EC230420018602D02464821217234C64848D2424660400432214042E8441222220048A23024C6622C049321FCC0418302400280000402824410128102801484C022032488C84024A120224004002222082263C +:80BC0000C448228E48880000455141801104414BE90011001800A01200001028010000200400008004240000440000401488A2840000000022A884004F8E0F2A8112C23428623064608428000022818B1480829628002002628012241444B4240422902C8012E48423B28C24810580B18424688148433144432642F4D8B18041024923822C +:80BC8000064A221288020081186084002A0448000048801224440444C0245048200242228C88810400428880044CC46C00178C2062120012004118480000804228012260820080022880041012A42400200240C43C8166A484120012860489012E142A082241BF410A184A0181844004848110C82800301100810084481A146886890442AF +:80BD000048C9C228289028E08532288481284444C12122CCA8821258460480210A3212FFBA0F2004304422004AA21400284881C048420000004B214002488002480089840421444C41882181223A48442A010030144C064024F175FD0000122001000000000028221741800C8100200281208101000080028A24220400480022824483028B +:80BD8000842A18088FA3091800814784324160848410488814088924028D15800C814C1668A48B2420247418E482250248C038A3C2248D148C8E6144C18AB248C24888181A260489816282A84781B0C8032001120000221A040000C0114828001088048002428428220020020081004C828112028812004C18C4244B418880029FD60C21EC +:80BE000022212222002222208212088480228424240268000020D2844248180410840428810020840C89280800004084812828F41B6500106884420040088311084608810000000010080000004828400400E08482034483811308200228281A021812F0966140224102902842002200002002000080648220028304424C04008022020040 +:80BE80008D2428006848200400810080A84200BC4302200181000042008006002A044A022280440826880200482810480848800240B8188208883694882008490818482036A43FE30FC222802284042210880148840048000000480048282002284884220022008004430428424842008A04480000F09A32404898424008001840080000CB +:80BF000000282002208101008004410000000000000044008A028004402408122F340F28801288026842288012480884812200008422840020841434288082044122000081528181411200168822011888AA8101F03881C012121800480040080000002228000022812289142804448F4234440040248224820266684349220492460800C9 +:80BF8000004C1AA4429A34E4EFC7082628E482046082268864842A042604282828842094288012021881A800A0244001C028818C2402000084A22E44818A0288A08482426210028FF6022B328B2A2F82F328486A86A6262AA42689E283A222008528A22220A266E08222D4880228228B6448CD642AE244362446084128812A220226B81845 +:80C00000727844AC46BE585E88A012288084E1489D44D2C8F076CEC04229211142688248288961861860848C844238486842A022A06248850885084A22724854844C86A4222826AC224828228B248CC5784BCE452894148F84882888E9488AB224E24881AB174F4452AF24602581288183142844881458888183048902626884002007873F +:80C08000824A668220D484342842406842490440982C48624189A2A1A88B688A14A8824628A484127AAA4282BAFCDC6D2014024008004820018C04848004000010088110081024042002430222848024820486286281200882288A04122041F4CB99241AE52242A8228784878485A8265E184008878685588885784828A2468F84048578E4 +:80C1000028F838282E2826A8466E286AE64686D484D4445688C0245088228558884E482AF23C2C4F42D288FCC8F88B4CF01898A0D14AA4914F45F97494EAAA6B2AF253B2241AF1726285B828F248488F84F248486AB2189128C59C288D2C85D888722858882AA2228D4824AF82F26848AF83A7228BAA8B228BE62AE646964C5FD2F42424FB +:80C180008F944448E442D68822528887828B4489F77824C57468FCE8985E688CF41818A051481AF174B44F61B982A9672F46F73129245E522E62818B226E688F86F648482AE287A3668F43B328E284D68854888F82F268682AA4448F8404AF827228A876842E882AE286A2646E644E4C4D6D4D648F84E482C2244B6285A822855888842A74 +:80C20000F234344F4AE2C8E88CBBC8AF888F81A92A9AAD4EFAF95414FE442BAEBABFE4F5B74F245E722F2296288B228F86F668688F84A6228F87F768688F43B328F24C488D4883F228288F86A6624AF66848F02A288FA6A472848F82FA28288F8EA6646E64C7C64D2D4D249F84A422444F42D288A222008F82D288F33C3CCFC8EA8EEA8E7A +:80C28000FB98988F88FC9898AAA2D9AAAC9F4F47FBF4F42BBAFEF24F4EF47BDA80010080044800000000002880024210084280024241000020020022120000C048008004824420043F320182901A10880400841884810084002082220284008100484484284828430200C028814883C2448326010080220280A342384712CFC3022D421F67 +:80C3000041522A1F41324A1FC1324A1D24AB141F41B24A9921AB9455B84A7924F84A9143F2429147822D914F82D418F9244A8D814FA27418F1244A87194FA2645DACE449E2A2F491244F22F4912487221F49324C1FC9326A1F48B64AF11164AB961F81B24A5985AB9443B24A7924F842B4478329F93448984FA2F4C4ABF0224A1F41362A89 +:80C380001FC136621FC132621FC1B26AF1116CAF46D8C1B242DB85B6427924F842B14F82D41A3924AD916B42AD914D528DB14DC28F11FA244287194F22F4D82526FB98252E4217C94FA2B491E42274913C441F89326A1FC8941E1FC9F6628417C12B245F89B24278B4B84268892F44FA344829FA3648214FAAF523AD0080040080020044F5 +:80C400008002000000108202800800001400000000000000000000000021F0FCA200222210042220026284124812A024008428812242004302800442222A04100460894A32480020332888186082460818A0282084E2520E4A2208802112AC42A0422002002890188022A46820128406186826282221042242204282041A62444288C220CB +:80C480000442484449084430641441BEB2A0244A023014224982822292248322838481223618C02826828AA24341A24302304830512842892264442880011E2800884BA4222A24814448148411642A43044B21CF130B00220010880448420000000020C448008004184A22820242220000B04A8826C4444280418808A04283240800224211 +:80C50000702A0800000000628400000000A18002000081004828000040042082120800421A04848100008C0400F0AD528092124542025218180028284008582884200452284A12280681269238848086022061423014A061A042E2282E88488A84A8284328136448833224812E489F560C2412441082240110082200002800482200222041 +:80C580000284222D6889026228004C21022A21220468CA22B628058120988440C444222884684FF706224002200118628002400852401A082025821488440880010000004410048303002088243C8828A021C08884414078E8464204846180020043C12428283018402801008B421281128095144800808106898231444144228001802646 +:80C60000A24926084200823081422272350A200489324482204208C41228812002484142A4004A22010084002840088304460842C0218100860CA082812A688283024822492221D1D404001A820149C844181A24048480150448810012008002100842304822212200A0210020C24820010000424220420110F4A7E840042E18EB124280E5 +:80C6800084321842E082014849819248102424212291682880D44881240489A212812848128149C24422206284A06922D2891888A242892688868882B144B2D307210010C42441124216342800161808E0810410C848000012100880042B422002411200266181008100008A140800284984022F250D1E24412241836182830230242A040B +:80C7000042108886C4282A8102281008422268120080052844001226042200A084888818000080E9842804E02D0C0044284C941430141A8204484C011A0400000000001200452842880218001800C100424110288222AA840022800188F0B5978082222201812122841800200442004018180A2820220220220200840000830180021028B5 +:80C7800028014E182001A018004858AF320B425240082149031018C8248042041088041604184244800400480000482A01412002418088018042849388382A01A0218183D23E0E1E44402482220683C2242238224880C12826A812802382E386012818122A21921830585A02001200001A04004788C08812220000802C04F0C36600004C0B +:80C80000911A444608200442A0218C0420A441810020040084442001200200488082C2282604444004200180281128312843A2241BD8004723844084011281411008002004814242481028A442414008844C0243810481490141161424B444A2434A9248308848E818261888722884286888EE5E102208A0822502201118488822210218E5 +:80C8800000423A24A1248004800100008084840422424200184A086A010018810014286012F08BDA4008488084941441482044044A0260421A5448128181A524A212B0488884A121482214782284224934141840146842121844A028861868481668480082A3056DCEF014544F69D248D24421272436282E144F4411984844529048C018D9 +:80C9000089F248485AA7118741684B4490541830244848481818488902124A32144744284D144A8CA44C281A28A822848C0B11A0288F12F92868BE98A0248A34248B238AD76A87F21434288D288CE382024852228B128362C532C782A3E282668222B02862831E18123668433880024245041E18448B234742224F4161818381B888B17870 +:80C98000A2D9818116AC18CBC4D88E294AF8CD5530222A0124C57E34F81E1C7058A8426A24A44718CD784AE244A6655838C0684A3148287A26A56443D288A3248D28723E646E4843A4131AD1447324E4820646A8648AB2CCCBA883094DD846E84929A3B23E88BE3866B84484F1ECD9244042080048A04120010043014508413014814321F8 +:80CA0000140449014084614418460444182002188400002200411004438812143814F05293244F62F23236EF82F23436EFE8F236242F42F26C6C8F84F22C2C8F84A666424D144D244F42B27CF128248F47F22C248F86F4687C2E4C4F46A6224F42F22C748F82F63C2C8FC3F23474C5FC24645AF444444B444B2247414F43725CFC1C3C4D02 +:80CA8000284E484B33AAAA911AA19945F4DC1CCFC3F31418CCE248781CBD98FCE4644FCDFDFCCC8FCA42E247F6787C246D24CFC8F63664EFC3F26C7CCFC1F33C3C8FC4A4664E24188F84F524244B172E747E34CF47F36C5EAFC6E3C2F1643C4F42A2FA8B73CFC2FE38288FC3F2646495A93345F5644C4B444F8757444F43F36C2CC5EC848C +:80CB0000E486A637AAF8549C3AF31838888F88F13C3CCB993E348FC1713CFD14462BCC8F8AFCBECC3DAEF042543E748F82F23426AF47F67E24ED3CCFC1F12C64CF46E647A76628188785CF86F6787C8F82B36CB128F67C7CAF86F734688B764F44A4E689F53868CD1CCF82F2185C8D492AF674444E484E442E644741437154ECC1D3CCF2A4 +:80CB800044444F47F764644E446A87AB119AB9ACCB9C9EB84B1287834FC7FDEAE88F8DFDECD8CFB50C2F45F71876AFA2F21E3CCFC5F77E2CEFC1F32C3C4F41F33C3C8B778B2643D444F15C1CCF86F6785C2AF76418CFC7E786F56A384F83F56C4C6AA4C7CF43F1BC6C8F8333348FC7F554753AB771F5644446E443F714144F41F1743C4FEF +:80CC0000C3F37C7C4F46F674744F4EFDC8DC4AD588A1914F48B9BCDBC8E883F32C18C7C18F83F4FAF8CFEBF9ECD8EB6380010049C14849411844088C041A048480041281120000008011081024040090148422482008860892608820912892448281F02AD2800400401424018400008004B048018148C0488024014008A021224249041853 +:80CC800044C12800221A24048901421608848100224441BF2E052CF411248D121F4132481F41324A1F41B24AD141B24AB911B24A3915AB9443F24A9147822F147934D81AF934484E914FA2C4814FA264114FA265192E4A96C54A9E24ACF591242E521F49D228F1912483F49124A3F48124AB141D24AB9419B24A19B54A3924ABB443B24216 +:80CD0000792498924F8284F9244A5F1D0B4F82F411446B521FC1726AF2112483F21164AB121F41F66A841F41B24ABB11F24A94322F546B822F546B83ADB52B432F54EBA2C5B5ACFC58A52E1A9E254D4ACE214D1BDE21ACF1912C2E5A1F49F62852174983F481646B141F89B24E9121AF465941ABB419F24A9422AF442BFA421445B84ABB4A +:80CD800036B442F8241AA73E402888040000004004280000000021008008000014000000000000400428000000405412D0BB0E208203902C498102181222184281A04180042004A4008112202104322084A2121618040028848422200488462802009228008FAB0AA018880012008304008304441880A2214A62822218222200224424006E +:80CE00002168225200202101800598C088800189046081D081C511F0E69900C28A012061418084911428221088A141222A25428284A1212322480841124811386889A6434A618141002022054B12A0488012A824008C61293E411C21F119AB001A2202C02C801208008B1448440000488922028400A0124002240000280018120081848802 +:80CE80001008984881000084002F110480228202288002288002002242224A082002430200222002000000004200000000000000003048F076BFB024111214342412482002120020042608001200200243032604222002224822002001284822000042202882040082427F660A26022800120028800100008304428001000043020022002C +:80CF000080022200480028422800004880888204008C041FCB07498112C4244C82828402289024282024822222082002438202122226240220022004008001000000000000002088F49CFA00440044208402002800420012802202208822021200002220040000000000008446010084000081BF294A020000C12001400818002818488406 +:80CF8000200144008002844248000044284F2102004A0200004800188422103C1822004F780F0012000000000010841404008C0400410081000000000041260480018002000000004008425FFB0F40240100481800202201484A82814428C21840042828288481484800804484F21422412604680020024240018400C1122230485FA90723 +:80D00000210010440C2800810040044412004A02204804800100800200000000120000402824012281104808F032FA00444120020000000000002800004004004480020000000000000000000010482804004F110D2880C22441002002220000002241004312240243020000000000000000000000000000800448CF1505282042840200AE +:80D080002280128402008002004C020000100422000000000000000000000084840080E4EE0A30444422440000504445B424A2222200604240024132414B2800001001100842000000004120020000002C8404125FE60B4122002200000000000000000000000000000000000000000000000000802444F81DA510C8484384044100004451 +:80D10000444422280000002502292181298808222214111484818C24840400004014C424222800002054229012AFEE0784800400000040042800002002902222188088020040014008480000000044800200400840180A6FDF012880420422000044A022000000000000220000000000000000000000000000810020F47D720041400400B9 +:80D18000280000000000000000000022000000000000000000000000008142005FBA01851428240428000041B02402220000002662222021212A8A0200111110182824040000004141222200000024A4F07E7C40C828484800000040C424282A0240040010128281818808280014144048888404000000444428280000008421216F23011B +:80D200000020024100000000000000008002000080020000000000000000000010080048842F190D2820020000000000000000004100000000000000000000000000000010480880F4A9BDA0222E24100441000000000010042820322400202202200200000000000000000000508820648440F82716003024442002280000000000000091 +:80D28000282200802202280000000000000000000000008598484688D4140245042828224C02000000000000000028800280A2220000000000000000000000008508904883F4ECC770269226182B119012C0122582E8317111A1889659888E414E48D09114815489C14A764854444B244F4222E24202284514A4226722212AB11281B88203 +:80D30000092C5922881E1317118A689985A8484E48C048805488814E484F79076F2242A23212122180512229C8111B1119E88818D818242444591148C48588E4441494244322420428444584F222222418121A388282182592821CB11191818E88818924244408488485C848DF59090000000000000000000000000000000000000000004A +:80D380000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000CF +:80D4000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000004E +:80D48000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000CE +:80D500000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000004D +:80D5800000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000CD +:80D60000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000004C +:80D680000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000CC +:80D7000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000004B +:80D78000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000CB +:80D800000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F004A +:80D8800000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE4D9 +:80D900000F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000000000000000000002C +:80D98000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000000000000000000000000C9 +:80DA00000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000048 +:80DA800000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000C8 +:80DB0000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000000047 +:80DB80000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000000000000000000000C7 +:80DC000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000000046 +:80DC8000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000000000000000000000000C6 +:80DD00000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000045 +:80DD800000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000C5 +:80DE0000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000044 +:80DE80000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000C4 +:80DF000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000000043 +:80DF8000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE00000000C3 +:80E000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000042 +:80E0800000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFEC2 +:80E10000000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F08E +:80E180004FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000000000000000000000000000000000B1 +:80E2000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000000000040 +:80E28000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000000C0 +:80E300000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000003F +:80E3800000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0000410000224100004428440000000000000000000000000000000000000000B0B80C80020041414441440049421404449024000041440000000000000000000000000000001008812F370880020000442042040006 +:80E40000004144220000000000000000000000000000000000001008817F450E0000414100440000000010040010140400000000000000000000000000000000F0A1570000000000001004444428000000000000000000000000000000000000000000AF1A0B00000044004400284400000000000000000000000000000000000000000014 +:80E4800000F05CF3000000000000000000000080020000000000000000000000000000000000F0289400100400411800000000224044C44426040080040042120000000080020000000000000081E09F0100002844280041800385044C01440022400448C1206242400800482800800120040000880088008324042281FF8E080000408456 +:80E5000082010000C4402442044143C2244400C44822430283840100220020012800000082008200892404002FF20700412002410044A021002001400442002004000000004200000080040000000000009028845F420E4004200200002A21911884A0410081221004A0240000002608000000008002282280480812200832880026F8C23C +:80E5800021802282624212623822844220060028228982C44C16A821688904282AE441A2246862124222422220828302188904001A042084062A848A24B4682826748804C02422432282A2212800A0411648082A0426881408440022224226242486322880828402802202800420820184A04180A22872C0A84AC268AF28062200802104E1 +:80E60000102884230200122210386489A112688C2404221222808421040080220180C128200248888084024A08802C04F0EA3EB04801842200901820848182222405008128404818A8218001844262A01228C302681684A2241252288842482200414088214484E1840248ADE310880480240200281084022002181A0880024212C9024C4F +:80E6800004180020341880040000200410842902800200004A013F240A1002120018280040088608C048002043840144003200182A048024040000281A04000046280141E082014A0860825FED041221800120912880226182C0C848288324918820932812484444182A41880428383044422244802481A443888004904849018C02584410 +:80E700009A3468428B428F8A03481088228402128004008001001822101448886282904480A12548A0421A02808122022A01424880820900441289020018F0E52A008412002002128C220244201508002284484884A04180A3242822A0124800848022018082A41258A02880010018800C80F8E44C00800480820448802581841228222164 +:80E7800094180028004884180041121281410080442804004008384008844A28326858008388E4B306A0210042000000220022008448008420028004286082428440082812003A2405200100008280042A8CA42448F0B54EC06800282800280041481228442026222261432002180089149848102814082081C41828000084821044684891 +:80E80000228400C01400F086162004004800002200000089A41248008100001248001228200242320010881208424181828220220C48180040B1460680024A028C44888242C8280028C0181248800400E084022081052001124820848426014200A021C6042001122081A2180082EFB4084024020000001008002A0400228C044E1848000B +:80E88000818180024412460850480000800488C01418209818400840A8848870C90C28000042108802000062000048422A0428834208220042482022048021240480046888428008820080088868425D81400868C0282248408804C42268844A6142896143200223021848C810984881811C82814308481840088C228428C4AC802202C48A +:80E900001A4404201202DF55092AC21800488B2483E282A22287828F4102807418A824892494486A21014A048C1228B428A4224B228981B22862864A02007A86322842890668488F869A1489A82889D18834588B44C2882A681C8ABC94034A8482223448220080044232A0243E5852226684344C89068B426A4488E481638446A8268FC190 +:80E9800045B8140748832441A815181A6282F0F888A81A856888128CA288481E242AFED4588A9228F0B67D0026A4122AA222484A048B41282A7438C844B02414E842F318781A83E28266862E3828814AE58121B41894481628A451811E48E0C383911848468824A444184B1D828A0249A98A4E1428181A014A842CF4A8BD400400844028B3 +:80EA000044284428240141701408478120010000180044184418444084018901890181100881128141100445088440085F28034F42A2233AA2222AA226228B664AA4246E487AA5154D444D244F46B234E242F238248B374FC7B768F638388F82F668288F84A1444AE483F5484C4F45F744444D144CF254144F44E48352882A47E881F11816 +:80EA8000188944F868B88F85B11849F81C1CCF41F12CACCF85E54FEDCFFD6868C7C485E886F448C86FE70D4F42E287A6232A56888F8624B268A6466E284FC2A2335A8384F44434CB146E748F42F34C6424A7828F85F16A788F86F6C8981AA4F78F87F5486C4F45F661615AE455F6347C4F44A4638D188F83B238E282F2682883B448A4B7D9 +:80EB0000CFCBB398B928A2199E184F4BFB5C188FCFE9CFF97C3C5E92236C8AAF8CB9FF01484F432481F268286AB248B62872489868CC82A3344846F86C387E346AF554187E38CF47B36AA6337887848F84AC514AF43818CF86E641E514E483B354E6C5A1444F4336188F83A3458B118B156E68A0B78F45E9838B8BB898F92CA88FC5FDF873 +:80EB8000C8CBDF6E684D142BE68BCE4ED84FF50E4AF63C64326AF248688F86B648B6287268F828688FC2F268784A81F44C4CCF86F3681C6AF744784FC7F73818AF82F2583A8F86B668F458C81AF4F8788F87F56C683E644FD7A7235B653E744AF434241E183AA2678B777E386E684AF478B8FEBCBEB89ADB88F8949C4BBB8FCDFDB888CB32 +:80EC0000DF4FC3FB58D82BE68F2AEC8C7C8C0D0000802402002200004880041008830400421008838431482004000048002009822001822008820020F86B6A20080000000020010012004A01184883441808128420022005001200181242002004008812818200184888142796C0421F41D228F1112483F41124A3F41164AB161F41B64AA6 +:80EC8000B911B64AB915B44A3934AF1439342F147934D812F924481CF9244A1CF8244A16F1245A9E212E4A96C55A9E24ACF591242E421F49F228121F49B268F19124AB141F48B26AD141B64A9921AB9451AB9443B24A3B242BB4478229FB2448984FA2B4D8062E421D688F22751124761114F2116423F2116C2D841B61ADB41B61AB9416D7 +:80ED0000F842B1122F146B812DB16F81D412FB245A8F14FB24C21E814FA2E51DE2A265192E5B96E1A27591E822F591488F227591B4687191B46A7181B46AD141F46A9411AF449A21AB9490BA48298A94B269B442FB24524F4908848004000000400428000000002100800800001400848004000000124480020000001002375200001200E4 +:80ED8000480080041304812088832502830242246280024242A0120048280020422842089A048142200200828242008F4B0142A68482021820032128001842421A049082A0418082040010480A2024020044808404488280028842A041281828806258E05D01424B24224800A0210043061984C128A058385821242A053A44220A00841099 +:80EE00002101892284024C042242288C04498462824A88061828A02886823284123D1500001A02124240020000424800200A84004248200248831482820400008014082088090020220418004800BF740B2C81021280840122282A4108120018002242224E24004B4289822141081800009012128082012280084A2808000000824222EF03 +:80EE80007B0F422003242A6182188041A2148144C38403328A06124325A14228C042C0668016222684A5252800188004004800A0188A9248488A4408481A026F5E0380A2120029C328122218101288112482218204182E1478282022141254822E422004486A81020020012200208888811888844C088A2483D2EA04522120014218002235 +:80EF0000388B144034481280212A2224148484C2448922A161001228481240822181812204004A084280882204000042F078DB200440824428C1242220512428181042A8144921044212841210044812128001A014004301006A0142E084888304000028880046F42231004243024118000090542800180080831102CA618480A4422100EC +:80EF800020041A122822040088202102412800B07428240A8002221E9D204122812201C01280012881481883220100000043420420410428A024420012A0124B142E444182200280088A410820048002274A80014383C24420912400E02641A814100890143800B04868C64160265820014A210452004381B244813414822210084880F8F6 +:80F00000748842A2208802448784800421901216081223228101002C2193181A04481848180060440049012220A22580820118B02488868124A24818822001002A0480A2429D8920810218180029228121024100120010042200802214341420218421841302800220818404482800688004002008E0C60B24C022C022200424008081359F +:80F0800042002248000028202482034344C41244C125A442250412491234444184004C881804418C9884824382140441FF2C0D2A240122002242212812222B244818000000000044004422002002283224003822288002100400008088288428F24B18100218808402002C81440420022305A12C811182130421124800000081006912848C +:80F100004608101444880840240420044400482F1B0A8A8104800260220000424002244228C01400122001492124210200208103000000888842800488482004800214EDF200800429040048E042654220012C042448002189042E184238A0124258121A042301484880240400480082200880220800C2A0CD002422004824602240820196 +:80F180002120210118418CA4149044421008002444246026424412214444C44C02000030680000208408F0C66380220200222200222460212422005A02001A82012828002838264218D2820300221082028181902822308890C881008800A086BFC60F841858280080846224E041042852214221221642142426C21480382281210014003E +:80F200008C11B21654840022101404448C8402C084400482482D44F09E1A2412EE32223866A2242E222CC422A025226CD122C422236121232112C45C2321D344644226A412124C31342C022D422B123A241562218C1114382C22844288C24120A24482A288A084AA64584AF2F99EA014211A1102002B26421A83D522A3245AB162A5142B79 +:80F2800044222F84C116614B5242128CA6645AA224C992624B425E1E497144D8868192246F4213624643C2144D48CD442289840A86BC48C88C8F844CE444C4A44144C044CFF5092A2281622278224830322F227426A2411A041224184E6268121682C2782A422241F826143AA4141A1122D128C2222F22E56701474229E64483C624D04453 +:80F300006882228B8C424926480482828AA4844A2CFAC82B24C012800121000012200100008460816081400AA4C01A448C4104441844181008180000000041100441100441706D0B5E622F21B112E2233292291262226E6227242AB272B352B142A5742D122F21F112122F27D6AEF15A58CFC4A5338D2AAD2AA5FA2242CD6CEB31AF61F361 +:80F380001434EFC1711E6C426F42D366F1123227E1655E44CFC3F3581C4FC45244CFC8A8AA8F8AFA88884D8CCFCC5CC44B448FC2EA445454CAEC46E644F4A4A4CF4744B242E687E723B332A22B2B642D222E226E6227262F62F272322B754AE525F552522F21F13212AFA7F61E1A2F25F514348FA3F328784AE62AFA2A4ACFC3FF5E74AFA1 +:80F4000063F356769F95F558484E47EFC5F556562F25F7363E6FE2722CFC7474CFC57144FC4444CFCCFC64648F8EFEC8EC8CF888A845BC44F428AC4E445F48F8C4C62F46E644FCF6B4EDD4242B251AA5333E322F25C5222CE422E426F652222F67F672122B755AE525F552522F25F11232AF87F654522B556F47F53838382E244EC28F879E +:80F48000F446644FE3F354728FC7F752518F85F47C582FE2B342F516566F61D36EF24664CFC2F34C5C4FC4F64C4CCFCCFCE8EC8F8EFC88A88CF8C88845F848CC8F86BEC4AC444F44BC22B644A47ADFE70B5AF338722F23B332E327E724E624E626E626F672322F27F672322B454AE525F552522F25F572727AF6585AAF85F536343AF32899 +:80F50000688FE6F662E27AF4FE7C4FE6F76462AFE7F754458F85F47D7A2FE3B342F514744F63F32E26EFC6B664F74C5C4FC4F64C4CCF8CFC686C8F8EFCCC488CF8AC8C4F88F8C8CC8F86BEC4FC44C44ABC62F6C4C24F4EF76B83800100184880440226A241804422410285221128314820048170480480012014022B128423C2481800829F +:80F580002200008220088A0400F0497D80042A014A010025024A012D12A014202411028004304820812481140810A2212A04403442444128418008884880040048808428788E0E2F22F41124AD121F41F26A121F41326A1F41B24AF11124AB941B21AB9451AB9443F24A9143F2429147832D914F83C4914FA2C4816FA2E451F2264A96F1E3 +:80F60000265A96D5A6E549D2A4F491244D521F49D228F191248B141F49B24AF18124AB161D24AB9419B24A19F54A9443F24A9443F2429447822DB44F82C4944FA2D4CC012F82F41164A9D541726AF2112483F61124A3F21144AF44F81124ABA459B24A3924AF1419D412EB83D452F816482DA58CC5B56F82EC51DA86E418F22658CE216D38 +:80F680001B8F1DD224F181284D5A1B688D521F48B248F1812429F1816C2B121D6C2D941D6C2BB417882F4463822D942E482F446B822DB42F82F442B42E1ADF680F848248008001000080020000001002008800004001400848000000004400000000002501EF15072002438181512220011228240028209242A01200420020220100250211 +:80F70000000000002200008100000084803284F0213300828821484902284843220458414024011822800228C048004022138602184828241002008002200882006018004814224E8E00C22C3814486C02801514248211868282818221E2220120038A0428182011210281484240020022004160CA200800828124708421F3283B002800AA +:80F780001812242880A214200410043042002280048400408252261022012824000000280000000014002A04707E0A00000000004230480000208404002E4800000028211004410012000024820042E014080042008008EFBB0A232412C2120041802402200148226420810228482012024CC21461188128481022022C021846848824823C +:80F80000A886920028241C4888984848814AF2D2712448001221002084220489012052248081022260862800263414441A42084100280021124C846824A8884A280142002100800448CF120A2012020044000020044800202404800410020021108222042504A01200000020A284908128C081462838489088281FC9494143020021400461 +:80F8800024400221100252486410524184218014440410811202414100440041424130440041001008414444D059074862004424101212120428000060884812210000008100D041012901481265021800448014048064240048002508446F6507401401802181014A81621100000000000040440221404404442400002444482120042001 +:80F9000008004162008002F0FE9980140640042141212D122218100221008849240111101284046508446042258401415022641848C04442000041422180044184005F540C1428250124122C21014810110200A041830421404408006100102441026180410444244440248484084240A4428100434254244F590624004022040000702479 +:80F98000011504004C040045021002000010041002244111404404000041100400414100D0920D4210428204490454423041481C440220041004004002004114240000800424000088800888458248C4840082414338889F5F05002400115043000010420100000044000041400241100200002100004400000000000040E47C0914000018 +:80FA000048214840040080044582040040420200100241002400248004440042400445020000002482006F3F0824484464001054242004006C020041000000400200450200401404001004000088000040080081F0C92B100248000014424124421400304100100400004004009046000000000080088880C88480088888812120F845C854 +:80FA8000201414024642614420220422B04102002024140200501240131115014014140240410100214860441114C084442F4408444918444478C30782824400000000000010040000004042820424003042400400210060444142000020240400848444BF340B25081C0414408104212415C4422848400224480031800119180111104469 +:80FB000001400A484110044124602854C024140040280800F0BFC5242562281092423114651414421252716074214512522442650441214012D2245412541552444D4200004054214400414446044908244D84904481888E8A65788818D442014A644841641446D244E414C422432444A144271411402404480000210021004501444C545D +:80FB80002241443041214141502243840810D41408100250444C18042F54061123545260241C241461544C041B642819B424044681E444040074405212341505555242242121442546026542014445A4448A48B2C118F1838444824F44E84CC888474800448FC8F873AE100111000080148216022141214914121412041100100111000099 +:80FC000000501240012110820482218221822182218658128444005FC948A34445557475F642C34E421F44E474F422246D442B662D434E421F64F447656556774D466F44F446424554554544425211F0474665545455556425F246462464755555507424405222F042C21F3CE4287883E5787884A2444768E5FC8C84CFC8F884844B888F6B +:80FC8000A8F8A14F343F14F4444D4515E53CE424D461F4424546F264666F6642F322657F44F447474177546B446D446F6454443555442F2141A29825F246C66554555553572F44E43454A8F0414D5595426546026425A2442F645C311F125A756DA74F28E824F88686ED8CCFC8F88C8ECFC8F884824F69F9E141243F14D444546575F64236 +:80FD0000411B441D415F74F426674D444E461F12D611B642F447464B447D4569D466A4446554465585018835F1424375575755577625F2464484646D4445545775544624214E42412F44FCC3418A7A81E5183886CE4223788CFE82862D842B888AF88C1CBF7B42F34242ED465514D732F4434237343D414E416F46F642443F32F645231DDA +:80FD8000445F54B442F445474A74449644654454752C51223F3158333F3C547775577765B342F44342255A22AD466576475757654456424E424B4C2BCC37181F387A87F5A4852B88CAE828F88E8EFF68F88A8C6514F48C96FF29032110068014844401008044032440820400000040140120140200002501414002244824400244400485A2 +:80FE0000245848F0B18B80040023043400442111213042000000002400502240420410064004000000201401410046124422084110F41E91D034F4112485F3112487141F41324A1D24AB141D24AB9419B24A19B54A3924AF1439242F147924D812F924481CF9244A1CF8244A16F1244A96E1A26459ACE449C24A1F49C2421F4952281F496F +:80FE80007248F29124A7241F48B24AD141B64A9921AB9451AB9443B24A39242B94478229F924484CF9244A4F5F0B4D4B1AD638E4417248F11124A3D441921A1D44AD941D44ABB451ABB453D21AB924F4429147822D917F8284F9265A1CF925CA5A78252AE9A26459BCE419C24A1FC9C2489E648D439A7248B3917248F2812489B181D64A5D +:80FF0000B181F64A344B28AF1431A4A9B1A4B442712498926F82D442F92458A307848248000000004480020000001002188009420040014008480000000000280000000025015FEB0C640011000000000025010021000000001002441004000061000000008A0482444200440081246F4A0F20481284582110140200005042100400004424 +:80FF8000401442144402100225042100400600440000000010088114C11FA24741240C7188004121100426043542044502400260416048214400411121100A219044000040140422800842004012483114DFC60424000011210000000000000000000024442400444004400240140200004A0810040045081048789E07000000000000245D :020000040001F9 -:800000002483F49124A3F48124AB141D24AB9419B24A19B54A3924AB9443B242792498924F8284F9244A1F9308ACF411648D421F4132481FC132421D2CAB141D24AF44D941B24A9B25AB9443F2429147822F147924D812F926482D914FA2C5914FA2EC11F8244A96E1A26459BCE459C24A1FC9C24A1F49D628F4912483F49124A3F4812474 -:80008000AB141D24AF44D941B24A9B25AB9443B24A39342B94478229F9364829F8245A5F570B208804000000400428120000001002188008000014008480040000004004280000000025017F6D0200000000000000810042000000000000000000000000002001000000000041E01E0F20080000000000200184000000000000000000004D -:800100000000000000000000000014F0D2D700C200000000412002830181420024001220080000110081200400000030142002000000244025F119A3000000000000000000000000000000000000000000000000000000000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000087 -:800180000000000000000000000000000000000000000000004001F0723E000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000000000000000001100EFF402400200000000000000000000000000000000000000000000000000002400F098CB0000007D -:80020000000000000000000000000000000000000000000000000010010024006FF30F000000000000000000000000000000000000000000000000000011000000FFF403002100000000000000000000000000000000000000000000000000000000350B0000000000000000000000000000000000000000000000000000000000F04FFE33 -:80028000000000000000000000000000000000000000000000000000000000000000FFE40F000000000040010000000000000000000000000000000000002440020000001FB90E0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000042 -:8003000000FFE40F0000000000000000000000000000000000000000000000000000000000F04FFE000000001400000000000000000000000000000000000000000000000000F0E1D3000011000000104141110100000000000000000000000000000000101242020000002F5C0B20080000000000000000000000000000000000000000BD -:800380000000000000100140012F630C848004860100004044810200000010021880080000140084800400000040468202244002001002530F2008000000001001110000000000000000000000000000000000001002110014F0A19D0082008200000000110000000000000000000000000000000000000010020014C09100001114001154 -:80040000005011140000000000000000000000000000000000250225125222000000F09B5A0014000000000000000000000000000000000000000000002440022440020000F09BF600155111151101501100501111501100000000000000000000000000000024212440022400110000EFD40BF0414915D11114015011004554111F52521B -:80048000111D2100004012022B11A09880080015011485084E48800400005064212E26800200002421B012F1A3BF00485011110015014054111D2150110000002180018800004001400848000000004424295222212512522221002180712A039048704111015011004415D11552111712000000212418A08120080014104108890442009E -:80050000000044246952222722255222251242012124185FAC0E000014000000400100000000000000000000000000000000000040020000008DE7200800000000000000000000000000000000000000000000000000000000F0AF7FC0421F4152281F4132481F41324A1D24AB141D24AB9419B24A19B54A3924AF1439242F147924D8128D -:80058000F924481CF9244A1CF8244A16F1244A96E1A26459ACE449C24A1F49C2421F4952281F4932481F49324A1F48B24AD141B24A9921AB9451AB9443B24A39242B94478229F92448984FA2F42235C04A1F41D638F4112483F41124A3C424AF14D141F24A941D24ABB459F24A9143F24A9143F2429147822D916F82D412F9245A1CF92464 -:80060000CA1E814FA264192E4A96C54B9E25ACF4912CACF491648D421F4932481F49324A1F48B24AD141F24A961D24AF249B25AF243924AF2439242B94478229F9264829F9245A2F680A848004000000400428000000002180018800004001400848000000004480020000005012F0AED5200800000000100800000000000000000000001D -:80068000000000000000000000000000EF4C06200888000000000000000000000000000000000000000000000000000040016F8C0F200400000010142802000000240012200800001100812004000000100422000000400214125F4309008008000000000000000000000000000000000000000000000000000000A75E0000400100000021 -:80070000000000000000000000000000000044200800000000000000F0BB7600000018000000000010020000000000002002000000800100000000000000007F9809000000000000000000000000000000002200000000120000000000000000F0FEB60000108101000000000021000000000000000000000041200800000000000000F01B -:80078000DADE0000000000000000100A000000210000810000000000000018001800800118220000AB450000140000110000000080010000000000800100000000400400840000000000002F3A0100000000000048000000120000000012000000000000000000000000441800006F4E080000000000004800240018000024000018812063 -:8008000001000000001004121008008001200100F099990000110000140000001008200100000000000000000000000000180000C0142200009FAE0D4100001800000000000000000000410000000000000000001821000000000084F09AE2000000000000000000000000000000000000000000000000000000000000FFE40F00000000FA -:800880000000004008000000000000000000000000001800000000000000F0316400000000000000008100000000000000000000000000800100000000000000CF750D0000000000000000000000000000000000000000000000000000000000F04FFE0000001008000000000000000000100200000080010000000040080000180000D0A8 -:80090000BD0B0014140000000000000040020000000000000000004008000000000080020000AFF3020000000000000000000000000000000040020000000000000000000000004F5F0A0000000040010000000000000000000000000000000000000000000000004F380D00000000000000000000000000002001000000000000000000E7 -:800980000000000000AFE50F0000000000000000000000000000000000000000000000000000000000F04FFE000084000000000000000000000000000000000000000000000000000000F0F5CD000011008100000000000010020000100218000021800100000000400800002A0100003FD20A00148400004001000000000000000000000A -:800A000000000000400800000000000000007077060000000000000000000000000000000000000000000000000000000000F04FFE00400100004005000040040021004400100218808802218001884008000028840000800200002FDB050014000048405588281082044480022100448002214818808802214818448828842148408481DC -:800A8000421882041E148002211A01445C03000000000048400400800444000000440000000028000080080000002800000000D0A10200140000005400000044001002400400218001882810021880088400008042080000280000F0B25D000000000000000000000000000000000000000000000000000000000000FFE40F000000000033 -:800B0000000000000000000000000000000000000000000000000000F04FFE001002000000480080022148008002000080028004000080044480022148400400214840040021FBA3000000000000000000000000000000000000000000000000000000000000FFE40F00004001000040040000400400004004000028000080080000000059 -:800B80008002000000005FAD0A0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000008002000088000000000000000000008FE20800004001000040040000400400004004000000000000000000008002000000002FABFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 -:1E0C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFF00 +:80000000840000000000000000000000000000001002000000880000F0E9D90000218001008302220000004841614290444002C04400004004241004004200820014004810180800F04CBC0040020000800228240000800421421004240000000000004400800480081001200489180800F02F4E000000120010080081000040140480040C +:8000800000304400004004100200004002000000000000F066E5000000008241212481400200240010020010080000000000000000001812001811000000183FB90B910021400114004100000000002100001008400421000010020040041004002140020000443F7A0100002200290C0000401808210000000044000000000044411200CE +:80010000000000004001000080F25DEB1001108202100240024002844002000000404408100421000010840100440020010040020000221F140700001001195424008400814002000000008100000000004502000000200140220100000041BF3E0E000000000000000000004100000000000000000000000000000000000000AFC40F00E6 +:800180004100008424004002004008640044440000100400210010020000000020010010280100A0AE00000021000000000000000000000000000000000000008001000000120000F0B3870000000081001008841048040040044044044400000000000000000000184400128081211108EF150C000000000044000000001002000000003B +:80020000000000000000008001000000000000FF4D0800000000100444000000108204000000000000000000000000000020010000009F7D044400708804410000210024002410441414140240044421100240020000000018000020018041410812F09A9600820000008400000044002400210000000000000000000000000000000020DD +:800280000114F0177940084800000000448042044400004840C414444C48440400140084800400002001448022014412000021F06DB100820086041008000081104A042424244C5444410045044441240000000000000018001880011289C111804109DF6B052008004044582800810010048421216914044441444044020000001002003C +:800300000000002081018001121E18C011F043824004411018020044412124400441004544042440140441410000212400000000A011120010044C01120000F0D4B64004444044420C4481100AA1504A1002000000400224442440022400000000000012301420018414846081F073480045141454884554C4455CA84554AAA55A8A6552C3 +:80038000EAA51A4A1A52666F44445444214144401642566225022552222502210000001A21A1111A51444514E441A1118B1189A1118F81518885F892E450444FC4149444C55C448181855A4465048F8252AE2D2445544CA42145F444444F4454642B11F0849445D46458662544543150128548E28414820400001AF114141AE1438381126B +:8004000044A4118B118F11F1181AA5082B113F3C0A45844404C50C818145568825042C528C25048556822465F646446554444D1445C4822512421216444102842448210000001AE14101281AA1114B11441A61811AF11818211A81F143C800CD444442855A66E55C8845568825568A8D2A412762E55C6C254852266F44F4444445D644514C +:80048000444F615866676865145424254112415A228914220400001AE141014922F134144B111E141AE181A1111AF11A188FA181F1DF7100001004004184400840440884244004440000000000000000000000000000200112008170220482000000000010080000100448004002002150224002240000000000000000000000E0E10F2C72 +:80050000F4112485F2112483F41124A3D441F24A121D24AF249921AF2419F54A9243F24A9343F2429147822D914F82C4914FA2C4814FA264114FA264192E4A96C54A9E24ACF491242CF4912485F2912483F49124A3F48124AB141D24AB9419B24A19B54A3924AB9443B242792498924F8284F9244AAF6A0E4D4A1B61CD421B2187241FC129 +:8005800032441D282F24D1C1F242961D2C2F24DB85F2429226F84A9743F2429147822D916F82D412E9A2C5952ECA1E852E4A96F5244A96C14B9E25ACF4912CACF491648D421F4932481F49324A1F48B24AF11124AF44F91124ABA41B21AF4428F34A8443B24A3924A9B93694824FA2F514FE40084800000000448002000000100218800832 +:8006000000001400848004000000400428000000002501EF5A0D82000010084002000000000000000000000000002800000080010000000000005F870B2008000000000020010000480000004602000000000000000000000000001140015FF50B2004001008401204228001000024001220084800100110084228000000100422000000D2 +:80068000400314121FDE0E000000000000000000004200000024000000000000000080010000000000002F160B00240000004001000000000000000000000000000000820000000000000040F82F580000002400120000000000840000000021100222000000002100208101180000100800F0AC7F004002002100400100000000000000E8 +:800700004002240022000000002100808101180000000040F84A3C00000000200100000000400800000000000000000000200800000000008400003FF401000000000000000000000000000000001002440000000000000000000000414FCE07004412100200003100120000004800001004844100000022000000000018000000848001E9 +:8007800077DA00000000100100000000000000000000180000000000002004000000000000F0AC230040240121001100250100000000000000444098140021002002000080040000000040081844EFB30500000000000000180000004800000000000010040000000000200100000000F07BA34004100400810011000000000000004004CC +:80080000000000000000000000000000000000705B06000000000000000000240000400800002400000000000000000000000000001BAC000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000100200100800002400000000000000000000000000009F270D000000000000000000003D +:8008800000000000000000000000000000000000000000F04FFE00008400000000000000000000000000000000000084000000840000000000F07DAB004001000040010000000000000000001800002120010000000000000080020000AF2501000000810000000000000000000000000000000000000000000000180000F0F7B5000000AF +:80090000000000000000000000000000000000000000000000000000000000FFE40F0010010000000000000000000000000000000000000000000000000000008F8301000000000000000000400200000000000000000000000000000000000000EFFA0F000000000000000000000000002400000000000000000000000000000000EFE232 +:8009800009001411008100000000000000000040022001000020010084000000810000800300009F6F0300400800001400000000002100000000000010020000000000000000000000F0E6BA000000000000000000000000000000000000000000000000000000000000FFE40F0014000000540000004400100240040021800188281002B4 +:800A00001880088400008042080000280000F0B25D004001008004548588022148400428100240042810828401882810828441848842188204441828842148E041012810A21140C435000000000080044400004840040000400400000080020000880000008002000000001D2A004001000040050000400400210044001002188088022136 +:800A80008001884008000028840000800200002FDB050000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F0021000000800400281082040028000000280048000000484004281082044400108204440010B23F0A00000000CB +:800B000000000000000000000000000000000000000000000000000000F04FFE004001000000004400000044000000440000800200008800000000002800000000F0C36D000000000000000000000000000000000000000000000000000000000000FFE40F00140000000000000000000000000000800200008800000000000000000000C9 +:550B8000EF880A00000000000044000000440000004400000000000000000000002800000000D0B2F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3FFFFFFFFFF72 :00000001FF diff --git a/xpp/utils/Makefile b/xpp/utils/Makefile index 562c738..d840333 100644 --- a/xpp/utils/Makefile +++ b/xpp/utils/Makefile @@ -3,13 +3,14 @@ PEDANTIC = -ansi -pedantic -std=c99 CC = gcc RANLIB = ranlib INSTALL = install +INSTALL_DATA = install -m 644 -BINDIR = /sbin +BINDIR = /usr/sbin DATADIR = /usr/share/zaptel MANDIR = /usr/share/man/man8 HOTPLUG_USB_DIR = /etc/hotplug/usb -DATA_FILES = ../init_data_*.cmd ../initialize_registers +DATA_FILES = $(wildcard ../init_data_*.cmd *.hex) CFLAGS = -g -Wall $(EXTRA_CFLAGS) @@ -18,15 +19,16 @@ TARGETS = libhexfile.a fpga_load test_parse all: $(TARGETS) install: all - $(INSTALL) -d $(BINDIR) - $(INSTALL) genzaptelconf fpga_load $(BINDIR)/ - $(INSTALL) -d $(DATADIR) - $(INSTALL) $(DATA_FILES) $(DATADIR)/ - $(INSTALL) -d $(MANDIR) - $(INSTALL) fpga_load.8 $(MANDIR)/ - $(INSTALL) -d $(HOTPLUG_USB_DIR) - $(INSTALL) xpp_fxloader xpp_fxloader.usermap $(HOTPLUG_USB_DIR)/ - + $(INSTALL) -d $(DESTDIR)$(BINDIR) + $(INSTALL) genzaptelconf fpga_load $(DESTDIR)$(BINDIR)/ + $(INSTALL) -d $(DESTDIR)$(DATADIR) + $(INSTALL_DATA) $(DATA_FILES) $(DESTDIR)$(DATADIR)/ + $(INSTALL) ../initialize_registers $(DESTDIR)$(DATADIR)/ + $(INSTALL) -d $(DESTDIR)$(MANDIR) + $(INSTALL_DATA) fpga_load.8 genzaptelconf.8 $(DESTDIR)$(MANDIR)/ + $(INSTALL) -d $(DESTDIR)$(HOTPLUG_USB_DIR) + $(INSTALL_DATA) xpp_fxloader.usermap $(DESTDIR)$(HOTPLUG_USB_DIR)/ + $(INSTALL) xpp_fxloader $(DESTDIR)$(HOTPLUG_USB_DIR)/ libhexfile.a: hexfile.o $(AR) cru $@ $^ diff --git a/xpp/utils/genzaptelconf b/xpp/utils/genzaptelconf index fe5c9e4..1763427 100755 --- a/xpp/utils/genzaptelconf +++ b/xpp/utils/genzaptelconf @@ -32,8 +32,11 @@ # Don't override variables here. Override them in /etc/default/zaptel # # 0.5.3: -# * Experimental support for Sangoman analog cards (A20x) -# * fixed timeout for Astribank load +# * Experimental support for Sangoma analog cards (A20x) +# * Support OpenVox A1200P (A TDM400P clone refactored) +# * Fixed timeout for Astribank load +# * Delete unsuccessfully-probe modules +# * Pass callerid from trunks # 0.5.2: # * Now it should detect most PRI cards and even wcusb # 0.5.1: @@ -342,7 +345,7 @@ print_pattern() { fi else # this is an FXO (trunk/phone: FXO signalling) # we have may have set it. So reset it: - echo "callerid=\"\" <0>" + echo "callerid=asrecieved" echo "mailbox=" if [ "$group_manual" != "yes" ] then @@ -410,22 +413,29 @@ count_proc_zap_lines() { load_modules() { say "Test Loading modules:" - for i in zaptel $ALL_MODULES + for i in $ALL_MODULES do - if [ "$i" = ztdummy ]; then - continue # No hardware to detect - fi lines_before=`count_proc_zap_lines` args="${i}_args" eval "args=\$$args" # a module is worth listing if it: # a. loaded successfully, and # b. added channels lines under /proc/zaptel/* - if /sbin/modprobe $i $args 2> /dev/null && \ - [ $lines_before -lt `count_proc_zap_lines` ] + if /sbin/modprobe $i $args 2> /dev/null then - probed_modules="$probed_modules $i" - say " ok $i $args" + check=0 + case "$i" in + xpp_usb) check=`grep 'STATUS=connected' 2>/dev/null /proc/xpp/xbuses | wc -l` ;; + *) if [ $lines_before -lt `count_proc_zap_lines` ]; then check=1; fi ;; + esac + if [ "$check" != 0 ] + then + probed_modules="$probed_modules $i" + say " ok $i $args" + else + say " - $i $args" + rmmod $i + fi else say " - $i $args" fi @@ -474,20 +484,21 @@ wait_for_xpp() { if [ -d /proc/xpp ] && \ [ "`cat /sys/module/xpp/parameters/zap_autoreg`" = 'Y' ] then - out_on_timeout=0 # wait for the XPDs to register: + # TODO: replace this loop with 'cat /proc/xpp/XBUS-*/waitfor_xpds + success=0 for i in `seq 30`; do - sleep 1 if ! grep -q 0 /proc/xpp/*/*/zt_registration 2>/dev/null then # There are either no XPDs or all of them are # registered. Nothing to do - out_on_timeout=1 + success=1 break fi + sleep 1 done - if [ "$out_on_timeout" != 0 ] - then echo >&2 "Warning: time out waiting for xpp init." + if [ "$success" = 0 ]; then + echo 1>&2 "$0: WARNING: some XPD's are not registered yet (timeout)" fi fi } @@ -643,7 +654,7 @@ EOF # in case this is a real channel. chan_num=`echo $line |awk '{print $1}'` case "$line" in - *WCTDM/*|*/WRTDM/*) + *WCTDM/*|*/WRTDM/*|*OPVXA1200/*) # this can be either FXS or FXO maybe_fxs=0 maybe_fxo=0 @@ -772,7 +783,7 @@ EOF # NT is the same as FXS for us and TE is the same as FXO if [ "$span_termtype" = 'nt' ] then - #echo "callerid=\"Channel $chan\" <$exten>" + echo "callerid=\"Channels $span_begin - $span_end\" <$span_begin>" #echo "mailbox=$exten" if [ "$group_manual" != "yes" ] then @@ -783,7 +794,7 @@ EOF echo "context=$context_phones" fi else # we have may have set it. So reset it: - #echo "callerid=\"\" <0>" + echo "callerid=asrecieved" #echo "mailbox=" if [ "$group_manual" != "yes" ] then diff --git a/xpp/utils/hexfile.c b/xpp/utils/hexfile.c index 9862ecc..f6e4149 100644 --- a/xpp/utils/hexfile.c +++ b/xpp/utils/hexfile.c @@ -230,12 +230,12 @@ int dump_hexfile2(struct hexdata *hexdata, FILE *outfile, uint8_t maxwidth) } ll = line->d.content.header.ll; bytesleft = ll; - // split the line into several lines + /* split the line into several lines */ tt = line->d.content.header.tt; while (bytesleft > 0) { this_line = (bytesleft >= maxwidth) ? maxwidth : bytesleft; allocsize = sizeof(struct hexline) + this_line + 1; - // generate the new line + /* generate the new line */ if((extraline = (struct hexline *)malloc(allocsize)) == NULL) { if(report_func) report_func(LOG_ERR, "No more memory for hexfile lines\n"); @@ -247,14 +247,14 @@ int dump_hexfile2(struct hexdata *hexdata, FILE *outfile, uint8_t maxwidth) extraline->d.content.header.tt = tt; memcpy( extraline->d.content.tt_data.data, line->d.content.tt_data.data+extra_offset, this_line); new_chksum = 0xFF - checksum(extraline) + 1; - // print it + /* print it */ data = extraline->d.content.tt_data.data; fprintf(outfile, ":%02X%04X%02X", extraline->d.content.header.ll, extraline->d.content.header.offset, tt); for(j = 0; j < this_line; j++) { fprintf(outfile, "%02X", data[j]); } fprintf(outfile, "%02X\n", new_chksum); - // cleanups + /* cleanups */ free( extraline); extra_offset += this_line; bytesleft -= this_line; diff --git a/xpp/utils/xpp_fxloader b/xpp/utils/xpp_fxloader index ef9f966..ca29fd2 100644 --- a/xpp/utils/xpp_fxloader +++ b/xpp/utils/xpp_fxloader @@ -63,7 +63,7 @@ FIRMWARE_DIR="${FIRMWARE_DIR:-/usr/share/zaptel}" FIRM_FXS=$FIRMWARE_DIR/FPGA_FXS.hex REENUM_SLEEP_TIME=3 # only used on manual runs -FPGA_LOAD="/sbin/fpga_load" +FPGA_LOAD="/usr/sbin/fpga_load" find_dev() { v_id=$1 @@ -84,6 +84,7 @@ load_fw() { devices=`find_dev $v_id $p_id` for dev in $devices do + $LOGGER "USB Firmware $FIRMWARE_DIR/$fw into $dev" do_fxload -D $dev -I $FIRMWARE_DIR/$fw || exit 1 done @@ -98,23 +99,24 @@ hexfile_version() { } load_fpga() { - dev=$1 - + v_id=$1 + p_id=$2 + fw=$3 + + devices=`find_dev $v_id $p_id` + for dev in $devices + do card_ver=`$FPGA_LOAD -d -D $dev` - firm_ver=`hexfile_version $FIRM_FXS` - - $LOGGER "considering fpga firmware version '$firm_ver' for $dev with version $card_ver." - case "$card_ver" in - 1.001) - $LOGGER "Loading firmware '$FIRM_FXS' (version $firm_ver) into '$dev'" - $FPGA_LOAD -D "$dev" -I "$FIRM_FXS" 2>&1 >/dev/null | $LOGGER - status=$PIPESTATUS - if [ $status != 0 ]; then - echo "fpga_load failed with status $status" | $LOGGER - exit 77 - fi - ;; - esac + firm_ver=`hexfile_version $FIRMWARE_DIR/$fw` + + $LOGGER "FPGA Firmware $FIRMWARE_DIR/$fw into $dev" + $FPGA_LOAD -D "$dev" -I "$FIRMWARE_DIR/$fw" 2>&1 >/dev/null | $LOGGER + status=$PIPESTATUS + if [ $status != 0 ]; then + echo "fpga_load failed with status $status" | $LOGGER + exit 77 + fi + done } ######################### @@ -124,11 +126,13 @@ load_fpga() { # to run manually, pass the parameter 'xppdetect' if [ "$1" = 'xppdetect' ]; then + echo "--------- FIRMWARE LOADING" load_fw 04b4 8613 USB_8613.hex load_fw e4e4 1130 USB_1130.hex - for dev in `find_dev e4e4 1131`; do - load_fpga $dev - done + load_fpga e4e4 1131 FPGA_FXS.hex + + sleep 3 # Let it stabilize + echo "--------- FIRMWARE IS LOADED" exit $? fi @@ -140,19 +144,20 @@ fi if [ "$ACTION" = "add" ] && [ -f "$DEVICE" ] then $LOGGER "Trying to find what to do for product $PRODUCT, device $DEVICE" + prod_id=`echo "$PRODUCT" | cut -d/ -f2` case "$PRODUCT" in - 4b4/8613/*) - FIRM_USB=$FIRMWARE_DIR/USB_8613.hex + 4b4/8613/*|e4e4/1130/*|e4e4/1140/*) + FIRM_USB="$FIRMWARE_DIR/USB_$prod_id.hex" $LOGGER "Loading firmware '$FIRM_USB' into '$DEVICE'" do_fxload -D "$DEVICE" -I "$FIRM_USB" ;; - e4e4/1130/*) - FIRM_USB=$FIRMWARE_DIR/USB_1130.hex - $LOGGER "Loading firmware '$FIRM_USB' into '$DEVICE'" - do_fxload -D "$DEVICE" -I "$FIRM_USB" - ;; - e4e4/1131/*) - load_fpga $DEVICE + e4e4/1131/*|e4e4/1141/*) + if [ "$prod_id" = 1131 ]; then + FIRM_FPGA="$FIRMWARE_DIR/FPGA_FXS.hex" # Legacy + else + FIRM_FPGA="$FIRMWARE_DIR/FPGA_$prod_id.hex" + fi + $FPGA_LOAD -D "$DEVICE" -I "$FIRM_FPGA" 2>&1 >/dev/null | $LOGGER ;; esac fi diff --git a/xpp/xbus-core.c b/xpp/xbus-core.c index 364d8e4..5a85f8b 100644 --- a/xpp/xbus-core.c +++ b/xpp/xbus-core.c @@ -30,6 +30,7 @@ #include #include #include +#include /* for mdelay() to debug */ #include "xpd.h" #include "xpp_zap.h" #include "xbus-core.h" @@ -38,13 +39,14 @@ static const char rcsid[] = "$Id$"; /* Defines */ +#define POLL_TIMEOUT (MAX_XPDS) /* in jiffies */ #define PROC_XBUSES "xbuses" #define PROC_XBUS_SUMMARY "summary" +#define PROC_XBUS_WAITFOR_XPDS "waitfor_xpds" /* Command line parameters */ extern int print_dbg; extern int max_queue_len; -extern int ignore_xpds; /* Forward declarations */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14) @@ -58,10 +60,13 @@ extern int ignore_xpds; static DEVICE_ATTR_FUNC(connector_show, dev, buf); static DEVICE_ATTR_FUNC(status_show, dev, buf); +static int xbus_poll(void *data); static void xbus_release(struct device *dev); static int xbus_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data); +static int xbus_read_waitfor_xpds(char *page, char **start, off_t off, int count, int *eof, void *data); /* Data structures */ +struct workqueue_struct *xpp_worker = NULL; static spinlock_t xbuses_lock = SPIN_LOCK_UNLOCKED; static xbus_t *xbuses_array[MAX_BUSES] = {}; static int bus_count = 0; @@ -234,29 +239,154 @@ xpd_t *xpd_of(xbus_t *xbus, int xpd_num) return xbus->xpds[xpd_num]; } -static void xbus_poll(xbus_t *xbus) +int xbus_register_xpd(xbus_t *xbus, xpd_t *xpd) { - int id; - int ret; - xpd_t **xpds; - xpd_t *xpd; + unsigned int xpd_num = xpd->id; + unsigned long flags; + int ret = 0; + + spin_lock_irqsave(&xbus->lock, flags); + if(!VALID_XPD_NUM(xpd_num)) { + ERR("%s: Bad xpd_num = %d\n", xbus->busname, xpd_num); + ret = -EINVAL; + goto out; + } + if(xbus->xpds[xpd_num] != NULL) { + xpd_t *other = xbus->xpds[xpd_num]; + + ERR("%s: xpd_num=%d is occupied by %p (%s)\n", + xbus->busname, xpd_num, other, other->xpdname); + ret = -EINVAL; + goto out; + } + xbus->xpds[xpd_num] = xpd; + xbus->num_xpds++; +out: + spin_unlock_irqrestore(&xbus->lock, flags); + return ret; +} + +int xbus_unregister_xpd(xbus_t *xbus, xpd_t *xpd) +{ + unsigned int xpd_num = xpd->id; + unsigned long flags; + int ret = 0; + + spin_lock_irqsave(&xbus->lock, flags); + if(!VALID_XPD_NUM(xpd_num)) { + ERR("%s: Bad xpd_num = %d\n", xbus->busname, xpd_num); + ret = -EINVAL; + goto out; + } + if(xbus->xpds[xpd_num] != xpd) { + xpd_t *other = xbus->xpds[xpd_num]; + + ERR("%s: xpd_num=%d is occupied by %p (%s)\n", + xbus->busname, xpd_num, other, other->xpdname); + ret = -EINVAL; + goto out; + } + xbus->xpds[xpd_num] = NULL; + xbus->num_xpds--; + xpd->xbus = NULL; +out: + spin_unlock_irqrestore(&xbus->lock, flags); + return ret; +} + +/* + * This must be called from synchronous (non-interrupt) context + * it returns only when all XPD's on the bus are detected and + * initialized. + */ +static int xbus_poll(void *data) +{ + int id; + int ret; + unsigned long flags; + struct list_head *card; + struct list_head *next_card; + struct list_head removal_list; + struct list_head additions_list; + int count_removed; + int count_added; + int xpd_num; + xbus_t *xbus = data; + spin_lock_irqsave(&xbus->lock, flags); DBG("%s\n", xbus->busname); - xpds = xbus->xpds; + + /* + * Send out the polls + */ + atomic_set(&xbus->count_poll_answers, 0); for(id = 0; id < MAX_XPDS; id++) { if(!xbus->hardware_exists) break; - xpd = xpd_of(xbus, id); - if(IS_SET(ignore_xpds, id)) { /* skip xpds */ - DBG(" Ignoring XPD #%d\n", id); - continue; - } - DBG(" Polling slot %d %s\n", id, xbus->busname); + // DBG(" Polling slot %d %s\n", id, xbus->busname); + spin_unlock_irqrestore(&xbus->lock, flags); ret = CALL_PROTO(GLOBAL, DESC_REQ, xbus, NULL, id); + spin_lock_irqsave(&xbus->lock, flags); if(ret < 0) { NOTICE("xpp: %s: Failed sending DESC_REQ to XPD #%d\n", __FUNCTION__, id); + break; + } + mdelay(1); /* FIXME: debugging for Dima */ + } + spin_unlock_irqrestore(&xbus->lock, flags); + DBG("%s: Polled %d XPD's. Waiting for replies\n", xbus->busname, MAX_XPDS); + ret = wait_event_timeout(xbus->wait_for_polls, atomic_read(&xbus->count_poll_answers) >= MAX_XPDS, POLL_TIMEOUT); + if(ret < 0) { + ERR("%s: Poll timeout %d\n", xbus->busname, ret); + return ret; + } + DBG("%s: Poll finished. Start processing.\n", xbus->busname); + spin_lock_irqsave(&xbus->lock, flags); + INIT_LIST_HEAD(&removal_list); + INIT_LIST_HEAD(&additions_list); + count_removed = 0; + count_added = 0; + list_for_each_safe(card, next_card, &xbus->poll_results) { + struct card_desc_struct *card_desc = list_entry(card, struct card_desc_struct, card_list); + byte type = card_desc->type; + xpd_t *xpd; + + BUG_ON(card_desc->magic != CARD_DESC_MAGIC); + xpd_num = xpd_addr2num(&card_desc->xpd_addr); + xpd = xpd_of(xbus, xpd_num); + + if(xpd && type == XPD_TYPE_NOMODULE) { /* card removal */ + list_move_tail(card, &removal_list); + count_removed++; + } else if(!xpd && type != XPD_TYPE_NOMODULE) { /* card detection */ + list_move_tail(card, &additions_list); + count_added++; + } else { /* same same */ + list_del(card); + kfree(card_desc); } } + spin_unlock_irqrestore(&xbus->lock, flags); + INFO("%s: Poll results: removals=%d additions=%d\n", xbus->busname, count_removed, count_added); + list_for_each_safe(card, next_card, &removal_list) { + struct card_desc_struct *card_desc = list_entry(card, struct card_desc_struct, card_list); + xpd_t *xpd; + + list_del(card); + xpd_num = xpd_addr2num(&card_desc->xpd_addr); + xpd = xpd_of(xbus, xpd_num); + if(xpd) + xpd_disconnect(xpd); + kfree(card); + } + list_for_each_safe(card, next_card, &additions_list) { + struct card_desc_struct *card_desc = list_entry(card, struct card_desc_struct, card_list); + + list_del(card); + card_detected(card_desc); + } + complete_all(&xbus->xpds_initialized); + return 0; } @@ -274,7 +404,11 @@ void xbus_activate(xbus_t *xbus) xbus->hardware_exists = 1; DBG("Activating: %s\n", xbus->busname); /* Poll it */ - xbus_poll(xbus); + INIT_WORK(&xbus->xpds_init_work, (void (*)(void *))xbus_poll, (void *)xbus); + if(!queue_work(xpp_worker, &xbus->xpds_init_work)) { + ERR("Failed to queue xpd initialization work\n"); + /* FIXME: need to return error */ + } } void xbus_disconnect(xbus_t *xbus) @@ -348,6 +482,11 @@ static void xbus_free(xbus_t *xbus) remove_proc_entry(PROC_XBUS_SUMMARY, xbus->proc_xbus_dir); xbus->proc_xbus_summary = NULL; } + if(xbus->proc_xbus_waitfor_xpds) { + DBG("Removing proc '%s' for %s\n", PROC_XBUS_WAITFOR_XPDS, xbus->busname); + remove_proc_entry(PROC_XBUS_WAITFOR_XPDS, xbus->proc_xbus_dir); + xbus->proc_xbus_waitfor_xpds = NULL; + } DBG("Removing proc directory %s\n", xbus->busname); remove_proc_entry(xbus->busname, xpp_proc_toplevel); xbus->proc_xbus_dir = NULL; @@ -385,7 +524,11 @@ xbus_t *xbus_new(xbus_ops_t *ops) INFO("New xbus: %s\n", xbus->busname); init_waitqueue_head(&xbus->packet_cache_empty); atomic_set(&xbus->packet_counter, 0); + atomic_set(&xbus->count_poll_answers, 0); + init_waitqueue_head(&xbus->wait_for_polls); init_rwsem(&xbus->in_use); + INIT_LIST_HEAD(&xbus->poll_results); + init_completion(&xbus->xpds_initialized); xbus->num_xpds = 0; xbus_reset_counters(xbus); @@ -425,6 +568,15 @@ xbus_t *xbus_new(xbus_ops_t *ops) err = -EIO; goto nobus; } + xbus->proc_xbus_summary->owner = THIS_MODULE; + xbus->proc_xbus_waitfor_xpds = create_proc_read_entry(PROC_XBUS_WAITFOR_XPDS, 0444, xbus->proc_xbus_dir, + xbus_read_waitfor_xpds, xbus); + if (!xbus->proc_xbus_waitfor_xpds) { + ERR("Failed to create '%s' proc file for xbus %s\n", PROC_XBUS_WAITFOR_XPDS, xbus->busname); + err = -EIO; + goto nobus; + } + xbus->proc_xbus_waitfor_xpds->owner = THIS_MODULE; #endif /* Sanity checks */ if(!ops->packet_send) { @@ -507,7 +659,9 @@ static int xbus_read_proc(char *page, char **start, off_t off, int count, int *e (xbus->hardware_exists) ? "connected" : "missing", xbus->bus_type ); - len += sprintf(page + len, "max_packet_size=%d open_counter=%d packet_count=%d\n", + len += sprintf(page + len, "POLLS: %d/%d\n", atomic_read(&xbus->count_poll_answers), MAX_XPDS); + len += sprintf(page + len, "XPDS_READY: %s\n", (xbus->xpds_initialized.done) ? "YES" : "NO"); + len += sprintf(page + len, "\nmax_packet_size=%d open_counter=%d packet_count=%d\n", xbus->max_packet_size, xbus->open_counter, atomic_read(&xbus->packet_counter) @@ -532,6 +686,36 @@ out: } +static int xbus_read_waitfor_xpds(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + int len = 0; + unsigned long flags; + xbus_t *xbus = data; + int i; + + if(!xbus) + goto out; + i = wait_for_completion_interruptible_timeout(&xbus->xpds_initialized, 40*HZ); + if(i < 0) { + NOTICE("PID=%d waiting for XPDS initialization failed: %d\n", current->pid, i); + return i; + } + spin_lock_irqsave(&xbus->lock, flags); + len += sprintf(page + len, "XPDS_READY: %s\n", (xbus->xpds_initialized.done) ? "YES" : "NO"); + spin_unlock_irqrestore(&xbus->lock, flags); +out: + if (len <= off+count) + *eof = 1; + *start = page + off; + len -= off; + if (len > count) + len = count; + if (len < 0) + len = 0; + return len; + +} + static int read_proc_xbuses(char *page, char **start, off_t off, int count, int *eof, void *data) { int len = 0; @@ -611,14 +795,19 @@ static int xbus_hotplug(struct device *device, char **envp, int envnum, char *bu struct bus_type xbus_bus_type = { .name = "xbus", .match = xbus_match, +/* FIXME: Hotplug replaced with uevent in 2.6.16 */ #if 0 -/* Hotplug replaced with uevent in 2.6.16 */ .hotplug = xbus_hotplug, #endif }; static void xbus_core_cleanup(void) { + if (xpp_worker) { + flush_workqueue(xpp_worker); + destroy_workqueue(xpp_worker); + xpp_worker = NULL; + } #ifdef CONFIG_PROC_FS if(proc_xbuses) remove_proc_entry(PROC_XBUSES, xpp_proc_toplevel); @@ -638,12 +827,20 @@ int __init xbus_core_init(void) if(!packet_cache) { return -ENOMEM; } + xpp_worker = create_singlethread_workqueue("xppworker"); + if(!xpp_worker) { + ERR("Failed to create card detector workqueue.\n"); + xbus_core_cleanup(); + return -ENOMEM; + } #ifdef CONFIG_PROC_FS proc_xbuses = create_proc_read_entry(PROC_XBUSES, 0444, xpp_proc_toplevel, read_proc_xbuses, 0); if (!proc_xbuses) { + ERR("Failed to create proc file %s\n", PROC_XBUSES); xbus_core_cleanup(); return -EFAULT; } + proc_xbuses->owner = THIS_MODULE; #endif ret = bus_register(&xbus_bus_type); if(ret) { diff --git a/xpp/xbus-core.h b/xpp/xbus-core.h index dd01971..780c1b6 100644 --- a/xpp/xbus-core.h +++ b/xpp/xbus-core.h @@ -49,5 +49,8 @@ void xbus_disconnect(xbus_t *xbus); void xbus_reset_counters(xbus_t *xbus); +int xbus_register_xpd(xbus_t *xbus, xpd_t *xpd); +int xbus_unregister_xpd(xbus_t *xbus, xpd_t *xpd); + #endif /* XBUS_CORE_H */ diff --git a/xpp/xdefs.h b/xpp/xdefs.h index c69b8a9..491e7b6 100644 --- a/xpp/xdefs.h +++ b/xpp/xdefs.h @@ -45,6 +45,48 @@ struct list_head { struct list_head *next; struct list_head *prev; }; #endif +#define PACKED __attribute__((packed)) + +#define ALL_LINES ((lineno_t)-1) + +#define BIT(i) (1 << (i)) +#define BIT_SET(x,i) ((x) |= BIT(i)) +#define BIT_CLR(x,i) ((x) &= ~BIT(i)) +#define IS_SET(x,i) (((x) & BIT(i)) != 0) +#define BITMASK(i) (BIT(i) - 1) + +#define CHANNELS_PERXPD 30 /* Depends on xpp_line_t and protocol fields */ + +#define MAX_SPANNAME 20 /* From zaptel.h */ +#define MAX_SPANDESC 40 /* From zaptel.h */ +#define MAX_CHANNAME 40 /* From zaptel.h */ + +#define XPD_NAMELEN 10 /* must be <= from maximal workqueue name */ +#define XPD_DESCLEN 20 +#define XBUS_NAMELEN 20 /* must be <= from maximal workqueue name */ +#define XBUS_DESCLEN 40 + +#define UNIT_BITS 4 /* Bit for Astribank unit number */ +#define SUBUNIT_BITS 4 /* Bit for Astribank subunit number */ + +#define MAX_UNIT 4 /* 1 FXS + 3 FXS/FXO */ +#define MAX_SUBUNIT 1 /* Firmware does not support subunits yet */ + +/* + * Compile time sanity checks + */ +#if MAX_UNIT > BIT(UNIT_BITS) +#error "MAX_UNIT too large" +#endif + +#if MAX_SUBUNIT > BIT(SUBUNIT_BITS) +#error "MAX_SUBUNIT too large" +#endif + +#define MAX_XPDS (MAX_UNIT*MAX_SUBUNIT) + +#define VALID_XPD_NUM(x) ((x) < MAX_XPDS && (x) >= 0) + typedef char *charp; typedef unsigned char byte; typedef int bool; @@ -56,13 +98,5 @@ typedef struct xops xops_t; typedef __u32 xpp_line_t; /* at most 31 lines for E1 */ typedef int lineno_t; -#define ALL_LINES ((lineno_t)-1) - -#define BIT(i) (1 << (i)) -#define BIT_SET(x,i) ((x) |= BIT(i)) -#define BIT_CLR(x,i) ((x) &= ~BIT(i)) -#define IS_SET(x,i) (((x) & BIT(i)) != 0) - -#define CHANNELS_PERXPD 30 /* Depends on xpp_line_t and protocol fields */ #endif /* XDEFS_H */ diff --git a/xpp/xpd.h b/xpp/xpd.h index f7efaf1..4de2510 100644 --- a/xpp/xpd.h +++ b/xpp/xpd.h @@ -62,20 +62,6 @@ #endif // __KERNEL__ -#define MAX_SPANNAME 20 /* From zaptel.h */ -#define MAX_SPANDESC 40 /* From zaptel.h */ -#define MAX_CHANNAME 40 /* From zaptel.h */ - -#define XPD_NAMELEN 10 /* must be <= from maximal workqueue name */ -#define XPD_DESCLEN 20 -#define XBUS_NAMELEN 20 /* must be <= from maximal workqueue name */ -#define XBUS_DESCLEN 40 - -/* Hardware does not check bank_num yet. So only 4 cards can be used */ -#define MAX_XPDS 4 // 1 FXS + 2 E1/T1 + 1 (Quad * E1/T1) - -#define VALID_XPD_NUM(x) ((x) < MAX_XPDS && (x) >= 0) - typedef struct xbus_ops xbus_ops_t; typedef enum xbus_type { @@ -106,13 +92,12 @@ struct xbus_ops { */ enum { XBUS_N_DESC_REQ, - XBUS_N_DEV_DESC, + XBUS_N_DEV_DESC_FULL, + XBUS_N_DEV_DESC_EMPTY, XBUS_N_PCM_WRITE, XBUS_N_PCM_READ, XBUS_N_TX_BYTES, XBUS_N_RX_BYTES, - XBUS_N_SOFTSIM_PACKETS, - XBUS_N_SIM_PACKETS, }; #define XBUS_COUNTER(xbus, counter) ((xbus)->counters[XBUS_N_ ## counter]) @@ -124,51 +109,72 @@ static struct xbus_counters { char *name; } xbus_counters[] = { C_(DESC_REQ), - C_(DEV_DESC), + C_(DEV_DESC_FULL), + C_(DEV_DESC_EMPTY), C_(PCM_WRITE), C_(PCM_READ), C_(TX_BYTES), C_(RX_BYTES), - C_(SOFTSIM_PACKETS), - C_(SIM_PACKETS), }; #undef C_ #define XBUS_COUNTER_MAX ARRAY_SIZE(xbus_counters) +#define CARD_DESC_MAGIC 0xca9dde5c + +struct card_desc_struct { + struct list_head card_list; + u32 magic; + xbus_t *xbus; + byte rev; /* Revision number */ + byte type; /* LSB: 1 - to_phone, 0 - to_line */ + xpd_addr_t xpd_addr; +}; + + /* * An xbus is a transport layer for Xorcom Protocol commands */ struct xbus { - char busname[XBUS_NAMELEN]; /* only xbus_new set this */ - char busdesc[XBUS_DESCLEN]; /* lowlevel drivers set this */ - int num; - xbus_ops_t *ops; - struct xpd *xpds[MAX_XPDS]; - int max_packet_size; + char busname[XBUS_NAMELEN]; /* only xbus_new set this */ + char busdesc[XBUS_DESCLEN]; /* lowlevel drivers set this */ + int num; + xbus_ops_t *ops; + struct xpd *xpds[MAX_XPDS]; + int max_packet_size; /* Device-Model */ - struct device the_bus; + struct device the_bus; /* Simulator data */ - xbus_type_t bus_type; - - spinlock_t lock; + xbus_type_t bus_type; - bool hardware_exists; /* Hardware is functional */ - int open_counter; /* Number of open channels */ - atomic_t packet_counter; /* Allocated packets */ - wait_queue_head_t packet_cache_empty; + spinlock_t lock; - struct timer_list poll_timer; - struct rw_semaphore in_use; - int num_xpds; - void *priv; /* Pointer to transport level data structures */ + bool hardware_exists; /* Hardware is functional */ + int open_counter; /* Number of open channels */ + atomic_t packet_counter; /* Allocated packets */ + wait_queue_head_t packet_cache_empty; + + struct timer_list poll_timer; + /* + * Bus scanning + */ + atomic_t count_poll_answers; + struct list_head poll_results; + wait_queue_head_t wait_for_polls; + struct work_struct xpds_init_work; + struct completion xpds_initialized; + + struct rw_semaphore in_use; + int num_xpds; + void *priv; /* Pointer to transport level data structures */ #ifdef CONFIG_PROC_FS struct proc_dir_entry *proc_xbus_dir; struct proc_dir_entry *proc_xbus_summary; + struct proc_dir_entry *proc_xbus_waitfor_xpds; #endif /* statistics */ @@ -236,9 +242,9 @@ struct xpd { xpd_type_t type; byte revision; /* Card revision */ xpd_direction_t direction; /* TO_PHONE, TO_PSTN */ - xpp_line_t enabled_chans; /* hardware activation: 0 - off, 1 - on */ xpp_line_t no_pcm; /* Temporary: disable PCM (for USB-1) */ xpp_line_t hookstate; /* Actual chip state: 0 - ONHOOK, 1 - OFHOOK */ + xpp_line_t cid_on; xpp_line_t digital_outputs; /* 0 - no, 1 - yes */ xpp_line_t digital_inputs; /* 0 - no, 1 - yes */ @@ -276,6 +282,7 @@ struct xpd { unsigned int seq_errors; unsigned long last_response; /* in jiffies */ unsigned id; + xpd_addr_t addr; struct list_head xpd_list; unsigned int timer_count; volatile u_char *writechunk; /* Double-word aligned write memory */ @@ -288,10 +295,6 @@ struct xpd { #define for_each_line(xpd,i) \ for((i) = 0; (i) < (xpd)->channels; (i)++) -#define for_each_enabled_line(xpd,i) \ - for((i) = 0; (i) < (xpd)->channels; (i)++) \ - if(IS_SET((xpd)->enabled_chans,(i))) - #endif #endif /* XPD_H */ diff --git a/xpp/xpp_usb.c b/xpp/xpp_usb.c index 4b67299..4f81680 100644 --- a/xpp/xpp_usb.c +++ b/xpp/xpp_usb.c @@ -115,6 +115,8 @@ static struct xusb_counters { #define XUSB_COUNTER_MAX ARRAY_SIZE(xusb_counters) +#define MAX_PENDING_WRITES 100 + enum xusb_dir { XUSB_RECV = 0, XUSB_SEND = 1, @@ -138,6 +140,7 @@ typedef struct xpp_usb_bus { int present; /* if the device is not disconnected */ int reading; /* is the read_urb reading (listening) */ + atomic_t pending_writes; /* submited but not out yet */ struct semaphore sem; /* locks this structure */ int counters[XUSB_COUNTER_MAX]; } xusb_t; @@ -311,6 +314,14 @@ static int xusb_packet_send(xbus_t *xbus, xpacket_t *pack) ret = -EBADF; goto out; } + atomic_inc(&xusb->pending_writes); + if(atomic_read(&xusb->pending_writes) > MAX_PENDING_WRITES) { + static int rate_limit; + + if((rate_limit++ % 1000) < 10) + ERR("%s: %s: more than %d pending writes. Dropping.\n", __FUNCTION__, xbus->busname, MAX_PENDING_WRITES); + ret = -ENODEV; + } if(pack->content.opcode == XPROTO_NAME(GLOBAL,PCM_WRITE)) XUSB_COUNTER(xusb, PCM_WRITES)++; out: @@ -395,14 +406,8 @@ static const struct xusb_model_info { /* table of devices that work with this driver */ static const struct usb_device_id xusb_table [] = { // { USB_DEVICE(0x04B4, 0x8613) }, // default of cypress - { USB_DEVICE(0x0547, 0x1002), .driver_info=(kernel_ulong_t)&model_table[0] }, // bulkloop.hex -// { USB_DEVICE(0x04B4, 0x1004), .driver_info=(kernel_ulong_t)&model_table[1] }, // FPGA_bulkloop.hex -// { USB_DEVICE(0x04B4, 0x1004), .driver_info=(kernel_ulong_t)&model_table[2] }, // FIXME: temporary test for Dima { USB_DEVICE(0xE4E4, 0x2211), .driver_info=(kernel_ulong_t)&model_table[2] }, // FPGA_XPD.hex { USB_DEVICE(0xE4E4, 0x1132), .driver_info=(kernel_ulong_t)&model_table[2] }, // FPGA_XPD.hex -// { USB_DEVICE(0x04B4, 0x1004), .driver_info=(kernel_ulong_t)&model_table[2] }, // TEST ONLY - //{ USB_DEVICE(0x0548, 0x1) }, - //{ USB_DEVICE(0x062a, 0x0) }, /* "Gadget Zero" firmware runs under Linux */ //{ USB_DEVICE(0x0525, 0xa4a0) }, { } /* Terminating entry */ @@ -556,6 +561,7 @@ static int xusb_probe(struct usb_interface *interface, const struct usb_device_i memset(xusb, 0, sizeof(xusb_t)); init_MUTEX (&xusb->sem); + atomic_set(&xusb->pending_writes, 0); xusb->udev = udev; xusb->interface = interface; xusb->model_info = model_info; @@ -631,6 +637,7 @@ static int xusb_probe(struct usb_interface *interface, const struct usb_device_i retval = -EIO; goto probe_failed; } + procsummary->owner = THIS_MODULE; #endif bus_count++; retval = usb_submit_urb(xusb->read_urb, GFP_ATOMIC); @@ -732,6 +739,7 @@ static void xpp_send_callback(struct urb *urb, struct pt_regs *regs) xbus_t *xbus = xusb->xbus; BUG_ON(!xbus); + atomic_dec(&xusb->pending_writes); /* sync/async unlink faults aren't errors */ if (urb->status && !(urb->status == -ENOENT || urb->status == -ECONNRESET)) { static int rate_limit; @@ -739,11 +747,11 @@ static void xpp_send_callback(struct urb *urb, struct pt_regs *regs) DBG("nonzero read bulk status received: %d\n", urb->status); XUSB_COUNTER(xusb, TX_ERRORS)++; } + xpp_urb_delete(urb); if(!xusb->present) { ERR("A packet from non-connected device?\n"); return; } - xpp_urb_delete(urb); /* allow device read, write and ioctl */ XUSB_COUNTER(xusb, TX_PACKETS)++; } @@ -875,6 +883,7 @@ static int xusb_read_proc(char *page, char **start, off_t off, int count, int *e xusb->endpoints[XUSB_SEND].ep_addr, xusb->endpoints[XUSB_SEND].max_size ); + len += sprintf(page + len, "\npending_writes=%d\n", atomic_read(&xusb->pending_writes)); #ifdef DEBUG_PCM_TIMING len += sprintf(page + len, "\nstamp_last_pcm_read=%lld accumulate_diff=%lld\n", stamp_last_pcm_read, accumulate_diff); #endif diff --git a/xpp/xpp_zap.c b/xpp/xpp_zap.c index 4c8d3e9..4209fda 100644 --- a/xpp/xpp_zap.c +++ b/xpp/xpp_zap.c @@ -40,7 +40,7 @@ #include #ifdef STANDALONE_ZAPATA -#include "zaptel.h" +#include "../zaptel.h" #else #include #endif @@ -69,25 +69,20 @@ static struct timer_list xpp_timer; static xpd_t *sync_master = NULL; // Start with host based sync static unsigned int xpp_timer_count = 0; static unsigned int xpp_last_jiffies = 0; -struct workqueue_struct *xpp_worker = NULL; - -static LIST_HEAD(xpd_list); DEF_PARM(int, print_dbg, 0, "Print DBG statements"); DEF_PARM(int, max_queue_len, MAX_QUEUE_LEN, "Maximum Queue Length."); -DEF_PARM(int, ignore_xpds, 0, "a bitmask of xpd numbers to ignore"); -DEF_PARM(int, xbus_err_disable_bus, 1000, "Number of errors needed to disable bus"); // FIXME: unused now. -DEF_PARM(ulong, pcm_gen, 0, "a bitmask of line numbers for hardware tone generator"); DEF_PARM(bool, have_sync_bus, 0, "True if all Astribank(TM) devices are connected via a sync-cable"); DEF_PARM(bool, zap_autoreg, 1, "Register spans automatically (1) or not (0)"); -DEF_ARRAY(ulong, enabled_channels, MAX_XPDS, ~0, "Enabled channels for each xpd"); - #include "zap_debug.h" +#ifdef XPP_EC_CHUNK +#include "echo_supress/ec_xpp.h" +#endif -static int xpd_zaptel_register(xpd_t *xpd); -static int xpd_zaptel_unregister(xpd_t *xpd); +static int zaptel_register_xpd(xpd_t *xpd); +static int zaptel_unregister_xpd(xpd_t *xpd); static void xpp_ring_generate(xpd_t *xpd); static void xpp_transmitprep(xpd_t *xpd); static void xpp_receiveprep(xpd_t *xpd); @@ -207,7 +202,10 @@ static void xpd_free(xpd_t *xpd) if(!xpd) return; xbus = xpd->xbus; + if(!xbus) + return; DBG("%s/%s\n", xbus->busname, xpd->xpdname); + xbus_unregister_xpd(xbus, xpd); #ifdef CONFIG_PROC_FS if(xpd->proc_xpd_dir) { if(xpd->proc_xpd_summary) { @@ -227,23 +225,42 @@ static void xpd_free(xpd_t *xpd) #endif if(xpd->writechunk) kfree((void *)xpd->writechunk); + xpd->writechunk = NULL; if(xpd->xproto) xproto_put(xpd->xproto); + xpd->xproto = NULL; kfree(xpd); } /*------------------------- XPD Management -------------------------*/ +#define REV(x,y) (10 * (x) + (y)) +static byte good_revs[] = { + REV(1,9), + REV(2,0), +}; +#undef REV + +static bool good_rev(byte rev) +{ + int i; + + for(i = 0; i < ARRAY_SIZE(good_revs); i++) { + if(good_revs[i] == rev) + return 1; + } + return 0; +} + /* * Synchronous part of XPD detection. - * Called from xpp_worker workqueue. + * Called from xbus_poll() */ -void card_detected(void *data) +void card_detected(struct card_desc_struct *card_desc) { - struct card_desc_struct *card_desc = (struct card_desc_struct *)data; xbus_t *xbus; - xpd_t *xpd; + xpd_t *xpd = NULL; int xpd_num; byte type; byte rev; @@ -254,16 +271,24 @@ void card_detected(void *data) BUG_ON(!card_desc); BUG_ON(card_desc->magic != CARD_DESC_MAGIC); xbus = card_desc->xbus; - xpd_num = card_desc->xpd_num; + xpd_num = xpd_addr2num(&card_desc->xpd_addr); type = card_desc->type; rev = card_desc->rev; BUG_ON(!xbus); - DBG("%s: xpd_num=%d type=%d rev=%d\n", xbus->busname, xpd_num, type, rev); + if(!good_rev(rev)) { + NOTICE("%s: New XPD #%d (%d-%d) type=%d has bad firmware revision %d.%d\n", xbus->busname, + xpd_num, card_desc->xpd_addr.unit, card_desc->xpd_addr.subunit, + type, rev / 10, rev % 10); + goto err; + } + INFO("%s: New XPD #%d (%d-%d) type=%d Revision %d.%d\n", xbus->busname, + xpd_num, card_desc->xpd_addr.unit, card_desc->xpd_addr.subunit, + type, rev / 10, rev % 10); xpd = xpd_of(xbus, xpd_num); if(xpd) { if(type == XPD_TYPE_NOMODULE) { NOTICE("%s: xpd #%d: removed\n", __FUNCTION__, xpd_num); - xpd_disconnect(xpd); + BUG(); goto out; } NOTICE("%s: xpd #%d: already exists\n", __FUNCTION__, xpd_num); @@ -285,13 +310,14 @@ void card_detected(void *data) NOTICE("card_new(%s,%d,%d,%d) failed. Ignored.\n", xbus->busname, xpd_num, proto_table->type, rev); goto err; } + xpd->addr = card_desc->xpd_addr; /* For USB-1 disable some channels */ if(xbus->max_packet_size < RPACKET_SIZE(GLOBAL, PCM_WRITE)) { xpp_line_t no_pcm; no_pcm = 0x7F | xpd->digital_outputs | xpd->digital_inputs; - xpd->no_pcm = no_pcm & xpd->enabled_chans; + xpd->no_pcm = no_pcm; NOTICE("%s: max packet size = %d, disabling some PCM channels. no_pcm=0x%04X\n", xbus->busname, xbus->max_packet_size, xpd->no_pcm); } @@ -308,28 +334,28 @@ void card_detected(void *data) ERR("Failed to create proc '%s' for %s/%s\n", PROC_XPD_SUMMARY, xbus->busname, xpd->xpdname); goto err; } + xpd->proc_xpd_summary->owner = THIS_MODULE; xpd->proc_xpd_ztregister = create_proc_entry(PROC_XPD_ZTREGISTER, 0644, xpd->proc_xpd_dir); if (!xpd->proc_xpd_ztregister) { ERR("Failed to create proc '%s' for %s/%s\n", PROC_XPD_ZTREGISTER, xbus->busname, xpd->xpdname); goto err; } + xpd->proc_xpd_ztregister->owner = THIS_MODULE; xpd->proc_xpd_ztregister->data = xpd; xpd->proc_xpd_ztregister->read_proc = proc_xpd_ztregister_read; xpd->proc_xpd_ztregister->write_proc = proc_xpd_ztregister_write; #endif + xbus_register_xpd(xbus, xpd); if(CALL_XMETHOD(card_init, xbus, xpd) < 0) goto err; - list_add(&xpd->xpd_list, &xpd_list); - xbus->xpds[xpd->id] = xpd; - xbus->num_xpds++; // Turn off all channels CALL_XMETHOD(CHAN_ENABLE, xbus, xpd, ~0, 0); xpd->card_present = 1; - // Turn on enabled channels - CALL_XMETHOD(CHAN_ENABLE, xbus, xpd, xpd->enabled_chans, 1); + // Turn on all channels + CALL_XMETHOD(CHAN_ENABLE, xbus, xpd, ALL_LINES, 1); if(zap_autoreg) - xpd_zaptel_register(xpd); + zaptel_register_xpd(xpd); out: memset(card_desc, 0, sizeof(struct card_desc_struct)); kfree(card_desc); @@ -372,10 +398,6 @@ static int xpd_read_proc(char *page, char **start, off_t off, int count, int *eo xpd->timer_count, xpd->span.mainttimer ); len += sprintf(page + len, "STATES:"); - len += sprintf(page + len, "\n\t%-17s: ", "enabled"); - for_each_line(xpd, i) { - len += sprintf(page + len, "%d ", IS_SET(xpd->enabled_chans, i)); - } len += sprintf(page + len, "\n\t%-17s: ", "output_relays"); for_each_line(xpd, i) { len += sprintf(page + len, "%d ", IS_SET(xpd->digital_outputs, i)); @@ -469,8 +491,7 @@ xpd_t *xpd_alloc(size_t privsize, xbus_t *xbus, int xpd_num, const xproto_table_ size_t alloc_size = sizeof(xpd_t) + privsize; int i; - INFO("New XPD #%d (Revision %d.%d) detected on xbus %s\n", - xpd_num, revision / 10, revision % 10, xbus->busname); + DBG("%s: xpd #%d\n", xbus->busname, xpd_num); if(!VALID_XPD_NUM(xpd_num)) { ERR("%s: illegal xpd id = %d\n", __FUNCTION__, xpd_num); goto err; @@ -498,7 +519,6 @@ xpd_t *xpd_alloc(size_t privsize, xbus_t *xbus, int xpd_num, const xproto_table_ xpd->type = proto_table->type; xpd->xproto = proto_table; xpd->xops = &proto_table->xops; - xpd->enabled_chans = enabled_channels[xpd_num]; xpd->digital_outputs = 0; xpd->digital_inputs = 0; @@ -535,6 +555,13 @@ err: return NULL; } +/* FIXME: this should be removed once digium patch their zaptel.h + * I simply wish to avoid changing zaptel.h in the xpp patches. + */ +#ifndef ZT_EVENT_REMOVED +#define ZT_EVENT_REMOVED (20) +#endif + void xpd_disconnect(xpd_t *xpd) { unsigned long flags; @@ -550,8 +577,15 @@ void xpd_disconnect(xpd_t *xpd) if(!xpd->card_present) /* Multiple reports */ goto out; xpd->card_present = 0; - if(SPAN_REGISTERED(xpd)) + if(SPAN_REGISTERED(xpd)) { + int i; + update_xpd_status(xpd, ZT_ALARM_NOTOPEN); + /* TODO: Should this be done before releasing the spinlock? */ + DBG("Queuing ZT_EVENT_REMOVED on all channels to ask user to release them\n"); + for (i=0; ispan.channels; i++) + zt_qevent_lock(&xpd->chans[i],ZT_EVENT_REMOVED); + } out: spin_unlock_irqrestore(&xpd->lock, flags); } @@ -562,12 +596,9 @@ void xpd_remove(xpd_t *xpd) BUG_ON(!xpd); xbus = xpd->xbus; - INFO("Remove XPD #%d from xbus=%s\n", xpd->id, xbus->busname); + INFO("%s: Remove XPD #%d from\n", xbus->busname, xpd->id); - xpd_zaptel_unregister(xpd); - xbus->xpds[xpd->id] = NULL; - list_del(&xpd->xpd_list); - xbus->num_xpds--; + zaptel_unregister_xpd(xpd); CALL_XMETHOD(card_remove, xbus, xpd); xpd_free(xpd); } @@ -595,6 +626,18 @@ void update_xpd_status(xpd_t *xpd, int alarm_flag) DBG("Update XPD alarms: %s -> %02X\n", xpd->span.name, alarm_flag); } +void update_line_status(xpd_t *xpd, int pos, bool good) +{ + struct zt_chan *chan; + + BUG_ON(!xpd); + chan = &xpd->chans[pos]; + if(good) + zt_hooksig(chan, ZT_RXSIG_OFFHOOK); + else + zt_hooksig(chan, ZT_RXSIG_ONHOOK); +} + static void xpp_ring_generate(xpd_t *xpd) { int i; @@ -616,7 +659,7 @@ static void xpp_ring_generate(xpd_t *xpd) * Ring detect logic: * fxo_power is toggled */ - for_each_enabled_line(xpd, i) { + for_each_line(xpd, i) { if(xpd->ringing[i] || xpd->ringer_on[i]) { // ring state is only changed once per second: if((xpd->timer_count % 1000) == 0) { @@ -764,9 +807,9 @@ static int proc_xpd_ztregister_write(struct file *file, const char __user *buffe DBG("%s: %s/%s %s\n", __FUNCTION__, xpd->xbus->busname, xpd->xpdname, (zt_reg) ? "register" : "unregister"); if(zt_reg) - ret = xpd_zaptel_register(xpd); + ret = zaptel_register_xpd(xpd); else - ret = xpd_zaptel_unregister(xpd); + ret = zaptel_unregister_xpd(xpd); return (ret < 0) ? ret : count; } @@ -870,14 +913,14 @@ static void xpp_transmitprep(xpd_t *xpd) wake_up_interruptible(&xpd->txstateq[i]); } } - if(IS_SET(xpd->hookstate, i)) { + if(IS_SET(xpd->hookstate, i) || IS_SET(xpd->cid_on, i)) { memcpy((u_char *)w, chans[i].writechunk, ZT_CHUNKSIZE); // fill_beep((u_char *)w, 5); } w += ZT_CHUNKSIZE; } // if(xpd->hookstate != 0 || sync_master != xpd) { - ret = CALL_XMETHOD(PCM_WRITE, xpd->xbus, xpd, xpd->hookstate, writechunk); + ret = CALL_XMETHOD(PCM_WRITE, xpd->xbus, xpd, xpd->hookstate | xpd->cid_on, writechunk); if(ret < 0) { DBG("failed to write PCM %d\n", ret); } @@ -918,7 +961,7 @@ static inline void xpp_ec_chunk(struct zt_chan *chan, unsigned char *rxchunk, co spin_lock_irqsave(&chan->lock, flags); for (x=0;xec, ZT_XLAW(txchunk[x], chan), rxlin); + rxlin = xpp_echo_can_update(chan->ec, ZT_XLAW(txchunk[x], chan), rxlin); rxchunk[x] = ZT_LIN2X((int)rxlin, chan); } spin_unlock_irqrestore(&chan->lock, flags); @@ -950,6 +993,8 @@ static void xpp_receiveprep(xpd_t *xpd) // memset((u_char *)readchunk, 0x5A, ZT_CHUNKSIZE); // DEBUG // fill_beep((u_char *)readchunk, 1); // DEBUG: BEEP memcpy(chans[i].readchunk, (u_char *)readchunk, ZT_CHUNKSIZE); + } else { + memset(chans[i].readchunk, 0x7F, ZT_CHUNKSIZE); // SILENCE } readchunk += ZT_CHUNKSIZE; } @@ -1051,7 +1096,7 @@ int xpp_ioctl(struct zt_chan *chan, unsigned int cmd, unsigned long arg) xpd->idletxhookstate[pos] = FXS_LINE_CID; /* OHT mode when idle */ if (xpd->lasttxhook[pos] == FXS_LINE_ENABLED) { /* Apply the change if appropriate */ - CALL_XMETHOD(CHAN_CID, xpd->xbus, xpd, BIT(pos)); // CALLER ID + CALL_XMETHOD(CHAN_CID, xpd->xbus, xpd, pos); // CALLER ID } DBG("xpd=%d: ZT_ONHOOKTRANSFER (%d millis) chan=%d\n", xpd->id, x, pos); return -ENOTTY; @@ -1062,6 +1107,13 @@ int xpp_ioctl(struct zt_chan *chan, unsigned int cmd, unsigned long arg) xpd->id, pos, (x & ZT_TONEDETECT_ON), (x & ZT_TONEDETECT_MUTE)); return -ENOTTY; default: + /* Some span-specific commands before we give up: */ + if (xpd->xops->card_ioctl != NULL) { + x = xpd->xops->card_ioctl(xpd, pos, cmd, arg); + if (x != -ENOTTY) + return x; + } + DBG("ENOTTY: chan=%d cmd=0x%x\n", pos, cmd); DBG(" IOC_TYPE=0x%02X\n", _IOC_TYPE(cmd)); DBG(" IOC_DIR=0x%02X\n", _IOC_DIR(cmd)); @@ -1078,85 +1130,12 @@ static int xpp_hooksig(struct zt_chan *chan, zt_txsig_t txsig) xpd_t *xpd = chan->pvt; xbus_t *xbus; int pos = chan->chanpos - 1; - int ret = 0; BUG_ON(!xpd); xbus = xpd->xbus; BUG_ON(!xbus); - DBG("Setting %s to %s (%d)\n", chan->name, txsig2str(txsig), txsig); - if(xpd->direction == TO_PSTN) { - /* XXX Enable hooksig for FXO XXX */ - switch(txsig) { - case ZT_TXSIG_START: - // DBG("%s: ZT_TXSIG_START (drop through.)\n", chan->name); - case ZT_TXSIG_OFFHOOK: - // DBG("%s: ZT_TXSIG_OFFHOOK\n", chan->name); - do_sethook(xpd, pos, 1); - break; - case ZT_TXSIG_ONHOOK: - // DBG("%s: ZT_TXSIG_ONHOOK\n", chan->name); - do_sethook(xpd, pos, 0); - break; - default: - NOTICE("Can't set tx state to %s (%d)\n", txsig2str(txsig), txsig); - return -EINVAL; - } - } else { /* TO_PHONE */ - switch(txsig) { - case ZT_TXSIG_ONHOOK: - // DBG("%s: ZT_TXSIG_ONHOOK\n", chan->name); - xpd->ringing[pos] = 0; - ret = CALL_XMETHOD(RING, xbus, xpd, pos, 0); // RING off - switch(chan->sig) { - case ZT_SIG_EM: - case ZT_SIG_FXOKS: - case ZT_SIG_FXOLS: - xpd->lasttxhook[pos] = xpd->idletxhookstate[pos]; - break; - case ZT_SIG_FXOGS: - xpd->lasttxhook[pos] = FXS_LINE_TIPOPEN; - break; - } - break; - case ZT_TXSIG_OFFHOOK: - // DBG("%s: ZT_TXSIG_OFFHOOK\n", chan->name); - xpd->ringing[pos] = 0; - ret = CALL_XMETHOD(RING, xbus, xpd, pos, 0); // RING off - switch(chan->sig) { - case ZT_SIG_EM: - xpd->lasttxhook[pos] = FXS_LINE_REV_ACTIVE; - break; - default: - xpd->lasttxhook[pos] = xpd->idletxhookstate[pos]; - break; - } - break; - case ZT_TXSIG_START: - // DBG("%s: ZT_TXSIG_START\n", chan->name); - xpd->lasttxhook[pos] = FXS_LINE_RING; - xpd->ringing[pos] = 1; - if(IS_SET(xpd->digital_inputs, pos)) { - NOTICE("%s: Trying to RING a digital input channel %d. Ignoring\n", __FUNCTION__, pos); - return -EINVAL; - } - if(IS_SET(xpd->digital_outputs, pos)) { - DBG("ZT_RING %s digital output ON\n", chan->name); - ret = CALL_XMETHOD(RELAY_OUT, xpd->xbus, xpd, pos-8, 1); - return ret; - } - ret = CALL_XMETHOD(RING, xbus, xpd, pos, 1); // RING on - break; - case ZT_TXSIG_KEWL: - // DBG("%s: ZT_TXSIG_KEWL\n", chan->name); - xpd->lasttxhook[pos] = FXS_LINE_DISABLED; - break; - default: - NOTICE("%s: Can't set tx state to %s (%d)\n", __FUNCTION__, txsig2str(txsig), txsig); - return -EINVAL; - } - } - return 0; + return CALL_XMETHOD(card_hooksig, xbus, xpd, pos, txsig); } #else @@ -1254,6 +1233,29 @@ int (*hooksig)(struct zt_chan *chan, zt_txsig_t hookstate); int (*sethook)(struct zt_chan *chan, int hookstate); #endif +#ifdef XPP_EC_CHUNK +static int xpp_echocan(struct zt_chan *chan, int len) +{ + if(len == 0) { /* shut down */ + /* zaptel calls this also during channel initialization */ + if(chan->ec) { + xpp_echo_can_free(chan->ec); + } + return 0; + } + if(chan->ec) { + ERR("%s: Trying to override an existing EC (%p)\n", __FUNCTION__, chan->ec); + return -EINVAL; + } + chan->ec = xpp_echo_can_create(len, 0); + if(!chan->ec) { + ERR("%s: Failed creating xpp EC (len=%d)\n", __FUNCTION__, len); + return -EINVAL; + } + return 0; +} +#endif + #ifdef CONFIG_ZAPTEL_WATCHDOG /* * If the watchdog detects no received data, it will call the @@ -1280,7 +1282,7 @@ static int xpp_watchdog(struct zt_span *span, int cause) * - User action through /proc * - During xpd_remove() */ -static int xpd_zaptel_unregister(xpd_t *xpd) +static int zaptel_unregister_xpd(xpd_t *xpd) { unsigned long flags; @@ -1303,18 +1305,17 @@ static int xpd_zaptel_unregister(xpd_t *xpd) mdelay(2); // FIXME: This is to give chance for transmit/receiveprep to finish. spin_unlock_irqrestore(&xpd->lock, flags); if(xpd->card_present) - xpd->xops->card_zaptel_registration(xpd, 0); + xpd->xops->card_zaptel_preregistration(xpd, 0); zt_unregister(&xpd->span); + if(xpd->card_present) + xpd->xops->card_zaptel_postregistration(xpd, 0); return 0; } -static int xpd_zaptel_register(xpd_t *xpd) +static int zaptel_register_xpd(xpd_t *xpd) { - struct zt_chan *cur_chan; struct zt_span *span; xbus_t *xbus; - int sigfxs; - int i; int cn; const xops_t *xops; @@ -1325,7 +1326,6 @@ static int xpd_zaptel_register(xpd_t *xpd) ERR("xpd %s already registered\n", xpd->xpdname); return -EEXIST; } - sigfxs = ! (xpd->direction == TO_PHONE); /* signaling is opposite */ cn = xpd->channels; DBG("Initializing span: xpd %d have %d channels.\n", xpd->id, cn); @@ -1334,46 +1334,7 @@ static int xpd_zaptel_register(xpd_t *xpd) span = &xpd->span; xbus = xpd->xbus; - snprintf(span->name, MAX_SPANNAME, "%s/%s", - xbus->busname, xpd->xpdname); - snprintf(span->desc, MAX_SPANDESC, "Xorcom XPD #%d/%d: %s", - xbus->num, xpd->id, - (xpd->direction == TO_PHONE) ? "FXS" : "FXO" - ); - for(i = 0; i < cn; i++) { - - cur_chan = &xpd->chans[i]; - DBG("setting channel %d (sigfxs=%d)\n", i, sigfxs); - if(IS_SET(xpd->digital_outputs, i)) { - snprintf(cur_chan->name, MAX_CHANNAME, "XPP_OUT/%d/%d/%d", xbus->num, xpd->id, i); - } else if(IS_SET(xpd->digital_inputs, i)) { - snprintf(cur_chan->name, MAX_CHANNAME, "XPP_IN/%d/%d/%d", xbus->num, xpd->id, i); - } else { - snprintf(cur_chan->name, MAX_CHANNAME, "XPP_%s/%d/%d/%d", (sigfxs) ? "FXO" : "FXS", xbus->num, xpd->id, i); - } - cur_chan->chanpos = i + 1; - cur_chan->pvt = xpd; - if (sigfxs) - cur_chan->sigcap = -#if 1 - ZT_SIG_FXSKS | - ZT_SIG_FXSLS | -#else - ZT_SIG_SF | -#endif - 0; - else - cur_chan->sigcap = -#if 1 - ZT_SIG_FXOKS | - ZT_SIG_FXOLS | - ZT_SIG_FXOGS | -#else - ZT_SIG_SF | - ZT_SIG_EM | -#endif - 0; - } + snprintf(span->name, MAX_SPANNAME, "%s/%s", xbus->busname, xpd->xpdname); span->deflaw = ZT_LAW_MULAW; init_waitqueue_head(&span->maintq); span->pvt = xpd; @@ -1394,22 +1355,21 @@ static int xpd_zaptel_register(xpd_t *xpd) #endif span->ioctl = xpp_ioctl; span->maint = xpp_maint; +#ifdef XPP_EC_CHUNK + span->echocan = xpp_echocan; +#endif #ifdef CONFIG_ZAPTEL_WATCHDOG span->watchdog = xpp_watchdog; #endif - DBG("Finished span_load: ZT_FLAG_RUNNING=%d\n", span->flags & ZT_FLAG_RUNNING); - DBG("Registering span of %s.\n", xpd->xpdname); + xpd->xops->card_zaptel_preregistration(xpd, 1); if(zt_register(&xpd->span, 1)) { xbus_t *xbus = xpd->xbus; - ERR("Failed to zt_register of span of xpd %s.\n", xpd->xpdname); - xbus->xpds[xpd->id] = NULL; - list_del(&xpd->xpd_list); - xbus->num_xpds--; + ERR("%s/%s: Failed to zt_register span\n", xbus->busname, xpd->xpdname); return -ENODEV; } - xpd->xops->card_zaptel_registration(xpd, 1); + xpd->xops->card_zaptel_postregistration(xpd, 1); return 0; } @@ -1498,7 +1458,7 @@ static ssize_t xpp_sys_write (struct file * file, const char __user * buf, if (copy_from_user (pack_tx->content.raw, buf, count)) { return -EFAULT; } - XPD_ADDR_SET(pack_tx->content.addr, xpdnum); + xpd_set_addr(&pack_tx->content.addr, xpdnum); pack_tx->datalen = count; // pack_tx->flags |= XPP_PACKET_FIREANDFORGET; DBG("sending op=%d to %d\n", pack_tx->content.opcode, xpdnum); @@ -1528,11 +1488,6 @@ static void do_cleanup(void) { if(timer_pending(&xpp_timer)) del_timer_sync(&xpp_timer); - if (xpp_worker) { - flush_workqueue(xpp_worker); - destroy_workqueue(xpp_worker); - xpp_worker = NULL; - } #if 0 unregister_chrdev(XPP_CTL_MAJOR, THIS_MODULE->name); #endif @@ -1582,12 +1537,6 @@ int __init xpp_zap_init(void) ent->write_proc = proc_sync_write; ent->data = NULL; #endif - xpp_worker = create_singlethread_workqueue("xppworker"); - if(!xpp_worker) { - ERR("Failed to create card detector workqueue.\n"); - do_cleanup(); - return -ENOMEM; - } ret = xbus_core_init(); if(ret) { ERR("xbus_core_init failed (%d)\n", ret); @@ -1621,6 +1570,7 @@ EXPORT_SYMBOL(xpd_alloc); EXPORT_SYMBOL(xpd_disconnect); EXPORT_SYMBOL(packet_send); EXPORT_SYMBOL(update_xpd_status); +EXPORT_SYMBOL(update_line_status); EXPORT_SYMBOL(fill_beep); EXPORT_SYMBOL(xpp_tick); EXPORT_SYMBOL(xpp_open); diff --git a/xpp/xpp_zap.h b/xpp/xpp_zap.h index 38b3521..4d884ad 100644 --- a/xpp/xpp_zap.h +++ b/xpp/xpp_zap.h @@ -28,10 +28,11 @@ void xpd_disconnect(xpd_t *xpd); int packet_send(xbus_t *xbus, xpacket_t *pack_tx); -void card_detected(void *data); +void card_detected(struct card_desc_struct *card_desc); xpd_t *xpd_alloc(size_t privsize, xbus_t *xbus, int xpd_num, const xproto_table_t *proto_table, int channels, byte revision); void xpd_remove(xpd_t *xpd); void update_xpd_status(xpd_t *xpd, int alarm_flag); +void update_line_status(xpd_t *xpd, int pos, bool good); void fill_beep(u_char *buf, int duration); void xpp_tick(unsigned long param); int xpp_open(struct zt_chan *chan); @@ -40,16 +41,6 @@ int xpp_ioctl(struct zt_chan *chan, unsigned int cmd, unsigned long arg); int xpp_maint(struct zt_span *span, int cmd); void sync_master_is(xpd_t *xpd); -#define CARD_DESC_MAGIC 0xca9dde5c - -struct card_desc_struct { - struct work_struct work; - u32 magic; - xbus_t *xbus; - byte rev; /* Revision number */ - byte type; /* LSB: 1 - to_phone, 0 - to_line */ - byte xpd_num; -}; extern struct workqueue_struct *xpp_worker; #ifdef CONFIG_PROC_FS diff --git a/xpp/xproto.c b/xpp/xproto.c index 1fb28c5..7e6dd56 100644 --- a/xpp/xproto.c +++ b/xpp/xproto.c @@ -34,26 +34,25 @@ static int packet_process(xbus_t *xbus, int xpd_num, xpacket_t *pack); static const xproto_table_t *xprotocol_tables[XPD_TYPE_NOMODULE]; +#if MAX_UNIT*MAX_SUBUNIT > MAX_XPDS +#error MAX_XPDS is too small +#endif + bool valid_xpd_addr(const xpd_addr_t *addr) { - return ((addr->bank_num & ~0x1) == 0) && ((addr->card_id & ~0x3) == 0); + return ((addr->subunit & ~0x1) == 0) && ((addr->unit & ~0x3) == 0); } int xpd_addr2num(const xpd_addr_t *addr) { BUG_ON(!valid_xpd_addr(addr)); - return addr->bank_num * 4 + addr->card_id; + return addr->unit + addr->subunit * MAX_UNIT; } void xpd_set_addr(xpd_addr_t *addr, int xpd_num) { - if(xpd_num < 4) { - addr->card_id = xpd_num; - addr->bank_num = 0; - } else { - addr->card_id = xpd_num % 4; - addr->bank_num = xpd_num / 4; - } + addr->unit = xpd_num % MAX_UNIT; + addr->subunit = xpd_num / MAX_UNIT; } @@ -195,7 +194,8 @@ static int packet_process(xbus_t *xbus, int xpd_num, xpacket_t *pack) xe = find_xproto_entry(xpd, op); /*-------- Validations -----------*/ if(!xe) { - ERR("xpp: %s -- bad command op=0x%02X\n", __FUNCTION__, op); + ERR("xpp: %s: %s unit #%d: bad command op=0x%02X\n", + __FUNCTION__, xbus->busname, xpd_num, op); dump_packet("packet_process -- bad command", pack, print_dbg); ret = -EPROTO; goto out; @@ -227,10 +227,10 @@ void dump_packet(const char *msg, xpacket_t *packet, bool print_dbg) if(!print_dbg) return; - DBG("%s: @0x%1X%1X OP=0x%02X LEN=%d\n", + DBG("%s: U=0x%1X S=0x%1X OP=0x%02X LEN=%d\n", msg, - packet->content.addr.bank_num, - packet->content.addr.card_id, + packet->content.addr.unit, + packet->content.addr.subunit, op, (byte)packet->datalen); #if VERBOSE_DEBUG @@ -296,8 +296,14 @@ int xproto_register(const xproto_table_t *proto_table) CHECK_XOP(card_init); CHECK_XOP(card_remove); CHECK_XOP(card_tick); - CHECK_XOP(card_zaptel_registration); + CHECK_XOP(card_zaptel_preregistration); + CHECK_XOP(card_zaptel_postregistration); +#ifdef WITH_RBS + CHECK_XOP(card_hooksig); +#else CHECK_XOP(card_sethook); +#endif + // CHECK_XOP(card_ioctl); // optional method -- call after testing CHECK_XOP(SYNC_SOURCE); CHECK_XOP(PCM_WRITE); CHECK_XOP(CHAN_ENABLE); diff --git a/xpp/xproto.h b/xpp/xproto.h index 0cae398..4fcc81a 100644 --- a/xpp/xproto.h +++ b/xpp/xproto.h @@ -26,12 +26,18 @@ #ifdef __KERNEL__ #include +#include #endif #define PROTO_TABLE(n) n ## _protocol_table -#define XPD_TYPE_FXS 3 -#define XPD_TYPE_FXO 4 +/* + * The LSB of the type number signifies: + * 0 - TO_PSTN + * 1 - TO_PHONE + */ +#define XPD_TYPE_FXS 3 // TO_PHONE +#define XPD_TYPE_FXO 4 // TO_PSTN #define XPD_TYPE_NOMODULE 15 typedef byte xpd_type_t; @@ -44,16 +50,15 @@ typedef byte xpd_type_t; #define PCM_CHUNKSIZE (CHANNELS_PERXPD * 8) /* samples of 8 bytes */ typedef struct xpd_addr { - byte card_id:4; - byte bank_num:4; -} __attribute__((packed)) xpd_addr_t; + byte unit:UNIT_BITS; + byte subunit:SUBUNIT_BITS; +} PACKED xpd_addr_t; bool valid_xpd_addr(const xpd_addr_t *addr); int xpd_addr2num(const xpd_addr_t *addr); void xpd_set_addr(xpd_addr_t *addr, int xpd_num); #define XPD_NUM(x) xpd_addr2num(&x) -#define XPD_ADDR_SET(x,val) xpd_set_addr(&x, val) #define MAX_XPACKET_DATALEN 100 #define XPROTO_NAME(card,op) card ## _ ## op @@ -85,11 +90,12 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num); byte opcode; \ xpd_addr_t addr; \ __VA_ARGS__ \ - } __attribute__((packed)) + } PACKED #define RPACKET_CAST(p,card,op) ((RPACKET_TYPE(card,op) *)p) #define RPACKET_FIELD(p,card,op,field) (RPACKET_CAST(p,card,op)->field) #define RPACKET_SIZE(card,op) sizeof(RPACKET_TYPE(card,op)) +#define RPACKET_DATALEN(card,op) (RPACKET_SIZE(card,op) - sizeof(xpd_addr_t) - 1) #define PACKET_LEN(p) \ ((p)->datalen + sizeof(xpd_addr_t) + 1) @@ -97,7 +103,7 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num); #define XENTRY(card,op) \ [ XPROTO_NAME(card,op) ] { \ .handler = XPROTO_HANDLER(card,op), \ - .datalen = RPACKET_SIZE(card,op), \ + .datalen = RPACKET_DATALEN(card,op), \ .name = #op, \ .table = &PROTO_TABLE(card) \ } @@ -106,7 +112,7 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num); #define XPACKET_INIT(p, card, op) \ do { \ p->content.opcode = XPROTO_NAME(card,op); \ - p->datalen = RPACKET_SIZE(card,op); \ + p->datalen = RPACKET_DATALEN(card,op); \ } while(0) #define XPACKET_NEW(p, xbus, card, op, to) \ @@ -115,7 +121,7 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num); if(!p) \ return -ENOMEM; \ XPACKET_INIT(p, card, op); \ - XPD_ADDR_SET(p->content.addr, to); \ + xpd_set_addr(&p->content.addr, to); \ } while(0); typedef struct xproto_entry xproto_entry_t; @@ -143,14 +149,20 @@ struct xops { int (*card_init)(xbus_t *xbus, xpd_t *xpd); int (*card_remove)(xbus_t *xbus, xpd_t *xpd); int (*card_tick)(xbus_t *xbus, xpd_t *xpd); - int (*card_zaptel_registration)(xpd_t *xpd, bool on); + int (*card_zaptel_preregistration)(xpd_t *xpd, bool on); + int (*card_zaptel_postregistration)(xpd_t *xpd, bool on); +#ifdef WITH_RBS + int (*card_hooksig)(xbus_t *xbus, xpd_t *xpd, int pos, zt_txsig_t txsig); +#else int (*card_sethook)(xbus_t *xbus, xpd_t *xpd, int pos, int hookstate); +#endif + int (*card_ioctl)(xpd_t *xpd, int pos, unsigned int cmd, unsigned long arg); int (*SYNC_SOURCE)(xbus_t *xbus, xpd_t *xpd, bool setit, bool is_master); int (*PCM_WRITE)(xbus_t *xbus, xpd_t *xpd, xpp_line_t hookstate, volatile byte *buf); int (*CHAN_ENABLE)(xbus_t *xbus, xpd_t *xpd, xpp_line_t lines, bool on); - int (*CHAN_CID)(xbus_t *xbus, xpd_t *xpd, xpp_line_t lines); + int (*CHAN_CID)(xbus_t *xbus, xpd_t *xpd, int pos); int (*RING)(xbus_t *xbus, xpd_t *xpd, int pos, bool on); int (*SETHOOK)(xbus_t *xbus, xpd_t *xpd, int pos, bool offhook); int (*RELAY_OUT)(xbus_t *xbus, xpd_t *xpd, byte which, bool on); @@ -178,6 +190,7 @@ struct xproto_table { #include "card_fxo.h" enum opcodes { + XPROTO_NAME(GLOBAL, NULL_REPLY) = 0xFE, XPROTO_NAME(GLOBAL, DESC_REQ) = 0x04, XPROTO_NAME(GLOBAL, DEV_DESC) = 0x05, /**/ @@ -195,6 +208,7 @@ struct xpacket_raw { byte opcode; xpd_addr_t addr; union { + MEMBER(GLOBAL, NULL_REPLY); MEMBER(GLOBAL, DESC_REQ); MEMBER(GLOBAL, DEV_DESC); MEMBER(GLOBAL, PCM_WRITE); @@ -203,17 +217,15 @@ struct xpacket_raw { MEMBER(FXS, SIG_CHANGED); MEMBER(FXS, SLIC_REPLY); - MEMBER(FXS, SLIC_INIT); MEMBER(FXS, SLIC_WRITE); MEMBER(FXO, SIG_CHANGED); MEMBER(FXO, DAA_REPLY); - MEMBER(FXO, DAA_INIT); MEMBER(FXO, DAA_WRITE); byte data[0]; }; -} __attribute__((packed)); +} PACKED; struct xpacket { xpacket_raw_t content; diff --git a/xpp/zap_debug.c b/xpp/zap_debug.c index 8134e8f..59eb0a8 100644 --- a/xpp/zap_debug.c +++ b/xpp/zap_debug.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include "zap_debug.h" static const char rcsid[] = "$Id$"; diff --git a/xpp/zap_debug.h b/xpp/zap_debug.h index 3c31352..6d8ac36 100644 --- a/xpp/zap_debug.h +++ b/xpp/zap_debug.h @@ -23,11 +23,9 @@ */ /* Debugging Macros */ -#define DBG(fmt, ...) \ - do { \ - if (print_dbg) \ - printk(KERN_DEBUG "DBG-%s: %s: " fmt, THIS_MODULE->name, __FUNCTION__, ## __VA_ARGS__); \ - } while (0) +#define DBG(fmt, ...) \ + ((void)((print_dbg) && printk(KERN_DEBUG "DBG-%s: %s: " fmt, \ + THIS_MODULE->name, __FUNCTION__, ## __VA_ARGS__))) #define INFO(fmt, ...) printk(KERN_INFO "INFO-%s: " fmt, THIS_MODULE->name, ## __VA_ARGS__) #define NOTICE(fmt, ...) printk(KERN_NOTICE "NOTICE-%s: " fmt, THIS_MODULE->name, ## __VA_ARGS__) #define WARN(fmt, ...) printk(KERN_WARNING "WARN-%s: %s: " fmt, THIS_MODULE->name, __FUNCTION__, ## __VA_ARGS__) -- cgit v1.2.3