diff options
Diffstat (limited to 'drivers/net/tokenring')
-rw-r--r-- | drivers/net/tokenring/.cvsignore | 2 | ||||
-rw-r--r-- | drivers/net/tokenring/Config.in | 15 | ||||
-rw-r--r-- | drivers/net/tokenring/Makefile | 51 | ||||
-rw-r--r-- | drivers/net/tokenring/ibmtr.c | 1809 | ||||
-rw-r--r-- | drivers/net/tokenring/ibmtr.h | 449 | ||||
-rw-r--r-- | drivers/net/tokenring/olympic.c | 1667 | ||||
-rw-r--r-- | drivers/net/tokenring/olympic.h | 304 | ||||
-rw-r--r-- | drivers/net/tokenring/sktr.c | 2707 | ||||
-rw-r--r-- | drivers/net/tokenring/sktr.h | 1103 | ||||
-rw-r--r-- | drivers/net/tokenring/sktr_firmware.h | 3616 |
10 files changed, 11723 insertions, 0 deletions
diff --git a/drivers/net/tokenring/.cvsignore b/drivers/net/tokenring/.cvsignore new file mode 100644 index 000000000..857dd22e9 --- /dev/null +++ b/drivers/net/tokenring/.cvsignore @@ -0,0 +1,2 @@ +.depend +.*.flags diff --git a/drivers/net/tokenring/Config.in b/drivers/net/tokenring/Config.in new file mode 100644 index 000000000..8b3065c8a --- /dev/null +++ b/drivers/net/tokenring/Config.in @@ -0,0 +1,15 @@ +# +# Token Ring driver configuration +# + +mainmenu_option next_comment +comment 'Token Ring driver support' + +bool 'Token Ring driver support' CONFIG_TR +if [ "$CONFIG_TR" = "y" ]; then + tristate ' IBM Tropic chipset based adapter support' CONFIG_IBMTR + tristate ' IBM Olympic chipset PCI adapter support' CONFIG_IBMOL + tristate ' SysKonnect adapter support' CONFIG_SKTR +fi + +endmenu diff --git a/drivers/net/tokenring/Makefile b/drivers/net/tokenring/Makefile new file mode 100644 index 000000000..038c58b86 --- /dev/null +++ b/drivers/net/tokenring/Makefile @@ -0,0 +1,51 @@ +# +# Makefile for drivers/net/tokenring +# +# Note! Dependencies are done automagically by 'make dep', which also +# removes any old dependencies. DON'T put your own dependencies here +# unless it's something special (ie not a .c file). +# +# Note 2! The CFLAGS definition is now inherited from the +# parent makefile. +# + +# +# Note : at this point, these files are compiled on all systems. +# In the future, some of these should be built conditionally. +# + +SUB_DIRS := +MOD_SUB_DIRS := $(SUB_DIRS) +ALL_SUB_DIRS := $(SUB_DIRS) + + +L_TARGET := tr.a +L_OBJS := +M_OBJS := + +ifeq ($(CONFIG_IBMTR),y) + L_OBJS += ibmtr.o +else + ifeq ($(CONFIG_IBMTR),m) + M_OBJS += ibmtr.o + endif +endif + +ifeq ($(CONFIG_IBMOL),y) + L_OBJS += olympic.o +else + ifeq ($(CONFIG_IBMOL),m) + M_OBJS += olympic.o + endif +endif + +ifeq ($(CONFIG_SKTR),y) + L_OBJS += sktr.o +else + ifeq ($(CONFIG_SKTR),m) + M_OBJS += sktr.o + endif +endif + +include $(TOPDIR)/Rules.make + diff --git a/drivers/net/tokenring/ibmtr.c b/drivers/net/tokenring/ibmtr.c new file mode 100644 index 000000000..85cdfb774 --- /dev/null +++ b/drivers/net/tokenring/ibmtr.c @@ -0,0 +1,1809 @@ +/* ibmtr.c: A shared-memory IBM Token Ring 16/4 driver for linux + * + * Written 1993 by Mark Swanson and Peter De Schrijver. + * This software may be used and distributed according to the terms + * of the GNU Public License, incorporated herein by reference. + * + * This device driver should work with Any IBM Token Ring Card that does + * not use DMA. + * + * I used Donald Becker's (becker@cesdis.gsfc.nasa.gov) device driver work + * as a base for most of my initial work. + * + * Changes by Peter De Schrijver (Peter.Deschrijver@linux.cc.kuleuven.ac.be) : + * + * + changed name to ibmtr.c in anticipation of other tr boards. + * + changed reset code and adapter open code. + * + added SAP open code. + * + a first attempt to write interrupt, transmit and receive routines. + * + * Changes by David W. Morris (dwm@shell.portal.com) : + * 941003 dwm: - Restructure tok_probe for multiple adapters, devices. + * + Add comments, misc reorg for clarity. + * + Flatten interrupt handler levels. + * + * Changes by Farzad Farid (farzy@zen.via.ecp.fr) + * and Pascal Andre (andre@chimay.via.ecp.fr) (March 9 1995) : + * + multi ring support clean up. + * + RFC1042 compliance enhanced. + * + * Changes by Pascal Andre (andre@chimay.via.ecp.fr) (September 7 1995) : + * + bug correction in tr_tx + * + removed redundant information display + * + some code reworking + * + * Changes by Michel Lespinasse (walken@via.ecp.fr), + * Yann Doussot (doussot@via.ecp.fr) and Pascal Andre (andre@via.ecp.fr) + * (February 18, 1996) : + * + modified shared memory and mmio access port the driver to + * alpha platform (structure access -> readb/writeb) + * + * Changes by Steve Kipisz (bungy@ibm.net or kipisz@vnet.ibm.com) + * (January 18 1996): + * + swapped WWOR and WWCR in ibmtr.h + * + moved some init code from tok_probe into trdev_init. The + * PCMCIA code can call trdev_init to complete initializing + * the driver. + * + added -DPCMCIA to support PCMCIA + * + detecting PCMCIA Card Removal in interrupt handler. If + * ISRP is FF, then a PCMCIA card has been removed + * + * Changes by Paul Norton (pnorton@cts.com) : + * + restructured the READ.LOG logic to prevent the transmit SRB + * from being rudely overwritten before the transmit cycle is + * complete. (August 15 1996) + * + completed multiple adapter support. (November 20 1996) + * + implemented csum_partial_copy in tr_rx and increased receive + * buffer size and count. Minor fixes. (March 15, 1997) + * + * Changes by Christopher Turcksin <wabbit@rtfc.demon.co.uk> + * + Now compiles ok as a module again. + * + * Changes by Paul Norton (pnorton@ieee.org) : + * + moved the header manipulation code in tr_tx and tr_rx to + * net/802/tr.c. (July 12 1997) + * + add retry and timeout on open if cable disconnected. (May 5 1998) + * + lifted 2000 byte mtu limit. now depends on shared-RAM size. + * May 25 1998) + * + can't allocate 2k recv buff at 8k shared-RAM. (20 October 1998) + * + * Changes by Joel Sloan (jjs@c-me.com) : + * + disable verbose debug messages by default - to enable verbose + * debugging, edit the IBMTR_DEBUG_MESSAGES define below + * + * Changes by Mike Phillips <phillim@amtrak.com> : + * + Added extra #ifdef's to work with new PCMCIA Token Ring Code. + * The PCMCIA code now just sets up the card so it can be recognized + * by ibmtr_probe. Also checks allocated memory vs. on-board memory + * for correct figure to use. + * + * Changes by Tim Hockin (thockin@isunix.it.ilstu.edu) : + * + added spinlocks for SMP sanity (10 March 1999) + * + * Changes by Jochen Friedrich to enable RFC1469 Option 2 multicasting + * i.e. using functional address C0 00 00 04 00 00 to transmit and + * receive multicast packets. + */ + +/* change the define of IBMTR_DEBUG_MESSAGES to a nonzero value +in the event that chatty debug messages are desired - jjs 12/30/98 */ + +#define IBMTR_DEBUG_MESSAGES 0 + +#ifdef PCMCIA +#define MODULE +#endif + +#include <linux/module.h> + +#ifdef PCMCIA +#undef MODULE +#endif + +#define NO_AUTODETECT 1 +#undef NO_AUTODETECT +#undef ENABLE_PAGING + + +#define FALSE 0 +#define TRUE (!FALSE) + +/* changes the output format of driver initialisation */ +#define TR_NEWFORMAT 1 +#define TR_VERBOSE 0 + +/* some 95 OS send many non UI frame; this allow removing the warning */ +#define TR_FILTERNONUI 1 + +/* version and credits */ +static char *version = +"ibmtr.c: v1.3.57 8/ 7/94 Peter De Schrijver and Mark Swanson\n" +" v2.1.125 10/20/98 Paul Norton <pnorton@ieee.org>\n" +" v2.2.0 12/30/98 Joel Sloan <jjs@c-me.com>\n"; + +static char pcchannelid[] = { + 0x05, 0x00, 0x04, 0x09, + 0x04, 0x03, 0x04, 0x0f, + 0x03, 0x06, 0x03, 0x01, + 0x03, 0x01, 0x03, 0x00, + 0x03, 0x09, 0x03, 0x09, + 0x03, 0x00, 0x02, 0x00 +}; + +static char mcchannelid[] = { + 0x04, 0x0d, 0x04, 0x01, + 0x05, 0x02, 0x05, 0x03, + 0x03, 0x06, 0x03, 0x03, + 0x05, 0x08, 0x03, 0x04, + 0x03, 0x05, 0x03, 0x01, + 0x03, 0x08, 0x02, 0x00 +}; + +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/errno.h> +#include <linux/timer.h> +#include <linux/in.h> +#include <linux/ioport.h> +#include <linux/string.h> +#include <linux/skbuff.h> +#include <linux/interrupt.h> +#include <linux/delay.h> +#include <linux/netdevice.h> +#include <linux/trdevice.h> +#include <linux/stddef.h> +#include <linux/init.h> +#include <linux/spinlock.h> +#include <net/checksum.h> + +#include <asm/io.h> +#include <asm/system.h> +#include <asm/bitops.h> + +#include "ibmtr.h" + + +#define DPRINTK(format, args...) printk("%s: " format, dev->name , ## args) +#define DPRINTD(format, args...) DummyCall("%s: " format, dev->name , ## args) +#define MIN(X, Y) ((X) < (Y) ? (X) : (Y)) +#define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) + +#if TR_NEWFORMAT +/* this allows displaying full adapter information */ + +const char *channel_def[] __initdata = { + "ISA", "MCA", "ISA P&P" +}; + +char __init *adapter_def(char type) +{ + switch (type) + { + case 0xF : return "PC Adapter | PC Adapter II | Adapter/A"; + case 0xE : return "16/4 Adapter | 16/4 Adapter/A (long)"; + case 0xD : return "16/4 Adapter/A (short) | 16/4 ISA-16 Adapter"; + case 0xC : return "Auto 16/4 Adapter"; + default : return "adapter (unknown type)"; + }; +}; +#endif + +#if !TR_NEWFORMAT +unsigned char ibmtr_debug_trace=1; /* Patch or otherwise alter to + control tokenring tracing. */ +#else +unsigned char ibmtr_debug_trace=0; +#endif +#define TRC_INIT 0x01 /* Trace initialization & PROBEs */ +#define TRC_INITV 0x02 /* verbose init trace points */ + +int ibmtr_probe(struct net_device *dev); +static int ibmtr_probe1(struct net_device *dev, int ioaddr); +static unsigned char get_sram_size(struct tok_info *adapt_info); +#ifdef PCMCIA +extern unsigned char pcmcia_reality_check(unsigned char gss); +#endif +static int tok_init_card(struct net_device *dev); +void tok_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static int trdev_init(struct net_device *dev); +static void initial_tok_int(struct net_device *dev); +static void open_sap(unsigned char type,struct net_device *dev); +void tok_open_adapter(unsigned long dev_addr); +static void tr_rx(struct net_device *dev); +static void tr_tx(struct net_device *dev); +static int tok_open(struct net_device *dev); +static int tok_close(struct net_device *dev); +static int tok_send_packet(struct sk_buff *skb, struct net_device *dev); +static struct net_device_stats * tok_get_stats(struct net_device *dev); +static void tok_set_multicast_list(struct net_device *dev); +void ibmtr_readlog(struct net_device *dev); +void ibmtr_reset_timer(struct timer_list *tmr, struct net_device *dev); +int ibmtr_change_mtu(struct net_device *dev, int mtu); + +static unsigned int ibmtr_portlist[] __initdata = { + 0xa20, 0xa24, 0 +}; + +static __u32 ibmtr_mem_base = 0xd0000; + +static void __init PrtChanID(char *pcid, short stride) +{ + short i, j; + for (i=0, j=0; i<24; i++, j+=stride) + printk("%1x", ((int) pcid[j]) & 0x0f); + printk("\n"); +} + +static void __init HWPrtChanID (__u32 pcid, short stride) +{ + short i, j; + for (i=0, j=0; i<24; i++, j+=stride) + printk("%1x", ((int)readb(pcid + j)) & 0x0f); + printk("\n"); +} + +/* + * ibmtr_probe(): Routine specified in the network device structure + * to probe for an IBM Token Ring Adapter. Routine outline: + * I. Interrogate hardware to determine if an adapter exists + * and what the speeds and feeds are + * II. Setup data structures to control execution based upon + * adapter characteristics. + * III. Initialize adapter operation + * + * We expect ibmtr_probe to be called once for each device entry + * which references it. + */ + +int __init ibmtr_probe(struct net_device *dev) +{ + int i; + int base_addr = dev ? dev->base_addr : 0; + + if (base_addr > 0x1ff) + { + /* + * Check a single specified location. + */ + + if (ibmtr_probe1(dev, base_addr)) + { +#ifndef MODULE +#ifndef PCMCIA + tr_freedev(dev); +#endif +#endif + return -ENODEV; + } else + return 0; + } + else if (base_addr != 0) /* Don't probe at all. */ + return -ENXIO; + + for (i = 0; ibmtr_portlist[i]; i++) + { + int ioaddr = ibmtr_portlist[i]; + if (check_region(ioaddr, IBMTR_IO_EXTENT)) + continue; + if (ibmtr_probe1(dev, ioaddr)) { +#ifndef MODULE +#ifndef PCMCIA + tr_freedev(dev); +#endif +#endif + } else + return 0; + } + + return -ENODEV; +} + +static int __init ibmtr_probe1(struct net_device *dev, int PIOaddr) +{ + unsigned char segment=0, intr=0, irq=0, i=0, j=0, cardpresent=NOTOK,temp=0; + __u32 t_mmio=0; + struct tok_info *ti=0; + __u32 cd_chanid; + unsigned char *tchanid, ctemp; + unsigned long timeout; + +#ifndef MODULE +#ifndef PCMCIA + dev = init_trdev(dev,0); +#endif +#endif + + /* Query the adapter PIO base port which will return + * indication of where MMIO was placed. We also have a + * coded interrupt number. + */ + + segment = inb(PIOaddr); + + /* + * Out of range values so we'll assume non-existent IO device + */ + + if (segment < 0x40 || segment > 0xe0) + return -ENODEV; + + /* + * Compute the linear base address of the MMIO area + * as LINUX doesn't care about segments + */ + + t_mmio=(((__u32)(segment & 0xfc) << 11) + 0x80000); + intr = segment & 0x03; /* low bits is coded interrupt # */ + if (ibmtr_debug_trace & TRC_INIT) + DPRINTK("PIOaddr: %4hx seg/intr: %2x mmio base: %08X intr: %d\n", + PIOaddr, (int)segment, t_mmio, (int)intr); + + /* + * Now we will compare expected 'channelid' strings with + * what we is there to learn of ISA/MCA or not TR card + */ + + cd_chanid = (CHANNEL_ID + t_mmio); /* for efficiency */ + tchanid=pcchannelid; + cardpresent=TR_ISA; /* try ISA */ + + /* + * Suboptimize knowing first byte different + */ + + ctemp = readb(cd_chanid) & 0x0f; + if (ctemp != *tchanid) { /* NOT ISA card, try MCA */ + tchanid=mcchannelid; + cardpresent=TR_MCA; + if (ctemp != *tchanid) /* Neither ISA nor MCA */ + cardpresent=NOTOK; + } + + if (cardpresent != NOTOK) + { + /* + * Know presumed type, try rest of ID + */ + for (i=2,j=1; i<=46; i=i+2,j++) + { + if ((readb(cd_chanid+i) & 0x0f) != tchanid[j]) { + cardpresent=NOTOK; /* match failed, not TR card */ + break; + } + } + } + + /* + * If we have an ISA board check for the ISA P&P version, + * as it has different IRQ settings + */ + + if (cardpresent == TR_ISA && (readb(AIPFID + t_mmio)==0x0e)) + cardpresent=TR_ISAPNP; + + if (cardpresent == NOTOK) { /* "channel_id" did not match, report */ + if (ibmtr_debug_trace & TRC_INIT) { + DPRINTK("Channel ID string not found for PIOaddr: %4hx\n", PIOaddr); + DPRINTK("Expected for ISA: "); PrtChanID(pcchannelid,1); + DPRINTK(" found: "); HWPrtChanID(cd_chanid,2); + DPRINTK("Expected for MCA: "); PrtChanID(mcchannelid,1); + } + return -ENODEV; + } + + /* Now, allocate some of the pl0 buffers for this driver.. */ + + /* If called from PCMCIA, ti is already set up, so no need to + waste the memory, just use the existing structure */ + +#ifndef PCMCIA + ti = (struct tok_info *)kmalloc(sizeof(struct tok_info), GFP_KERNEL); + if (ti == NULL) + return -ENOMEM; + + memset(ti, 0, sizeof(struct tok_info)); +#else + ti = dev->priv ; +#endif + ti->mmio= t_mmio; + ti->readlog_pending = 0; + init_waitqueue_head(&ti->wait_for_tok_int); + init_waitqueue_head(&ti->wait_for_reset); + + dev->priv = ti; /* this seems like the logical use of the + field ... let's try some empirical tests + using the token-info structure -- that + should fit with out future hope of multiple + adapter support as well /dwm */ + + /* if PCMCIA, then the card is recognized as TR_ISAPNP + * and there is no need to set up the interrupt, it is already done. */ + +#ifndef PCMCIA + switch (cardpresent) + { + case TR_ISA: + if (intr==0) + irq=9; /* irq2 really is irq9 */ + if (intr==1) + irq=3; + if (intr==2) + irq=6; + if (intr==3) + irq=7; + ti->global_int_enable=GLOBAL_INT_ENABLE+((irq==9) ? 2 : irq); + ti->adapter_int_enable=PIOaddr+ADAPTINTREL; + ti->sram=0; +#if !TR_NEWFORMAT + DPRINTK("ti->global_int_enable: %04X\n",ti->global_int_enable); +#endif + break; + case TR_MCA: + if (intr==0) + irq=9; + if (intr==1) + irq=3; + if (intr==2) + irq=10; + if (intr==3) + irq=11; + ti->global_int_enable=0; + ti->adapter_int_enable=0; + ti->sram=((__u32)(inb(PIOaddr+ADAPTRESETREL) & 0xfe) << 12); + break; + case TR_ISAPNP: + if (intr==0) + irq=9; + if (intr==1) + irq=3; + if (intr==2) + irq=10; + if (intr==3) + irq=11; + timeout = jiffies + TR_SPIN_INTERVAL; + while(!readb(ti->mmio + ACA_OFFSET + ACA_RW + RRR_EVEN)) + if (time_after(jiffies, timeout)) { + DPRINTK("Hardware timeout during initialization.\n"); + kfree_s(ti, sizeof(struct tok_info)); + return -ENODEV; + } + + ti->sram=((__u32)readb(ti->mmio + ACA_OFFSET + ACA_RW + RRR_EVEN)<<12); + ti->global_int_enable=PIOaddr+ADAPTINTREL; + ti->adapter_int_enable=PIOaddr+ADAPTINTREL; + break; + } +#endif + + if (ibmtr_debug_trace & TRC_INIT) { /* just report int */ + DPRINTK("irq=%d",irq); + if (ibmtr_debug_trace & TRC_INITV) { /* full chat in verbose only */ + DPRINTK(", ti->mmio=%08X",ti->mmio); + printk(", segment=%02X",segment); + } + printk(".\n"); + } + + /* Get hw address of token ring card */ +#if !TR_NEWFORMAT + DPRINTK("hw address: "); +#endif + j=0; + for (i=0; i<0x18; i=i+2) + { + /* technical reference states to do this */ + temp = readb(ti->mmio + AIP + i) & 0x0f; +#if !TR_NEWFORMAT + printk("%1X",ti->hw_address[j]=temp); +#else + ti->hw_address[j]=temp; +#endif + if(j&1) + dev->dev_addr[(j/2)]=ti->hw_address[j]+(ti->hw_address[j-1]<<4); + ++j; + } +#ifndef TR_NEWFORMAT + printk("\n"); +#endif + + /* get Adapter type: 'F' = Adapter/A, 'E' = 16/4 Adapter II,...*/ + ti->adapter_type = readb(ti->mmio + AIPADAPTYPE); + + /* get Data Rate: F=4Mb, E=16Mb, D=4Mb & 16Mb ?? */ + ti->data_rate = readb(ti->mmio + AIPDATARATE); + + /* Get Early Token Release support?: F=no, E=4Mb, D=16Mb, C=4&16Mb */ + ti->token_release = readb(ti->mmio + AIPEARLYTOKEN); + + /* How much shared RAM is on adapter ? */ +#ifdef PCMCIA + ti->avail_shared_ram = pcmcia_reality_check(get_sram_size(ti)); + ibmtr_mem_base = ti->sram_base << 12 ; +#else + ti->avail_shared_ram = get_sram_size(ti); +#endif + /* We need to set or do a bunch of work here based on previous results.. */ + /* Support paging? What sizes?: F=no, E=16k, D=32k, C=16 & 32k */ + ti->shared_ram_paging = readb(ti->mmio + AIPSHRAMPAGE); + + /* Available DHB 4Mb size: F=2048, E=4096, D=4464 */ + switch (readb(ti->mmio + AIP4MBDHB)) { + case 0xe : + ti->dhb_size4mb = 4096; + break; + case 0xd : + ti->dhb_size4mb = 4464; + break; + default : + ti->dhb_size4mb = 2048; + break; + } + + /* Available DHB 16Mb size: F=2048, E=4096, D=8192, C=16384, B=17960 */ + switch (readb(ti->mmio + AIP16MBDHB)) { + case 0xe : + ti->dhb_size16mb = 4096; + break; + case 0xd : + ti->dhb_size16mb = 8192; + break; + case 0xc : + ti->dhb_size16mb = 16384; + break; + case 0xb : + ti->dhb_size16mb = 17960; + break; + default : + ti->dhb_size16mb = 2048; + break; + } + +#if !TR_NEWFORMAT + DPRINTK("atype=%x, drate=%x, trel=%x, asram=%dK, srp=%x, " + "dhb(4mb=%x, 16mb=%x)\n",ti->adapter_type, + ti->data_rate, ti->token_release, ti->avail_shared_ram/2, + ti->shared_ram_paging, ti->dhb_size4mb, ti->dhb_size16mb); +#endif + + /* We must figure out how much shared memory space this adapter + * will occupy so that if there are two adapters we can fit both + * in. Given a choice, we will limit this adapter to 32K. The + * maximum space will will use for two adapters is 64K so if the + * adapter we are working on demands 64K (it also doesn't support + * paging), then only one adapter can be supported. + */ + + /* + * determine how much of total RAM is mapped into PC space + */ + ti->mapped_ram_size=1<<((((readb(ti->mmio+ ACA_OFFSET + ACA_RW + RRR_ODD)) >>2) & 0x03) + 4); + ti->page_mask=0; + if (ti->shared_ram_paging == 0xf) { /* No paging in adapter */ + ti->mapped_ram_size = ti->avail_shared_ram; + } else { +#ifdef ENABLE_PAGING + unsigned char pg_size; +#endif + +#if !TR_NEWFORMAT + DPRINTK("shared ram page size: %dK\n",ti->mapped_ram_size/2); +#endif +#ifdef ENABLE_PAGING + switch(ti->shared_ram_paging) + { + case 0xf: + break; + case 0xe: + ti->page_mask=(ti->mapped_ram_size==32) ? 0xc0 : 0; + pg_size=32; /* 16KB page size */ + break; + case 0xd: + ti->page_mask=(ti->mapped_ram_size==64) ? 0x80 : 0; + pg_size=64; /* 32KB page size */ + break; + case 0xc: + ti->page_mask=(ti->mapped_ram_size==32) ? 0xc0 : 0; + ti->page_mask=(ti->mapped_ram_size==64) ? 0x80 : 0; + DPRINTK("Dual size shared RAM page (code=0xC), don't support it!\n"); + /* nb/dwm: I did this because RRR (3,2) bits are documented as + R/O and I can't find how to select which page size + Also, the above conditional statement sequence is invalid + as page_mask will always be set by the second stmt */ + kfree_s(ti, sizeof(struct tok_info)); + return -ENODEV; + break; + default: + DPRINTK("Unknown shared ram paging info %01X\n",ti->shared_ram_paging); + kfree_s(ti, sizeof(struct tok_info)); + return -ENODEV; + break; + } + if (ti->page_mask) { + if (pg_size > ti->mapped_ram_size) { + DPRINTK("Page size (%d) > mapped ram window (%d), can't page.\n", + pg_size, ti->mapped_ram_size); + ti->page_mask = 0; /* reset paging */ + } else { + ti->mapped_ram_size=ti->avail_shared_ram; + DPRINTK("Shared RAM paging enabled. Page size : %uK\n", + ((ti->page_mask^ 0xff)+1)>>2); + } +#endif + } + /* finish figuring the shared RAM address */ + if (cardpresent==TR_ISA) { + static __u32 ram_bndry_mask[]={0xffffe000, 0xffffc000, 0xffff8000, 0xffff0000}; + __u32 new_base, rrr_32, chk_base, rbm; + + rrr_32 = ((readb(ti->mmio+ ACA_OFFSET + ACA_RW + RRR_ODD))>>2) & 0x00000003; + rbm = ram_bndry_mask[rrr_32]; + new_base = (ibmtr_mem_base + (~rbm)) & rbm; /* up to boundary */ + chk_base = new_base + (ti->mapped_ram_size<<9); + if (chk_base > (ibmtr_mem_base + IBMTR_SHARED_RAM_SIZE)) { + DPRINTK("Shared RAM for this adapter (%05x) exceeds driver" + " limit (%05x), adapter not started.\n", + chk_base, ibmtr_mem_base + IBMTR_SHARED_RAM_SIZE); + kfree_s(ti, sizeof(struct tok_info)); + return -ENODEV; + } else { /* seems cool, record what we have figured out */ + ti->sram_base = new_base >> 12; + ibmtr_mem_base = chk_base; + } + } + +#if !TR_NEWFORMAT + DPRINTK("Using %dK shared RAM\n",ti->mapped_ram_size/2); +#endif + + /* The PCMCIA has already got the interrupt line and the io port, + so no chance of anybody else getting it - MLP */ + +#ifndef PCMCIA + if (request_irq (dev->irq = irq, &tok_interrupt,0,"ibmtr", dev) != 0) { + DPRINTK("Could not grab irq %d. Halting Token Ring driver.\n",irq); + kfree_s(ti, sizeof(struct tok_info)); + return -ENODEV; + } + + /*?? Now, allocate some of the PIO PORTs for this driver.. */ + request_region(PIOaddr,IBMTR_IO_EXTENT,"ibmtr"); /* record PIOaddr range as busy */ +#endif + +#if !TR_NEWFORMAT + DPRINTK("%s",version); /* As we have passed card identification, + let the world know we're here! */ +#else + + if (version) { + printk("%s",version); + version = NULL; + } + DPRINTK("%s %s found\n", + channel_def[cardpresent-1], adapter_def(ti->adapter_type)); + DPRINTK("using irq %d, PIOaddr %hx, %dK shared RAM.\n", + irq, PIOaddr, ti->mapped_ram_size/2); + DPRINTK("Hardware address : %02X:%02X:%02X:%02X:%02X:%02X\n", + dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], + dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); +#endif + /* Calculate the maximum DHB we can use */ + switch (ti->mapped_ram_size) { + case 16 : /* 8KB shared RAM */ + ti->dhb_size4mb = MIN(ti->dhb_size4mb, 2048); + ti->rbuf_len4 = 1032; + ti->rbuf_cnt4 = 2; + ti->dhb_size16mb = MIN(ti->dhb_size16mb, 2048); + ti->rbuf_len16 = 1032; + ti->rbuf_cnt16 = 2; + break; + case 32 : /* 16KB shared RAM */ + ti->dhb_size4mb = MIN(ti->dhb_size4mb, 4464); + ti->rbuf_len4 = 520; + ti->rbuf_cnt4 = 9; + ti->dhb_size16mb = MIN(ti->dhb_size16mb, 4096); + ti->rbuf_len16 = 1032; /* 1024 usable */ + ti->rbuf_cnt16 = 4; + break; + case 64 : /* 32KB shared RAM */ + ti->dhb_size4mb = MIN(ti->dhb_size4mb, 4464); + ti->rbuf_len4 = 1032; + ti->rbuf_cnt4 = 6; + ti->dhb_size16mb = MIN(ti->dhb_size16mb, 10240); + ti->rbuf_len16 = 1032; + ti->rbuf_cnt16 = 10; + break; + case 127 : /* 63KB shared RAM */ + ti->dhb_size4mb = MIN(ti->dhb_size4mb, 4464); + ti->rbuf_len4 = 1032; + ti->rbuf_cnt4 = 6; + ti->dhb_size16mb = MIN(ti->dhb_size16mb, 16384); + ti->rbuf_len16 = 1032; + ti->rbuf_cnt16 = 16; + break; + case 128 : /* 64KB shared RAM */ + ti->dhb_size4mb = MIN(ti->dhb_size4mb, 4464); + ti->rbuf_len4 = 1032; + ti->rbuf_cnt4 = 6; + ti->dhb_size16mb = MIN(ti->dhb_size16mb, 17960); + ti->rbuf_len16 = 1032; + ti->rbuf_cnt16 = 18; + break; + default : + ti->dhb_size4mb = 2048; + ti->rbuf_len4 = 1032; + ti->rbuf_cnt4 = 2; + ti->dhb_size16mb = 2048; + ti->rbuf_len16 = 1032; + ti->rbuf_cnt16 = 2; + break; + } + + ti->maxmtu16 = (ti->rbuf_len16*ti->rbuf_cnt16)-((ti->rbuf_cnt16)<<3)-TR_HLEN; + ti->maxmtu4 = (ti->rbuf_len4*ti->rbuf_cnt4)-((ti->rbuf_cnt4)<<3)-TR_HLEN; + DPRINTK("Maximum MTU 16Mbps: %d, 4Mbps: %d\n", + ti->maxmtu16, ti->maxmtu4); + + dev->base_addr=PIOaddr; /* set the value for device */ + + trdev_init(dev); + tok_init_card(dev); + + return 0; /* Return 0 to indicate we have found a Token Ring card. */ +} + +/* query the adapter for the size of shared RAM */ + +static unsigned char __init get_sram_size(struct tok_info *adapt_info) +{ + + unsigned char avail_sram_code; + static unsigned char size_code[]={ 0,16,32,64,127,128 }; + /* Adapter gives + 'F' -- use RRR bits 3,2 + 'E' -- 8kb 'D' -- 16kb + 'C' -- 32kb 'A' -- 64KB + 'B' - 64KB less 512 bytes at top + (WARNING ... must zero top bytes in INIT */ + + avail_sram_code=0xf-readb(adapt_info->mmio + AIPAVAILSHRAM); + if (avail_sram_code) + return size_code[avail_sram_code]; + else /* for code 'F', must compute size from RRR(3,2) bits */ + return 1<<((readb(adapt_info->mmio+ ACA_OFFSET + ACA_RW + RRR_ODD)>>2)+4); +} + +static int __init trdev_init(struct net_device *dev) +{ + struct tok_info *ti=(struct tok_info *)dev->priv; + + ti->open_status = CLOSED; + + dev->init = tok_init_card; + dev->open = tok_open; + dev->stop = tok_close; + dev->hard_start_xmit = tok_send_packet; + dev->get_stats = tok_get_stats; + dev->set_multicast_list = tok_set_multicast_list; + dev->change_mtu = ibmtr_change_mtu; + +#ifndef MODULE +#ifndef PCMCIA + tr_setup(dev); +#endif +#endif + return 0; +} + + +static void tok_set_multicast_list(struct net_device *dev) +{ + struct tok_info *ti=(struct tok_info *)dev->priv; + struct dev_mc_list *mclist; + unsigned char address[4]; + + int i; + + address[0] = address[1] = address[2] = address[3] = 0; + + mclist = dev->mc_list; + for (i=0; i< dev->mc_count; i++) + { + address[0] |= mclist->dmi_addr[2]; + address[1] |= mclist->dmi_addr[3]; + address[2] |= mclist->dmi_addr[4]; + address[3] |= mclist->dmi_addr[5]; + mclist = mclist->next; + } + SET_PAGE(ti->srb); + for (i=0; i<sizeof(struct srb_set_funct_addr); i++) + writeb(0, ti->srb+i); + + writeb(DIR_SET_FUNC_ADDR, + ti->srb + offsetof(struct srb_set_funct_addr, command)); + + DPRINTK("Setting functional address: "); + + for (i=0; i<4; i++) + { + writeb(address[i], + ti->srb + offsetof(struct srb_set_funct_addr, funct_address)+i); + printk("%02X ", address[i]); + } + writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); + printk("\n"); +} + +static int tok_open(struct net_device *dev) +{ + struct tok_info *ti=(struct tok_info *)dev->priv; + + /* init the spinlock */ + ti->lock = (spinlock_t) SPIN_LOCK_UNLOCKED; + + if (ti->open_status==CLOSED) tok_init_card(dev); + + if (ti->open_status==IN_PROGRESS) sleep_on(&ti->wait_for_reset); + + if (ti->open_status==SUCCESS) { + dev->tbusy=0; + dev->interrupt=0; + dev->start=1; + /* NEED to see smem size *AND* reset high 512 bytes if needed */ + + MOD_INC_USE_COUNT; + + return 0; + } else return -EAGAIN; + +} + +static int tok_close(struct net_device *dev) +{ + + struct tok_info *ti=(struct tok_info *) dev->priv; + + writeb(DIR_CLOSE_ADAPTER, + ti->srb + offsetof(struct srb_close_adapter, command)); + writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); + + ti->open_status=CLOSED; + + sleep_on(&ti->wait_for_tok_int); + + if (readb(ti->srb + offsetof(struct srb_close_adapter, ret_code))) + DPRINTK("close adapter failed: %02X\n", + (int)readb(ti->srb + offsetof(struct srb_close_adapter, ret_code))); + + dev->start = 0; +#ifdef PCMCIA + ti->sram = 0 ; +#endif + DPRINTK("Adapter closed.\n"); + MOD_DEC_USE_COUNT; + + return 0; +} + +void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs) +{ + unsigned char status; + struct tok_info *ti; + struct net_device *dev; + + dev = dev_id; +#if TR_VERBOSE + DPRINTK("Int from tok_driver, dev : %p\n",dev); +#endif + ti = (struct tok_info *) dev->priv; + spin_lock(&(ti->lock)); + + /* Disable interrupts till processing is finished */ + dev->interrupt=1; + writeb((~INT_ENABLE), ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN); + + /* Reset interrupt for ISA boards */ + if (ti->adapter_int_enable) + outb(0,ti->adapter_int_enable); + else + outb(0,ti->global_int_enable); + + + switch (ti->do_tok_int) { + + case NOT_FIRST: + + /* Begin the regular interrupt handler HERE inline to avoid + the extra levels of logic and call depth for the + original solution. */ + + status=readb(ti->mmio + ACA_OFFSET + ACA_RW + ISRP_ODD); +#ifdef PCMCIA + /* Check if the PCMCIA card was pulled. */ + if (status == 0xFF) + { + DPRINTK("PCMCIA card removed.\n"); + spin_unlock(&(ti->lock)); + dev->interrupt = 0; + return; + } + + /* Check ISRP EVEN too. */ + if ( readb (ti->mmio + ACA_OFFSET + ACA_RW + ISRP_EVEN) == 0xFF) + { + DPRINTK("PCMCIA card removed.\n"); + spin_unlock(&(ti->lock)); + dev->interrupt = 0; + return; + } +#endif + + + if (status & ADAP_CHK_INT) { + + int i; + __u32 check_reason; + + check_reason=ti->mmio + ntohs(readw(ti->sram + ACA_OFFSET + ACA_RW +WWCR_EVEN)); + + DPRINTK("Adapter check interrupt\n"); + DPRINTK("8 reason bytes follow: "); + for(i=0; i<8; i++, check_reason++) + printk("%02X ", (int)readb(check_reason)); + printk("\n"); + + writeb((~ADAP_CHK_INT), ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD); + writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN); + dev->interrupt=0; + + } else if (readb(ti->mmio + ACA_OFFSET + ACA_RW + ISRP_EVEN) + & (TCR_INT | ERR_INT | ACCESS_INT)) { + + DPRINTK("adapter error: ISRP_EVEN : %02x\n", + (int)readb(ti->mmio + ACA_OFFSET + ACA_RW + ISRP_EVEN)); + writeb(~(TCR_INT | ERR_INT | ACCESS_INT), + ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN); + writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN); + dev->interrupt=0; + + } else if (status + & (SRB_RESP_INT | ASB_FREE_INT | ARB_CMD_INT | SSB_RESP_INT)) { + /* SRB, ASB, ARB or SSB response */ + + if (status & SRB_RESP_INT) { /* SRB response */ + + switch(readb(ti->srb)) { /* SRB command check */ + + case XMIT_DIR_FRAME: { + unsigned char xmit_ret_code; + + xmit_ret_code=readb(ti->srb + offsetof(struct srb_xmit, ret_code)); + if (xmit_ret_code != 0xff) { + DPRINTK("error on xmit_dir_frame request: %02X\n", + xmit_ret_code); + if (ti->current_skb) { + dev_kfree_skb(ti->current_skb); + ti->current_skb=NULL; + } + dev->tbusy=0; + if (ti->readlog_pending) ibmtr_readlog(dev); + } + } + break; + + case XMIT_UI_FRAME: { + unsigned char xmit_ret_code; + + xmit_ret_code=readb(ti->srb + offsetof(struct srb_xmit, ret_code)); + if (xmit_ret_code != 0xff) { + DPRINTK("error on xmit_ui_frame request: %02X\n", + xmit_ret_code); + if (ti->current_skb) { + dev_kfree_skb(ti->current_skb); + ti->current_skb=NULL; + } + dev->tbusy=0; + if (ti->readlog_pending) ibmtr_readlog(dev); + } + } + break; + + case DIR_OPEN_ADAPTER: { + unsigned char open_ret_code; + __u16 open_error_code; + + ti->srb=ti->sram+ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, srb_addr))); + ti->ssb=ti->sram+ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, ssb_addr))); + ti->arb=ti->sram+ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, arb_addr))); + ti->asb=ti->sram+ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, asb_addr))); + ti->current_skb=NULL; + + open_ret_code = readb(ti->init_srb +offsetof(struct srb_open_response, ret_code)); + open_error_code = ntohs(readw(ti->init_srb +offsetof(struct srb_open_response, error_code))); + + if (open_ret_code==7) { + + if (!ti->auto_ringspeedsave && (open_error_code==0x24)) { + DPRINTK("Open failed: Adapter speed must match ring " + "speed if Automatic Ring Speed Save is disabled.\n"); + ti->open_status=FAILURE; + wake_up(&ti->wait_for_reset); + } else if (open_error_code==0x24) + DPRINTK("Retrying open to adjust to ring speed.\n"); + else if ((open_error_code==0x2d) && ti->auto_ringspeedsave) + DPRINTK("No signal detected for Auto Speed Detection.\n"); + else if (open_error_code==0x11) + { + if (ti->retry_count--) + DPRINTK("Ring broken/disconnected, retrying...\n"); + else { + DPRINTK("Ring broken/disconnected, open failed.\n"); + ti->open_status = FAILURE; + } + } + else DPRINTK("Unrecoverable error: error code = %04x.\n", + open_error_code); + + } else if (!open_ret_code) { +#if !TR_NEWFORMAT + DPRINTK("board opened...\n"); +#else + DPRINTK("Adapter initialized and opened.\n"); +#endif + writeb(~(SRB_RESP_INT), + ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD); + writeb(~(CMD_IN_SRB), + ti->mmio + ACA_OFFSET + ACA_RESET + ISRA_ODD); + open_sap(EXTENDED_SAP,dev); + + /* YdW probably hates me */ + goto skip_reset; + } else + DPRINTK("open failed: ret_code = %02X, retrying\n", + open_ret_code); + + if (ti->open_status != FAILURE) { + ibmtr_reset_timer(&(ti->tr_timer), dev); + } + + } + break; + + case DIR_CLOSE_ADAPTER: + wake_up(&ti->wait_for_tok_int); + break; + + case DLC_OPEN_SAP: + if (readb(ti->srb+offsetof(struct dlc_open_sap, ret_code))) { + DPRINTK("open_sap failed: ret_code = %02X,retrying\n", + (int)readb(ti->srb+offsetof(struct dlc_open_sap, ret_code))); + ibmtr_reset_timer(&(ti->tr_timer), dev); + } else { + ti->exsap_station_id= + readw(ti->srb+offsetof(struct dlc_open_sap, station_id)); + ti->open_status=SUCCESS; /* TR adapter is now available */ + wake_up(&ti->wait_for_reset); + } + break; + + case DIR_INTERRUPT: + case DIR_MOD_OPEN_PARAMS: + case DIR_SET_GRP_ADDR: + case DIR_SET_FUNC_ADDR: + case DLC_CLOSE_SAP: + if (readb(ti->srb+offsetof(struct srb_interrupt, ret_code))) + DPRINTK("error on %02X: %02X\n", + (int)readb(ti->srb+offsetof(struct srb_interrupt, command)), + (int)readb(ti->srb+offsetof(struct srb_interrupt, ret_code))); + break; + + case DIR_READ_LOG: + if (readb(ti->srb+offsetof(struct srb_read_log, ret_code))) + DPRINTK("error on dir_read_log: %02X\n", + (int)readb(ti->srb+offsetof(struct srb_read_log, ret_code))); + else + if (IBMTR_DEBUG_MESSAGES) { + DPRINTK( + "Line errors %02X, Internal errors %02X, Burst errors %02X\n" + "A/C errors %02X, Abort delimiters %02X, Lost frames %02X\n" + "Receive congestion count %02X, Frame copied errors %02X\n" + "Frequency errors %02X, Token errors %02X\n", + (int)readb(ti->srb+offsetof(struct srb_read_log, + line_errors)), + (int)readb(ti->srb+offsetof(struct srb_read_log, + internal_errors)), + (int)readb(ti->srb+offsetof(struct srb_read_log, + burst_errors)), + (int)readb(ti->srb+offsetof(struct srb_read_log, A_C_errors)), + (int)readb(ti->srb+offsetof(struct srb_read_log, + abort_delimiters)), + (int)readb(ti->srb+offsetof(struct srb_read_log, + lost_frames)), + (int)readb(ti->srb+offsetof(struct srb_read_log, + recv_congest_count)), + (int)readb(ti->srb+offsetof(struct srb_read_log, + frame_copied_errors)), + (int)readb(ti->srb+offsetof(struct srb_read_log, + frequency_errors)), + (int)readb(ti->srb+offsetof(struct srb_read_log, + token_errors))); + } + dev->tbusy=0; + break; + + default: + DPRINTK("Unknown command %02X encountered\n", + (int)readb(ti->srb)); + + } /* SRB command check */ + + writeb(~CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_RESET + ISRA_ODD); + writeb(~SRB_RESP_INT, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD); + + skip_reset: + } /* SRB response */ + + if (status & ASB_FREE_INT) { /* ASB response */ + + switch(readb(ti->asb)) { /* ASB command check */ + + case REC_DATA: + case XMIT_UI_FRAME: + case XMIT_DIR_FRAME: + break; + + default: + DPRINTK("unknown command in asb %02X\n", + (int)readb(ti->asb)); + + } /* ASB command check */ + + if (readb(ti->asb+2)!=0xff) /* checks ret_code */ + DPRINTK("ASB error %02X in cmd %02X\n", + (int)readb(ti->asb+2),(int)readb(ti->asb)); + writeb(~ASB_FREE_INT, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD); + + } /* ASB response */ + + if (status & ARB_CMD_INT) { /* ARB response */ + + switch (readb(ti->arb)) { /* ARB command check */ + + case DLC_STATUS: + DPRINTK("DLC_STATUS new status: %02X on station %02X\n", + ntohs(readw(ti->arb + offsetof(struct arb_dlc_status, status))), + ntohs(readw(ti->arb + +offsetof(struct arb_dlc_status, station_id)))); + break; + + case REC_DATA: + tr_rx(dev); + break; + + case RING_STAT_CHANGE: { + unsigned short ring_status; + + ring_status=ntohs(readw(ti->arb + +offsetof(struct arb_ring_stat_change, ring_status))); + + if (ring_status & (SIGNAL_LOSS | LOBE_FAULT)) { + + DPRINTK("Signal loss/Lobe fault\n"); + DPRINTK("We try to reopen the adapter.\n"); + ibmtr_reset_timer(&(ti->tr_timer), dev); + } else if (ring_status & (HARD_ERROR | XMIT_BEACON + | AUTO_REMOVAL | REMOVE_RECV | RING_RECOVER)) + DPRINTK("New ring status: %02X\n", ring_status); + + if (ring_status & LOG_OVERFLOW) { + if (dev->tbusy) + ti->readlog_pending = 1; + else + ibmtr_readlog(dev); + } + } + break; + + case XMIT_DATA_REQ: + tr_tx(dev); + break; + + default: + DPRINTK("Unknown command %02X in arb\n", + (int)readb(ti->arb)); + break; + + } /* ARB command check */ + + writeb(~ARB_CMD_INT, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD); + writeb(ARB_FREE, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); + + } /* ARB response */ + + if (status & SSB_RESP_INT) { /* SSB response */ + unsigned char retcode; + switch (readb(ti->ssb)) { /* SSB command check */ + + case XMIT_DIR_FRAME: + case XMIT_UI_FRAME: + retcode = readb(ti->ssb+2); + if (retcode && (retcode != 0x22)) /* checks ret_code */ + DPRINTK("xmit ret_code: %02X xmit error code: %02X\n", + (int)retcode, (int)readb(ti->ssb+6)); + else ti->tr_stats.tx_packets++; + break; + + case XMIT_XID_CMD: + DPRINTK("xmit xid ret_code: %02X\n", (int)readb(ti->ssb+2)); + + default: + DPRINTK("Unknown command %02X in ssb\n", (int)readb(ti->ssb)); + + } /* SSB command check */ + + writeb(~SSB_RESP_INT, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD); + writeb(SSB_FREE, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); + + } /* SSB response */ + + } /* SRB, ARB, ASB or SSB response */ + + dev->interrupt=0; + writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN); + break; + + case FIRST_INT: + initial_tok_int(dev); + break; + + default: + DPRINTK("Unexpected interrupt from tr adapter\n"); + + } + spin_unlock(&(ti->lock)); +} + +static void initial_tok_int(struct net_device *dev) +{ + + __u32 encoded_addr; + __u32 hw_encoded_addr; + struct tok_info *ti; + ti=(struct tok_info *) dev->priv; + + ti->do_tok_int=NOT_FIRST; + +#ifndef TR_NEWFORMAT + DPRINTK("Initial tok int received\n"); +#endif + + /* we assign the shared-ram address for ISA devices */ + if(!ti->sram) { + writeb(ti->sram_base, ti->mmio + ACA_OFFSET + ACA_RW + RRR_EVEN); + ti->sram=((__u32)ti->sram_base << 12); + } + ti->init_srb=ti->sram + +ntohs((unsigned short)readw(ti->mmio+ ACA_OFFSET + WRBR_EVEN)); + SET_PAGE(ntohs((unsigned short)readw(ti->mmio+ACA_OFFSET + WRBR_EVEN))); + + dev->mem_start = ti->sram; + dev->mem_end = ti->sram + (ti->mapped_ram_size<<9) - 1; + +#if TR_VERBOSE + { + int i; + DPRINTK("init_srb(%p):", ti->init_srb); + for (i=0;i<17;i++) printk("%02X ", (int)readb(ti->init_srb+i)); + printk("\n"); + } +#endif + + hw_encoded_addr = readw(ti->init_srb + + offsetof(struct srb_init_response, encoded_address)); + +#if !TR_NEWFORMAT + DPRINTK("srb_init_response->encoded_address: %04X\n", hw_encoded_addr); + DPRINTK("ntohs(srb_init_response->encoded_address): %04X\n", + ntohs(hw_encoded_addr)); +#endif + + encoded_addr=(ti->sram + ntohs(hw_encoded_addr)); + ti->ring_speed = readb(ti->init_srb+offsetof(struct srb_init_response, init_status)) & 0x01 ? 16 : 4; +#if !TR_NEWFORMAT + DPRINTK("encoded addr (%04X,%04X,%08X): ", hw_encoded_addr, + ntohs(hw_encoded_addr), encoded_addr); +#else + DPRINTK("Initial interrupt : %d Mbps, shared RAM base %08x.\n", + ti->ring_speed, ti->sram); +#endif + + ti->auto_ringspeedsave=readb(ti->init_srb + +offsetof(struct srb_init_response, init_status_2)) & 0x4 ? TRUE : FALSE; + +#if !TR_NEWFORMAT + for(i=0;i<TR_ALEN;i++) { + dev->dev_addr[i]=readb(encoded_addr + i); + printk("%02X%s", dev->dev_addr[i], (i==TR_ALEN-1) ? "" : ":" ); + } + printk("\n"); +#endif + + tok_open_adapter((unsigned long)dev); +} + +static int tok_init_card(struct net_device *dev) +{ + struct tok_info *ti; + short PIOaddr; + unsigned long i; + PIOaddr = dev->base_addr; + ti=(struct tok_info *) dev->priv; + + /* Special processing for first interrupt after reset */ + ti->do_tok_int=FIRST_INT; + + /* Reset adapter */ + dev->tbusy=1; /* nothing can be done before reset and open completed */ + +#ifdef ENABLE_PAGING + if(ti->page_mask) + writeb(SRPR_ENABLE_PAGING, ti->mmio + ACA_OFFSET + ACA_RW + SRPR_EVEN); +#endif + + writeb(~INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN); + +#if !TR_NEWFORMAT + DPRINTK("resetting card\n"); +#endif + + outb(0, PIOaddr+ADAPTRESET); + for (i=jiffies+TR_RESET_INTERVAL; time_before_eq(jiffies, i);); /* wait 50ms */ + outb(0,PIOaddr+ADAPTRESETREL); + +#if !TR_NEWFORMAT + DPRINTK("card reset\n"); +#endif + + ti->open_status=IN_PROGRESS; + writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN); + return 0; +} + +static void open_sap(unsigned char type,struct net_device *dev) +{ + int i; + struct tok_info *ti=(struct tok_info *) dev->priv; + + SET_PAGE(ti->srb); + for (i=0; i<sizeof(struct dlc_open_sap); i++) + writeb(0, ti->srb+i); + + writeb(DLC_OPEN_SAP, ti->srb + offsetof(struct dlc_open_sap, command)); + writew(htons(MAX_I_FIELD), + ti->srb + offsetof(struct dlc_open_sap, max_i_field)); + writeb(SAP_OPEN_IND_SAP | SAP_OPEN_PRIORITY, + ti->srb + offsetof(struct dlc_open_sap, sap_options)); + writeb(SAP_OPEN_STATION_CNT, + ti->srb + offsetof(struct dlc_open_sap, station_count)); + writeb(type, ti->srb + offsetof(struct dlc_open_sap, sap_value)); + + writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); + +} + +void tok_open_adapter(unsigned long dev_addr) +{ + + struct net_device *dev=(struct net_device *)dev_addr; + struct tok_info *ti; + int i; + + ti=(struct tok_info *) dev->priv; + +#if !TR_NEWFORMAT + DPRINTK("now opening the board...\n"); +#endif + + writeb(~SRB_RESP_INT, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD); + writeb(~CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_RESET + ISRA_ODD); + + for (i=0; i<sizeof(struct dir_open_adapter); i++) + writeb(0, ti->init_srb+i); + + writeb(DIR_OPEN_ADAPTER, + ti->init_srb + offsetof(struct dir_open_adapter, command)); + writew(htons(OPEN_PASS_BCON_MAC), + ti->init_srb + offsetof(struct dir_open_adapter, open_options)); + if (ti->ring_speed == 16) { + writew(htons(ti->dhb_size16mb), + ti->init_srb + offsetof(struct dir_open_adapter, dhb_length)); + writew(htons(ti->rbuf_cnt16), + ti->init_srb + offsetof(struct dir_open_adapter, num_rcv_buf)); + writew(htons(ti->rbuf_len16), + ti->init_srb + offsetof(struct dir_open_adapter, rcv_buf_len)); + } else { + writew(htons(ti->dhb_size4mb), + ti->init_srb + offsetof(struct dir_open_adapter, dhb_length)); + writew(htons(ti->rbuf_cnt4), + ti->init_srb + offsetof(struct dir_open_adapter, num_rcv_buf)); + writew(htons(ti->rbuf_len4), + ti->init_srb + offsetof(struct dir_open_adapter, rcv_buf_len)); + } + writeb(NUM_DHB, /* always 2 */ + ti->init_srb + offsetof(struct dir_open_adapter, num_dhb)); + writeb(DLC_MAX_SAP, + ti->init_srb + offsetof(struct dir_open_adapter, dlc_max_sap)); + writeb(DLC_MAX_STA, + ti->init_srb + offsetof(struct dir_open_adapter, dlc_max_sta)); + + ti->srb=ti->init_srb; /* We use this one in the interrupt handler */ + + writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN); + writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); + +} + +static void tr_tx(struct net_device *dev) +{ + struct tok_info *ti=(struct tok_info *) dev->priv; + struct trh_hdr *trhdr=(struct trh_hdr *)ti->current_skb->data; + unsigned int hdr_len; + __u32 dhb; + unsigned char xmit_command; + int i; + struct trllc *llc; + + if (readb(ti->asb + offsetof(struct asb_xmit_resp, ret_code))!=0xFF) + DPRINTK("ASB not free !!!\n"); + + /* in providing the transmit interrupts, + is telling us it is ready for data and + providing a shared memory address for us + to stuff with data. Here we compute the + effective address where we will place data.*/ + dhb=ti->sram + +ntohs(readw(ti->arb + offsetof(struct arb_xmit_req, dhb_address))); + + /* Figure out the size of the 802.5 header */ + if (!(trhdr->saddr[0] & 0x80)) /* RIF present? */ + hdr_len=sizeof(struct trh_hdr)-TR_MAXRIFLEN; + else + hdr_len=((ntohs(trhdr->rcf) & TR_RCF_LEN_MASK)>>8) + +sizeof(struct trh_hdr)-TR_MAXRIFLEN; + + llc = (struct trllc *)(ti->current_skb->data + hdr_len); + + xmit_command = readb(ti->srb + offsetof(struct srb_xmit, command)); + + writeb(xmit_command, ti->asb + offsetof(struct asb_xmit_resp, command)); + writew(readb(ti->srb + offsetof(struct srb_xmit, station_id)), + ti->asb + offsetof(struct asb_xmit_resp, station_id)); + writeb(llc->ssap, ti->asb + offsetof(struct asb_xmit_resp, rsap_value)); + writeb(readb(ti->srb + offsetof(struct srb_xmit, cmd_corr)), + ti->asb + offsetof(struct asb_xmit_resp, cmd_corr)); + writeb(0, ti->asb + offsetof(struct asb_xmit_resp, ret_code)); + + if ((xmit_command==XMIT_XID_CMD) || (xmit_command==XMIT_TEST_CMD)) { + + writew(htons(0x11), + ti->asb + offsetof(struct asb_xmit_resp, frame_length)); + writeb(0x0e, ti->asb + offsetof(struct asb_xmit_resp, hdr_length)); + writeb(AC, dhb); + writeb(LLC_FRAME, dhb+1); + + for (i=0; i<TR_ALEN; i++) writeb((int)0x0FF, dhb+i+2); + for (i=0; i<TR_ALEN; i++) writeb(0, dhb+i+TR_ALEN+2); + + writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); + return; + + } + + /* + * the token ring packet is copied from sk_buff to the adapter + * buffer identified in the command data received with the interrupt. + */ + writeb(hdr_len, ti->asb + offsetof(struct asb_xmit_resp, hdr_length)); + writew(htons(ti->current_skb->len), + ti->asb + offsetof(struct asb_xmit_resp, frame_length)); + + memcpy_toio(dhb, ti->current_skb->data, ti->current_skb->len); + + writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); + ti->tr_stats.tx_bytes+=ti->current_skb->len; + dev->tbusy=0; + dev_kfree_skb(ti->current_skb); + ti->current_skb=NULL; + mark_bh(NET_BH); + if (ti->readlog_pending) ibmtr_readlog(dev); +} + +static void tr_rx(struct net_device *dev) +{ + struct tok_info *ti=(struct tok_info *) dev->priv; + __u32 rbuffer, rbufdata; + __u32 llc; + unsigned char *data; + unsigned int rbuffer_len, lan_hdr_len, hdr_len, ip_len, length; + struct sk_buff *skb; + unsigned int skb_size = 0; + int IPv4_p = 0; + unsigned int chksum = 0; + struct iphdr *iph; + + rbuffer=(ti->sram + +ntohs(readw(ti->arb + offsetof(struct arb_rec_req, rec_buf_addr))))+2; + + if(readb(ti->asb + offsetof(struct asb_rec, ret_code))!=0xFF) + DPRINTK("ASB not free !!!\n"); + + writeb(REC_DATA, + ti->asb + offsetof(struct asb_rec, command)); + writew(readw(ti->arb + offsetof(struct arb_rec_req, station_id)), + ti->asb + offsetof(struct asb_rec, station_id)); + writew(readw(ti->arb + offsetof(struct arb_rec_req, rec_buf_addr)), + ti->asb + offsetof(struct asb_rec, rec_buf_addr)); + + lan_hdr_len=readb(ti->arb + offsetof(struct arb_rec_req, lan_hdr_len)); + hdr_len = lan_hdr_len + sizeof(struct trllc) + sizeof(struct iphdr); + + llc=(rbuffer + offsetof(struct rec_buf, data) + lan_hdr_len); + +#if TR_VERBOSE + DPRINTK("offsetof data: %02X lan_hdr_len: %02X\n", + (unsigned int)offsetof(struct rec_buf,data), (unsigned int)lan_hdr_len); + DPRINTK("llc: %08X rec_buf_addr: %04X ti->sram: %p\n", llc, + ntohs(readw(ti->arb + offsetof(struct arb_rec_req, rec_buf_addr))), + ti->sram); + DPRINTK("dsap: %02X, ssap: %02X, llc: %02X, protid: %02X%02X%02X, " + "ethertype: %04X\n", + (int)readb(llc + offsetof(struct trllc, dsap)), + (int)readb(llc + offsetof(struct trllc, ssap)), + (int)readb(llc + offsetof(struct trllc, llc)), + (int)readb(llc + offsetof(struct trllc, protid)), + (int)readb(llc + offsetof(struct trllc, protid)+1), + (int)readb(llc + offsetof(struct trllc, protid)+2), + (int)readw(llc + offsetof(struct trllc, ethertype))); +#endif + if (readb(llc + offsetof(struct trllc, llc))!=UI_CMD) { + writeb(DATA_LOST, ti->asb + offsetof(struct asb_rec, ret_code)); + ti->tr_stats.rx_dropped++; + writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); + return; + } + + length = ntohs(readw(ti->arb+offsetof(struct arb_rec_req, frame_len))); + if ((readb(llc + offsetof(struct trllc, dsap))==EXTENDED_SAP) && + (readb(llc + offsetof(struct trllc, ssap))==EXTENDED_SAP) && + (length>=hdr_len)) { + IPv4_p = 1; + } + +#if TR_VERBOSE + if (!IPv4_p){ + + __u32 trhhdr; + + trhhdr=(rbuffer+offsetof(struct rec_buf,data)); + + DPRINTK("Probably non-IP frame received.\n"); + DPRINTK("ssap: %02X dsap: %02X saddr: %02X:%02X:%02X:%02X:%02X:%02X " + "daddr: %02X:%02X:%02X:%02X:%02X:%02X\n", + (int)readb(llc + offsetof(struct trllc, ssap)), + (int)readb(llc + offsetof(struct trllc, dsap)), + (int)readb(trhhdr + offsetof(struct trh_hdr, saddr)), + (int)readb(trhhdr + offsetof(struct trh_hdr, saddr)+1), + (int)readb(trhhdr + offsetof(struct trh_hdr, saddr)+2), + (int)readb(trhhdr + offsetof(struct trh_hdr, saddr)+3), + (int)readb(trhhdr + offsetof(struct trh_hdr, saddr)+4), + (int)readb(trhhdr + offsetof(struct trh_hdr, saddr)+5), + (int)readb(trhhdr + offsetof(struct trh_hdr, daddr)), + (int)readb(trhhdr + offsetof(struct trh_hdr, daddr)+1), + (int)readb(trhhdr + offsetof(struct trh_hdr, daddr)+2), + (int)readb(trhhdr + offsetof(struct trh_hdr, daddr)+3), + (int)readb(trhhdr + offsetof(struct trh_hdr, daddr)+4), + (int)readb(trhhdr + offsetof(struct trh_hdr, daddr)+5)); + } +#endif + + skb_size = length-lan_hdr_len+sizeof(struct trh_hdr)+sizeof(struct trllc); + + if (!(skb=dev_alloc_skb(skb_size))) { + DPRINTK("out of memory. frame dropped.\n"); + ti->tr_stats.rx_dropped++; + writeb(DATA_LOST, ti->asb + offsetof(struct asb_rec, ret_code)); + writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); + return; + } + + skb_put(skb, length); + skb_reserve(skb, sizeof(struct trh_hdr)-lan_hdr_len+sizeof(struct trllc)); + skb->dev=dev; + data=skb->data; + rbuffer_len=ntohs(readw(rbuffer + offsetof(struct rec_buf, buf_len))); + rbufdata = rbuffer + offsetof(struct rec_buf,data); + + if (IPv4_p) { + /* Copy the headers without checksumming */ + memcpy_fromio(data, rbufdata, hdr_len); + + /* Watch for padded packets and bogons */ + iph=(struct iphdr*)(data + lan_hdr_len + sizeof(struct trllc)); + ip_len = ntohs(iph->tot_len) - sizeof(struct iphdr); + length -= hdr_len; + if ((ip_len <= length) && (ip_len > 7)) + length = ip_len; + data += hdr_len; + rbuffer_len -= hdr_len; + rbufdata += hdr_len; + } + + /* Copy the payload... */ + for (;;) { + if (IPv4_p) + chksum = csum_partial_copy(bus_to_virt(rbufdata), data, + length < rbuffer_len ? length : rbuffer_len, + chksum); + else + memcpy_fromio(data, rbufdata, rbuffer_len); + rbuffer = ntohs(readw(rbuffer)); + if (!rbuffer) + break; + length -= rbuffer_len; + data += rbuffer_len; + rbuffer += ti->sram; + rbuffer_len = ntohs(readw(rbuffer + offsetof(struct rec_buf, buf_len))); + rbufdata = rbuffer + offsetof(struct rec_buf, data); + } + + writeb(0, ti->asb + offsetof(struct asb_rec, ret_code)); + + writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); + + ti->tr_stats.rx_bytes += skb->len; + ti->tr_stats.rx_packets++; + + skb->protocol = tr_type_trans(skb,dev); + if (IPv4_p){ + skb->csum = chksum; + skb->ip_summed = 1; + } + netif_rx(skb); +} + +static int tok_send_packet(struct sk_buff *skb, struct net_device *dev) +{ + struct tok_info *ti; + ti=(struct tok_info *) dev->priv; + + if (dev->tbusy) { + int ticks_waited; + + ticks_waited=jiffies - dev->trans_start; + if (ticks_waited<TR_BUSY_INTERVAL) return 1; + + DPRINTK("Arrg. Transmitter busy.\n"); + dev->trans_start+=5; /* we fake the transmission start time... */ + return 1; + } + + if (test_and_set_bit(0,(void *)&dev->tbusy)!=0) + DPRINTK("Transmitter access conflict\n"); + else { + int flags; + + /* lock against other CPUs */ + spin_lock_irqsave(&(ti->lock), flags); + + /* Save skb; we'll need it when the adapter asks for the data */ + ti->current_skb=skb; + writeb(XMIT_UI_FRAME, ti->srb + offsetof(struct srb_xmit, command)); + writew(ti->exsap_station_id, ti->srb + +offsetof(struct srb_xmit, station_id)); + writeb(CMD_IN_SRB, (ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD)); + spin_unlock_irqrestore(&(ti->lock), flags); + + dev->trans_start=jiffies; + } + + return 0; +} + +void ibmtr_reset_timer(struct timer_list *tmr, struct net_device *dev) { + tmr->expires = jiffies + TR_RETRY_INTERVAL; + tmr->data = (unsigned long) dev; + tmr->function = tok_open_adapter; + init_timer(tmr); + add_timer(tmr); +} + +void ibmtr_readlog(struct net_device *dev) { + struct tok_info *ti; + ti=(struct tok_info *) dev->priv; + + ti->readlog_pending = 0; + writeb(DIR_READ_LOG, ti->srb); + writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN); + writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD); + dev->tbusy=1; /* really srb busy... */ +} + +/* tok_get_stats(): Basically a scaffold routine which will return + the address of the tr_statistics structure associated with + this device -- the tr.... structure is an ethnet look-alike + so at least for this iteration may suffice. */ + +static struct net_device_stats * tok_get_stats(struct net_device *dev) { + + struct tok_info *toki; + toki=(struct tok_info *) dev->priv; + return (struct net_device_stats *) &toki->tr_stats; +} + +int ibmtr_change_mtu(struct net_device *dev, int mtu) { + struct tok_info *ti = (struct tok_info *) dev->priv; + + if (ti->ring_speed == 16 && mtu > ti->maxmtu16) + return -EINVAL; + if (ti->ring_speed == 4 && mtu > ti->maxmtu4) + return -EINVAL; + dev->mtu = mtu; + return 0; +} + +#ifdef MODULE + +/* 3COM 3C619C supports 8 interrupts, 32 I/O ports */ +static struct net_device* dev_ibmtr[IBMTR_MAX_ADAPTERS]; +static int io[IBMTR_MAX_ADAPTERS] = {0xa20,0xa24}; +static int irq[IBMTR_MAX_ADAPTERS] = {0,0}; +static int mem[IBMTR_MAX_ADAPTERS] = {0,0}; + +MODULE_PARM(io, "1-" __MODULE_STRING(IBMTR_MAX_ADAPTERS) "i"); +MODULE_PARM(irq, "1-" __MODULE_STRING(IBMTR_MAX_ADAPTERS) "i"); +MODULE_PARM(mem, "1-" __MODULE_STRING(IBMTR_MAX_ADAPTERS) "i"); + +int init_module(void) +{ + int i; + for (i = 0; io[i] && (i<IBMTR_MAX_ADAPTERS); i++) { + irq[i] = 0; + mem[i] = 0; + dev_ibmtr[i] = NULL; + dev_ibmtr[i] = init_trdev(dev_ibmtr[i], 0); + if (dev_ibmtr[i] == NULL) + return -ENOMEM; + + dev_ibmtr[i]->base_addr = io[i]; + dev_ibmtr[i]->irq = irq[i]; + dev_ibmtr[i]->mem_start = mem[i]; + dev_ibmtr[i]->init = &ibmtr_probe; + + if (register_trdev(dev_ibmtr[i]) != 0) { + kfree_s(dev_ibmtr[i], sizeof(struct net_device)); + dev_ibmtr[i] = NULL; + if (i == 0) { + printk("ibmtr: register_trdev() returned non-zero.\n"); + return -EIO; + } else { + return 0; + } + } + } + return 0; +} + +void cleanup_module(void) +{ + int i; + + for (i = 0; i < IBMTR_MAX_ADAPTERS; i++) + if (dev_ibmtr[i]) { + unregister_trdev(dev_ibmtr[i]); + free_irq(dev_ibmtr[i]->irq, dev_ibmtr[i]); + release_region(dev_ibmtr[i]->base_addr, IBMTR_IO_EXTENT); + kfree_s(dev_ibmtr[i]->priv, sizeof(struct tok_info)); + kfree_s(dev_ibmtr[i], sizeof(struct net_device)); + dev_ibmtr[i] = NULL; + } +} +#endif /* MODULE */ diff --git a/drivers/net/tokenring/ibmtr.h b/drivers/net/tokenring/ibmtr.h new file mode 100644 index 000000000..3f3fa6aed --- /dev/null +++ b/drivers/net/tokenring/ibmtr.h @@ -0,0 +1,449 @@ +/* Definitions for an IBM Token Ring card. */ +/* This file is distributed under the GNU GPL */ + +/* ported to the Alpha architecture 02/20/96 (just used the HZ macro) */ + +#define TR_RETRY_INTERVAL (5*HZ) /* 500 on PC = 5 s */ +#define TR_RESET_INTERVAL (HZ/20) /* 5 on PC = 50 ms */ +#define TR_BUSY_INTERVAL (HZ/5) /* 5 on PC = 200 ms */ +#define TR_SPIN_INTERVAL (3*HZ) /* 3 seconds before init timeout */ +#define TR_RETRIES 6 /* number of open retries */ + +#define TR_ISA 1 +#define TR_MCA 2 +#define TR_ISAPNP 3 +#define NOTOK 0 +#define TOKDEBUG 1 + +#define IBMTR_SHARED_RAM_SIZE 0x10000 +#define IBMTR_IO_EXTENT 4 +#define IBMTR_MAX_ADAPTERS 2 + +#define CHANNEL_ID 0X1F30 +#define AIP 0X1F00 +#define AIPCHKSUM1 0X1F60 +#define AIPCHKSUM2 0X1FF0 +#define AIPADAPTYPE 0X1FA0 +#define AIPDATARATE 0X1FA2 +#define AIPEARLYTOKEN 0X1FA4 +#define AIPAVAILSHRAM 0X1FA6 +#define AIPSHRAMPAGE 0X1FA8 +#define AIP4MBDHB 0X1FAA +#define AIP16MBDHB 0X1FAC +#define AIPFID 0X1FBA + +/* Note, 0xA20 == 0x220 since motherboard decodes 10 bits. I left everything + the way my documentation had it, ie: 0x0A20. */ +#define ADAPTINTCNTRL 0x02f0 /* Adapter interrupt control */ +#define ADAPTRESET 0x1 /* Control Adapter reset (add to base) */ +#define ADAPTRESETREL 0x2 /* Release Adapter from reset ( """) */ +#define ADAPTINTREL 0x3 /* Adapter interrupt release */ + +#define MMIOStartLocP 0x0a20 /* Primary adapter's starting MMIO area */ +#define MMIOStartLocA 0x0a24 /* Alternate adapter's starting MMIO area */ + +#define GLOBAL_INT_ENABLE 0x02f0 + +/* MMIO bits 0-4 select register */ +#define RRR_EVEN 0x00 /* Shared RAM relocation registers - even and odd */ +/* Used to set the starting address of shared RAM */ +/* Bits 1 through 7 of this register map to bits 13 through 19 of the shared RAM address.*/ +/* ie: 0x02 sets RAM address to ...ato! issy su wazzoo !! GODZILLA!!! */ +#define RRR_ODD 0x01 +/* Bits 2 and 3 of this register can be read to determine shared RAM size */ +/* 00 for 8k, 01 for 16k, 10 for 32k, 11 for 64k */ +#define WRBR_EVEN 0x02 /* Write region base registers - even and odd */ +#define WRBR_ODD 0x03 +#define WWOR_EVEN 0x04 /* Write window open registers - even and odd */ +#define WWOR_ODD 0x05 +#define WWCR_EVEN 0x06 /* Write window close registers - even and odd */ +#define WWCR_ODD 0x07 + +/* Interrupt status registers - PC system - even and odd */ +#define ISRP_EVEN 0x08 + +#define TCR_INT 0x10 /* Bit 4 - Timer interrupt. The TVR_EVEN timer has + expired. */ +#define ERR_INT 0x08 /* Bit 3 - Error interrupt. The adapter has had an + internal error. */ +#define ACCESS_INT 0x04 /* Bit 2 - Access interrupt. You have attempted to + write to an invalid area of shared RAM or an invalid + register within the MMIO. */ +/* In addition, the following bits within ISRP_EVEN can be turned on or off by you */ +/* to control the interrupt processing: */ +#define INT_IRQ 0x80 /* Bit 7 - If 0 the adapter will issue a CHCK, if 1 and + IRQ. This should normally be set (by you) to 1. */ +#define INT_ENABLE 0x40 /* Bit 6 - Interrupt enable. If 0, no interrupts will + occur. If 1, interrupts will occur normally. + Normally set to 1. */ +/* Bit 0 - Primary or alternate adapter. Set to zero if this adapter is the primary adapter,*/ +/* 1 if this adapter is the alternate adapter. */ + + +#define ISRP_ODD 0x09 + +#define ADAP_CHK_INT 0x40 /* Bit 6 - Adapter check. the adapter has + encountered a serious problem and has closed + itself. Whoa. */ +#define SRB_RESP_INT 0x20 /* Bit 5 - SRB response. The adapter has accepted + an SRB request and set the return code within + the SRB. */ +#define ASB_FREE_INT 0x10 /* Bit 4 - ASB free. The adapter has read the ASB + and this area can be safely reused. This interrupt + is only used if your application has set the ASB + free request bit in ISRA_ODD or if an error was + detected in your response. */ +#define ARB_CMD_INT 0x08 /* Bit 3 - ARB command. The adapter has given you a + command for action. The command is located in the + ARB area of shared memory. */ +#define SSB_RESP_INT 0x04 /* Bit 2 - SSB response. The adapter has posted a + response to your SRB (the response is located in + the SSB area of shared memory). */ +/* Bit 1 - Bridge frame forward complete. */ + + + +#define ISRA_EVEN 0x0A /* Interrupt status registers - adapter - even and odd */ +/* Bit 7 - Internal parity error (on adapter's internal bus) */ +/* Bit 6 - Timer interrupt pending */ +/* Bit 5 - Access interrupt (attempt by adapter to access illegal address) */ +/* Bit 4 - Adapter microcode problem (microcode dead-man timer expired) */ +/* Bit 3 - Adapter processor check status */ +/* Bit 2 - Reserved */ +/* Bit 1 - Adapter hardware interrupt mask (prevents internal interrupts) */ +/* Bit 0 - Adapter software interrupt mask (prevents internal software interrupts) */ + +#define ISRA_ODD 0x0B +#define CMD_IN_SRB 0x20 /* Bit 5 - Indicates that you have placed a new + command in the SRB and are ready for the adapter to + process the command. */ +#define RESP_IN_ASB 0x10 /* Bit 4 - Indicates that you have placed a response + (an ASB) in the shared RAM which is available for + the adapter's use. */ +/* Bit 3 - Indicates that you are ready to put an SRB in the shared RAM, but that a previous */ +/* command is still pending. The adapter will then interrupt you when the previous */ +/* command is completed */ +/* Bit 2 - Indicates that you are ready to put an ASB in the shared RAM, but that a previous */ +/* ASB is still pending. The adapter will then interrupt you when the previous ASB */ +/* is copied. */ +#define ARB_FREE 0x2 +#define SSB_FREE 0x1 + +#define TCR_EVEN 0x0C /* Timer control registers - even and odd */ +#define TCR_ODD 0x0D +#define TVR_EVEN 0x0E /* Timer value registers - even and odd */ +#define TVR_ODD 0x0F +#define SRPR_EVEN 0x10 /* Shared RAM paging registers - even and odd */ +#define SRPR_ENABLE_PAGING 0xc0 +#define SRPR_ODD 0x11 /* Not used. */ +#define TOKREAD 0x60 +#define TOKOR 0x40 +#define TOKAND 0x20 +#define TOKWRITE 0x00 + +/* MMIO bits 5-6 select operation */ +/* 00 is used to write to a register */ +/* 01 is used to bitwise AND a byte with a register */ +/* 10 is used to bitwise OR a byte with a register */ +/* 11 is used to read from a register */ + +/* MMIO bits 7-8 select area of interest.. see below */ +/* 00 selects attachment control area. */ +/* 01 is reserved. */ +/* 10 selects adapter identification area A containing the adapter encoded address. */ +/* 11 selects the adapter identification area B containing test patterns. */ + +#define PCCHANNELID 5049434F3631313039393020 +#define MCCHANNELID 4D4152533633583435313820 + +#define ACA_OFFSET 0x1e00 +#define ACA_SET 0x40 +#define ACA_RESET 0x20 +#define ACA_RW 0x00 + +#ifdef ENABLE_PAGING +#define SET_PAGE(x) (writeb(((x>>8)&ti.page_mask), \ + ti->mmio + ACA_OFFSET + ACA_RW + SRPR_EVEN)) +#else +#define SET_PAGE(x) +#endif + +typedef enum { IN_PROGRESS, SUCCESS, FAILURE, CLOSED } open_state; + +/* do_tok_int possible values */ +#define FIRST_INT 1 +#define NOT_FIRST 2 + +struct tok_info { + unsigned char irq; + __u32 mmio; + unsigned char hw_address[32]; + unsigned char adapter_type; + unsigned char data_rate; + unsigned char token_release; + unsigned char avail_shared_ram; + unsigned char shared_ram_paging; + unsigned short dhb_size4mb; + unsigned short rbuf_len4; + unsigned short rbuf_cnt4; + unsigned short maxmtu4; + unsigned short dhb_size16mb; + unsigned short rbuf_len16; + unsigned short rbuf_cnt16; + unsigned short maxmtu16; + /* Additions by David Morris */ + unsigned char do_tok_int; + wait_queue_head_t wait_for_tok_int; + wait_queue_head_t wait_for_reset; + unsigned char sram_base; + /* Additions by Peter De Schrijver */ + unsigned char page_mask; /* mask to select RAM page to Map*/ + unsigned char mapped_ram_size; /* size of RAM page */ + __u32 sram; /* Shared memory base address */ + __u32 init_srb; /* Initial System Request Block address */ + __u32 srb; /* System Request Block address */ + __u32 ssb; /* System Status Block address */ + __u32 arb; /* Adapter Request Block address */ + __u32 asb; /* Adapter Status Block address */ + unsigned short exsap_station_id; + unsigned short global_int_enable; + struct sk_buff *current_skb; + struct net_device_stats tr_stats; + unsigned char auto_ringspeedsave; + open_state open_status; + unsigned char readlog_pending; + unsigned short adapter_int_enable; /* Adapter-specific int enable */ + struct timer_list tr_timer; + unsigned char ring_speed; + __u32 func_addr; + unsigned int retry_count; + spinlock_t lock; /* SMP protection */ +}; + +/* token ring adapter commands */ +#define DIR_INTERRUPT 0x00 /* struct srb_interrupt */ +#define DIR_MOD_OPEN_PARAMS 0x01 +#define DIR_OPEN_ADAPTER 0x03 /* struct dir_open_adapter */ +#define DIR_CLOSE_ADAPTER 0x04 +#define DIR_SET_GRP_ADDR 0x06 +#define DIR_SET_FUNC_ADDR 0x07 /* struct srb_set_funct_addr */ +#define DIR_READ_LOG 0x08 /* struct srb_read_log */ +#define DLC_OPEN_SAP 0x15 /* struct dlc_open_sap */ +#define DLC_CLOSE_SAP 0x16 +#define DATA_LOST 0x20 /* struct asb_rec */ +#define REC_DATA 0x81 /* struct arb_rec_req */ +#define XMIT_DATA_REQ 0x82 /* struct arb_xmit_req */ +#define DLC_STATUS 0x83 /* struct arb_dlc_status */ +#define RING_STAT_CHANGE 0x84 /* struct dlc_open_sap ??? */ + +/* DIR_OPEN_ADAPTER options */ +#define OPEN_PASS_BCON_MAC 0x0100 +#define NUM_RCV_BUF 2 +#define RCV_BUF_LEN 1024 +#define DHB_LENGTH 2048 +#define NUM_DHB 2 +#define DLC_MAX_SAP 2 +#define DLC_MAX_STA 1 + +/* DLC_OPEN_SAP options */ +#define MAX_I_FIELD 0x0088 +#define SAP_OPEN_IND_SAP 0x04 +#define SAP_OPEN_PRIORITY 0x20 +#define SAP_OPEN_STATION_CNT 0x1 +#define XMIT_DIR_FRAME 0x0A +#define XMIT_UI_FRAME 0x0d +#define XMIT_XID_CMD 0x0e +#define XMIT_TEST_CMD 0x11 + +/* srb close return code */ +#define SIGNAL_LOSS 0x8000 +#define HARD_ERROR 0x4000 +#define XMIT_BEACON 0x1000 +#define LOBE_FAULT 0x0800 +#define AUTO_REMOVAL 0x0400 +#define REMOVE_RECV 0x0100 +#define LOG_OVERFLOW 0x0080 +#define RING_RECOVER 0x0020 + +struct srb_init_response { + unsigned char command; + unsigned char init_status; + unsigned char init_status_2; + unsigned char reserved[3]; + __u16 bring_up_code; + __u16 encoded_address; + __u16 level_address; + __u16 adapter_address; + __u16 parms_address; + __u16 mac_address; +}; + +struct dir_open_adapter { + unsigned char command; + char reserved[7]; + __u16 open_options; + unsigned char node_address[6]; + unsigned char group_address[4]; + unsigned char funct_address[4]; + __u16 num_rcv_buf; + __u16 rcv_buf_len; + __u16 dhb_length; + unsigned char num_dhb; + char reserved2; + unsigned char dlc_max_sap; + unsigned char dlc_max_sta; + unsigned char dlc_max_gsap; + unsigned char dlc_max_gmem; + unsigned char dlc_t1_tick_1; + unsigned char dlc_t2_tick_1; + unsigned char dlc_ti_tick_1; + unsigned char dlc_t1_tick_2; + unsigned char dlc_t2_tick_2; + unsigned char dlc_ti_tick_2; + unsigned char product_id[18]; +}; + +struct srb_open_response { + unsigned char command; + unsigned char reserved1; + unsigned char ret_code; + unsigned char reserved2[3]; + __u16 error_code; + __u16 asb_addr; + __u16 srb_addr; + __u16 arb_addr; + __u16 ssb_addr; +}; + +struct dlc_open_sap { + unsigned char command; + unsigned char reserved1; + unsigned char ret_code; + unsigned char reserved2; + __u16 station_id; + unsigned char timer_t1; + unsigned char timer_t2; + unsigned char timer_ti; + unsigned char maxout; + unsigned char maxin; + unsigned char maxout_incr; + unsigned char max_retry_count; + unsigned char gsap_max_mem; + __u16 max_i_field; + unsigned char sap_value; + unsigned char sap_options; + unsigned char station_count; + unsigned char sap_gsap_mem; + unsigned char gsap[0]; +}; + +struct srb_xmit { + unsigned char command; + unsigned char cmd_corr; + unsigned char ret_code; + unsigned char reserved1; + __u16 station_id; +}; + +struct srb_interrupt { + unsigned char command; + unsigned char cmd_corr; + unsigned char ret_code; +}; + +struct srb_read_log { + unsigned char command; + unsigned char reserved1; + unsigned char ret_code; + unsigned char reserved2; + unsigned char line_errors; + unsigned char internal_errors; + unsigned char burst_errors; + unsigned char A_C_errors; + unsigned char abort_delimiters; + unsigned char reserved3; + unsigned char lost_frames; + unsigned char recv_congest_count; + unsigned char frame_copied_errors; + unsigned char frequency_errors; + unsigned char token_errors; +}; + +struct asb_xmit_resp { + unsigned char command; + unsigned char cmd_corr; + unsigned char ret_code; + unsigned char reserved; + __u16 station_id; + __u16 frame_length; + unsigned char hdr_length; + unsigned char rsap_value; +}; + +struct arb_xmit_req { + unsigned char command; + unsigned char cmd_corr; + unsigned char reserved1[2]; + __u16 station_id; + __u16 dhb_address; +}; + +struct arb_rec_req { + unsigned char command; + unsigned char reserved1[3]; + __u16 station_id; + __u16 rec_buf_addr; + unsigned char lan_hdr_len; + unsigned char dlc_hdr_len; + __u16 frame_len; + unsigned char msg_type; +}; + +struct asb_rec { + unsigned char command; + unsigned char reserved1; + unsigned char ret_code; + unsigned char reserved2; + __u16 station_id; + __u16 rec_buf_addr; +}; + +struct rec_buf { + /* unsigned char reserved1[2]; */ + __u16 buf_ptr; + unsigned char reserved2; + __u16 buf_len; + unsigned char data[0]; +}; + +struct arb_dlc_status { + unsigned char command; + unsigned char reserved1[3]; + __u16 station_id; + __u16 status; + unsigned char frmr_data[5]; + unsigned char access_prio; + unsigned char rem_addr[TR_ALEN]; + unsigned char rsap_value; +}; + +struct arb_ring_stat_change { + unsigned char command; + unsigned char reserved1[5]; + __u16 ring_status; +}; + +struct srb_close_adapter { + unsigned char command; + unsigned char reserved1; + unsigned char ret_code; +}; + +struct srb_set_funct_addr { + unsigned char command; + unsigned char reserved1; + unsigned char ret_code; + unsigned char reserved2[3]; + unsigned char funct_address[4]; +}; + diff --git a/drivers/net/tokenring/olympic.c b/drivers/net/tokenring/olympic.c new file mode 100644 index 000000000..460480c48 --- /dev/null +++ b/drivers/net/tokenring/olympic.c @@ -0,0 +1,1667 @@ +/* + * olympic.c (c) 1999 Peter De Schrijver All Rights Reserved + * 1999 Mike Phillips (phillim@amtrak.com) + * + * Linux driver for IBM PCI tokenring cards based on the Pit/Pit-Phy/Olympic + * chipset. + * + * Base Driver Skeleton: + * Written 1993-94 by Donald Becker. + * + * Copyright 1993 United States Government as represented by the + * Director, National Security Agency. + * + * Thanks to Erik De Cock, Adrian Bridgett and Frank Fiene for their + * assistance and perserverance with the testing of this driver. + * + * This software may be used and distributed according to the terms + * of the GNU Public License, incorporated herein by reference. + * + * 4/27/99 - Alpha Release 0.1.0 + * First release to the public + * + * 6/8/99 - Official Release 0.2.0 + * Merged into the kernel code + * 8/18/99 - Updated driver for 2.3.13 kernel to use new pci + * resource. Driver also reports the card name returned by + * the pci resource. + * + * To Do: + * + * Sanitize for smp + * + * If Problems do Occur + * Most problems can be rectified by either closing and opening the interface + * (ifconfig down and up) or rmmod and insmod'ing the driver (a bit difficult + * if compiled into the kernel). + */ + +/* Change OLYMPIC_DEBUG to 1 to get verbose, and I mean really verbose, messages */ + +#define OLYMPIC_DEBUG 0 + +/* Change OLYMPIC_NETWORK_MONITOR to receive mac frames through the arb channel. + * Will also create a /proc/net/olympic_tr entry if proc_fs is compiled into the + * kernel. + * Intended to be used to create a ring-error reporting network module + * i.e. it will give you the source address of beaconers on the ring + */ + +#define OLYMPIC_NETWORK_MONITOR 0 + +#include <linux/config.h> +#include <linux/module.h> + +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/errno.h> +#include <linux/timer.h> +#include <linux/in.h> +#include <linux/ioport.h> +#include <linux/string.h> +#include <linux/proc_fs.h> +#include <linux/ptrace.h> +#include <linux/skbuff.h> +#include <linux/interrupt.h> +#include <linux/delay.h> +#include <linux/netdevice.h> +#include <linux/trdevice.h> +#include <linux/stddef.h> +#include <linux/init.h> +#include <linux/pci.h> +#include <net/checksum.h> + +#include <asm/io.h> +#include <asm/system.h> +#include <asm/bitops.h> + +#include "olympic.h" + +/* I've got to put some intelligence into the version number so that Peter and I know + * which version of the code somebody has got. + * Version Number = a.b.c.d where a.b.c is the level of code and d is the latest author. + * So 0.0.1.pds = Peter, 0.0.1.mlp = Mike + * + * Official releases will only have an a.b.c version number format. + */ + +static char *version = +"Olympic.c v0.3.0 8/18/99 - Peter De Schrijver & Mike Phillips" ; + +static char *open_maj_error[] = {"No error", "Lobe Media Test", "Physical Insertion", + "Address Verification", "Neighbor Notification (Ring Poll)", + "Request Parameters","FDX Registration Request", + "FDX Duplicate Address Check", "Station registration Query Wait", + "Unknown stage"}; + +static char *open_min_error[] = {"No error", "Function Failure", "Signal Lost", "Wire Fault", + "Ring Speed Mismatch", "Timeout","Ring Failure","Ring Beaconing", + "Duplicate Node Address","Request Parameters","Remove Received", + "Reserved", "Reserved", "No Monitor Detected for RPL", + "Monitor Contention failer for RPL", "FDX Protocol Error"}; + +/* Module paramters */ + +/* Ring Speed 0,4,16,100 + * 0 = Autosense + * 4,16 = Selected speed only, no autosense + * This allows the card to be the first on the ring + * and become the active monitor. + * 100 = Nothing at present, 100mbps is autodetected + * if FDX is turned on. May be implemented in the future to + * fail if 100mpbs is not detected. + * + * WARNING: Some hubs will allow you to insert + * at the wrong speed + */ + +static int ringspeed[OLYMPIC_MAX_ADAPTERS] = {0,} ; + +MODULE_PARM(ringspeed, "1-" __MODULE_STRING(OLYMPIC_MAX_ADAPTERS) "i"); + +/* Packet buffer size */ + +static int pkt_buf_sz[OLYMPIC_MAX_ADAPTERS] = {0,} ; + +MODULE_PARM(pkt_buf_sz, "1-" __MODULE_STRING(OLYMPIC_MAX_ADAPTERS) "i") ; + +/* Message Level */ + +static int message_level[OLYMPIC_MAX_ADAPTERS] = {0,} ; + +MODULE_PARM(message_level, "1-" __MODULE_STRING(OLYMPIC_MAX_ADAPTERS) "i") ; + +static int olympic_scan(struct net_device *dev); +static int olympic_init(struct net_device *dev); +static int olympic_open(struct net_device *dev); +static int olympic_xmit(struct sk_buff *skb, struct net_device *dev); +static int olympic_close(struct net_device *dev); +static void olympic_set_rx_mode(struct net_device *dev); +static void olympic_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static struct net_device_stats * olympic_get_stats(struct net_device *dev); +static int olympic_set_mac_address(struct net_device *dev, void *addr) ; +static void olympic_arb_cmd(struct net_device *dev); +static int olympic_change_mtu(struct net_device *dev, int mtu); +static void olympic_srb_bh(struct net_device *dev) ; +static void olympic_asb_bh(struct net_device *dev) ; +#if OLYMPIC_NETWORK_MONITOR +#ifdef CONFIG_PROC_FS +static int sprintf_info(char *buffer, struct net_device *dev) ; +#endif +#endif + +int __init olympic_probe(struct net_device *dev) +{ + int cards_found; + + cards_found=olympic_scan(dev); + return cards_found ? 0 : -ENODEV; +} + +static int __init olympic_scan(struct net_device *dev) +{ + struct pci_dev *pci_device = NULL ; + struct olympic_private *olympic_priv; + int card_no = 0 ; + if (pci_present()) { + + while((pci_device=pci_find_device(PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_TR_WAKE, pci_device))) { + + pci_set_master(pci_device); + + /* Check to see if io has been allocated, if so, we've already done this card, + so continue on the card discovery loop */ + + if (check_region(pci_device->resource[0].start, OLYMPIC_IO_SPACE)) { + card_no++ ; + continue ; + } + + olympic_priv=kmalloc(sizeof (struct olympic_private), GFP_KERNEL); + memset(olympic_priv, 0, sizeof(struct olympic_private)); + init_waitqueue_head(&olympic_priv->srb_wait); + init_waitqueue_head(&olympic_priv->trb_wait); +#ifndef MODULE + dev=init_trdev(dev, 0); +#endif + dev->priv=(void *)olympic_priv; +#if OLYMPIC_DEBUG + printk("pci_device: %p, dev:%p, dev->priv: %p\n", pci_device, dev, dev->priv); +#endif + dev->irq=pci_device->irq; + dev->base_addr=pci_device->resource[0].start; + dev->init=&olympic_init; + olympic_priv->olympic_card_name = (char *)pci_device->resource[0].name ; + olympic_priv->olympic_mmio=ioremap(pci_device->resource[1].start,256); + olympic_priv->olympic_lap=ioremap(pci_device->resource[2].start,2048); + + if ((pkt_buf_sz[card_no] < 100) || (pkt_buf_sz[card_no] > 18000) ) + olympic_priv->pkt_buf_sz = PKT_BUF_SZ ; + else + olympic_priv->pkt_buf_sz = pkt_buf_sz[card_no] ; + + olympic_priv->olympic_ring_speed = ringspeed[card_no] ; + olympic_priv->olympic_message_level = message_level[card_no] ; + olympic_priv->olympic_multicast_set = 0 ; + + if(olympic_init(dev)==-1) { + unregister_netdevice(dev); + kfree(dev->priv); + return 0; + } + + dev->open=&olympic_open; + dev->hard_start_xmit=&olympic_xmit; + dev->change_mtu=&olympic_change_mtu; + + dev->stop=&olympic_close; + dev->do_ioctl=NULL; + dev->set_multicast_list=&olympic_set_rx_mode; + dev->get_stats=&olympic_get_stats ; + dev->set_mac_address=&olympic_set_mac_address ; + return 1; + } + } + return 0 ; +} + + +static int __init olympic_init(struct net_device *dev) +{ + struct olympic_private *olympic_priv; + __u8 *olympic_mmio, *init_srb,*adapter_addr; + unsigned long t; + unsigned int uaa_addr; + + olympic_priv=(struct olympic_private *)dev->priv; + olympic_mmio=olympic_priv->olympic_mmio; + + printk("%s \n", version); + printk("%s: %s. I/O at %hx, MMIO at %p, LAP at %p, using irq %d\n",dev->name, olympic_priv->olympic_card_name, (unsigned int) dev->base_addr,olympic_priv->olympic_mmio, olympic_priv->olympic_lap, dev->irq); + + request_region(dev->base_addr, OLYMPIC_IO_SPACE, "olympic"); + writel(readl(olympic_mmio+BCTL) | BCTL_SOFTRESET,olympic_mmio+BCTL); + t=jiffies; + while((readl(olympic_priv->olympic_mmio+BCTL)) & BCTL_SOFTRESET) { + schedule(); + if(jiffies-t > 40*HZ) { + printk(KERN_ERR "IBM PCI tokenring card not responding.\n"); + release_region(dev->base_addr, OLYMPIC_IO_SPACE) ; + return -1; + } + } + +#if OLYMPIC_DEBUG + printk("BCTL: %x\n",readl(olympic_mmio+BCTL)); + printk("GPR: %x\n",readw(olympic_mmio+GPR)); + printk("SISRMASK: %x\n",readl(olympic_mmio+SISR_MASK)); +#endif + /* Aaaahhh, You have got to be real careful setting GPR, the card + holds the previous values from flash memory, including autosense + and ring speed */ + + writel(readl(olympic_mmio+BCTL)|BCTL_MIMREB,olympic_mmio+BCTL); + + if (olympic_priv->olympic_ring_speed == 0) { /* Autosense */ + writel(readl(olympic_mmio+GPR)|GPR_AUTOSENSE,olympic_mmio+GPR); + if (olympic_priv->olympic_message_level) + printk(KERN_INFO "%s: Ringspeed autosense mode on\n",dev->name); + } else if (olympic_priv->olympic_ring_speed == 16) { + if (olympic_priv->olympic_message_level) + printk(KERN_INFO "%s: Trying to open at 16 Mbps as requested\n", dev->name); + writel(GPR_16MBPS, olympic_mmio+GPR); + } else if (olympic_priv->olympic_ring_speed == 4) { + if (olympic_priv->olympic_message_level) + printk(KERN_INFO "%s: Trying to open at 4 Mbps as requested\n", dev->name) ; + writel(0, olympic_mmio+GPR); + } + + writel(readl(olympic_mmio+GPR)|GPR_NEPTUNE_BF,olympic_mmio+GPR); + +#if OLYMPIC_DEBUG + printk("GPR = %x\n",readw(olympic_mmio + GPR) ) ; +#endif + /* start solo init */ + writel((1<<15),olympic_mmio+SISR_MASK_SUM); + + t=jiffies; + while(!((readl(olympic_mmio+SISR_RR)) & SISR_SRB_REPLY)) { + schedule(); + if(jiffies-t > 40*HZ) { + printk(KERN_ERR "IBM PCI tokenring card not responding.\n"); + release_region(dev->base_addr, OLYMPIC_IO_SPACE); + return -1; + } + } + + writel(readl(olympic_mmio+LAPWWO),olympic_mmio+LAPA); + +#if OLYMPIC_DEBUG + printk("LAPWWO: %x, LAPA: %x\n",readl(olympic_mmio+LAPWWO), readl(olympic_mmio+LAPA)); +#endif + + init_srb=olympic_priv->olympic_lap + ((readl(olympic_mmio+LAPWWO)) & (~0xf800)); + +#if OLYMPIC_DEBUG +{ + int i; + printk("init_srb(%p): ",init_srb); + for(i=0;i<20;i++) + printk("%x ",readb(init_srb+i)); + printk("\n"); +} +#endif + if(readw(init_srb+6)) { + printk(KERN_INFO "tokenring card intialization failed. errorcode : %x\n",readw(init_srb+6)); + release_region(dev->base_addr, OLYMPIC_IO_SPACE); + return -1; + } + + uaa_addr=ntohs(readw(init_srb+8)); + +#if OLYMPIC_DEBUG + printk("UAA resides at %x\n",uaa_addr); +#endif + + writel(uaa_addr,olympic_mmio+LAPA); + adapter_addr=olympic_priv->olympic_lap + (uaa_addr & (~0xf800)); + +#if OLYMPIC_DEBUG + printk("adapter address: %02x:%02x:%02x:%02x:%02x:%02x\n", + readb(adapter_addr), readb(adapter_addr+1),readb(adapter_addr+2), + readb(adapter_addr+3),readb(adapter_addr+4),readb(adapter_addr+5)); +#endif + + memcpy_fromio(&dev->dev_addr[0], adapter_addr,6); + + olympic_priv->olympic_addr_table_addr = ntohs(readw(init_srb + 12)) ; + olympic_priv->olympic_parms_addr = ntohs(readw(init_srb + 14)) ; + + return 0; + +} + +static int olympic_open(struct net_device *dev) +{ + struct olympic_private *olympic_priv=(struct olympic_private *)dev->priv; + __u8 *olympic_mmio=olympic_priv->olympic_mmio,*init_srb; + unsigned long flags; + char open_error[255] ; + int i, open_finished = 1 ; + +#if OLYMPIC_NETWORK_MONITOR + __u8 *oat ; + __u8 *opt ; +#endif + + if(request_irq(dev->irq, &olympic_interrupt, SA_SHIRQ , "olympic", dev)) { + return -EAGAIN; + } + +#if OLYMPIC_DEBUG + printk("BMCTL: %x\n",readl(olympic_mmio+BMCTL_SUM)); + printk("pending ints: %x\n",readl(olympic_mmio+SISR_RR)); +#endif + + writel(SISR_MI,olympic_mmio+SISR_MASK_SUM); + + writel(SISR_MI | SISR_SRB_REPLY, olympic_mmio+SISR_MASK); /* more ints later, doesn't stop arb cmd interrupt */ + + writel(LISR_LIE,olympic_mmio+LISR); /* more ints later */ + + /* adapter is closed, so SRB is pointed to by LAPWWO */ + + writel(readl(olympic_mmio+LAPWWO),olympic_mmio+LAPA); + init_srb=olympic_priv->olympic_lap + ((readl(olympic_mmio+LAPWWO)) & (~0xf800)); + +#if OLYMPIC_DEBUG + printk("LAPWWO: %x, LAPA: %x\n",readl(olympic_mmio+LAPWWO), readl(olympic_mmio+LAPA)); + printk("SISR Mask = %04x\n", readl(olympic_mmio+SISR_MASK)); + printk("Before the open command \n"); +#endif + do { + int i; + + save_flags(flags); + cli(); + for(i=0;i<SRB_COMMAND_SIZE;i+=4) + writel(0,init_srb+i); + if(SRB_COMMAND_SIZE & 2) + writew(0,init_srb+(SRB_COMMAND_SIZE & ~3)); + if(SRB_COMMAND_SIZE & 1) + writeb(0,init_srb+(SRB_COMMAND_SIZE & ~1)); + + writeb(SRB_OPEN_ADAPTER,init_srb) ; /* open */ + writeb(OLYMPIC_CLEAR_RET_CODE,init_srb+2); + + /* If Network Monitor, instruct card to copy MAC frames through the ARB */ + +#if OLYMPIC_NETWORK_MONITOR + writew(ntohs(OPEN_ADAPTER_ENABLE_FDX | OPEN_ADAPTER_PASS_ADC_MAC | OPEN_ADAPTER_PASS_ATT_MAC | OPEN_ADAPTER_PASS_BEACON),init_srb+8); +#else + writew(OPEN_ADAPTER_ENABLE_FDX,init_srb+8); +#endif + + if (olympic_priv->olympic_laa[0]) { + writeb(olympic_priv->olympic_laa[0],init_srb+12); + writeb(olympic_priv->olympic_laa[1],init_srb+13); + writeb(olympic_priv->olympic_laa[2],init_srb+14); + writeb(olympic_priv->olympic_laa[3],init_srb+15); + writeb(olympic_priv->olympic_laa[4],init_srb+16); + writeb(olympic_priv->olympic_laa[5],init_srb+17); + memcpy(dev->dev_addr,olympic_priv->olympic_laa,dev->addr_len) ; + } + writeb(1,init_srb+30); + + olympic_priv->srb_queued=1; + + writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM); + + while(olympic_priv->srb_queued) { + interruptible_sleep_on_timeout(&olympic_priv->srb_wait, 60*HZ); + if(signal_pending(current)) { + printk(KERN_WARNING "%s: SRB timed out.\n", + dev->name); + printk(KERN_WARNING "SISR=%x MISR=%x\n", + readl(olympic_mmio+SISR), + readl(olympic_mmio+LISR)); + olympic_priv->srb_queued=0; + break; + } + } + restore_flags(flags); +#if OLYMPIC_DEBUG + printk("init_srb(%p): ",init_srb); + for(i=0;i<20;i++) + printk("%x ",readb(init_srb+i)); + printk("\n"); +#endif + + /* If we get the same return response as we set, the interrupt wasn't raised and the open + * timed out. + */ + + if(readb(init_srb+2)== OLYMPIC_CLEAR_RET_CODE) { + printk(KERN_WARNING "%s: Adapter Open time out or error.\n", dev->name) ; + return -EIO ; + } + + if(readb(init_srb+2)!=0) { + if (readb(init_srb+2) == 0x07) { + if (!olympic_priv->olympic_ring_speed && open_finished) { /* Autosense , first time around */ + printk(KERN_WARNING "%s: Retrying at different ring speed \n", dev->name); + open_finished = 0 ; + } else { + + strcpy(open_error, open_maj_error[(readb(init_srb+7) & 0xf0) >> 4]) ; + strcat(open_error," - ") ; + strcat(open_error, open_min_error[(readb(init_srb+7) & 0x0f)]) ; + + if (!olympic_priv->olympic_ring_speed && ((readb(init_srb+7) & 0x0f) == 0x0d)) { + printk(KERN_WARNING "%s: Tried to autosense ring speed with no monitors present\n",dev->name); + printk(KERN_WARNING "%s: Please try again with a specified ring speed \n",dev->name); + free_irq(dev->irq, dev); + return -EIO ; + } + + printk(KERN_WARNING "%s: %s\n",dev->name,open_error); + free_irq(dev->irq,dev) ; + return -EIO ; + + } /* if autosense && open_finished */ + } else { + printk(KERN_WARNING "%s: Bad OPEN response: %x\n", dev->name,init_srb[2]); + free_irq(dev->irq, dev); + return -EIO; + } + } else + open_finished = 1 ; + } while (!(open_finished)) ; /* Will only loop if ring speed mismatch re-open attempted && autosense is on */ + + if (readb(init_srb+18) & (1<<3)) + if (olympic_priv->olympic_message_level) + printk(KERN_INFO "%s: Opened in FDX Mode\n",dev->name); + + if (readb(init_srb+18) & (1<<1)) + olympic_priv->olympic_ring_speed = 100 ; + else if (readb(init_srb+18) & 1) + olympic_priv->olympic_ring_speed = 16 ; + else + olympic_priv->olympic_ring_speed = 4 ; + + if (olympic_priv->olympic_message_level) + printk(KERN_INFO "%s: Opened in %d Mbps mode\n",dev->name, olympic_priv->olympic_ring_speed); + + olympic_priv->asb=ntohs(readw(init_srb+8)); + olympic_priv->srb=ntohs(readw(init_srb+10)); + olympic_priv->arb=ntohs(readw(init_srb+12)); + olympic_priv->trb=ntohs(readw(init_srb+16)); + + olympic_priv->olympic_receive_options = 0x01 ; + olympic_priv->olympic_copy_all_options = 0 ; + + /* setup rx ring */ + + writel((3<<16),olympic_mmio+BMCTL_RWM); /* Ensure end of frame generated interrupts */ + + writel(BMCTL_RX_DIS|3,olympic_mmio+BMCTL_RWM); /* Yes, this the enables RX channel */ + + for(i=0;i<OLYMPIC_RX_RING_SIZE;i++) { + + struct sk_buff *skb; + + skb=dev_alloc_skb(olympic_priv->pkt_buf_sz); + if(skb == NULL) + break; + + skb->dev = dev; + + olympic_priv->olympic_rx_ring[i].buffer=virt_to_bus(skb->data); + olympic_priv->olympic_rx_ring[i].res_length = olympic_priv->pkt_buf_sz ; + olympic_priv->rx_ring_skb[i]=skb; + } + + if (i==0) { + printk(KERN_WARNING "%s: Not enough memory to allocate rx buffers. Adapter disabled\n",dev->name); + free_irq(dev->irq, dev); + return -EIO; + } + + writel(virt_to_bus(&olympic_priv->olympic_rx_ring[0]),olympic_mmio+RXDESCQ); + writel(virt_to_bus(&olympic_priv->olympic_rx_ring[0]),olympic_mmio+RXCDA); + writew(i,olympic_mmio+RXDESCQCNT); + + writel(virt_to_bus(&olympic_priv->olympic_rx_status_ring[0]),olympic_mmio+RXSTATQ); + writel(virt_to_bus(&olympic_priv->olympic_rx_status_ring[0]),olympic_mmio+RXCSA); + + olympic_priv->rx_ring_last_received=OLYMPIC_RX_RING_SIZE-1; /* last processed rx status */ + olympic_priv->rx_status_last_received = OLYMPIC_RX_RING_SIZE-1; + + writew(i,olympic_mmio+RXSTATQCNT); + +#if OLYMPIC_DEBUG + printk("# of rx buffers: %d, RXENQ: %x\n",i, readw(olympic_mmio+RXENQ)); + printk("RXCSA: %x, rx_status_ring[0]: %p\n",bus_to_virt(readl(olympic_mmio+RXCSA)),&olympic_priv->olympic_rx_status_ring[0]); + printk(" stat_ring[1]: %p, stat_ring[2]: %p, stat_ring[3]: %p\n", &(olympic_priv->olympic_rx_status_ring[1]), &(olympic_priv->olympic_rx_status_ring[2]), &(olympic_priv->olympic_rx_status_ring[3]) ); + printk(" stat_ring[4]: %p, stat_ring[5]: %p, stat_ring[6]: %p\n", &(olympic_priv->olympic_rx_status_ring[4]), &(olympic_priv->olympic_rx_status_ring[5]), &(olympic_priv->olympic_rx_status_ring[6]) ); + printk(" stat_ring[7]: %p\n", &(olympic_priv->olympic_rx_status_ring[7]) ); + + printk("RXCDA: %x, rx_ring[0]: %p\n",bus_to_virt(readl(olympic_mmio+RXCDA)),&olympic_priv->olympic_rx_ring[0]); +#endif + + writew((((readw(olympic_mmio+RXENQ)) & 0x8000) ^ 0x8000) | i,olympic_mmio+RXENQ); + +#if OLYMPIC_DEBUG + printk("# of rx buffers: %d, RXENQ: %x\n",i, readw(olympic_mmio+RXENQ)); + printk("RXCSA: %x, rx_ring[0]: %p\n",bus_to_virt(readl(olympic_mmio+RXCSA)),&olympic_priv->olympic_rx_status_ring[0]); + printk("RXCDA: %x, rx_ring[0]: %p\n",bus_to_virt(readl(olympic_mmio+RXCDA)),&olympic_priv->olympic_rx_ring[0]); +#endif + + writel(SISR_RX_STATUS | SISR_RX_NOBUF,olympic_mmio+SISR_MASK_SUM); + + /* setup tx ring */ + + writel(BMCTL_TX1_DIS,olympic_mmio+BMCTL_RWM); /* Yes, this enables TX channel 1 */ + for(i=0;i<OLYMPIC_TX_RING_SIZE;i++) + olympic_priv->olympic_tx_ring[i].buffer=0xdeadbeef; + + olympic_priv->free_tx_ring_entries=OLYMPIC_TX_RING_SIZE; + writel(virt_to_bus(&olympic_priv->olympic_tx_ring[0]),olympic_mmio+TXDESCQ_1); + writel(virt_to_bus(&olympic_priv->olympic_tx_ring[0]),olympic_mmio+TXCDA_1); + writew(OLYMPIC_TX_RING_SIZE,olympic_mmio+TXDESCQCNT_1); + + writel(virt_to_bus(&olympic_priv->olympic_tx_status_ring[0]),olympic_mmio+TXSTATQ_1); + writel(virt_to_bus(&olympic_priv->olympic_tx_status_ring[0]),olympic_mmio+TXCSA_1); + writew(OLYMPIC_TX_RING_SIZE,olympic_mmio+TXSTATQCNT_1); + + olympic_priv->tx_ring_free=0; /* next entry in tx ring to use */ + olympic_priv->tx_ring_last_status=OLYMPIC_TX_RING_SIZE-1; /* last processed tx status */ + + writel(SISR_TX1_EOF | SISR_ADAPTER_CHECK | SISR_ARB_CMD | SISR_TRB_REPLY | SISR_ASB_FREE,olympic_mmio+SISR_MASK_SUM); + +#if OLYMPIC_DEBUG + printk("BMCTL: %x\n",readl(olympic_mmio+BMCTL_SUM)); + printk("SISR MASK: %x\n",readl(olympic_mmio+SISR_MASK)); +#endif + +#if OLYMPIC_NETWORK_MONITOR + oat = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->olympic_addr_table_addr) ; + opt = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->olympic_parms_addr) ; + + printk("%s: Node Address: %02x:%02x:%02x:%02x:%02x:%02x\n",dev->name, + readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)), + readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+1), + readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+2), + readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+3), + readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+4), + readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+5)); + printk("%s: Functional Address: %02x:%02x:%02x:%02x\n",dev->name, + readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)), + readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+1), + readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+2), + readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+3)); + + printk("%s: NAUN Address: %02x:%02x:%02x:%02x:%02x:%02x\n",dev->name, + readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)), + readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+1), + readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+2), + readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+3), + readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+4), + readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+5)); + + +#endif + + dev->start = 1; + dev->interrupt=0; + dev->tbusy=0; + + MOD_INC_USE_COUNT ; + return 0; + +} + +/* + * When we enter the rx routine we do not know how many frames have been + * queued on the rx channel. Therefore we start at the next rx status + * position and travel around the receive ring until we have completed + * all the frames. + * + * This means that we may process the frame before we receive the end + * of frame interrupt. This is why we always test the status instead + * of blindly processing the next frame. + * + */ +static void olympic_rx(struct net_device *dev) +{ + struct olympic_private *olympic_priv=(struct olympic_private *)dev->priv; + __u8 *olympic_mmio=olympic_priv->olympic_mmio; + struct olympic_rx_status *rx_status; + struct olympic_rx_desc *rx_desc ; + int rx_ring_last_received,length, buffer_cnt, cpy_length, frag_len; + struct sk_buff *skb, *skb2; + int i; + + rx_status=&(olympic_priv->olympic_rx_status_ring[(olympic_priv->rx_status_last_received + 1) & (OLYMPIC_RX_RING_SIZE - 1)]) ; + + while (rx_status->status_buffercnt) { + + olympic_priv->rx_status_last_received++ ; + olympic_priv->rx_status_last_received &= (OLYMPIC_RX_RING_SIZE -1); +#if OLYMPIC_DEBUG + printk(" stat_ring addr: %x \n", &(olympic_priv->olympic_rx_status_ring[olympic_priv->rx_status_last_received]) ); + printk("rx status: %x rx len: %x \n",rx_status->status_buffercnt,rx_status->fragmentcnt_framelen); +#endif + length=rx_status->fragmentcnt_framelen & 0xffff; + buffer_cnt = rx_status->status_buffercnt & 0xffff ; + i = buffer_cnt ; /* Need buffer_cnt later for rxenq update */ + frag_len = rx_status->fragmentcnt_framelen >> 16 ; + +#if OLYMPIC_DEBUG + printk("length: %x, frag_len: %x, buffer_cnt: %x\n",length,frag_len,buffer_cnt); +#endif + + if(rx_status->status_buffercnt & 0xC0000000) { + if (rx_status->status_buffercnt & 0x3B000000) { + if (olympic_priv->olympic_message_level) { + if (rx_status->status_buffercnt & (1<<29)) /* Rx Frame Truncated */ + printk(KERN_WARNING "%s: Rx Frame Truncated \n",dev->name); + if (rx_status->status_buffercnt & (1<<28)) /*Rx receive overrun */ + printk(KERN_WARNING "%s: Rx Frame Receive overrun \n",dev->name); + if (rx_status->status_buffercnt & (1<<27)) /* No receive buffers */ + printk(KERN_WARNING "%s: No receive buffers \n",dev->name); + if (rx_status->status_buffercnt & (1<<25)) /* Receive frame error detect */ + printk(KERN_WARNING "%s: Receive frame error detect \n",dev->name); + if (rx_status->status_buffercnt & (1<<24)) /* Received Error Detect */ + printk(KERN_WARNING "%s: Received Error Detect \n",dev->name); + } + olympic_priv->rx_ring_last_received += i ; + olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1) ; + olympic_priv->olympic_stats.rx_errors++; + } else { + + if (buffer_cnt == 1) { + skb = dev_alloc_skb(olympic_priv->pkt_buf_sz) ; + } else { + skb = dev_alloc_skb(length) ; + } + + if (skb == NULL) { + printk(KERN_WARNING "%s: Not enough memory to copy packet to upper layers. \n",dev->name) ; + olympic_priv->olympic_stats.rx_dropped++ ; + /* Update counters even though we don't transfer the frame */ + olympic_priv->rx_ring_last_received += i ; + olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1) ; + } else { + skb->dev = dev ; + + /* Optimise based upon number of buffers used. + If only one buffer is used we can simply swap the buffers around. + If more than one then we must use the new buffer and copy the information + first. Ideally all frames would be in a single buffer, this can be tuned by + altering the buffer size. */ + + if (buffer_cnt==1) { + olympic_priv->rx_ring_last_received++ ; + olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1); + rx_ring_last_received = olympic_priv->rx_ring_last_received ; + skb2=olympic_priv->rx_ring_skb[rx_ring_last_received] ; + skb_put(skb2,length); + skb2->protocol = tr_type_trans(skb2,dev); + olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer=virt_to_bus(skb->data); + olympic_priv->olympic_rx_ring[rx_ring_last_received].res_length = olympic_priv->pkt_buf_sz ; + olympic_priv->rx_ring_skb[rx_ring_last_received] = skb ; + netif_rx(skb2) ; + } else { + do { /* Walk the buffers */ + olympic_priv->rx_ring_last_received++ ; + olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1); + rx_ring_last_received = olympic_priv->rx_ring_last_received ; + rx_desc = &(olympic_priv->olympic_rx_ring[rx_ring_last_received]); + cpy_length = (i == 1 ? frag_len : rx_desc->res_length); + memcpy(skb_put(skb, cpy_length), bus_to_virt(rx_desc->buffer), cpy_length) ; + } while (--i) ; + + skb->protocol = tr_type_trans(skb,dev); + netif_rx(skb) ; + } + olympic_priv->olympic_stats.rx_packets++ ; + olympic_priv->olympic_stats.rx_bytes += length ; + } /* if skb == null */ + } /* If status & 0x3b */ + + } else { /*if buffercnt & 0xC */ + olympic_priv->rx_ring_last_received += i ; + olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE - 1) ; + } + + rx_status->fragmentcnt_framelen = 0 ; + rx_status->status_buffercnt = 0 ; + rx_status = &(olympic_priv->olympic_rx_status_ring[(olympic_priv->rx_status_last_received+1) & (OLYMPIC_RX_RING_SIZE -1) ]); + + writew((((readw(olympic_mmio+RXENQ)) & 0x8000) ^ 0x8000) | buffer_cnt , olympic_mmio+RXENQ); + } /* while */ + +} + +static void olympic_interrupt(int irq, void *dev_id, struct pt_regs *regs) +{ + struct net_device *dev= (struct net_device *)dev_id; + struct olympic_private *olympic_priv=(struct olympic_private *)dev->priv; + __u8 *olympic_mmio=olympic_priv->olympic_mmio; + __u32 sisr; + __u8 *adapter_check_area ; + + sisr=readl(olympic_mmio+SISR_RR) ; /* Reset sisr */ + + if (!(sisr & SISR_MI)) /* Interrupt isn't for us */ + return ; + + if (dev->interrupt) + printk(KERN_WARNING "%s: Re-entering interrupt \n",dev->name) ; + + dev->interrupt = 1 ; + + if (sisr & (SISR_SRB_REPLY | SISR_TX1_EOF | SISR_RX_STATUS | SISR_ADAPTER_CHECK | + SISR_ASB_FREE | SISR_ARB_CMD | SISR_TRB_REPLY | SISR_RX_NOBUF)) { + + if(sisr & SISR_SRB_REPLY) { + if(olympic_priv->srb_queued==1) { + wake_up_interruptible(&olympic_priv->srb_wait); + } else if (olympic_priv->srb_queued==2) { + olympic_srb_bh(dev) ; + } + olympic_priv->srb_queued=0; + } /* SISR_SRB_REPLY */ + + if (sisr & SISR_TX1_EOF) { + olympic_priv->tx_ring_last_status++; + olympic_priv->tx_ring_last_status &= (OLYMPIC_TX_RING_SIZE-1); + olympic_priv->free_tx_ring_entries++; + olympic_priv->olympic_stats.tx_bytes += olympic_priv->tx_ring_skb[olympic_priv->tx_ring_last_status]->len; + olympic_priv->olympic_stats.tx_packets++ ; + dev_kfree_skb(olympic_priv->tx_ring_skb[olympic_priv->tx_ring_last_status]); + olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_last_status].buffer=0xdeadbeef; + olympic_priv->olympic_tx_status_ring[olympic_priv->tx_ring_last_status].status=0; + + if(dev->tbusy) { + dev->tbusy=0; + mark_bh(NET_BH); + } + } /* SISR_TX1_EOF */ + + if (sisr & SISR_RX_STATUS) { + olympic_rx(dev); + } /* SISR_RX_STATUS */ + + if (sisr & SISR_ADAPTER_CHECK) { + printk(KERN_WARNING "%s: Adapter Check Interrupt Raised, 8 bytes of information follow:\n", dev->name); + writel(readl(olympic_mmio+LAPWWO),olympic_mmio+LAPA); + adapter_check_area = (__u8 *)(olympic_mmio+LAPWWO) ; + printk(KERN_WARNING "%s: Bytes %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",dev->name, readb(adapter_check_area+0), readb(adapter_check_area+1), readb(adapter_check_area+2), readb(adapter_check_area+3), readb(adapter_check_area+4), readb(adapter_check_area+5), readb(adapter_check_area+6), readb(adapter_check_area+7)) ; + dev->interrupt = 0 ; + free_irq(dev->irq, dev) ; + + } /* SISR_ADAPTER_CHECK */ + + if (sisr & SISR_ASB_FREE) { + /* Wake up anything that is waiting for the asb response */ + if (olympic_priv->asb_queued) { + olympic_asb_bh(dev) ; + } + } /* SISR_ASB_FREE */ + + if (sisr & SISR_ARB_CMD) { + olympic_arb_cmd(dev) ; + } /* SISR_ARB_CMD */ + + if (sisr & SISR_TRB_REPLY) { + /* Wake up anything that is waiting for the trb response */ + if (olympic_priv->trb_queued) { + wake_up_interruptible(&olympic_priv->trb_wait); + } + olympic_priv->trb_queued = 0 ; + } /* SISR_TRB_REPLY */ + + if (sisr & SISR_RX_NOBUF) { + /* According to the documentation, we don't have to do anything, but trapping it keeps it out of + /var/log/messages. */ + } /* SISR_RX_NOBUF */ + } else { + printk(KERN_WARNING "%s: Unexpected interrupt: %x\n",dev->name, sisr); + printk(KERN_WARNING "%s: SISR_MASK: %x\n",dev->name, readl(olympic_mmio+SISR_MASK)) ; + } /* One if the interrupts we want */ + + dev->interrupt = 0 ; + + writel(SISR_MI,olympic_mmio+SISR_MASK_SUM); + +} + +static int olympic_xmit(struct sk_buff *skb, struct net_device *dev) +{ + struct olympic_private *olympic_priv=(struct olympic_private *)dev->priv; + __u8 *olympic_mmio=olympic_priv->olympic_mmio; + + if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) { + return 1; + } + + if(olympic_priv->free_tx_ring_entries) { + olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].buffer=virt_to_bus(skb->data); + olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].status_length=skb->len | (0x80000000); + olympic_priv->tx_ring_skb[olympic_priv->tx_ring_free]=skb; + olympic_priv->free_tx_ring_entries--; + + olympic_priv->tx_ring_free++; + olympic_priv->tx_ring_free &= (OLYMPIC_TX_RING_SIZE-1); + + + writew((((readw(olympic_mmio+TXENQ_1)) & 0x8000) ^ 0x8000) | 1,olympic_mmio+TXENQ_1); + + dev->tbusy=0; + + return 0; + } else + return 1; + +} + + +static int olympic_close(struct net_device *dev) +{ + struct olympic_private *olympic_priv=(struct olympic_private *)dev->priv; + __u8 *olympic_mmio=olympic_priv->olympic_mmio,*srb; + unsigned long flags; + int i; + + writel(olympic_priv->srb,olympic_mmio+LAPA); + srb=olympic_priv->olympic_lap + (olympic_priv->srb & (~0xf800)); + + writeb(SRB_CLOSE_ADAPTER,srb+0); + writeb(0,srb+1); + writeb(OLYMPIC_CLEAR_RET_CODE,srb+2); + + save_flags(flags); + cli(); + + olympic_priv->srb_queued=1; + + writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM); + + while(olympic_priv->srb_queued) { + interruptible_sleep_on_timeout(&olympic_priv->srb_wait, jiffies+60*HZ); + if(signal_pending(current)) { + printk(KERN_WARNING "%s: SRB timed out.\n", + dev->name); + printk(KERN_WARNING "SISR=%x MISR=%x\n", + readl(olympic_mmio+SISR), + readl(olympic_mmio+LISR)); + olympic_priv->srb_queued=0; + break; + } + } + + restore_flags(flags) ; + olympic_priv->rx_status_last_received++; + olympic_priv->rx_status_last_received&=OLYMPIC_RX_RING_SIZE-1; + + for(i=0;i<OLYMPIC_RX_RING_SIZE;i++) { + dev_kfree_skb(olympic_priv->rx_ring_skb[olympic_priv->rx_status_last_received]); + olympic_priv->rx_status_last_received++; + olympic_priv->rx_status_last_received&=OLYMPIC_RX_RING_SIZE-1; + } + + /* reset tx/rx fifo's and busmaster logic */ + + writel(readl(olympic_mmio+BCTL)|(3<<13),olympic_mmio+BCTL); + udelay(1); + writel(readl(olympic_mmio+BCTL)&~(3<<13),olympic_mmio+BCTL); + +#if OLYMPIC_DEBUG + printk("srb(%p): ",srb); + for(i=0;i<4;i++) + printk("%x ",readb(srb+i)); + printk("\n"); +#endif + dev->start = 0; + free_irq(dev->irq,dev); + + MOD_DEC_USE_COUNT ; + return 0; + +} + +static void olympic_set_rx_mode(struct net_device *dev) +{ + struct olympic_private *olympic_priv = (struct olympic_private *) dev->priv ; + __u8 *olympic_mmio = olympic_priv->olympic_mmio ; + __u8 options = 0, set_mc_list = 0 ; + __u8 *srb, *ata ; + struct dev_mc_list *dmi ; + + writel(olympic_priv->srb,olympic_mmio+LAPA); + srb=olympic_priv->olympic_lap + (olympic_priv->srb & (~0xf800)); + options = olympic_priv->olympic_copy_all_options; + + if (dev->flags&IFF_PROMISC) + options |= (3<<5) ; /* All LLC and MAC frames, all through the main rx channel */ + else + options &= ~(3<<5) ; + + if (dev->mc_count) { + set_mc_list = 1 ; + } + + /* Only issue the srb if there is a change in options */ + + if ((options ^ olympic_priv->olympic_copy_all_options)) { + + /* Now to issue the srb command to alter the copy.all.options */ + + writeb(SRB_MODIFY_RECEIVE_OPTIONS,srb); + writeb(0,srb+1); + writeb(OLYMPIC_CLEAR_RET_CODE,srb+2); + writeb(0,srb+3); + writeb(olympic_priv->olympic_receive_options,srb+4); + writeb(options,srb+5); + + olympic_priv->srb_queued=2; /* Can't sleep, use srb_bh */ + + writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM); + + olympic_priv->olympic_copy_all_options = options ; + + return ; + } + + if (set_mc_list ^ olympic_priv->olympic_multicast_set) { /* Multicast options have changed */ + + dmi = dev->mc_list ; + + if (set_mc_list) { /* Turn multicast on */ + + /* RFC 1469 Says we must support using the functional address C0 00 00 04 00 00 + * We do this with a set functional address mask. + */ + + ata=olympic_priv->olympic_lap + (olympic_priv->olympic_addr_table_addr) ; + if (!(readb(ata+11) & 0x04)) { /* Hmmm, need to set the functional mask */ + writeb(SRB_SET_FUNC_ADDRESS,srb+0); + writeb(0,srb+1); + writeb(OLYMPIC_CLEAR_RET_CODE,srb+2); + writeb(0,srb+3); + writeb(0,srb+4); + writeb(0,srb+5); + writeb(readb(ata+10),srb+6); + writeb(readb(ata+11)|4,srb+7); + writeb(readb(ata+12),srb+8); + writeb(readb(ata+13),srb+9); + + olympic_priv->srb_queued = 2 ; + writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM); + + olympic_priv->olympic_multicast_set = 1 ; + } + + + } else { /* Turn multicast off */ + + ata=olympic_priv->olympic_lap + (olympic_priv->olympic_addr_table_addr) ; + if ((readb(ata+11) & 0x04)) { /* Hmmm, need to reset the functional mask */ + writeb(SRB_SET_FUNC_ADDRESS,srb+0); + writeb(0,srb+1); + writeb(OLYMPIC_CLEAR_RET_CODE,srb+2); + writeb(0,srb+3); + writeb(0,srb+4); + writeb(0,srb+5); + writeb(readb(ata+10),srb+6); + writeb(readb(ata+11) & ~4,srb+7); + writeb(readb(ata+12),srb+8); + writeb(readb(ata+13),srb+9); + + olympic_priv->srb_queued = 2 ; + writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM); + + olympic_priv->olympic_multicast_set = 0 ; + } + } + + } + + +} + +static void olympic_srb_bh(struct net_device *dev) +{ + struct olympic_private *olympic_priv = (struct olympic_private *) dev->priv ; + __u8 *olympic_mmio = olympic_priv->olympic_mmio ; + __u8 *srb; + + writel(olympic_priv->srb,olympic_mmio+LAPA); + srb=olympic_priv->olympic_lap + (olympic_priv->srb & (~0xf800)); + + switch (readb(srb)) { + + /* SRB_MODIFY_RECEIVE_OPTIONS i.e. set_multicast_list options (promiscuous) + * At some point we should do something if we get an error, such as + * resetting the IFF_PROMISC flag in dev + */ + + case SRB_MODIFY_RECEIVE_OPTIONS: + switch (readb(srb+2)) { + case 0x01: + printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name) ; + break ; + case 0x04: + printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name); + break ; + default: + if (olympic_priv->olympic_message_level) + printk(KERN_WARNING "%s: Receive Options Modified to %x,%x\n",dev->name,olympic_priv->olympic_copy_all_options, olympic_priv->olympic_receive_options) ; + break ; + } /* switch srb[2] */ + break ; + + /* SRB_SET_GROUP_ADDRESS - Multicast group setting + */ + + case SRB_SET_GROUP_ADDRESS: + switch (readb(srb+2)) { + case 0x00: + olympic_priv->olympic_multicast_set = 1 ; + break ; + case 0x01: + printk(KERN_WARNING "%s: Unrecognized srb command \n",dev->name) ; + break ; + case 0x04: + printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name); + break ; + case 0x3c: + printk(KERN_WARNING "%s: Group/Functional address indicator bits not set correctly\n",dev->name) ; + break ; + case 0x3e: /* If we ever implement individual multicast addresses, will need to deal with this */ + printk(KERN_WARNING "%s: Group address registers full\n",dev->name) ; + break ; + case 0x55: + printk(KERN_INFO "%s: Group Address already set.\n",dev->name) ; + break ; + default: + break ; + } /* switch srb[2] */ + break ; + + /* SRB_RESET_GROUP_ADDRESS - Remove a multicast address from group list + */ + + case SRB_RESET_GROUP_ADDRESS: + switch (readb(srb+2)) { + case 0x00: + olympic_priv->olympic_multicast_set = 0 ; + break ; + case 0x01: + printk(KERN_WARNING "%s: Unrecognized srb command \n",dev->name) ; + break ; + case 0x04: + printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ; + break ; + case 0x39: /* Must deal with this if individual multicast addresses used */ + printk(KERN_INFO "%s: Group address not found \n",dev->name); + break ; + default: + break ; + } /* switch srb[2] */ + break ; + + + /* SRB_SET_FUNC_ADDRESS - Called by the set_rx_mode + */ + + case SRB_SET_FUNC_ADDRESS: + switch (readb(srb+2)) { + case 0x00: + if (olympic_priv->olympic_message_level) + printk(KERN_INFO "%s: Functional Address Mask Set \n",dev->name) ; + break ; + case 0x01: + printk(KERN_WARNING "%s: Unrecognized srb command \n",dev->name) ; + break ; + case 0x04: + printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ; + break ; + default: + break ; + } /* switch srb[2] */ + break ; + + /* SRB_READ_LOG - Read and reset the adapter error counters + */ + + case SRB_READ_LOG: + switch (readb(srb+2)) { + case 0x00: + if (olympic_priv->olympic_message_level) + printk(KERN_INFO "%s: Read Log issued\n",dev->name) ; + break ; + case 0x01: + printk(KERN_WARNING "%s: Unrecognized srb command \n",dev->name) ; + break ; + case 0x04: + printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ; + break ; + + } /* switch srb[2] */ + break ; + + /* SRB_READ_SR_COUNTERS - Read and reset the source routing bridge related counters */ + + case SRB_READ_SR_COUNTERS: + switch (readb(srb+2)) { + case 0x00: + if (olympic_priv->olympic_message_level) + printk(KERN_INFO "%s: Read Source Routing Counters issued\n",dev->name) ; + break ; + case 0x01: + printk(KERN_WARNING "%s: Unrecognized srb command \n",dev->name) ; + break ; + case 0x04: + printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ; + break ; + default: + break ; + } /* switch srb[2] */ + break ; + + default: + printk(KERN_WARNING "%s: Unrecognized srb bh return value.\n",dev->name); + break ; + } /* switch srb[0] */ + +} + +static struct net_device_stats * olympic_get_stats(struct net_device *dev) +{ + struct olympic_private *olympic_priv ; + olympic_priv=(struct olympic_private *) dev->priv; + return (struct net_device_stats *) &olympic_priv->olympic_stats; +} + +static int olympic_set_mac_address (struct net_device *dev, void *addr) +{ + struct sockaddr *saddr = addr ; + struct olympic_private *olympic_priv = (struct olympic_private *)dev->priv ; + + if (dev->start) { + printk(KERN_WARNING "%s: Cannot set mac/laa address while card is open\n", dev->name) ; + return -EIO ; + } + + memcpy(olympic_priv->olympic_laa, saddr->sa_data,dev->addr_len) ; + + if (olympic_priv->olympic_message_level) { + printk(KERN_INFO "%s: MAC/LAA Set to = %x.%x.%x.%x.%x.%x\n",dev->name, olympic_priv->olympic_laa[0], + olympic_priv->olympic_laa[1], olympic_priv->olympic_laa[2], + olympic_priv->olympic_laa[3], olympic_priv->olympic_laa[4], + olympic_priv->olympic_laa[5]); + } + + return 0 ; +} + +static void olympic_arb_cmd(struct net_device *dev) +{ + struct olympic_private *olympic_priv = (struct olympic_private *) dev->priv; + __u8 *olympic_mmio=olympic_priv->olympic_mmio; + __u8 *arb_block, *asb_block, *srb ; + __u8 header_len ; + __u16 frame_len, buffer_len ; + struct sk_buff *mac_frame ; + __u8 *buf_ptr ; + __u8 *frame_data ; + __u16 buff_off ; + __u16 lan_status = 0, lan_status_diff ; /* Initialize to stop compiler warning */ + __u8 fdx_prot_error ; + __u16 next_ptr; + +#if OLYMPIC_NETWORK_MONITOR + struct trh_hdr *mac_hdr ; +#endif + + arb_block = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->arb) ; + asb_block = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->asb) ; + srb = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->srb) ; + writel(readl(olympic_mmio+LAPA),olympic_mmio+LAPWWO); + + if (readb(arb_block+0) == ARB_RECEIVE_DATA) { /* Receive.data, MAC frames */ + + header_len = readb(arb_block+8) ; /* 802.5 Token-Ring Header Length */ + frame_len = ntohs(readw(arb_block + 10)) ; + + buff_off = ntohs(readw(arb_block + 6)) ; + + buf_ptr = olympic_priv->olympic_lap + buff_off ; + +#if OLYMPIC_DEBUG +{ + int i; + frame_data = buf_ptr+offsetof(struct mac_receive_buffer,frame_data) ; + + for (i=0 ; i < 14 ; i++) { + printk("Loc %d = %02x\n",i,readb(frame_data + i)); + } + + printk("next %04x, fs %02x, len %04x \n",readw(buf_ptr+offsetof(struct mac_receive_buffer,next)), readb(buf_ptr+offsetof(struct mac_receive_buffer,frame_status)), readw(buf_ptr+offsetof(struct mac_receive_buffer,buffer_length))); +} +#endif + mac_frame = dev_alloc_skb(frame_len) ; + + /* Walk the buffer chain, creating the frame */ + + do { + frame_data = buf_ptr+offsetof(struct mac_receive_buffer,frame_data) ; + buffer_len = ntohs(readw(buf_ptr+offsetof(struct mac_receive_buffer,buffer_length))); + memcpy_fromio(skb_put(mac_frame, buffer_len), frame_data , buffer_len ) ; + next_ptr=readw(buf_ptr+offsetof(struct mac_receive_buffer,next)); + + } while (next_ptr && (buf_ptr=olympic_priv->olympic_lap + ntohs(next_ptr))); + +#if OLYMPIC_NETWORK_MONITOR + printk(KERN_WARNING "%s: Received MAC Frame, details: \n",dev->name) ; + mac_hdr = (struct trh_hdr *)mac_frame->data ; + printk(KERN_WARNING "%s: MAC Frame Dest. Addr: %02x:%02x:%02x:%02x:%02x:%02x \n", dev->name , mac_hdr->daddr[0], mac_hdr->daddr[1], mac_hdr->daddr[2], mac_hdr->daddr[3], mac_hdr->daddr[4], mac_hdr->daddr[5]) ; + printk(KERN_WARNING "%s: MAC Frame Srce. Addr: %02x:%02x:%02x:%02x:%02x:%02x \n", dev->name , mac_hdr->saddr[0], mac_hdr->saddr[1], mac_hdr->saddr[2], mac_hdr->saddr[3], mac_hdr->saddr[4], mac_hdr->saddr[5]) ; +#endif + mac_frame->dev = dev ; + mac_frame->protocol = tr_type_trans(mac_frame,dev); + netif_rx(mac_frame) ; + + /* Now tell the card we have dealt with the received frame */ + + /* Set LISR Bit 1 */ + writel(LISR_ARB_FREE,olympic_priv->olympic_lap + LISR_SUM); + + /* Is the ASB free ? */ + + if (!(readl(olympic_priv->olympic_mmio + SISR) & SISR_ASB_FREE)) { + olympic_priv->asb_queued = 1 ; + writel(LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM); + return ; + /* Drop out and wait for the bottom half to be run */ + } + + writeb(ASB_RECEIVE_DATA,asb_block); /* Receive data */ + writeb(OLYMPIC_CLEAR_RET_CODE,asb_block+2); /* Necessary ?? */ + writeb(readb(arb_block+6),asb_block+6); /* Must send the address back to the adapter */ + writeb(readb(arb_block+7),asb_block+7); /* To let it know we have dealt with the data */ + + writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM); + + olympic_priv->asb_queued = 2 ; + + return ; + + } else if (readb(arb_block) == ARB_LAN_CHANGE_STATUS) { /* Lan.change.status */ + lan_status = readw(arb_block+6); + fdx_prot_error = readb(arb_block+8) ; + + /* Issue ARB Free */ + writel(LISR_ARB_FREE,olympic_priv->olympic_mmio+LISR_SUM); + + lan_status_diff = olympic_priv->olympic_lan_status ^ lan_status ; + + if (lan_status_diff & (LSC_LWF | LSC_ARW | LSC_FPE | LSC_RR) ) { + if (lan_status_diff & LSC_LWF) + printk(KERN_WARNING "%s: Short circuit detected on the lobe\n",dev->name); + if (lan_status_diff & LSC_ARW) + printk(KERN_WARNING "%s: Auto removal error\n",dev->name); + if (lan_status_diff & LSC_FPE) + printk(KERN_WARNING "%s: FDX Protocol Error\n",dev->name); + if (lan_status_diff & LSC_RR) + printk(KERN_WARNING "%s: Force remove MAC frame received\n",dev->name); + + /* Adapter has been closed by the hardware */ + + /* reset tx/rx fifo's and busmaster logic */ + + writel(readl(olympic_mmio+BCTL)|(3<<13),olympic_mmio+BCTL); + udelay(1); + writel(readl(olympic_mmio+BCTL)&~(3<<13),olympic_mmio+BCTL); + dev->tbusy = 1 ; + dev->interrupt = 1 ; + dev->start = 0 ; + olympic_priv->srb = readw(olympic_priv->olympic_lap + LAPWWO) ; + free_irq(dev->irq,dev); + + printk(KERN_WARNING "%s: Adapter has been closed \n", dev->name) ; + + } /* If serious error */ + + if (olympic_priv->olympic_message_level) { + if (lan_status_diff & LSC_SIG_LOSS) + printk(KERN_WARNING "%s: No receive signal detected \n", dev->name) ; + if (lan_status_diff & LSC_HARD_ERR) + printk(KERN_INFO "%s: Beaconing \n",dev->name); + if (lan_status_diff & LSC_SOFT_ERR) + printk(KERN_WARNING "%s: Adapter transmitted Soft Error Report Mac Frame \n",dev->name); + if (lan_status_diff & LSC_TRAN_BCN) + printk(KERN_INFO "%s: We are tranmitting the beacon, aaah\n",dev->name); + if (lan_status_diff & LSC_SS) + printk(KERN_INFO "%s: Single Station on the ring \n", dev->name); + if (lan_status_diff & LSC_RING_REC) + printk(KERN_INFO "%s: Ring recovery ongoing\n",dev->name); + if (lan_status_diff & LSC_FDX_MODE) + printk(KERN_INFO "%s: Operating in FDX mode\n",dev->name); + } + + if (lan_status_diff & LSC_CO) { + + if (olympic_priv->olympic_message_level) + printk(KERN_INFO "%s: Counter Overflow \n", dev->name); + + /* Issue READ.LOG command */ + + writeb(SRB_READ_LOG, srb); + writeb(0,srb+1); + writeb(OLYMPIC_CLEAR_RET_CODE,srb+2); + writeb(0,srb+3); + writeb(0,srb+4); + writeb(0,srb+5); + + olympic_priv->srb_queued=2; /* Can't sleep, use srb_bh */ + + writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM); + + } + + if (lan_status_diff & LSC_SR_CO) { + + if (olympic_priv->olympic_message_level) + printk(KERN_INFO "%s: Source routing counters overflow\n", dev->name); + + /* Issue a READ.SR.COUNTERS */ + + writeb(SRB_READ_SR_COUNTERS,srb); + writeb(0,srb+1); + writeb(OLYMPIC_CLEAR_RET_CODE,srb+2); + writeb(0,srb+3); + + olympic_priv->srb_queued=2; /* Can't sleep, use srb_bh */ + + writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM); + + } + + olympic_priv->olympic_lan_status = lan_status ; + + } /* Lan.change.status */ + else + printk(KERN_WARNING "%s: Unknown arb command \n", dev->name); +} + +static void olympic_asb_bh(struct net_device *dev) +{ + struct olympic_private *olympic_priv = (struct olympic_private *) dev->priv ; + __u8 *arb_block, *asb_block ; + + arb_block = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->arb) ; + asb_block = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->asb) ; + + if (olympic_priv->asb_queued == 1) { /* Dropped through the first time */ + + writeb(ASB_RECEIVE_DATA,asb_block); /* Receive data */ + writeb(OLYMPIC_CLEAR_RET_CODE,asb_block+2); /* Necessary ?? */ + writeb(readb(arb_block+6),asb_block+6); /* Must send the address back to the adapter */ + writeb(readb(arb_block+7),asb_block+7); /* To let it know we have dealt with the data */ + + writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM); + olympic_priv->asb_queued = 2 ; + + return ; + } + + if (olympic_priv->asb_queued == 2) { + switch (readb(asb_block+2)) { + case 0x01: + printk(KERN_WARNING "%s: Unrecognized command code \n", dev->name); + break ; + case 0x26: + printk(KERN_WARNING "%s: Unrecognized buffer address \n", dev->name); + break ; + case 0xFF: + /* Valid response, everything should be ok again */ + break ; + default: + printk(KERN_WARNING "%s: Invalid return code in asb\n",dev->name); + break ; + } + } + olympic_priv->asb_queued = 0 ; +} + +static int olympic_change_mtu(struct net_device *dev, int mtu) +{ + struct olympic_private *olympic_priv = (struct olympic_private *) dev->priv; + __u16 max_mtu ; + + if (olympic_priv->olympic_ring_speed == 4) + max_mtu = 4500 ; + else + max_mtu = 18000 ; + + if (mtu > max_mtu) + return -EINVAL ; + if (mtu < 100) + return -EINVAL ; + + dev->mtu = mtu ; + olympic_priv->pkt_buf_sz = mtu + TR_HLEN ; + + return 0 ; +} + +#if OLYMPIC_NETWORK_MONITOR +#ifdef CONFIG_PROC_FS +static int olympic_proc_info(char *buffer, char **start, off_t offset, int length, int *eof, void *data) +{ + struct pci_dev *pci_device = NULL ; + int len=0; + off_t begin=0; + off_t pos=0; + int size; + + struct net_device *dev; + + + size = sprintf(buffer, + "IBM Pit/Pit-Phy/Olympic Chipset Token Ring Adapters\n"); + + pos+=size; + len+=size; + + + while((pci_device=pci_find_device(PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_TR_WAKE, pci_device))) { + + for (dev = dev_base; dev != NULL; dev = dev->next) + { + if (dev->base_addr == pci_device->resource[0].start ) { /* Yep, an Olympic device */ + size = sprintf_info(buffer+len, dev); + len+=size; + pos=begin+len; + + if(pos<offset) + { + len=0; + begin=pos; + } + if(pos>offset+length) + break; + } /* if */ + } /* for */ + } /* While */ + + *start=buffer+(offset-begin); /* Start of wanted data */ + len-=(offset-begin); /* Start slop */ + if(len>length) + len=length; /* Ending slop */ + return len; +} + +static int sprintf_info(char *buffer, struct net_device *dev) +{ + struct olympic_private *olympic_priv=(struct olympic_private *)dev->priv; + __u8 *oat = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->olympic_addr_table_addr) ; + __u8 *opt = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->olympic_parms_addr) ; + int size = 0 ; + + size = sprintf(buffer, "\n%6s: Adapter Address : Node Address : Functional Addr\n", + dev->name); + + size += sprintf(buffer+size, "%6s: %02x:%02x:%02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x\n", + dev->name, + dev->dev_addr[0], + dev->dev_addr[1], + dev->dev_addr[2], + dev->dev_addr[3], + dev->dev_addr[4], + dev->dev_addr[5], + readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)), + readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+1), + readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+2), + readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+3), + readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+4), + readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+5), + readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)), + readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+1), + readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+2), + readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+3)); + + size += sprintf(buffer+size, "\n%6s: Token Ring Parameters Table:\n", dev->name); + + size += sprintf(buffer+size, "%6s: Physical Addr : Up Node Address : Poll Address : AccPri : Auth Src : Att Code :\n", + dev->name) ; + + size += sprintf(buffer+size, "%6s: %02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x:%02x:%02x : %04x : %04x : %04x :\n", + dev->name, + readb(opt+offsetof(struct olympic_parameters_table, phys_addr)), + readb(opt+offsetof(struct olympic_parameters_table, phys_addr)+1), + readb(opt+offsetof(struct olympic_parameters_table, phys_addr)+2), + readb(opt+offsetof(struct olympic_parameters_table, phys_addr)+3), + readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)), + readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+1), + readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+2), + readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+3), + readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+4), + readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+5), + readb(opt+offsetof(struct olympic_parameters_table, poll_addr)), + readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+1), + readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+2), + readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+3), + readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+4), + readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+5), + ntohs(readw(opt+offsetof(struct olympic_parameters_table, acc_priority))), + ntohs(readw(opt+offsetof(struct olympic_parameters_table, auth_source_class))), + ntohs(readw(opt+offsetof(struct olympic_parameters_table, att_code)))); + + size += sprintf(buffer+size, "%6s: Source Address : Bcn T : Maj. V : Lan St : Lcl Rg : Mon Err : Frame Correl : \n", + dev->name) ; + + size += sprintf(buffer+size, "%6s: %02x:%02x:%02x:%02x:%02x:%02x : %04x : %04x : %04x : %04x : %04x : %04x : \n", + dev->name, + readb(opt+offsetof(struct olympic_parameters_table, source_addr)), + readb(opt+offsetof(struct olympic_parameters_table, source_addr)+1), + readb(opt+offsetof(struct olympic_parameters_table, source_addr)+2), + readb(opt+offsetof(struct olympic_parameters_table, source_addr)+3), + readb(opt+offsetof(struct olympic_parameters_table, source_addr)+4), + readb(opt+offsetof(struct olympic_parameters_table, source_addr)+5), + ntohs(readw(opt+offsetof(struct olympic_parameters_table, beacon_type))), + ntohs(readw(opt+offsetof(struct olympic_parameters_table, major_vector))), + ntohs(readw(opt+offsetof(struct olympic_parameters_table, lan_status))), + ntohs(readw(opt+offsetof(struct olympic_parameters_table, local_ring))), + ntohs(readw(opt+offsetof(struct olympic_parameters_table, mon_error))), + ntohs(readw(opt+offsetof(struct olympic_parameters_table, frame_correl)))); + + size += sprintf(buffer+size, "%6s: Beacon Details : Tx : Rx : NAUN Node Address : NAUN Node Phys : \n", + dev->name) ; + + size += sprintf(buffer+size, "%6s: : %02x : %02x : %02x:%02x:%02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x : \n", + dev->name, + ntohs(readw(opt+offsetof(struct olympic_parameters_table, beacon_transmit))), + ntohs(readw(opt+offsetof(struct olympic_parameters_table, beacon_receive))), + readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)), + readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)+1), + readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)+2), + readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)+3), + readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)+4), + readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)+5), + readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)), + readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)+1), + readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)+2), + readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)+3)); + + + return size; +} +#endif +#endif + +#ifdef MODULE + +static struct net_device* dev_olympic[OLYMPIC_MAX_ADAPTERS]; + +int init_module(void) +{ + int i; + +#if OLYMPIC_NETWORK_MONITOR +#ifdef CONFIG_PROC_FS + struct proc_dir_entry *ent ; + + ent = create_proc_entry("net/olympic_tr",0,0); + ent->read_proc = &olympic_proc_info ; +#endif +#endif + for (i = 0; (i<OLYMPIC_MAX_ADAPTERS); i++) { + dev_olympic[i] = NULL; + dev_olympic[i] = init_trdev(dev_olympic[i], 0); + if (dev_olympic[i] == NULL) + return -ENOMEM; + + dev_olympic[i]->init = &olympic_probe; + + if (register_trdev(dev_olympic[i]) != 0) { + kfree_s(dev_olympic[i], sizeof(struct net_device)); + dev_olympic[i] = NULL; + if (i == 0) { + printk("Olympic: No IBM PCI Token Ring cards found in system.\n"); + return -EIO; + } else { + printk("Olympic: %d IBM PCI Token Ring card(s) found in system.\n",i) ; + return 0; + } + } + } + + return 0; +} + +void cleanup_module(void) +{ + int i; + + for (i = 0; i < OLYMPIC_MAX_ADAPTERS; i++) + if (dev_olympic[i]) { + unregister_trdev(dev_olympic[i]); + release_region(dev_olympic[i]->base_addr, OLYMPIC_IO_SPACE); + kfree_s(dev_olympic[i]->priv, sizeof(struct olympic_private)); + kfree_s(dev_olympic[i], sizeof(struct net_device)); + dev_olympic[i] = NULL; + } + +#if OLYMPIC_NETWORK_MONITOR +#ifdef CONFIG_PROC_FS + remove_proc_entry("net/olympic_tr", NULL) ; +#endif +#endif +} +#endif /* MODULE */ + diff --git a/drivers/net/tokenring/olympic.h b/drivers/net/tokenring/olympic.h new file mode 100644 index 000000000..d5a06423a --- /dev/null +++ b/drivers/net/tokenring/olympic.h @@ -0,0 +1,304 @@ +/* + * olympic.h (c) 1999 Peter De Schrijver All Rights Reserved + * 1999 Mike Phillips (phillim@amtrak.com) + * + * Linux driver for IBM PCI tokenring cards based on the olympic and the PIT/PHY chipset. + * + * Base Driver Skeleton: + * Written 1993-94 by Donald Becker. + * + * Copyright 1993 United States Government as represented by the + * Director, National Security Agency. + * + * This software may be used and distributed according to the terms + * of the GNU Public License, incorporated herein by reference. + */ + +#define CID 0x4e + +#define BCTL 0x70 +#define BCTL_SOFTRESET (1<<15) +#define BCTL_MIMREB (1<<6) + +#define GPR 0x4a +#define GPR_OPTI_BF (1<<6) +#define GPR_NEPTUNE_BF (1<<4) +#define GPR_AUTOSENSE (1<<2) +#define GPR_16MBPS (1<<3) + +#define PAG 0x85 +#define LBC 0x8e + +#define LISR 0x10 +#define LISR_SUM 0x14 +#define LISR_RWM 0x18 + +#define LISR_LIE (1<<15) +#define LISR_SLIM (1<<13) +#define LISR_SLI (1<<12) +#define LISR_PCMSRMASK (1<<11) +#define LISR_PCMSRINT (1<<10) +#define LISR_WOLMASK (1<<9) +#define LISR_WOL (1<<8) +#define LISR_SRB_CMD (1<<5) +#define LISR_ASB_REPLY (1<<4) +#define LISR_ASB_FREE_REQ (1<<2) +#define LISR_ARB_FREE (1<<1) +#define LISR_TRB_FRAME (1<<0) + +#define SISR 0x20 +#define SISR_SUM 0x24 +#define SISR_RWM 0x28 +#define SISR_RR 0x2C +#define SISR_RESMASK 0x30 +#define SISR_MASK 0x54 +#define SISR_MASK_SUM 0x58 +#define SISR_MASK_RWM 0x5C + +#define SISR_TX2_IDLE (1<<31) +#define SISR_TX2_HALT (1<<29) +#define SISR_TX2_EOF (1<<28) +#define SISR_TX1_IDLE (1<<27) +#define SISR_TX1_HALT (1<<25) +#define SISR_TX1_EOF (1<<24) +#define SISR_TIMEOUT (1<<23) +#define SISR_RX_NOBUF (1<<22) +#define SISR_RX_STATUS (1<<21) +#define SISR_RX_HALT (1<<18) +#define SISR_RX_EOF_EARLY (1<<16) +#define SISR_MI (1<<15) +#define SISR_PI (1<<13) +#define SISR_ERR (1<<9) +#define SISR_ADAPTER_CHECK (1<<6) +#define SISR_SRB_REPLY (1<<5) +#define SISR_ASB_FREE (1<<4) +#define SISR_ARB_CMD (1<<3) +#define SISR_TRB_REPLY (1<<2) + +#define EISR 0x34 +#define EISR_RWM 0x38 +#define EISR_MASK 0x3c + +#define LAPA 0x60 +#define LAPWWO 0x64 +#define LAPWWC 0x68 +#define LAPCTL 0x6C +#define LAIPD 0x78 +#define LAIPDDINC 0x7C + +#define TIMER 0x50 + +#define CLKCTL 0x74 + +#define PM_CON 0x4 + +#define BMCTL_SUM 0x40 +#define BMCTL_RWM 0x44 +#define BMCTL_TX2_DIS (1<<30) +#define BMCTL_TX1_DIS (1<<26) +#define BMCTL_RX_DIS (1<<22) + +#define BMASR 0xcc + +#define RXDESCQ 0x90 +#define RXDESCQCNT 0x94 +#define RXCDA 0x98 +#define RXENQ 0x9C +#define RXSTATQ 0xA0 +#define RXSTATQCNT 0xA4 +#define RXCSA 0xA8 +#define RXCLEN 0xAC +#define RXHLEN 0xAE + +#define TXDESCQ_1 0xb0 +#define TXDESCQ_2 0xd0 +#define TXDESCQCNT_1 0xb4 +#define TXDESCQCNT_2 0xd4 +#define TXCDA_1 0xb8 +#define TXCDA_2 0xd8 +#define TXENQ_1 0xbc +#define TXENQ_2 0xdc +#define TXSTATQ_1 0xc0 +#define TXSTATQ_2 0xe0 +#define TXSTATQCNT_1 0xc4 +#define TXSTATQCNT_2 0xe4 +#define TXCSA_1 0xc8 +#define TXCSA_2 0xe8 + +#define OLYMPIC_IO_SPACE 256 + +#define SRB_COMMAND_SIZE 50 + +#define OLYMPIC_MAX_ADAPTERS 8 /* 0x08 __MODULE_STRING can't hand 0xnn */ + +/* Defines for LAN STATUS CHANGE reports */ +#define LSC_SIG_LOSS 0x8000 +#define LSC_HARD_ERR 0x4000 +#define LSC_SOFT_ERR 0x2000 +#define LSC_TRAN_BCN 0x1000 +#define LSC_LWF 0x0800 +#define LSC_ARW 0x0400 +#define LSC_FPE 0x0200 +#define LSC_RR 0x0100 +#define LSC_CO 0x0080 +#define LSC_SS 0x0040 +#define LSC_RING_REC 0x0020 +#define LSC_SR_CO 0x0010 +#define LSC_FDX_MODE 0x0004 + +/* Defines for OPEN ADAPTER command */ + +#define OPEN_ADAPTER_EXT_WRAP (1<<15) +#define OPEN_ADAPTER_DIS_HARDEE (1<<14) +#define OPEN_ADAPTER_DIS_SOFTERR (1<<13) +#define OPEN_ADAPTER_PASS_ADC_MAC (1<<12) +#define OPEN_ADAPTER_PASS_ATT_MAC (1<<11) +#define OPEN_ADAPTER_ENABLE_EC (1<<10) +#define OPEN_ADAPTER_CONTENDER (1<<8) +#define OPEN_ADAPTER_PASS_BEACON (1<<7) +#define OPEN_ADAPTER_ENABLE_FDX (1<<6) +#define OPEN_ADAPTER_ENABLE_RPL (1<<5) +#define OPEN_ADAPTER_INHIBIT_ETR (1<<4) +#define OPEN_ADAPTER_INTERNAL_WRAP (1<<3) +#define OPEN_ADAPTER_USE_OPTS2 (1<<0) + +#define OPEN_ADAPTER_2_ENABLE_ONNOW (1<<15) + +/* Defines for SRB Commands */ + +#define SRB_ACCESS_REGISTER 0x1f +#define SRB_CLOSE_ADAPTER 0x04 +#define SRB_CONFIGURE_BRIDGE 0x0c +#define SRB_CONFIGURE_WAKEUP_EVENT 0x1a +#define SRB_MODIFY_BRIDGE_PARMS 0x15 +#define SRB_MODIFY_OPEN_OPTIONS 0x01 +#define SRB_MODIFY_RECEIVE_OPTIONS 0x17 +#define SRB_NO_OPERATION 0x00 +#define SRB_OPEN_ADAPTER 0x03 +#define SRB_READ_LOG 0x08 +#define SRB_READ_SR_COUNTERS 0x16 +#define SRB_RESET_GROUP_ADDRESS 0x02 +#define SRB_SAVE_CONFIGURATION 0x1b +#define SRB_SET_BRIDGE_PARMS 0x09 +#define SRB_SET_BRIDGE_TARGETS 0x10 +#define SRB_SET_FUNC_ADDRESS 0x07 +#define SRB_SET_GROUP_ADDRESS 0x06 +#define SRB_SET_GROUP_ADDR_OPTIONS 0x11 +#define SRB_UPDATE_WAKEUP_PATTERN 0x19 + +/* Clear return code */ + +#define OLYMPIC_CLEAR_RET_CODE 0xfe + +/* ARB Commands */ +#define ARB_RECEIVE_DATA 0x81 +#define ARB_LAN_CHANGE_STATUS 0x84 +/* ASB Response commands */ + +#define ASB_RECEIVE_DATA 0x81 + + +/* Olympic defaults for buffers */ + +#define OLYMPIC_RX_RING_SIZE 16 /* should be a power of 2 */ +#define OLYMPIC_TX_RING_SIZE 8 /* should be a power of 2 */ + +#define PKT_BUF_SZ 4096 /* Default packet size */ + +/* Olympic data structures */ + +struct olympic_tx_desc { + __u32 buffer; + __u32 status_length; +}; + +struct olympic_tx_status { + __u32 status; +}; + +struct olympic_rx_desc { + __u32 buffer; + __u32 res_length ; +}; + +struct olympic_rx_status { + __u32 fragmentcnt_framelen; + __u32 status_buffercnt; +}; + +struct mac_receive_buffer { + __u16 next ; + __u8 padding ; + __u8 frame_status ; + __u16 buffer_length ; + __u8 frame_data ; +}; + +struct olympic_private { + + __u16 srb; + __u16 trb; + __u16 arb; + __u16 asb; + + __u8 *olympic_mmio; + __u8 *olympic_lap; + char *olympic_card_name ; + + volatile int srb_queued; /* True if an SRB is still posted */ + wait_queue_head_t srb_wait; + + volatile int asb_queued; /* True if an ASB is posted */ + + volatile int trb_queued; /* True if a TRB is posted */ + wait_queue_head_t trb_wait ; + + struct olympic_rx_desc olympic_rx_ring[OLYMPIC_RX_RING_SIZE]; + struct olympic_tx_desc olympic_tx_ring[OLYMPIC_TX_RING_SIZE]; + struct olympic_rx_status olympic_rx_status_ring[OLYMPIC_RX_RING_SIZE]; + struct olympic_tx_status olympic_tx_status_ring[OLYMPIC_TX_RING_SIZE]; + struct sk_buff *tx_ring_skb[OLYMPIC_TX_RING_SIZE], *rx_ring_skb[OLYMPIC_RX_RING_SIZE]; + int tx_ring_free, tx_ring_last_status, rx_ring_last_received,rx_status_last_received, free_tx_ring_entries; + + struct net_device_stats olympic_stats ; + __u16 olympic_lan_status ; + __u8 olympic_ring_speed ; + __u16 pkt_buf_sz ; + __u8 olympic_receive_options, olympic_copy_all_options, olympic_message_level; + __u8 olympic_multicast_set ; + __u16 olympic_addr_table_addr, olympic_parms_addr ; + __u8 olympic_laa[6] ; +}; + +struct olympic_adapter_addr_table { + + __u8 node_addr[6] ; + __u8 reserved[4] ; + __u8 func_addr[4] ; +} ; + +struct olympic_parameters_table { + + __u8 phys_addr[4] ; + __u8 up_node_addr[6] ; + __u8 up_phys_addr[6] ; + __u8 poll_addr[6] ; + __u16 reserved ; + __u16 acc_priority ; + __u16 auth_source_class ; + __u16 att_code ; + __u8 source_addr[6] ; + __u16 beacon_type ; + __u16 major_vector ; + __u16 lan_status ; + __u16 soft_error_time ; + __u16 reserved1 ; + __u16 local_ring ; + __u16 mon_error ; + __u16 beacon_transmit ; + __u16 beacon_receive ; + __u16 frame_correl ; + __u8 beacon_naun[6] ; + __u32 reserved2 ; + __u8 beacon_phys[4] ; +}; diff --git a/drivers/net/tokenring/sktr.c b/drivers/net/tokenring/sktr.c new file mode 100644 index 000000000..81b2df4bc --- /dev/null +++ b/drivers/net/tokenring/sktr.c @@ -0,0 +1,2707 @@ +/* + * sktr.c: A network driver for the SysKonnect Token Ring ISA/PCI Adapters. + * + * Written 1997 by Christoph Goos + * + * A fine result of the Linux Systems Network Architecture Project. + * http://samba.anu.edu.au/linux-sna/ + * + * This software may be used and distributed according to the terms + * of the GNU Public License, incorporated herein by reference. + * + * This device driver works with the following SysKonnect adapters: + * - SysKonnect TR4/16(+) ISA (SK-4190) + * - SysKonnect TR4/16(+) PCI (SK-4590) + * - SysKonnect TR4/16 PCI (SK-4591) + * + * Sources: + * - The hardware related parts of this driver are take from + * the SysKonnect Token Ring driver for Windows NT. + * - I used the IBM Token Ring driver 'ibmtr.c' as a base for this + * driver, as well as the 'skeleton.c' driver by Donald Becker. + * - Also various other drivers in the linux source tree were taken + * as samples for some tasks. + * + * Maintainer(s): + * JS Jay Schulist jschlst@samba.anu.edu.au + * CG Christoph Goos cgoos@syskonnect.de + * AF Adam Fritzler mid@auk.cx + * + * Modification History: + * 29-Aug-97 CG Created + * 04-Apr-98 CG Fixed problems caused by tok_timer_check + * 10-Apr-98 CG Fixed lockups at cable disconnection + * 27-May-98 JS Formated to Linux Kernel Format + * 31-May-98 JS Hacked in PCI support + * 16-Jun-98 JS Modulized for multiple cards with one driver + * 21-Sep-99 CG Fixed source routing issues for 2.2 kernels + * 21-Sep-99 AF Added multicast changes recommended by + * Jochen Friedrich <jochen@nwe.de> (untested) + * Added detection of compatible Compaq PCI card + * + * To do: + * 1. Selectable 16 Mbps or 4Mbps + * 2. Multi/Broadcast packet handling (might be done) + * + */ + +static const char *version = "sktr.c: v1.01 08/29/97 by Christoph Goos\n"; + +#ifdef MODULE +#include <linux/module.h> +#include <linux/version.h> +#endif + +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/types.h> +#include <linux/fcntl.h> +#include <linux/interrupt.h> +#include <linux/ptrace.h> +#include <linux/ioport.h> +#include <linux/in.h> +#include <linux/malloc.h> +#include <linux/string.h> +#include <linux/time.h> +#include <asm/system.h> +#include <asm/bitops.h> +#include <asm/io.h> +#include <asm/dma.h> +#include <asm/irq.h> +#include <linux/errno.h> +#include <linux/init.h> +#include <linux/pci.h> + +#include <linux/netdevice.h> +#include <linux/etherdevice.h> +#include <linux/skbuff.h> +#include <linux/trdevice.h> + +#include "sktr.h" /* Our Stuff */ +#include "sktr_firmware.h" /* SysKonnect adapter firmware */ + +/* A zero-terminated list of I/O addresses to be probed. */ +static unsigned int sktr_portlist[] __initdata = { + 0x0A20, 0x1A20, 0x0B20, 0x1B20, 0x0980, 0x1980, 0x0900, 0x1900, + 0 +}; + +/* A zero-terminated list of IRQs to be probed. + * Used again after initial probe for sktr_chipset_init, called from sktr_open. + */ +static unsigned short sktr_irqlist[] = { + 3, 5, 9, 10, 11, 12, 15, + 0 +}; + +/* A zero-terminated list of DMAs to be probed. */ +static int sktr_dmalist[] __initdata = { + 5, 6, 7, + 0 +}; + +/* Card names */ +static char *pci_cardname = "SK NET TR 4/16 PCI\0"; +static char *isa_cardname = "SK NET TR 4/16 ISA\0"; +static char *AdapterName; + +/* Use 0 for production, 1 for verification, 2 for debug, and + * 3 for very verbose debug. + */ +#ifndef SKTR_DEBUG +#define SKTR_DEBUG 1 +#endif +static unsigned int sktr_debug = SKTR_DEBUG; + +/* The number of low I/O ports used by the tokencard. */ +#define SKTR_IO_EXTENT 32 + +/* Index to functions, as function prototypes. + * Alphabetical by function name. + */ + +/* "B" */ +static int sktr_bringup_diags(struct net_device *dev); +/* "C" */ +static void sktr_cancel_tx_queue(struct net_local* tp); +static int sktr_chipset_init(struct net_device *dev); +static void sktr_chk_irq(struct net_device *dev); +static unsigned char sktr_chk_frame(struct net_device *dev, unsigned char *Addr); +static void sktr_chk_outstanding_cmds(struct net_device *dev); +static void sktr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr); +static unsigned char sktr_chk_ssb(struct net_local *tp, unsigned short IrqType); +static int sktr_close(struct net_device *dev); +static void sktr_cmd_status_irq(struct net_device *dev); +/* "D" */ +static void sktr_disable_interrupts(struct net_device *dev); +static void sktr_dump(unsigned char *Data, int length); +/* "E" */ +static void sktr_enable_interrupts(struct net_device *dev); +static void sktr_exec_cmd(struct net_device *dev, unsigned short Command); +static void sktr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue); +/* "F" */ +/* "G" */ +static struct enet_statistics *sktr_get_stats(struct net_device *dev); +/* "H" */ +static void sktr_hardware_send_packet(struct net_device *dev, + struct net_local* tp); +/* "I" */ +static int sktr_init_adapter(struct net_device *dev); +static int sktr_init_card(struct net_device *dev); +static void sktr_init_ipb(struct net_local *tp); +static void sktr_init_net_local(struct net_device *dev); +static void sktr_init_opb(struct net_local *tp); +static void sktr_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static int sktr_isa_chk_card(struct net_device *dev, int ioaddr); +static int sktr_isa_chk_ioaddr(int ioaddr); +/* "O" */ +static int sktr_open(struct net_device *dev); +static void sktr_open_adapter(struct net_device *dev); +/* "P" */ +static int sktr_pci_chk_card(struct net_device *dev); +int sktr_probe(struct net_device *dev); +static int sktr_probe1(struct net_device *dev, int ioaddr); +/* "R" */ +static void sktr_rcv_status_irq(struct net_device *dev); +static void sktr_read_addr(struct net_device *dev, unsigned char *Address); +static void sktr_read_ptr(struct net_device *dev); +static void sktr_read_ram(struct net_device *dev, unsigned char *Data, + unsigned short Address, int Length); +static int sktr_reset_adapter(struct net_device *dev); +static void sktr_reset_interrupt(struct net_device *dev); +static void sktr_ring_status_irq(struct net_device *dev); +/* "S" */ +static int sktr_send_packet(struct sk_buff *skb, struct net_device *dev); +static void sktr_set_multicast_list(struct net_device *dev); +/* "T" */ +static void sktr_timer_chk(unsigned long data); +static void sktr_timer_end_wait(unsigned long data); +static void sktr_tx_status_irq(struct net_device *dev); +/* "U" */ +static void sktr_update_rcv_stats(struct net_local *tp, + unsigned char DataPtr[], unsigned int Length); +/* "W" */ +static void sktr_wait(unsigned long time); +static void sktr_write_rpl_status(RPL *rpl, unsigned int Status); +static void sktr_write_tpl_status(TPL *tpl, unsigned int Status); + +/* + * Check for a network adapter of this type, and return '0' if one exists. + * If dev->base_addr == 0, probe all likely locations. + * If dev->base_addr == 1, always return failure. + */ +int __init sktr_probe(struct net_device *dev) +{ + int i; + int base_addr = dev ? dev->base_addr : 0; + + if(base_addr > 0x1ff) /* Check a single specified location. */ + return (sktr_probe1(dev, base_addr)); + else if(base_addr != 0) /* Don't probe at all. */ + return (-ENXIO); + + for(i = 0; sktr_portlist[i]; i++) + { + int ioaddr = sktr_portlist[i]; + if(check_region(ioaddr, SKTR_IO_EXTENT)) + continue; + if(sktr_probe1(dev, ioaddr)) + { +#ifndef MODULE + tr_freedev(dev); +#endif + } + else + return (0); + } + + return (-ENODEV); +} + +/* + * Detect and setup the PCI SysKonnect TR cards in slot order. + */ +static int __init sktr_pci_chk_card(struct net_device *dev) +{ + static int pci_index = 0; + unsigned char pci_bus, pci_device_fn; + + if(!pci_present()) + return (-1); /* No PCI present. */ + + for(; pci_index < 0xff; pci_index++) + { + unsigned int pci_irq_line; + struct pci_dev *pdev; + unsigned short pci_command, new_command, vendor, device; + unsigned int pci_ioaddr; + + if(pcibios_find_class(PCI_CLASS_NETWORK_TOKEN_RING << 8, + pci_index, &pci_bus, &pci_device_fn) + != PCIBIOS_SUCCESSFUL) + { + break; + } + + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_VENDOR_ID, &vendor); + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_DEVICE_ID, &device); + + pdev = pci_find_slot(pci_bus, pci_device_fn); + pci_irq_line = pdev->irq; + pci_ioaddr = pdev->resource[0].start; + + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_COMMAND, &pci_command); + + /* Remove I/O space marker in bit 0. */ + pci_ioaddr &= ~3; + + if((vendor != PCI_VENDOR_ID_SK) && + (vendor != PCI_VENDOR_ID_COMPAQ)) + continue; + + if((vendor == PCI_VENDOR_ID_SK) && + (device != PCI_DEVICE_ID_SK_TR)) + continue; + else if((vendor == PCI_VENDOR_ID_COMPAQ) && + (device != PCI_DEVICE_ID_COMPAQ_TOKENRING)) + continue; + + if(check_region(pci_ioaddr, SKTR_IO_EXTENT)) + continue; + request_region(pci_ioaddr, SKTR_IO_EXTENT, pci_cardname); + if(request_irq(pdev->irq, sktr_interrupt, SA_SHIRQ, + pci_cardname, dev)) + return (-ENODEV); /* continue; ?? */ + + AdapterName = pci_cardname; + + new_command = (pci_command|PCI_COMMAND_MASTER|PCI_COMMAND_IO); + + if(pci_command != new_command) + { + printk("The PCI BIOS has not enabled this" + "device! Updating PCI command %4.4x->%4.4x.\n", + pci_command, new_command); + pcibios_write_config_word(pci_bus, pci_device_fn, + PCI_COMMAND, new_command); + } + + /* At this point we have found a valid PCI TR card. */ + dev->base_addr = pci_ioaddr; + dev->irq = pci_irq_line; + dev->dma = 0; + + printk("%s: %s found at %#4x, using IRQ %d.\n", + dev->name, AdapterName, pci_ioaddr, dev->irq); + + return (0); + } + + return (-1); +} + +/* + * Detect and setup the ISA SysKonnect TR cards. + */ +static int __init sktr_isa_chk_card(struct net_device *dev, int ioaddr) +{ + int i, err; + unsigned long flags; + + err = sktr_isa_chk_ioaddr(ioaddr); + if(err < 0) + return (-ENODEV); + + if(virt_to_bus((void*)((unsigned long)dev->priv+sizeof(struct net_local))) + > ISA_MAX_ADDRESS) + { + printk("%s: Memory not accessible for DMA\n", dev->name); + kfree(dev->priv); + return (-EAGAIN); + } + + AdapterName = isa_cardname; + + /* Grab the region so that no one else tries to probe our ioports. */ + request_region(ioaddr, SKTR_IO_EXTENT, AdapterName); + dev->base_addr = ioaddr; + + /* Autoselect IRQ and DMA if dev->irq == 0 */ + if(dev->irq == 0) + { + for(i = 0; sktr_irqlist[i] != 0; i++) + { + dev->irq = sktr_irqlist[i]; + err = request_irq(dev->irq, &sktr_interrupt, 0, AdapterName, dev); + if(!err) + break; + } + + if(sktr_irqlist[i] == 0) + { + printk("%s: AutoSelect no IRQ available\n", dev->name); + return (-EAGAIN); + } + } + else + { + err = request_irq(dev->irq, &sktr_interrupt, 0, AdapterName, dev); + if(err) + { + printk("%s: Selected IRQ not available\n", dev->name); + return (-EAGAIN); + } + } + + /* Always allocate the DMA channel after IRQ and clean up on failure */ + if(dev->dma == 0) + { + for(i = 0; sktr_dmalist[i] != 0; i++) + { + dev->dma = sktr_dmalist[i]; + err = request_dma(dev->dma, AdapterName); + if(!err) + break; + } + + if(dev->dma == 0) + { + printk("%s: AutoSelect no DMA available\n", dev->name); + free_irq(dev->irq, NULL); + return (-EAGAIN); + } + } + else + { + err = request_dma(dev->dma, AdapterName); + if(err) + { + printk("%s: Selected DMA not available\n", dev->name); + free_irq(dev->irq, NULL); + return (-EAGAIN); + } + } + + flags=claim_dma_lock(); + disable_dma(dev->dma); + set_dma_mode(dev->dma, DMA_MODE_CASCADE); + enable_dma(dev->dma); + release_dma_lock(flags); + + printk("%s: %s found at %#4x, using IRQ %d and DMA %d.\n", + dev->name, AdapterName, ioaddr, dev->irq, dev->dma); + + return (0); +} + +static int __init sktr_probe1(struct net_device *dev, int ioaddr) +{ + static unsigned version_printed = 0; + struct net_local *tp; + int DeviceType = SK_PCI; + int err; + + if(sktr_debug && version_printed++ == 0) + printk("%s", version); + +#ifndef MODULE + dev = init_trdev(dev, 0); + if(dev == NULL) + return (-ENOMEM); +#endif + + err = sktr_pci_chk_card(dev); + if(err < 0) + { + err = sktr_isa_chk_card(dev, ioaddr); + if(err < 0) + return (-ENODEV); + DeviceType = SK_ISA; + } + + /* Setup this devices private information structure */ + tp = (struct net_local *)kmalloc(sizeof(struct net_local), GFP_KERNEL | GFP_DMA); + if(tp == NULL) + return (-ENOMEM); + memset(tp, 0, sizeof(struct net_local)); + tp->DeviceType = DeviceType; + init_waitqueue_head(&tp->wait_for_tok_int); + + dev->priv = tp; + dev->init = sktr_init_card; + dev->open = sktr_open; + dev->stop = sktr_close; + dev->hard_start_xmit = sktr_send_packet; + dev->get_stats = sktr_get_stats; + dev->set_multicast_list = &sktr_set_multicast_list; + + return (0); +} + +/* Dummy function */ +static int __init sktr_init_card(struct net_device *dev) +{ + if(sktr_debug > 3) + printk("%s: sktr_init_card\n", dev->name); + + return (0); +} + +/* + * This function tests if an adapter is really installed at the + * given I/O address. Return negative if no adapter at IO addr. + */ +static int __init sktr_isa_chk_ioaddr(int ioaddr) +{ + unsigned char old, chk1, chk2; + + old = inb(ioaddr + SIFADR); /* Get the old SIFADR value */ + + chk1 = 0; /* Begin with check value 0 */ + do { + /* Write new SIFADR value */ + outb(chk1, ioaddr + SIFADR); + + /* Read, invert and write */ + chk2 = inb(ioaddr + SIFADD); + chk2 ^= 0x0FE; + outb(chk2, ioaddr + SIFADR); + + /* Read, invert and compare */ + chk2 = inb(ioaddr + SIFADD); + chk2 ^= 0x0FE; + + if(chk1 != chk2) + return (-1); /* No adapter */ + + chk1 -= 2; + } while(chk1 != 0); /* Repeat 128 times (all byte values) */ + + /* Restore the SIFADR value */ + outb(old, ioaddr + SIFADR); + + return (0); +} + +/* + * Open/initialize the board. This is called sometime after + * booting when the 'ifconfig' program is run. + * + * This routine should set everything up anew at each open, even + * registers that "should" only need to be set once at boot, so that + * there is non-reboot way to recover if something goes wrong. + */ +static int sktr_open(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + int err; + + /* Reset the hardware here. Don't forget to set the station address. */ + err = sktr_chipset_init(dev); + if(err) + { + printk(KERN_INFO "%s: Chipset initialization error\n", + dev->name); + return (-1); + } + + dev->addr_len = 6; + sktr_read_addr(dev, (unsigned char*)dev->dev_addr); + + init_timer(&tp->timer); + tp->timer.expires = jiffies + 30*HZ; + tp->timer.function = sktr_timer_end_wait; + tp->timer.data = (unsigned long)dev; + tp->timer.next = NULL; + tp->timer.prev = NULL; + add_timer(&tp->timer); + + sktr_read_ptr(dev); + sktr_enable_interrupts(dev); + sktr_open_adapter(dev); + + dev->tbusy = 0; + dev->interrupt = 0; + dev->start = 0; + + /* Wait for interrupt from hardware. If interrupt does not come, + * there will be a timeout from the timer. + */ + tp->Sleeping = 1; + interruptible_sleep_on(&tp->wait_for_tok_int); + del_timer(&tp->timer); + + /* If AdapterVirtOpenFlag is 1, the adapter is now open for use */ + if(tp->AdapterVirtOpenFlag == 0) + { + sktr_disable_interrupts(dev); + return (-1); + } + + dev->start = 1; + + tp->StartTime = jiffies; + + /* Start function control timer */ + tp->timer.expires = jiffies + 2*HZ; + tp->timer.function = sktr_timer_chk; + tp->timer.data = (unsigned long)dev; + add_timer(&tp->timer); + +#ifdef MODULE + MOD_INC_USE_COUNT; +#endif + + return (0); +} + +/* + * Timeout function while waiting for event + */ +static void sktr_timer_end_wait(unsigned long data) +{ + struct net_device *dev = (struct net_device*)data; + struct net_local *tp = (struct net_local *)dev->priv; + + if(tp->Sleeping) + { + tp->Sleeping = 0; + wake_up_interruptible(&tp->wait_for_tok_int); + } + + return; +} + +/* + * Initialize the chipset + */ +static int sktr_chipset_init(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned char PosReg, Tmp; + int i, err; + + sktr_init_ipb(tp); + sktr_init_opb(tp); + sktr_init_net_local(dev); + + /* Set pos register: selects irq and dma channel. + * Only for ISA bus adapters. + */ + if(dev->dma > 0) + { + PosReg = 0; + for(i = 0; sktr_irqlist[i] != 0; i++) + { + if(sktr_irqlist[i] == dev->irq) + break; + } + + /* Choose default cycle time, 500 nsec */ + PosReg |= CYCLE_TIME << 2; + PosReg |= i << 4; + i = dev->dma - 5; + PosReg |= i; + + if(tp->DataRate == SPEED_4) + PosReg |= LINE_SPEED_BIT; + else + PosReg &= ~LINE_SPEED_BIT; + + outb(PosReg, dev->base_addr + POSREG); + Tmp = inb(dev->base_addr + POSREG); + if((Tmp & ~CYCLE_TIME) != (PosReg & ~CYCLE_TIME)) + printk(KERN_INFO "%s: POSREG error\n", dev->name); + } + + err = sktr_reset_adapter(dev); + if(err < 0) + return (-1); + + err = sktr_bringup_diags(dev); + if(err < 0) + return (-1); + + err = sktr_init_adapter(dev); + if(err < 0) + return (-1); + + return (0); +} + +/* + * Initializes the net_local structure. + */ +static void sktr_init_net_local(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + int i; + + tp->scb.CMD = 0; + tp->scb.Parm[0] = 0; + tp->scb.Parm[1] = 0; + + tp->ssb.STS = 0; + tp->ssb.Parm[0] = 0; + tp->ssb.Parm[1] = 0; + tp->ssb.Parm[2] = 0; + + tp->CMDqueue = 0; + + tp->AdapterOpenFlag = 0; + tp->AdapterVirtOpenFlag = 0; + tp->ScbInUse = 0; + tp->OpenCommandIssued = 0; + tp->ReOpenInProgress = 0; + tp->HaltInProgress = 0; + tp->TransmitHaltScheduled = 0; + tp->LobeWireFaultLogged = 0; + tp->LastOpenStatus = 0; + tp->MaxPacketSize = DEFAULT_PACKET_SIZE; + + skb_queue_head_init(&tp->SendSkbQueue); + tp->QueueSkb = MAX_TX_QUEUE; + + /* Create circular chain of transmit lists */ + for (i = 0; i < TPL_NUM; i++) + { + tp->Tpl[i].NextTPLAddr = htonl((unsigned long) virt_to_bus(&tp->Tpl[(i+1) % TPL_NUM])); + tp->Tpl[i].Status = 0; + tp->Tpl[i].FrameSize = 0; + tp->Tpl[i].FragList[0].DataCount = 0; + tp->Tpl[i].FragList[0].DataAddr = 0; + tp->Tpl[i].NextTPLPtr = &tp->Tpl[(i+1) % TPL_NUM]; + tp->Tpl[i].MData = NULL; + tp->Tpl[i].TPLIndex = i; + tp->Tpl[i].BusyFlag = 0; + } + + tp->TplFree = tp->TplBusy = &tp->Tpl[0]; + + /* Create circular chain of receive lists */ + for (i = 0; i < RPL_NUM; i++) + { + tp->Rpl[i].NextRPLAddr = htonl((unsigned long) virt_to_bus(&tp->Rpl[(i+1) % RPL_NUM])); + tp->Rpl[i].Status = (RX_VALID | RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ); + tp->Rpl[i].FrameSize = 0; + tp->Rpl[i].FragList[0].DataCount = SWAPB(tp->MaxPacketSize); + + /* Alloc skb and point adapter to data area */ + tp->Rpl[i].Skb = dev_alloc_skb(tp->MaxPacketSize); + + /* skb == NULL ? then use local buffer */ + if(tp->Rpl[i].Skb == NULL) + { + tp->Rpl[i].SkbStat = SKB_UNAVAILABLE; + tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i])); + tp->Rpl[i].MData = tp->LocalRxBuffers[i]; + } + else /* SKB != NULL */ + { + tp->Rpl[i].Skb->dev = dev; + skb_put(tp->Rpl[i].Skb, tp->MaxPacketSize); + + /* data unreachable for DMA ? then use local buffer */ + if(tp->DeviceType == SK_ISA && + virt_to_bus(tp->Rpl[i].Skb->data) + + tp->MaxPacketSize > ISA_MAX_ADDRESS) + { + tp->Rpl[i].SkbStat = SKB_DATA_COPY; + tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i])); + tp->Rpl[i].MData = tp->LocalRxBuffers[i]; + } + else /* DMA directly in skb->data */ + { + tp->Rpl[i].SkbStat = SKB_DMA_DIRECT; + tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->Rpl[i].Skb->data)); + tp->Rpl[i].MData = tp->Rpl[i].Skb->data; + } + } + + tp->Rpl[i].NextRPLPtr = &tp->Rpl[(i+1) % RPL_NUM]; + tp->Rpl[i].RPLIndex = i; + } + + tp->RplHead = &tp->Rpl[0]; + tp->RplTail = &tp->Rpl[RPL_NUM-1]; + tp->RplTail->Status = (RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ); + + return; +} + +/* + * Initializes the initialisation parameter block. + */ +static void sktr_init_ipb(struct net_local *tp) +{ + tp->ipb.Init_Options = BURST_MODE; + tp->ipb.CMD_Status_IV = 0; + tp->ipb.TX_IV = 0; + tp->ipb.RX_IV = 0; + tp->ipb.Ring_Status_IV = 0; + tp->ipb.SCB_Clear_IV = 0; + tp->ipb.Adapter_CHK_IV = 0; + tp->ipb.RX_Burst_Size = BURST_SIZE; + tp->ipb.TX_Burst_Size = BURST_SIZE; + tp->ipb.DMA_Abort_Thrhld = DMA_RETRIES; + tp->ipb.SCB_Addr = 0; + tp->ipb.SSB_Addr = 0; + + return; +} + +/* + * Initializes the open parameter block. + */ +static void sktr_init_opb(struct net_local *tp) +{ + unsigned long Addr; + unsigned short RplSize = RPL_SIZE; + unsigned short TplSize = TPL_SIZE; + unsigned short BufferSize = BUFFER_SIZE; + + tp->ocpl.OPENOptions = 0; + tp->ocpl.OPENOptions |= ENABLE_FULL_DUPLEX_SELECTION; +/* tp->ocpl.OPENOptions |= PAD_ROUTING_FIELD; no more needed */ + tp->ocpl.FullDuplex = 0; + tp->ocpl.FullDuplex |= OPEN_FULL_DUPLEX_OFF; + + /* Fixme: If mac address setable: + * for (i=0; i<LENGTH_OF_ADDRESS; i++) + * mac->Vam->ocpl.NodeAddr[i] = mac->CurrentAddress[i]; + */ + + tp->ocpl.GroupAddr = 0; + tp->ocpl.FunctAddr = 0; + tp->ocpl.RxListSize = SWAPB(RplSize); + tp->ocpl.TxListSize = SWAPB(TplSize); + tp->ocpl.BufSize = SWAPB(BufferSize); + tp->ocpl.Reserved = 0; + tp->ocpl.TXBufMin = TX_BUF_MIN; + tp->ocpl.TXBufMax = TX_BUF_MAX; + + Addr = htonl(virt_to_bus(tp->ProductID)); + + tp->ocpl.ProdIDAddr[0] = LOWORD(Addr); + tp->ocpl.ProdIDAddr[1] = HIWORD(Addr); + + return; +} + +/* + * Send OPEN command to adapter + */ +static void sktr_open_adapter(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + if(tp->OpenCommandIssued) + return; + + tp->OpenCommandIssued = 1; + sktr_exec_cmd(dev, OC_OPEN); + + return; +} + +/* + * Clear the adapter's interrupt flag. Clear system interrupt enable + * (SINTEN): disable adapter to system interrupts. + */ +static void sktr_disable_interrupts(struct net_device *dev) +{ + outb(0, dev->base_addr + SIFACL); + + return; +} + +/* + * Set the adapter's interrupt flag. Set system interrupt enable + * (SINTEN): enable adapter to system interrupts. + */ +static void sktr_enable_interrupts(struct net_device *dev) +{ + outb(ACL_SINTEN, dev->base_addr + SIFACL); + + return; +} + +/* + * Put command in command queue, try to execute it. + */ +static void sktr_exec_cmd(struct net_device *dev, unsigned short Command) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + tp->CMDqueue |= Command; + sktr_chk_outstanding_cmds(dev); + + return; +} + +/* + * Gets skb from system, queues it and checks if it can be sent + */ +static int sktr_send_packet(struct sk_buff *skb, struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + if(dev->tbusy) + { + /* + * If we get here, some higher level has decided we are broken. + * There should really be a "kick me" function call instead. + * + * Resetting the token ring adapter takes a long time so just + * fake transmission time and go on trying. Our own timeout + * routine is in sktr_timer_chk() + */ + dev->tbusy = 0; + dev->trans_start = jiffies; + return (1); + } + + /* + * If some higher layer thinks we've missed an tx-done interrupt we + * are passed NULL. + */ + if(skb == NULL) + return (0); + + /* + * Block a timer-based transmit from overlapping. This could better be + * done with atomic_swap(1, dev->tbusy), but set_bit() works as well. + */ + if(test_and_set_bit(0, (void*)&dev->tbusy) != 0) + { + printk("%s: Transmitter access conflict.\n", dev->name); + return (1); + } + + if(tp->QueueSkb == 0) + return (1); /* Return with tbusy set: queue full */ + + tp->QueueSkb--; + skb_queue_tail(&tp->SendSkbQueue, skb); + sktr_hardware_send_packet(dev, tp); + if(tp->QueueSkb > 0) + dev->tbusy = 0; + + return (0); +} + +/* + * Move frames from internal skb queue into adapter tx queue + */ +static void sktr_hardware_send_packet(struct net_device *dev, struct net_local* tp) +{ + TPL *tpl; + short length; + unsigned char *buf, *newbuf; + struct sk_buff *skb; + int i; + + for(;;) + { + /* Try to get a free TPL from the chain. + * + * NOTE: We *must* always leave one unused TPL in the chain, + * because otherwise the adapter might send frames twice. + */ + if(tp->TplFree->NextTPLPtr->BusyFlag) /* No free TPL */ + { + printk(KERN_INFO "%s: No free TPL\n", dev->name); + return; + } + + /* Send first buffer from queue */ + skb = skb_dequeue(&tp->SendSkbQueue); + if(skb == NULL) + return; + + tp->QueueSkb++; + /* Is buffer reachable for Busmaster-DMA? */ + if(tp->DeviceType == SK_ISA && + virt_to_bus((void*)(((long) skb->data) + skb->len)) + > ISA_MAX_ADDRESS) + { + /* Copy frame to local buffer */ + i = tp->TplFree->TPLIndex; + length = skb->len; + buf = tp->LocalTxBuffers[i]; + memcpy(buf, skb->data, length); + newbuf = buf; + } + else + { + /* Send direct from skb->data */ + length = skb->len; + newbuf = skb->data; + } + + /* Source address in packet? */ + sktr_chk_src_addr(newbuf, dev->dev_addr); + + tp->LastSendTime = jiffies; + tpl = tp->TplFree; /* Get the "free" TPL */ + tpl->BusyFlag = 1; /* Mark TPL as busy */ + tp->TplFree = tpl->NextTPLPtr; + + /* Save the skb for delayed return of skb to system */ + tpl->Skb = skb; + tpl->FragList[0].DataCount = (unsigned short) SWAPB(length); + tpl->FragList[0].DataAddr = htonl(virt_to_bus(newbuf)); + + /* Write the data length in the transmit list. */ + tpl->FrameSize = (unsigned short) SWAPB(length); + tpl->MData = newbuf; + + /* Transmit the frame and set the status values. */ + sktr_write_tpl_status(tpl, TX_VALID | TX_START_FRAME + | TX_END_FRAME | TX_PASS_SRC_ADDR + | TX_FRAME_IRQ); + + /* Let adapter send the frame. */ + sktr_exec_sifcmd(dev, CMD_TX_VALID); + } + + return; +} + +/* + * Write the given value to the 'Status' field of the specified TPL. + * NOTE: This function should be used whenever the status of any TPL must be + * modified by the driver, because the compiler may otherwise change the + * order of instructions such that writing the TPL status may be executed at + * an undesireable time. When this function is used, the status is always + * written when the function is called. + */ +static void sktr_write_tpl_status(TPL *tpl, unsigned int Status) +{ + tpl->Status = Status; +} + +static void sktr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr) +{ + unsigned char SRBit; + + if((((unsigned long)frame[8]) & ~0x80) != 0) /* Compare 4 bytes */ + return; + if((unsigned short)frame[12] != 0) /* Compare 2 bytes */ + return; + + SRBit = frame[8] & 0x80; + memcpy(&frame[8], hw_addr, 6); + frame[8] |= SRBit; + + return; +} + +/* + * The timer routine: Check if adapter still open and working, reopen if not. + */ +static void sktr_timer_chk(unsigned long data) +{ + struct net_device *dev = (struct net_device*)data; + struct net_local *tp = (struct net_local*)dev->priv; + + if(tp->HaltInProgress) + return; + + sktr_chk_outstanding_cmds(dev); + if(time_before(tp->LastSendTime + SEND_TIMEOUT, jiffies) + && (tp->QueueSkb < MAX_TX_QUEUE || tp->TplFree != tp->TplBusy)) + { + /* Anything to send, but stalled to long */ + tp->LastSendTime = jiffies; + sktr_exec_cmd(dev, OC_CLOSE); /* Does reopen automatically */ + } + + tp->timer.expires = jiffies + 2*HZ; + add_timer(&tp->timer); + + if(tp->AdapterOpenFlag || tp->ReOpenInProgress) + return; + tp->ReOpenInProgress = 1; + sktr_open_adapter(dev); + + return; +} + +/* + * The typical workload of the driver: Handle the network interface interrupts. + */ +static void sktr_interrupt(int irq, void *dev_id, struct pt_regs *regs) +{ + struct net_device *dev = dev_id; + struct net_local *tp; + int ioaddr; + unsigned short irq_type; + + if(dev == NULL) + { + printk("%s: irq %d for unknown device.\n", dev->name, irq); + return; + } + + dev->interrupt = 1; + + ioaddr = dev->base_addr; + tp = (struct net_local *)dev->priv; + + irq_type = inw(ioaddr + SIFSTS); + + while(irq_type & STS_SYSTEM_IRQ) + { + irq_type &= STS_IRQ_MASK; + + if(!sktr_chk_ssb(tp, irq_type)) + { + printk(KERN_INFO "%s: DATA LATE occurred\n", dev->name); + break; + } + + switch(irq_type) + { + case STS_IRQ_RECEIVE_STATUS: + sktr_reset_interrupt(dev); + sktr_rcv_status_irq(dev); + break; + + case STS_IRQ_TRANSMIT_STATUS: + /* Check if TRANSMIT.HALT command is complete */ + if(tp->ssb.Parm[0] & COMMAND_COMPLETE) + { + tp->TransmitCommandActive = 0; + tp->TransmitHaltScheduled = 0; + + /* Issue a new transmit command. */ + sktr_exec_cmd(dev, OC_TRANSMIT); + } + + sktr_reset_interrupt(dev); + sktr_tx_status_irq(dev); + break; + + case STS_IRQ_COMMAND_STATUS: + /* The SSB contains status of last command + * other than receive/transmit. + */ + sktr_cmd_status_irq(dev); + break; + + case STS_IRQ_SCB_CLEAR: + /* The SCB is free for another command. */ + tp->ScbInUse = 0; + sktr_chk_outstanding_cmds(dev); + break; + + case STS_IRQ_RING_STATUS: + sktr_ring_status_irq(dev); + break; + + case STS_IRQ_ADAPTER_CHECK: + sktr_chk_irq(dev); + break; + + default: + printk(KERN_INFO "Unknown Token Ring IRQ\n"); + break; + } + + /* Reset system interrupt if not already done. */ + if(irq_type != STS_IRQ_TRANSMIT_STATUS + && irq_type != STS_IRQ_RECEIVE_STATUS) + { + sktr_reset_interrupt(dev); + } + + irq_type = inw(ioaddr + SIFSTS); + } + + dev->interrupt = 0; + + return; +} + +/* + * Reset the INTERRUPT SYSTEM bit and issue SSB CLEAR command. + */ +static void sktr_reset_interrupt(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + SSB *ssb = &tp->ssb; + + /* + * [Workaround for "Data Late"] + * Set all fields of the SSB to well-defined values so we can + * check if the adapter has written the SSB. + */ + + ssb->STS = (unsigned short) -1; + ssb->Parm[0] = (unsigned short) -1; + ssb->Parm[1] = (unsigned short) -1; + ssb->Parm[2] = (unsigned short) -1; + + /* Free SSB by issuing SSB_CLEAR command after reading IRQ code + * and clear STS_SYSTEM_IRQ bit: enable adapter for further interrupts. + */ + sktr_exec_sifcmd(dev, CMD_SSB_CLEAR | CMD_CLEAR_SYSTEM_IRQ); + + return; +} + +/* + * Check if the SSB has actually been written by the adapter. + */ +static unsigned char sktr_chk_ssb(struct net_local *tp, unsigned short IrqType) +{ + SSB *ssb = &tp->ssb; /* The address of the SSB. */ + + /* C 0 1 2 INTERRUPT CODE + * - - - - -------------- + * 1 1 1 1 TRANSMIT STATUS + * 1 1 1 1 RECEIVE STATUS + * 1 ? ? 0 COMMAND STATUS + * 0 0 0 0 SCB CLEAR + * 1 1 0 0 RING STATUS + * 0 0 0 0 ADAPTER CHECK + * + * 0 = SSB field not affected by interrupt + * 1 = SSB field is affected by interrupt + * + * C = SSB ADDRESS +0: COMMAND + * 0 = SSB ADDRESS +2: STATUS 0 + * 1 = SSB ADDRESS +4: STATUS 1 + * 2 = SSB ADDRESS +6: STATUS 2 + */ + + /* Check if this interrupt does use the SSB. */ + + if(IrqType != STS_IRQ_TRANSMIT_STATUS + && IrqType != STS_IRQ_RECEIVE_STATUS + && IrqType != STS_IRQ_COMMAND_STATUS + && IrqType != STS_IRQ_RING_STATUS) + { + return (1); /* SSB not involved. */ + } + + /* Note: All fields of the SSB have been set to all ones (-1) after it + * has last been used by the software (see DriverIsr()). + * + * Check if the affected SSB fields are still unchanged. + */ + + if(ssb->STS == (unsigned short) -1) + return (0); /* Command field not yet available. */ + if(IrqType == STS_IRQ_COMMAND_STATUS) + return (1); /* Status fields not always affected. */ + if(ssb->Parm[0] == (unsigned short) -1) + return (0); /* Status 1 field not yet available. */ + if(IrqType == STS_IRQ_RING_STATUS) + return (1); /* Status 2 & 3 fields not affected. */ + + /* Note: At this point, the interrupt is either TRANSMIT or RECEIVE. */ + if(ssb->Parm[1] == (unsigned short) -1) + return (0); /* Status 2 field not yet available. */ + if(ssb->Parm[2] == (unsigned short) -1) + return (0); /* Status 3 field not yet available. */ + + return (1); /* All SSB fields have been written by the adapter. */ +} + +/* + * Evaluates the command results status in the SSB status field. + */ +static void sktr_cmd_status_irq(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned short ssb_cmd, ssb_parm_0; + unsigned short ssb_parm_1; + char *open_err = "Open error -"; + char *code_err = "Open code -"; + + /* Copy the ssb values to local variables */ + ssb_cmd = tp->ssb.STS; + ssb_parm_0 = tp->ssb.Parm[0]; + ssb_parm_1 = tp->ssb.Parm[1]; + + if(ssb_cmd == OPEN) + { + tp->Sleeping = 0; + if(!tp->ReOpenInProgress) + wake_up_interruptible(&tp->wait_for_tok_int); + + tp->OpenCommandIssued = 0; + tp->ScbInUse = 0; + + if((ssb_parm_0 & 0x00FF) == GOOD_COMPLETION) + { + /* Success, the adapter is open. */ + tp->LobeWireFaultLogged = 0; + tp->AdapterOpenFlag = 1; + tp->AdapterVirtOpenFlag = 1; + tp->TransmitCommandActive = 0; + sktr_exec_cmd(dev, OC_TRANSMIT); + sktr_exec_cmd(dev, OC_RECEIVE); + + if(tp->ReOpenInProgress) + tp->ReOpenInProgress = 0; + + return; + } + else /* The adapter did not open. */ + { + if(ssb_parm_0 & NODE_ADDR_ERROR) + printk(KERN_INFO "%s: Node address error\n", + dev->name); + if(ssb_parm_0 & LIST_SIZE_ERROR) + printk(KERN_INFO "%s: List size error\n", + dev->name); + if(ssb_parm_0 & BUF_SIZE_ERROR) + printk(KERN_INFO "%s: Buffer size error\n", + dev->name); + if(ssb_parm_0 & TX_BUF_COUNT_ERROR) + printk(KERN_INFO "%s: Tx buffer count error\n", + dev->name); + if(ssb_parm_0 & INVALID_OPEN_OPTION) + printk(KERN_INFO "%s: Invalid open option\n", + dev->name); + if(ssb_parm_0 & OPEN_ERROR) + { + /* Show the open phase. */ + switch(ssb_parm_0 & OPEN_PHASES_MASK) + { + case LOBE_MEDIA_TEST: + if(!tp->LobeWireFaultLogged) + { + tp->LobeWireFaultLogged = 1; + printk(KERN_INFO "%s: %s Lobe wire fault (check cable !).\n", dev->name, open_err); + } + tp->ReOpenInProgress = 1; + tp->AdapterOpenFlag = 0; + tp->AdapterVirtOpenFlag = 1; + sktr_open_adapter(dev); + return; + + case PHYSICAL_INSERTION: + printk(KERN_INFO "%s: %s Physical insertion.\n", dev->name, open_err); + break; + + case ADDRESS_VERIFICATION: + printk(KERN_INFO "%s: %s Address verification.\n", dev->name, open_err); + break; + + case PARTICIPATION_IN_RING_POLL: + printk(KERN_INFO "%s: %s Participation in ring poll.\n", dev->name, open_err); + break; + + case REQUEST_INITIALISATION: + printk(KERN_INFO "%s: %s Request initialisation.\n", dev->name, open_err); + break; + + case FULLDUPLEX_CHECK: + printk(KERN_INFO "%s: %s Full duplex check.\n", dev->name, open_err); + break; + + default: + printk(KERN_INFO "%s: %s Unknown open phase\n", dev->name, open_err); + break; + } + + /* Show the open errors. */ + switch(ssb_parm_0 & OPEN_ERROR_CODES_MASK) + { + case OPEN_FUNCTION_FAILURE: + printk(KERN_INFO "%s: %s OPEN_FUNCTION_FAILURE", dev->name, code_err); + tp->LastOpenStatus = + OPEN_FUNCTION_FAILURE; + break; + + case OPEN_SIGNAL_LOSS: + printk(KERN_INFO "%s: %s OPEN_SIGNAL_LOSS\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_SIGNAL_LOSS; + break; + + case OPEN_TIMEOUT: + printk(KERN_INFO "%s: %s OPEN_TIMEOUT\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_TIMEOUT; + break; + + case OPEN_RING_FAILURE: + printk(KERN_INFO "%s: %s OPEN_RING_FAILURE\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_RING_FAILURE; + break; + + case OPEN_RING_BEACONING: + printk(KERN_INFO "%s: %s OPEN_RING_BEACONING\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_RING_BEACONING; + break; + + case OPEN_DUPLICATE_NODEADDR: + printk(KERN_INFO "%s: %s OPEN_DUPLICATE_NODEADDR\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_DUPLICATE_NODEADDR; + break; + + case OPEN_REQUEST_INIT: + printk(KERN_INFO "%s: %s OPEN_REQUEST_INIT\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_REQUEST_INIT; + break; + + case OPEN_REMOVE_RECEIVED: + printk(KERN_INFO "%s: %s OPEN_REMOVE_RECEIVED", dev->name, code_err); + tp->LastOpenStatus = + OPEN_REMOVE_RECEIVED; + break; + + case OPEN_FULLDUPLEX_SET: + printk(KERN_INFO "%s: %s OPEN_FULLDUPLEX_SET\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_FULLDUPLEX_SET; + break; + + default: + printk(KERN_INFO "%s: %s Unknown open err code", dev->name, code_err); + tp->LastOpenStatus = + OPEN_FUNCTION_FAILURE; + break; + } + } + + tp->AdapterOpenFlag = 0; + tp->AdapterVirtOpenFlag = 0; + + return; + } + } + else + { + if(ssb_cmd != READ_ERROR_LOG) + return; + + /* Add values from the error log table to the MAC + * statistics counters and update the errorlogtable + * memory. + */ + tp->MacStat.line_errors += tp->errorlogtable.Line_Error; + tp->MacStat.burst_errors += tp->errorlogtable.Burst_Error; + tp->MacStat.A_C_errors += tp->errorlogtable.ARI_FCI_Error; + tp->MacStat.lost_frames += tp->errorlogtable.Lost_Frame_Error; + tp->MacStat.recv_congest_count += tp->errorlogtable.Rx_Congest_Error; + tp->MacStat.rx_errors += tp->errorlogtable.Rx_Congest_Error; + tp->MacStat.frame_copied_errors += tp->errorlogtable.Frame_Copied_Error; + tp->MacStat.token_errors += tp->errorlogtable.Token_Error; + tp->MacStat.dummy1 += tp->errorlogtable.DMA_Bus_Error; + tp->MacStat.dummy1 += tp->errorlogtable.DMA_Parity_Error; + tp->MacStat.abort_delimiters += tp->errorlogtable.AbortDelimeters; + tp->MacStat.frequency_errors += tp->errorlogtable.Frequency_Error; + tp->MacStat.internal_errors += tp->errorlogtable.Internal_Error; + } + + return; +} + +/* + * The inverse routine to sktr_open(). + */ +static int sktr_close(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + dev->tbusy = 1; + dev->start = 0; + + del_timer(&tp->timer); + + /* Flush the Tx and disable Rx here. */ + + tp->HaltInProgress = 1; + sktr_exec_cmd(dev, OC_CLOSE); + tp->timer.expires = jiffies + 1*HZ; + tp->timer.function = sktr_timer_end_wait; + tp->timer.data = (unsigned long)dev; + add_timer(&tp->timer); + + sktr_enable_interrupts(dev); + + tp->Sleeping = 1; + interruptible_sleep_on(&tp->wait_for_tok_int); + tp->TransmitCommandActive = 0; + + del_timer(&tp->timer); + sktr_disable_interrupts(dev); + + if(dev->dma > 0) + { + unsigned long flags=claim_dma_lock(); + disable_dma(dev->dma); + release_dma_lock(flags); + } + + outw(0xFF00, dev->base_addr + SIFCMD); + if(dev->dma > 0) + outb(0xff, dev->base_addr + POSREG); + +#ifdef MODULE + MOD_DEC_USE_COUNT; +#endif + + sktr_cancel_tx_queue(tp); + + return (0); +} + +/* + * Get the current statistics. This may be called with the card open + * or closed. + */ +static struct enet_statistics *sktr_get_stats(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + return ((struct enet_statistics *)&tp->MacStat); +} + +/* + * Set or clear the multicast filter for this adapter. + */ +static void sktr_set_multicast_list(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned int OpenOptions; + + OpenOptions = tp->ocpl.OPENOptions & + ~(PASS_ADAPTER_MAC_FRAMES + | PASS_ATTENTION_FRAMES + | PASS_BEACON_MAC_FRAMES + | COPY_ALL_MAC_FRAMES + | COPY_ALL_NON_MAC_FRAMES); + + tp->ocpl.FunctAddr = 0; + + if(dev->flags & IFF_PROMISC) + /* Enable promiscuous mode */ + OpenOptions |= COPY_ALL_NON_MAC_FRAMES | + COPY_ALL_MAC_FRAMES; + else + { + if(dev->flags & IFF_ALLMULTI) + { + /* Disable promiscuous mode, use normal mode. */ + tp->ocpl.FunctAddr = 0xFFFFFFFF; + + } + else + { + int i; + struct dev_mc_list *mclist = dev->mc_list; + for (i=0; i< dev->mc_count; i++) + { + ((char *)(&tp->ocpl.FunctAddr))[0] |= + mclist->dmi_addr[2]; + ((char *)(&tp->ocpl.FunctAddr))[1] |= + mclist->dmi_addr[3]; + ((char *)(&tp->ocpl.FunctAddr))[2] |= + mclist->dmi_addr[4]; + ((char *)(&tp->ocpl.FunctAddr))[3] |= + mclist->dmi_addr[5]; + mclist = mclist->next; + } + } + sktr_exec_cmd(dev, OC_SET_FUNCT_ADDR); + } + + tp->ocpl.OPENOptions = OpenOptions; + sktr_exec_cmd(dev, OC_MODIFY_OPEN_PARMS); + return; +} + +/* + * Wait for some time (microseconds) + * + * udelay() is a bit harsh, but using a looser timer causes + * the bring-up-diags to stall indefinitly. + * + */ + +static void sktr_wait(unsigned long time) +{ + udelay(time); + return; +} + +/* + * Write a command value to the SIFCMD register + */ +static void sktr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue) +{ + int ioaddr = dev->base_addr; + unsigned short cmd; + unsigned short SifStsValue; + unsigned long loop_counter; + + WriteValue = ((WriteValue ^ CMD_SYSTEM_IRQ) | CMD_INTERRUPT_ADAPTER); + cmd = (unsigned short)WriteValue; + loop_counter = 0,5 * 800000; + do { + SifStsValue = inw(ioaddr + SIFSTS); + } while((SifStsValue & CMD_INTERRUPT_ADAPTER) && loop_counter--); + outw(cmd, ioaddr + SIFCMD); + + return; +} + +/* + * Processes adapter hardware reset, halts adapter and downloads firmware, + * clears the halt bit. + */ +static int sktr_reset_adapter(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned short *fw_ptr = (unsigned short *)&sktr_code; + unsigned short count, c; + int ioaddr = dev->base_addr; + + /* Hardware adapter reset */ + outw(ACL_ARESET, ioaddr + SIFACL); + sktr_wait(40); + + c = inw(ioaddr + SIFACL); + sktr_wait(20); + + if(dev->dma == 0) /* For PCI adapters */ + { + c &= ~(ACL_SPEED4 | ACL_SPEED16); /* Clear bits */ + if(tp->DataRate == SPEED_4) + c |= ACL_SPEED4; /* Set 4Mbps */ + else + c |= ACL_SPEED16; /* Set 16Mbps */ + } + + /* In case a command is pending - forget it */ + tp->ScbInUse = 0; + + c &= ~ACL_ARESET; /* Clear adapter reset bit */ + c |= ACL_CPHALT; /* Halt adapter CPU, allow download */ + c &= ~ACL_PSDMAEN; /* Clear pseudo dma bit */ + outw(c, ioaddr + SIFACL); + sktr_wait(40); + + /* Download firmware via DIO interface: */ + do { + /* Download first address part */ + outw(*fw_ptr, ioaddr + SIFADX); + fw_ptr++; + + /* Download second address part */ + outw(*fw_ptr, ioaddr + SIFADD); + fw_ptr++; + + if((count = *fw_ptr) != 0) /* Load loop counter */ + { + fw_ptr++; /* Download block data */ + for(; count > 0; count--) + { + outw(*fw_ptr, ioaddr + SIFINC); + fw_ptr++; + } + } + else /* Stop, if last block downloaded */ + { + c = inw(ioaddr + SIFACL); + c &= (~ACL_CPHALT | ACL_SINTEN); + + /* Clear CPHALT and start BUD */ + outw(c, ioaddr + SIFACL); + return (1); + } + } while(count == 0); + + return (-1); +} + +/* + * Starts bring up diagnostics of token ring adapter and evaluates + * diagnostic results. + */ +static int sktr_bringup_diags(struct net_device *dev) +{ + int loop_cnt, retry_cnt; + unsigned short Status; + int ioaddr = dev->base_addr; + + sktr_wait(HALF_SECOND); + sktr_exec_sifcmd(dev, EXEC_SOFT_RESET); + sktr_wait(HALF_SECOND); + + retry_cnt = BUD_MAX_RETRIES; /* maximal number of retrys */ + + do { + retry_cnt--; + if(sktr_debug > 3) + printk(KERN_INFO "BUD-Status: \n"); + loop_cnt = BUD_MAX_LOOPCNT; /* maximum: three seconds*/ + do { /* Inspect BUD results */ + loop_cnt--; + sktr_wait(HALF_SECOND); + Status = inw(ioaddr + SIFSTS); + Status &= STS_MASK; + + if(sktr_debug > 3) + printk(KERN_INFO " %04X \n", Status); + /* BUD successfully completed */ + if(Status == STS_INITIALIZE) + return (1); + /* Unrecoverable hardware error, BUD not completed? */ + } while((loop_cnt > 0) && ((Status & (STS_ERROR | STS_TEST)) + != (STS_ERROR | STS_TEST))); + + /* Error preventing completion of BUD */ + if(retry_cnt > 0) + { + printk(KERN_INFO "%s: Adapter Software Reset.\n", + dev->name); + sktr_exec_sifcmd(dev, EXEC_SOFT_RESET); + sktr_wait(HALF_SECOND); + } + } while(retry_cnt > 0); + + Status = inw(ioaddr + SIFSTS); + Status &= STS_ERROR_MASK; /* Hardware error occurred! */ + + printk(KERN_INFO "%s: Bring Up Diagnostics Error (%04X) occurred\n", + dev->name, Status); + + return (-1); +} + +/* + * Copy initialisation data to adapter memory, beginning at address + * 1:0A00; Starting DMA test and evaluating result bits. + */ +static int sktr_init_adapter(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + const unsigned char SCB_Test[6] = {0x00, 0x00, 0xC1, 0xE2, 0xD4, 0x8B}; + const unsigned char SSB_Test[8] = {0xFF, 0xFF, 0xD1, 0xD7, + 0xC5, 0xD9, 0xC3, 0xD4}; + void *ptr = (void *)&tp->ipb; + unsigned short *ipb_ptr = (unsigned short *)ptr; + unsigned char *cb_ptr = (unsigned char *) &tp->scb; + unsigned char *sb_ptr = (unsigned char *) &tp->ssb; + unsigned short Status; + int i, loop_cnt, retry_cnt; + int ioaddr = dev->base_addr; + + /* Normalize: byte order low/high, word order high/low! (only IPB!) */ + tp->ipb.SCB_Addr = SWAPW(virt_to_bus(&tp->scb)); + tp->ipb.SSB_Addr = SWAPW(virt_to_bus(&tp->ssb)); + + /* Maximum: three initialization retries */ + retry_cnt = INIT_MAX_RETRIES; + + do { + retry_cnt--; + + /* Transfer initialization block */ + outw(0x0001, ioaddr + SIFADX); + + /* To address 0001:0A00 of adapter RAM */ + outw(0x0A00, ioaddr + SIFADD); + + /* Write 11 words to adapter RAM */ + for(i = 0; i < 11; i++) + outw(ipb_ptr[i], ioaddr + SIFINC); + + /* Execute SCB adapter command */ + sktr_exec_sifcmd(dev, CMD_EXECUTE); + + loop_cnt = INIT_MAX_LOOPCNT; /* Maximum: 11 seconds */ + + /* While remaining retries, no error and not completed */ + do { + Status = 0; + loop_cnt--; + sktr_wait(HALF_SECOND); + + /* Mask interesting status bits */ + Status = inw(ioaddr + SIFSTS); + Status &= STS_MASK; + } while(((Status &(STS_INITIALIZE | STS_ERROR | STS_TEST)) != 0) + && ((Status & STS_ERROR) == 0) && (loop_cnt != 0)); + + if((Status & (STS_INITIALIZE | STS_ERROR | STS_TEST)) == 0) + { + /* Initialization completed without error */ + i = 0; + do { /* Test if contents of SCB is valid */ + if(SCB_Test[i] != *(cb_ptr + i)) + /* DMA data error: wrong data in SCB */ + return (-1); + i++; + } while(i < 6); + + i = 0; + do { /* Test if contents of SSB is valid */ + if(SSB_Test[i] != *(sb_ptr + i)) + /* DMA data error: wrong data in SSB */ + return (-1); + i++; + } while (i < 8); + + return (1); /* Adapter successfully initialized */ + } + else + { + if((Status & STS_ERROR) != 0) + { + /* Initialization error occurred */ + Status = inw(ioaddr + SIFSTS); + Status &= STS_ERROR_MASK; + /* ShowInitialisationErrorCode(Status); */ + return (-1); /* Unrecoverable error */ + } + else + { + if(retry_cnt > 0) + { + /* Reset adapter and try init again */ + sktr_exec_sifcmd(dev, EXEC_SOFT_RESET); + sktr_wait(HALF_SECOND); + } + } + } + } while(retry_cnt > 0); + + return (-1); +} + +/* + * Check for outstanding commands in command queue and tries to execute + * command immediately. Corresponding command flag in command queue is cleared. + */ +static void sktr_chk_outstanding_cmds(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned long Addr = 0; + unsigned char i = 0; + + if(tp->CMDqueue == 0) + return; /* No command execution */ + + /* If SCB in use: no command */ + if(tp->ScbInUse == 1) + return; + + /* Check if adapter is opened, avoiding COMMAND_REJECT + * interrupt by the adapter! + */ + if(tp->AdapterOpenFlag == 0) + { + if(tp->CMDqueue & OC_OPEN) + { + /* Execute OPEN command */ + tp->CMDqueue ^= OC_OPEN; + + /* Copy the 18 bytes of the product ID */ + while((AdapterName[i] != '\0') && (i < PROD_ID_SIZE)) + { + tp->ProductID[i] = AdapterName[i]; + i++; + } + + Addr = htonl(virt_to_bus(&tp->ocpl)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = OPEN; + } + else + /* No OPEN command queued, but adapter closed. Note: + * We'll try to re-open the adapter in DriverPoll() + */ + return; /* No adapter command issued */ + } + else + { + /* Adapter is open; evaluate command queue: try to execute + * outstanding commands (depending on priority!) CLOSE + * command queued + */ + if(tp->CMDqueue & OC_CLOSE) + { + tp->CMDqueue ^= OC_CLOSE; + tp->AdapterOpenFlag = 0; + tp->scb.Parm[0] = 0; /* Parm[0], Parm[1] are ignored */ + tp->scb.Parm[1] = 0; /* but should be set to zero! */ + tp->scb.CMD = CLOSE; + if(!tp->HaltInProgress) + tp->CMDqueue |= OC_OPEN; /* re-open adapter */ + else + tp->CMDqueue = 0; /* no more commands */ + } + else + { + if(tp->CMDqueue & OC_RECEIVE) + { + tp->CMDqueue ^= OC_RECEIVE; + Addr = htonl(virt_to_bus(tp->RplHead)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = RECEIVE; + } + else + { + if(tp->CMDqueue & OC_TRANSMIT_HALT) + { + /* NOTE: TRANSMIT.HALT must be checked + * before TRANSMIT. + */ + tp->CMDqueue ^= OC_TRANSMIT_HALT; + tp->scb.CMD = TRANSMIT_HALT; + + /* Parm[0] and Parm[1] are ignored + * but should be set to zero! + */ + tp->scb.Parm[0] = 0; + tp->scb.Parm[1] = 0; + } + else + { + if(tp->CMDqueue & OC_TRANSMIT) + { + /* NOTE: TRANSMIT must be + * checked after TRANSMIT.HALT + */ + if(tp->TransmitCommandActive) + { + if(!tp->TransmitHaltScheduled) + { + tp->TransmitHaltScheduled = 1; + sktr_exec_cmd(dev, OC_TRANSMIT_HALT) ; + } + tp->TransmitCommandActive = 0; + return; + } + + tp->CMDqueue ^= OC_TRANSMIT; + sktr_cancel_tx_queue(tp); + Addr = htonl(virt_to_bus(tp->TplBusy)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = TRANSMIT; + tp->TransmitCommandActive = 1; + } + else + { + if(tp->CMDqueue & OC_MODIFY_OPEN_PARMS) + { + tp->CMDqueue ^= OC_MODIFY_OPEN_PARMS; + tp->scb.Parm[0] = tp->ocpl.OPENOptions; /* new OPEN options*/ + tp->scb.Parm[0] |= ENABLE_FULL_DUPLEX_SELECTION; + tp->scb.Parm[1] = 0; /* is ignored but should be zero */ + tp->scb.CMD = MODIFY_OPEN_PARMS; + } + else + { + if(tp->CMDqueue & OC_SET_FUNCT_ADDR) + { + tp->CMDqueue ^= OC_SET_FUNCT_ADDR; + tp->scb.Parm[0] = LOWORD(tp->ocpl.FunctAddr); + tp->scb.Parm[1] = HIWORD(tp->ocpl.FunctAddr); + tp->scb.CMD = SET_FUNCT_ADDR; + } + else + { + if(tp->CMDqueue & OC_SET_GROUP_ADDR) + { + tp->CMDqueue ^= OC_SET_GROUP_ADDR; + tp->scb.Parm[0] = LOWORD(tp->ocpl.GroupAddr); + tp->scb.Parm[1] = HIWORD(tp->ocpl.GroupAddr); + tp->scb.CMD = SET_GROUP_ADDR; + } + else + { + if(tp->CMDqueue & OC_READ_ERROR_LOG) + { + tp->CMDqueue ^= OC_READ_ERROR_LOG; + Addr = htonl(virt_to_bus(&tp->errorlogtable)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = READ_ERROR_LOG; + } + else + { + printk(KERN_WARNING "CheckForOutstandingCommand: unknown Command\n"); + tp->CMDqueue = 0; + return; + } + } + } + } + } + } + } + } + } + + tp->ScbInUse = 1; /* Set semaphore: SCB in use. */ + + /* Execute SCB and generate IRQ when done. */ + sktr_exec_sifcmd(dev, CMD_EXECUTE | CMD_SCB_REQUEST); + + return; +} + +/* + * IRQ conditions: signal loss on the ring, transmit or receive of beacon + * frames (disabled if bit 1 of OPEN option is set); report error MAC + * frame transmit (disabled if bit 2 of OPEN option is set); open or short + * cirquit fault on the lobe is detected; remove MAC frame received; + * error counter overflow (255); opened adapter is the only station in ring. + * After some of the IRQs the adapter is closed! + */ +static void sktr_ring_status_irq(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + tp->CurrentRingStatus = SWAPB(tp->ssb.Parm[0]); + + /* First: fill up statistics */ + if(tp->ssb.Parm[0] & SIGNAL_LOSS) + { + printk(KERN_INFO "%s: Signal Loss\n", dev->name); + tp->MacStat.line_errors++; + } + + /* Adapter is closed, but initialized */ + if(tp->ssb.Parm[0] & LOBE_WIRE_FAULT) + { + printk(KERN_INFO "%s: Lobe Wire Fault, Reopen Adapter\n", + dev->name); + tp->MacStat.line_errors++; + } + + if(tp->ssb.Parm[0] & RING_RECOVERY) + printk(KERN_INFO "%s: Ring Recovery\n", dev->name); + + /* Counter overflow: read error log */ + if(tp->ssb.Parm[0] & COUNTER_OVERFLOW) + { + printk(KERN_INFO "%s: Counter Overflow\n", dev->name); + sktr_exec_cmd(dev, OC_READ_ERROR_LOG); + } + + /* Adapter is closed, but initialized */ + if(tp->ssb.Parm[0] & REMOVE_RECEIVED) + printk(KERN_INFO "%s: Remove Received, Reopen Adapter\n", + dev->name); + + /* Adapter is closed, but initialized */ + if(tp->ssb.Parm[0] & AUTO_REMOVAL_ERROR) + printk(KERN_INFO "%s: Auto Removal Error, Reopen Adapter\n", + dev->name); + + if(tp->ssb.Parm[0] & HARD_ERROR) + printk(KERN_INFO "%s: Hard Error\n", dev->name); + + if(tp->ssb.Parm[0] & SOFT_ERROR) + printk(KERN_INFO "%s: Soft Error\n", dev->name); + + if(tp->ssb.Parm[0] & TRANSMIT_BEACON) + printk(KERN_INFO "%s: Transmit Beacon\n", dev->name); + + if(tp->ssb.Parm[0] & SINGLE_STATION) + printk(KERN_INFO "%s: Single Station\n", dev->name); + + /* Check if adapter has been closed */ + if(tp->ssb.Parm[0] & ADAPTER_CLOSED) + { + printk(KERN_INFO "%s: Adapter closed (Reopening)," + "QueueSkb %d, CurrentRingStat %x\n", + dev->name, tp->QueueSkb, tp->CurrentRingStatus); + tp->AdapterOpenFlag = 0; + sktr_open_adapter(dev); + } + + return; +} + +/* + * Issued if adapter has encountered an unrecoverable hardware + * or software error. + */ +static void sktr_chk_irq(struct net_device *dev) +{ + int i; + unsigned short AdapterCheckBlock[4]; + unsigned short ioaddr = dev->base_addr; + struct net_local *tp = (struct net_local *)dev->priv; + + tp->AdapterOpenFlag = 0; /* Adapter closed now */ + + /* Page number of adapter memory */ + outw(0x0001, ioaddr + SIFADX); + /* Address offset */ + outw(CHECKADDR, ioaddr + SIFADR); + + /* Reading 8 byte adapter check block. */ + for(i = 0; i < 4; i++) + AdapterCheckBlock[i] = inw(ioaddr + SIFINC); + + if(sktr_debug > 3) + { + printk("%s: AdapterCheckBlock: ", dev->name); + for (i = 0; i < 4; i++) + printk("%04X", AdapterCheckBlock[i]); + printk("\n"); + } + + switch(AdapterCheckBlock[0]) + { + case DIO_PARITY: + printk(KERN_INFO "%s: DIO parity error\n", dev->name); + break; + + case DMA_READ_ABORT: + printk(KERN_INFO "%s DMA read operation aborted:\n", + dev->name); + switch (AdapterCheckBlock[1]) + { + case 0: + printk(KERN_INFO "Timeout\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 1: + printk(KERN_INFO "Parity error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 2: + printk(KERN_INFO "Bus error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + default: + printk(KERN_INFO "Unknown error.\n"); + break; + } + break; + + case DMA_WRITE_ABORT: + printk(KERN_INFO "%s: DMA write operation aborted: \n", + dev->name); + switch (AdapterCheckBlock[1]) + { + case 0: + printk(KERN_INFO "Timeout\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 1: + printk(KERN_INFO "Parity error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 2: + printk(KERN_INFO "Bus error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + default: + printk(KERN_INFO "Unknown error.\n"); + break; + } + break; + + case ILLEGAL_OP_CODE: + printk("%s: Illegal operation code in firmware\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case PARITY_ERRORS: + printk("%s: Adapter internal bus parity error\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case RAM_DATA_ERROR: + printk("%s: RAM data error\n", dev->name); + /* Parm[0-1]: MSW/LSW address of RAM location. */ + break; + + case RAM_PARITY_ERROR: + printk("%s: RAM parity error\n", dev->name); + /* Parm[0-1]: MSW/LSW address of RAM location. */ + break; + + case RING_UNDERRUN: + printk("%s: Internal DMA underrun detected\n", + dev->name); + break; + + case INVALID_IRQ: + printk("%s: Unrecognized interrupt detected\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case INVALID_ERROR_IRQ: + printk("%s: Unrecognized error interrupt detected\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case INVALID_XOP: + printk("%s: Unrecognized XOP request detected\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + default: + printk("%s: Unknown status", dev->name); + break; + } + + if(sktr_chipset_init(dev) == 1) + { + /* Restart of firmware successful */ + tp->AdapterOpenFlag = 1; + } + + return; +} + +/* + * Internal adapter pointer to RAM data are copied from adapter into + * host system. + */ +static void sktr_read_ptr(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned short adapterram; + + sktr_read_ram(dev, (unsigned char *)&tp->intptrs.BurnedInAddrPtr, + ADAPTER_INT_PTRS, 16); + sktr_read_ram(dev, (unsigned char *)&adapterram, + (unsigned short)SWAPB(tp->intptrs.AdapterRAMPtr), 2); + + printk(KERN_INFO "%s: Adapter RAM size: %d K\n", + dev->name, SWAPB(adapterram)); + + return; +} + +/* + * Reads a number of bytes from adapter to system memory. + */ +static void sktr_read_ram(struct net_device *dev, unsigned char *Data, + unsigned short Address, int Length) +{ + int i; + unsigned short old_sifadx, old_sifadr, InWord; + unsigned short ioaddr = dev->base_addr; + + /* Save the current values */ + old_sifadx = inw(ioaddr + SIFADX); + old_sifadr = inw(ioaddr + SIFADR); + + /* Page number of adapter memory */ + outw(0x0001, ioaddr + SIFADX); + /* Address offset in adapter RAM */ + outw(Address, ioaddr + SIFADR); + + /* Copy len byte from adapter memory to system data area. */ + i = 0; + for(;;) + { + InWord = inw(ioaddr + SIFINC); + + *(Data + i) = HIBYTE(InWord); /* Write first byte */ + if(++i == Length) /* All is done break */ + break; + + *(Data + i) = LOBYTE(InWord); /* Write second byte */ + if (++i == Length) /* All is done break */ + break; + } + + /* Restore original values */ + outw(old_sifadx, ioaddr + SIFADX); + outw(old_sifadr, ioaddr + SIFADR); + + return; +} + +/* + * Reads MAC address from adapter ROM. + */ +static void sktr_read_addr(struct net_device *dev, unsigned char *Address) +{ + int i, In; + unsigned short ioaddr = dev->base_addr; + + /* Address: 0000:0000 */ + outw(0, ioaddr + SIFADX); + outw(0, ioaddr + SIFADR); + + /* Read six byte MAC address data */ + for(i = 0; i < 6; i++) + { + In = inw(ioaddr + SIFINC); + *(Address + i) = (unsigned char)(In >> 8); + } + + return; +} + +/* + * Cancel all queued packets in the transmission queue. + */ +static void sktr_cancel_tx_queue(struct net_local* tp) +{ + TPL *tpl; + struct sk_buff *skb; + + /* + * NOTE: There must not be an active TRANSMIT command pending, when + * this function is called. + */ + if(tp->TransmitCommandActive) + return; + + for(;;) + { + tpl = tp->TplBusy; + if(!tpl->BusyFlag) + break; + /* "Remove" TPL from busy list. */ + tp->TplBusy = tpl->NextTPLPtr; + sktr_write_tpl_status(tpl, 0); /* Clear VALID bit */ + tpl->BusyFlag = 0; /* "free" TPL */ + + printk(KERN_INFO "Cancel tx (%08lXh).\n", (unsigned long)tpl); + + dev_kfree_skb(tpl->Skb); + } + + for(;;) + { + skb = skb_dequeue(&tp->SendSkbQueue); + if(skb == NULL) + break; + tp->QueueSkb++; + dev_kfree_skb(skb); + } + + return; +} + +/* + * This function is called whenever a transmit interrupt is generated by the + * adapter. For a command complete interrupt, it is checked if we have to + * issue a new transmit command or not. + */ +static void sktr_tx_status_irq(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned char HighByte, HighAc, LowAc; + TPL *tpl; + + /* NOTE: At this point the SSB from TRANSMIT STATUS is no longer + * available, because the CLEAR SSB command has already been issued. + * + * Process all complete transmissions. + */ + + for(;;) + { + tpl = tp->TplBusy; + if(!tpl->BusyFlag || (tpl->Status + & (TX_VALID | TX_FRAME_COMPLETE)) + != TX_FRAME_COMPLETE) + { + break; + } + + /* "Remove" TPL from busy list. */ + tp->TplBusy = tpl->NextTPLPtr ; + + if(sktr_debug > 3) + sktr_dump(tpl->MData, SWAPB(tpl->FrameSize)); + + /* Check the transmit status field only for directed frames*/ + if(DIRECTED_FRAME(tpl) && (tpl->Status & TX_ERROR) == 0) + { + HighByte = GET_TRANSMIT_STATUS_HIGH_BYTE(tpl->Status); + HighAc = GET_FRAME_STATUS_HIGH_AC(HighByte); + LowAc = GET_FRAME_STATUS_LOW_AC(HighByte); + + if((HighAc != LowAc) || (HighAc == AC_NOT_RECOGNIZED)) + { + printk(KERN_INFO "%s: (DA=%08lX not recognized)", + dev->name, + *(unsigned long *)&tpl->MData[2+2]); + } + else + { + if(sktr_debug > 3) + printk("%s: Directed frame tx'd\n", + dev->name); + } + } + else + { + if(!DIRECTED_FRAME(tpl)) + { + if(sktr_debug > 3) + printk("%s: Broadcast frame tx'd\n", + dev->name); + } + } + + tp->MacStat.tx_packets++; + dev_kfree_skb(tpl->Skb); + tpl->BusyFlag = 0; /* "free" TPL */ + } + + dev->tbusy = 0; + if(tp->QueueSkb < MAX_TX_QUEUE) + sktr_hardware_send_packet(dev, tp); + + return; +} + +/* + * Called if a frame receive interrupt is generated by the adapter. + * Check if the frame is valid and indicate it to system. + */ +static void sktr_rcv_status_irq(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned char *ReceiveDataPtr; + struct sk_buff *skb; + unsigned int Length, Length2; + RPL *rpl; + RPL *SaveHead; + + /* NOTE: At this point the SSB from RECEIVE STATUS is no longer + * available, because the CLEAR SSB command has already been issued. + * + * Process all complete receives. + */ + + for(;;) + { + rpl = tp->RplHead; + if(rpl->Status & RX_VALID) + break; /* RPL still in use by adapter */ + + /* Forward RPLHead pointer to next list. */ + SaveHead = tp->RplHead; + tp->RplHead = rpl->NextRPLPtr; + + /* Get the frame size (Byte swap for Intel). + * Do this early (see workaround comment below) + */ + Length = (unsigned short)SWAPB(rpl->FrameSize); + + /* Check if the Frame_Start, Frame_End and + * Frame_Complete bits are set. + */ + if((rpl->Status & VALID_SINGLE_BUFFER_FRAME) + == VALID_SINGLE_BUFFER_FRAME) + { + ReceiveDataPtr = rpl->MData; + + /* Workaround for delayed write of FrameSize on ISA + * (FrameSize is false but valid-bit is reset) + * Frame size is set to zero when the RPL is freed. + * Length2 is there because there have also been + * cases where the FrameSize was partially written + */ + Length2 = (unsigned short)SWAPB(rpl->FrameSize); + + if(Length == 0 || Length != Length2) + { + tp->RplHead = SaveHead; + break; /* Return to sktr_interrupt */ + } + + /* Drop frames sent by myself */ + if(sktr_chk_frame(dev, rpl->MData)) + { + if(rpl->Skb != NULL) + dev_kfree_skb(rpl->Skb); + } + else + { + sktr_update_rcv_stats(tp,ReceiveDataPtr,Length); + + if(sktr_debug > 3) + printk("%s: Packet Length %04X (%d)\n", + dev->name, Length, Length); + + /* Indicate the received frame to system. + * The source routing padding is no more + * necessary with 2.2.x kernel. + * See: OpenOptions in sktr_init_opb() + */ + skb = rpl->Skb; + if(rpl->SkbStat == SKB_UNAVAILABLE) + { + /* Try again to allocate skb */ + skb = dev_alloc_skb(tp->MaxPacketSize); + if(skb == NULL) + { + /* Update Stats ?? */ + } + else + { + skb->dev = dev; + skb_put(skb, tp->MaxPacketSize); + rpl->SkbStat = SKB_DATA_COPY; + ReceiveDataPtr = rpl->MData; + } + } + + if(rpl->SkbStat == SKB_DATA_COPY + || rpl->SkbStat == SKB_DMA_DIRECT) + { + if(rpl->SkbStat == SKB_DATA_COPY) + { + memmove(skb->data, ReceiveDataPtr, Length); + } + + /* Deliver frame to system */ + rpl->Skb = NULL; + skb_trim(skb,Length); + skb->dev = dev; + skb->protocol = tr_type_trans(skb,dev); + netif_rx(skb); + } + } + } + else /* Invalid frame */ + { + if(rpl->Skb != NULL) + dev_kfree_skb(rpl->Skb); + + /* Skip list. */ + if(rpl->Status & RX_START_FRAME) + /* Frame start bit is set -> overflow. */ + tp->MacStat.rx_errors++; + } + + /* Allocate new skb for rpl */ + rpl->Skb = dev_alloc_skb(tp->MaxPacketSize); + + /* skb == NULL ? then use local buffer */ + if(rpl->Skb == NULL) + { + rpl->SkbStat = SKB_UNAVAILABLE; + rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex])); + rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex]; + } + else /* skb != NULL */ + { + rpl->Skb->dev = dev; + skb_put(rpl->Skb, tp->MaxPacketSize); + + /* Data unreachable for DMA ? then use local buffer */ + if(tp->DeviceType == SK_ISA && + virt_to_bus(rpl->Skb->data) + tp->MaxPacketSize + > ISA_MAX_ADDRESS) + { + rpl->SkbStat = SKB_DATA_COPY; + rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex])); + rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex]; + } + else + { + /* DMA directly in skb->data */ + rpl->SkbStat = SKB_DMA_DIRECT; + rpl->FragList[0].DataAddr = htonl(virt_to_bus(rpl->Skb->data)); + rpl->MData = rpl->Skb->data; + } + } + + rpl->FragList[0].DataCount = SWAPB(tp->MaxPacketSize); + rpl->FrameSize = 0; + + /* Pass the last RPL back to the adapter */ + tp->RplTail->FrameSize = 0; + + /* Reset the CSTAT field in the list. */ + sktr_write_rpl_status(tp->RplTail, RX_VALID | RX_FRAME_IRQ); + + /* Current RPL becomes last one in list. */ + tp->RplTail = tp->RplTail->NextRPLPtr; + + /* Inform adapter about RPL valid. */ + sktr_exec_sifcmd(dev, CMD_RX_VALID); + } + + return; +} + +/* + * This function should be used whenever the status of any RPL must be + * modified by the driver, because the compiler may otherwise change the + * order of instructions such that writing the RPL status may be executed + * at an undesireable time. When this function is used, the status is + * always written when the function is called. + */ +static void sktr_write_rpl_status(RPL *rpl, unsigned int Status) +{ + rpl->Status = Status; + + return; +} + +/* + * The function updates the statistic counters in mac->MacStat. + * It differtiates between directed and broadcast/multicast ( ==functional) + * frames. + */ +static void sktr_update_rcv_stats(struct net_local *tp, unsigned char DataPtr[], + unsigned int Length) +{ + tp->MacStat.rx_packets++; + + /* Test functional bit */ + if(DataPtr[2] & GROUP_BIT) + tp->MacStat.multicast++; + + return; +} + +/* + * Check if it is a frame of myself. Compare source address with my current + * address in reverse direction, and mask out the TR_RII. + */ +static unsigned char sktr_chk_frame(struct net_device *dev, unsigned char *Addr) +{ + int i; + + for(i = 5; i > 0; i--) + { + if(Addr[8 + i] != dev->dev_addr[i]) + return (0); + } + + /* Mask out RIF bit. */ + if((Addr[8] & ~TR_RII) != (unsigned char)(dev->dev_addr[0])) + return (0); + + return (1); /* It is my frame. */ +} + +/* + * Dump Packet (data) + */ +static void sktr_dump(unsigned char *Data, int length) +{ + int i, j; + + for (i = 0, j = 0; i < length / 8; i++, j += 8) + { + printk(KERN_DEBUG "%02x %02x %02x %02x %02x %02x %02x %02x\n", + Data[j+0],Data[j+1],Data[j+2],Data[j+3], + Data[j+4],Data[j+5],Data[j+6],Data[j+7]); + } + + return; +} + +#ifdef MODULE + +static struct net_device* dev_sktr[SKTR_MAX_ADAPTERS]; +static int io[SKTR_MAX_ADAPTERS] = { 0, 0 }; +static int irq[SKTR_MAX_ADAPTERS] = { 0, 0 }; +static int mem[SKTR_MAX_ADAPTERS] = { 0, 0 }; + +MODULE_PARM(io, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i"); +MODULE_PARM(irq, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i"); +MODULE_PARM(mem, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i"); + +int init_module(void) +{ + int i; + + for(i = 0; i < SKTR_MAX_ADAPTERS; i++) + { + irq[i] = 0; + mem[i] = 0; + dev_sktr[i] = NULL; + dev_sktr[i] = init_trdev(dev_sktr[i], 0); + if(dev_sktr[i] == NULL) + return (-ENOMEM); + + dev_sktr[i]->base_addr = io[i]; + dev_sktr[i]->irq = irq[i]; + dev_sktr[i]->mem_start = mem[i]; + dev_sktr[i]->init = &sktr_probe; + + if(register_trdev(dev_sktr[i]) != 0) + { + kfree_s(dev_sktr[i], sizeof(struct net_device)); + dev_sktr[i] = NULL; + if(i == 0) + { + printk("sktr: register_trdev() returned non-zero.\n"); + return (-EIO); + } + else + return (0); + } + } + + return (0); +} + +void cleanup_module(void) +{ + int i; + + for(i = 0; i < SKTR_MAX_ADAPTERS; i++) + { + if(dev_sktr[i]) + { + unregister_trdev(dev_sktr[i]); + release_region(dev_sktr[i]->base_addr, SKTR_IO_EXTENT); + if(dev_sktr[i]->irq) + free_irq(dev_sktr[i]->irq, dev_sktr[i]); + if(dev_sktr[i]->dma > 0) + free_dma(dev_sktr[i]->dma); + if(dev_sktr[i]->priv) + kfree_s(dev_sktr[i]->priv, sizeof(struct net_local)); + kfree_s(dev_sktr[i], sizeof(struct net_device)); + dev_sktr[i] = NULL; + } + } +} +#endif /* MODULE */ diff --git a/drivers/net/tokenring/sktr.h b/drivers/net/tokenring/sktr.h new file mode 100644 index 000000000..90b5c382f --- /dev/null +++ b/drivers/net/tokenring/sktr.h @@ -0,0 +1,1103 @@ +/* sktr.h: SysKonnect TokenRing driver for Linux + * + * Authors: + * - Christoph Goos <cgoos@syskonnect.de> + */ + +#ifndef __LINUX_SKTR_H +#define __LINUX_SKTR_H + +#ifdef __KERNEL__ + +#define SKTR_MAX_ADAPTERS 7 + +#define SEND_TIMEOUT 10*HZ + +#define TR_RCF_LONGEST_FRAME_MASK 0x0070 +#define TR_RCF_FRAME4K 0x0030 + +#define SK_ISA 0 +#define SK_PCI 1 + +/*------------------------------------------------------------------*/ +/* Bit order for adapter communication with DMA */ +/* -------------------------------------------------------------- */ +/* Bit 8 | 9| 10| 11|| 12| 13| 14| 15|| 0| 1| 2| 3|| 4| 5| 6| 7| */ +/* -------------------------------------------------------------- */ +/* The bytes in a word must be byte swapped. Also, if a double */ +/* word is used for storage, then the words, as well as the bytes, */ +/* must be swapped. */ +/* Bit order for adapter communication with DIO */ +/* -------------------------------------------------------------- */ +/* Bit 0 | 1| 2| 3|| 4| 5| 6| 7|| 8| 9| 10| 11|| 12| 13| 14| 15| */ +/* -------------------------------------------------------------- */ +/*------------------------------------------------------------------*/ + +/* Swap bytes of a word. */ +#define SWAPB(x) (((unsigned short)((x) << 8)) | ((unsigned short)((x) >> 8))) + +/* Swap words of a long. */ +#define SWAPW(x) (((x) << 16) | ((x) >> 16)) + +/* Get the low byte of a word. */ +#define LOBYTE(w) ((unsigned char)(w)) + +/* Get the high byte of a word. */ +#define HIBYTE(w) ((unsigned char)((unsigned short)(w) >> 8)) + +/* Get the low word of a long. */ +#define LOWORD(l) ((unsigned short)(l)) + +/* Get the high word of a long. */ +#define HIWORD(l) ((unsigned short)((unsigned long)(l) >> 16)) + + + +/* Token ring adapter I/O addresses for normal mode. */ +#define SIFDAT 0L /* SIF/DMA data. */ +#define SIFINC 2L /* IO Word data with auto increment. */ +#define SIFINH 3L /* IO Byte data with auto increment. */ +#define SIFADR 4L /* SIF/DMA Address. */ +#define SIFCMD 6L /* SIF Command. */ +#define SIFSTS 6L /* SIF Status. */ +#define SIFACL 8L /* SIF Adapter Control Register. */ +#define SIFADD 10L /* SIF/DMA Address. */ +#define SIFADX 12L +#define DMALEN 14L /* SIF DMA length. */ +#define POSREG 16L /* Adapter Program Option Select (POS) + * Register: base IO address + 16 byte. + */ +#define POSREG_2 24L /* only for TR4/16+ adapter + * base IO address + 24 byte. + */ + + +/* SIFCMD command codes (high-low) */ +#define CMD_INTERRUPT_ADAPTER 0x8000 /* Cause internal adapter interrupt */ +#define CMD_ADAPTER_RESET 0x4000 /* Hardware reset of adapter */ +#define CMD_SSB_CLEAR 0x2000 /* Acknowledge to adapter to + * system interrupts. + */ +#define CMD_EXECUTE 0x1000 /* Execute SCB command */ +#define CMD_SCB_REQUEST 0x0800 /* Request adapter to interrupt + * system when SCB is available for + * another command. + */ +#define CMD_RX_CONTINUE 0x0400 /* Continue receive after odd pointer + * stop. (odd pointer receive method) + */ +#define CMD_RX_VALID 0x0200 /* Now actual RPL is valid. */ +#define CMD_TX_VALID 0x0100 /* Now actual TPL is valid. (valid + * bit receive/transmit method) + */ +#define CMD_SYSTEM_IRQ 0x0080 /* Adapter-to-attached-system + * interrupt is reset. + */ +#define CMD_CLEAR_SYSTEM_IRQ 0x0080 /* Clear SYSTEM_INTERRUPT bit. + * (write: 1=ignore, 0=reset) + */ +#define EXEC_SOFT_RESET 0xFF00 /* adapter soft reset. (restart + * adapter after hardware reset) + */ + + +/* ACL commands (high-low) */ +#define ACL_SWHLDA 0x0800 /* Software hold acknowledge. */ +#define ACL_SWDDIR 0x0400 /* Data transfer direction. */ +#define ACL_SWHRQ 0x0200 /* Pseudo DMA operation. */ +#define ACL_PSDMAEN 0x0100 /* Enable pseudo system DMA. */ +#define ACL_ARESET 0x0080 /* Adapter hardware reset command. + * (held in reset condition as + * long as bit is set) + */ +#define ACL_CPHALT 0x0040 /* Communication processor halt. + * (can only be set while ACL_ARESET + * bit is set; prevents adapter + * processor from executing code while + * downloading firmware) + */ +#define ACL_BOOT 0x0020 +#define ACL_SINTEN 0x0008 /* System interrupt enable/disable + * (1/0): can be written if ACL_ARESET + * is zero. + */ +#define ACL_SPEED4 0x0003 +#define ACL_SPEED16 0x0001 +#define PS_DMA_MASK (ACL_SWHRQ | ACL_PSDMAEN) + + +/* SIFSTS register return codes (high-low) */ +#define STS_SYSTEM_IRQ 0x0080 /* Adapter-to-attached-system + * interrupt is valid. + */ +#define STS_INITIALIZE 0x0040 /* INITIALIZE status. (ready to + * initialize) + */ +#define STS_TEST 0x0020 /* TEST status. (BUD not completed) */ +#define STS_ERROR 0x0010 /* ERROR status. (unrecoverable + * HW error occurred) + */ +#define STS_MASK 0x00F0 /* Mask interesting status bits. */ +#define STS_ERROR_MASK 0x000F /* Get Error Code by masking the + * interrupt code bits. + */ +#define ADAPTER_INT_PTRS 0x0A00 /* Address offset of adapter internal + * pointers 01:0a00 (high-low) have to + * be read after init and before open. + */ + + +/* Interrupt Codes (only MAC IRQs) */ +#define STS_IRQ_ADAPTER_CHECK 0x0000 /* unrecoverable hardware or + * software error. + */ +#define STS_IRQ_RING_STATUS 0x0004 /* SSB is updated with ring status. */ +#define STS_IRQ_SCB_CLEAR 0x0006 /* SCB clear, following an + * SCB_REQUEST IRQ. + */ +#define STS_IRQ_COMMAND_STATUS 0x0008 /* SSB is updated with command + * status. + */ +#define STS_IRQ_RECEIVE_STATUS 0x000A /* SSB is updated with receive + * status. + */ +#define STS_IRQ_TRANSMIT_STATUS 0x000C /* SSB is updated with transmit + * status + */ +#define STS_IRQ_MASK 0x000F /* = STS_ERROR_MASK. */ + + +/* TRANSMIT_STATUS completion code: (SSB.Parm[0]) */ +#define COMMAND_COMPLETE 0x0080 /* TRANSMIT command completed + * (avoid this!) issue another transmit + * to send additional frames. + */ +#define FRAME_COMPLETE 0x0040 /* Frame has been transmitted; + * INTERRUPT_FRAME bit was set in the + * CSTAT request; indication of possibly + * more than one frame transmissions! + * SSB.Parm[0-1]: 32 bit pointer to + * TPL of last frame. + */ +#define LIST_ERROR 0x0020 /* Error in one of the TPLs that + * compose the frame; TRANSMIT + * terminated; Parm[1-2]: 32 bit pointer + * to TPL which starts the error + * frame; error details in bits 8-13. + * (14?) + */ +#define FRAME_SIZE_ERROR 0x8000 /* FRAME_SIZE does not equal the sum of + * the valid DATA_COUNT fields; + * FRAME_SIZE less than header plus + * information field. (15 bytes + + * routing field) Or if FRAME_SIZE + * was specified as zero in one list. + */ +#define TX_THRESHOLD 0x4000 /* FRAME_SIZE greater than (BUFFER_SIZE + * - 9) * TX_BUF_MAX. + */ +#define ODD_ADDRESS 0x2000 /* Odd forward pointer value is + * read on a list without END_FRAME + * indication. + */ +#define FRAME_ERROR 0x1000 /* START_FRAME bit is (not) anticipated, + * but (not) set. + */ +#define ACCESS_PRIORITY_ERROR 0x0800 /* Access priority requested has not + * been allowed. + */ +#define UNENABLED_MAC_FRAME 0x0400 /* MAC frame has source class of zero + * or MAC frame PCF ATTN field is + * greater than one. + */ +#define ILLEGAL_FRAME_FORMAT 0x0200 /* Bit 0 or FC field was set to one. */ + + +/* + * Since we need to support some functions even if the adapter is in a + * CLOSED state, we have a (pseudo-) command queue which holds commands + * that are outstandig to be executed. + * + * Each time a command completes, an interrupt occurs and the next + * command is executed. The command queue is actually a simple word with + * a bit for each outstandig command. Therefore the commands will not be + * executed in the order they have been queued. + * + * The following defines the command code bits and the command queue: + */ +#define OC_OPEN 0x0001 /* OPEN command */ +#define OC_TRANSMIT 0x0002 /* TRANSMIT command */ +#define OC_TRANSMIT_HALT 0x0004 /* TRANSMIT_HALT command */ +#define OC_RECEIVE 0x0008 /* RECEIVE command */ +#define OC_CLOSE 0x0010 /* CLOSE command */ +#define OC_SET_GROUP_ADDR 0x0020 /* SET_GROUP_ADDR command */ +#define OC_SET_FUNCT_ADDR 0x0040 /* SET_FUNCT_ADDR command */ +#define OC_READ_ERROR_LOG 0x0080 /* READ_ERROR_LOG command */ +#define OC_READ_ADAPTER 0x0100 /* READ_ADAPTER command */ +#define OC_MODIFY_OPEN_PARMS 0x0400 /* MODIFY_OPEN_PARMS command */ +#define OC_RESTORE_OPEN_PARMS 0x0800 /* RESTORE_OPEN_PARMS command */ +#define OC_SET_FIRST_16_GROUP 0x1000 /* SET_FIRST_16_GROUP command */ +#define OC_SET_BRIDGE_PARMS 0x2000 /* SET_BRIDGE_PARMS command */ +#define OC_CONFIG_BRIDGE_PARMS 0x4000 /* CONFIG_BRIDGE_PARMS command */ + +#define OPEN 0x0300 /* C: open command. S: completion. */ +#define TRANSMIT 0x0400 /* C: transmit command. S: completion + * status. (reject: COMMAND_REJECT if + * adapter not opened, TRANSMIT already + * issued or address passed in the SCB + * not word aligned) + */ +#define TRANSMIT_HALT 0x0500 /* C: interrupt TX TPL chain; if no + * TRANSMIT command issued, the command + * is ignored. (completion with TRANSMIT + * status (0x0400)!) + */ +#define RECEIVE 0x0600 /* C: receive command. S: completion + * status. (reject: COMMAND_REJECT if + * adapter not opened, RECEIVE already + * issued or address passed in the SCB + * not word aligned) + */ +#define CLOSE 0x0700 /* C: close adapter. S: completion. + * (COMMAND_REJECT if adapter not open) + */ +#define SET_GROUP_ADDR 0x0800 /* C: alter adapter group address after + * OPEN. S: completion. (COMMAND_REJECT + * if adapter not open) + */ +#define SET_FUNCT_ADDR 0x0900 /* C: alter adapter functional address + * after OPEN. S: completion. + * (COMMAND_REJECT if adapter not open) + */ +#define READ_ERROR_LOG 0x0A00 /* C: read adapter error counters. + * S: completion. (command ignored + * if adapter not open!) + */ +#define READ_ADAPTER 0x0B00 /* C: read data from adapter memory. + * (important: after init and before + * open!) S: completion. (ADAPTER_CHECK + * interrupt if undefined storage area + * read) + */ +#define MODIFY_OPEN_PARMS 0x0D00 /* C: modify some adapter operational + * parameters. (bit correspondend to + * WRAP_INTERFACE is ignored) + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define RESTORE_OPEN_PARMS 0x0E00 /* C: modify some adapter operational + * parameters. (bit correspondend + * to WRAP_INTERFACE is ignored) + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define SET_FIRST_16_GROUP 0x0F00 /* C: alter the first two bytes in + * adapter group address. + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define SET_BRIDGE_PARMS 0x1000 /* C: values and conditions for the + * adapter hardware to use when frames + * are copied for forwarding. + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define CONFIG_BRIDGE_PARMS 0x1100 /* C: .. + * S: completion. (reject: + * COMMAND_REJECT) + */ + +#define SPEED_4 4 +#define SPEED_16 16 /* Default transmission speed */ + + +/* Initialization Parameter Block (IPB); word alignment necessary! */ +#define BURST_SIZE 0x0018 /* Default burst size */ +#define BURST_MODE 0x9F00 /* Burst mode enable */ +#define DMA_RETRIES 0x0505 /* Magic DMA retry number... */ + +#define CYCLE_TIME 3 /* Default AT-bus cycle time: 500 ns + * (later adapter version: fix cycle time!) + */ +#define LINE_SPEED_BIT 0x80 + +/* Macro definition for the wait function. */ +#define ONE_SECOND_TICKS 1000000 +#define HALF_SECOND (ONE_SECOND_TICKS / 2) +#define ONE_SECOND (ONE_SECOND_TICKS) +#define TWO_SECONDS (ONE_SECOND_TICKS * 2) +#define THREE_SECONDS (ONE_SECOND_TICKS * 3) +#define FOUR_SECONDS (ONE_SECOND_TICKS * 4) +#define FIVE_SECONDS (ONE_SECOND_TICKS * 5) + +#define BUFFER_SIZE 2048 /* Buffers on Adapter */ + +#pragma pack(1) +typedef struct { + unsigned short Init_Options; /* Initialize with burst mode; + * LLC disabled. (MAC only) + */ + + /* Interrupt vectors the adapter places on attached system bus. */ + unsigned char CMD_Status_IV; /* Interrupt vector: command status. */ + unsigned char TX_IV; /* Interrupt vector: transmit. */ + unsigned char RX_IV; /* Interrupt vector: receive. */ + unsigned char Ring_Status_IV; /* Interrupt vector: ring status. */ + unsigned char SCB_Clear_IV; /* Interrupt vector: SCB clear. */ + unsigned char Adapter_CHK_IV; /* Interrupt vector: adapter check. */ + + unsigned short RX_Burst_Size; /* Max. number of transfer cycles. */ + unsigned short TX_Burst_Size; /* During DMA burst; even value! */ + unsigned short DMA_Abort_Thrhld; /* Number of DMA retries. */ + + unsigned long SCB_Addr; /* SCB address: even, word aligned, high-low. */ + unsigned long SSB_Addr; /* SSB address: even, word aligned, high-low. */ +} IPB, *IPB_Ptr; +#pragma pack() + +/* + * OPEN Command Parameter List (OCPL) (can be reused, if the adapter has to + * be reopened) + */ +#define BUFFER_SIZE 2048 /* Buffers on Adapter. */ +#define TPL_SIZE 8+6*TX_FRAG_NUM /* Depending on fragments per TPL. */ +#define RPL_SIZE 14 /* (with TI firmware v2.26 handling + * up to nine fragments possible) + */ +#define TX_BUF_MIN 20 /* ??? (Stephan: calculation with */ +#define TX_BUF_MAX 40 /* BUFFER_SIZE and MAX_FRAME_SIZE) ??? + */ +#define DISABLE_EARLY_TOKEN_RELEASE 0x1000 + +/* OPEN Options (high-low) */ +#define WRAP_INTERFACE 0x0080 /* Inserting omitted for test + * purposes; transmit data appears + * as receive data. (usefull for + * testing; change: CLOSE necessary) + */ +#define DISABLE_HARD_ERROR 0x0040 /* On HARD_ERROR & TRANSMIT_BEACON + * no RING.STATUS interrupt. + */ +#define DISABLE_SOFT_ERROR 0x0020 /* On SOFT_ERROR, no RING.STATUS + * interrupt. + */ +#define PASS_ADAPTER_MAC_FRAMES 0x0010 /* Passing unsupported MAC frames + * to system. + */ +#define PASS_ATTENTION_FRAMES 0x0008 /* All changed attention MAC frames are + * passed to the system. + */ +#define PAD_ROUTING_FIELD 0x0004 /* Routing field is padded to 18 + * bytes. + */ +#define FRAME_HOLD 0x0002 /* Adapter waits for entire frame before + * initiating DMA transfer; otherwise: + * DMA transfer initiation if internal + * buffer filled. + */ +#define CONTENDER 0x0001 /* Adapter participates in the monitor + * contention process. + */ +#define PASS_BEACON_MAC_FRAMES 0x8000 /* Adapter passes beacon MAC frames + * to the system. + */ +#define EARLY_TOKEN_RELEASE 0x1000 /* Only valid in 16 Mbps operation; + * 0 = ETR. (no effect in 4 Mbps + * operation) + */ +#define COPY_ALL_MAC_FRAMES 0x0400 /* All MAC frames are copied to + * the system. (after OPEN: duplicate + * address test (DAT) MAC frame is + * first received frame copied to the + * system) + */ +#define COPY_ALL_NON_MAC_FRAMES 0x0200 /* All non MAC frames are copied to + * the system. + */ +#define PASS_FIRST_BUF_ONLY 0x0100 /* Passes only first internal buffer + * of each received frame; FrameSize + * of RPLs must contain internal + * BUFFER_SIZE bits for promiscous mode. + */ +#define ENABLE_FULL_DUPLEX_SELECTION 0x2000 /* Enable the use of full-duplex + * settings with bits in byte 22 in + * ocpl. (new feature in firmware + * version 3.09) + */ + +/* Full-duplex settings */ +#define OPEN_FULL_DUPLEX_OFF 0x0000 +#define OPEN_FULL_DUPLEX_ON 0x00c0 +#define OPEN_FULL_DUPLEX_AUTO 0x0080 + +#define PROD_ID_SIZE 18 /* Length of product ID. */ + +#define TX_FRAG_NUM 3 /* Number of fragments used in one TPL. */ +#define TX_MORE_FRAGMENTS 0x8000 /* Bit set in DataCount to indicate more + * fragments following. + */ + +#define ISA_MAX_ADDRESS 0x00ffffff + +#pragma pack(1) +typedef struct { + unsigned short OPENOptions; + unsigned char NodeAddr[6]; /* Adapter node address; use ROM + * address + */ + unsigned long GroupAddr; /* Multicast: high order + * bytes = 0xC000 + */ + unsigned long FunctAddr; /* High order bytes = 0xC000 */ + unsigned short RxListSize; /* RPL size: 0 (=26), 14, 20 or + * 26 bytes read by the adapter. + * (Depending on the number of + * fragments/list) + */ + unsigned short TxListSize; /* TPL size */ + unsigned short BufSize; /* Is automatically rounded up to the + * nearest nK boundary. + */ + unsigned short FullDuplex; + unsigned short Reserved; + unsigned char TXBufMin; /* Number of adapter buffers reserved + * for transmission a minimum of 2 + * buffers must be allocated. + */ + unsigned char TXBufMax; /* Maximum number of adapter buffers + * for transmit; a minimum of 2 buffers + * must be available for receive. + * Default: 6 + */ + unsigned short ProdIDAddr[2]; /* Pointer to product ID. */ +} OPB, *OPB_Ptr; +#pragma pack() + +/* + * SCB: adapter commands enabled by the host system started by writing + * CMD_INTERRUPT_ADAPTER | CMD_EXECUTE (|SCB_REQUEST) to the SIFCMD IO + * register. (special case: | CMD_SYSTEM_IRQ for initialization) + */ +#pragma pack(1) +typedef struct { + unsigned short CMD; /* Command code */ + unsigned short Parm[2]; /* Pointer to Command Parameter Block */ +} SCB; /* System Command Block (32 bit physical address; big endian)*/ +#pragma pack() + +/* + * SSB: adapter command return status can be evaluated after COMMAND_STATUS + * adapter to system interrupt after reading SSB, the availability of the SSB + * has to be told the adapter by writing CMD_INTERRUPT_ADAPTER | CMD_SSB_CLEAR + * in the SIFCMD IO register. + */ +#pragma pack(1) +typedef struct { + unsigned short STS; /* Status code */ + unsigned short Parm[3]; /* Parameter or pointer to Status Parameter + * Block. + */ +} SSB; /* System Status Block (big endian - physical address) */ +#pragma pack() + +typedef struct { + unsigned short BurnedInAddrPtr; /* Pointer to adapter burned in + * address. (BIA) + */ + unsigned short SoftwareLevelPtr;/* Pointer to software level data. */ + unsigned short AdapterAddrPtr; /* Pointer to adapter addresses. */ + unsigned short AdapterParmsPtr; /* Pointer to adapter parameters. */ + unsigned short MACBufferPtr; /* Pointer to MAC buffer. (internal) */ + unsigned short LLCCountersPtr; /* Pointer to LLC counters. */ + unsigned short SpeedFlagPtr; /* Pointer to data rate flag. + * (4/16 Mbps) + */ + unsigned short AdapterRAMPtr; /* Pointer to adapter RAM found. (KB) */ +} INTPTRS; /* Adapter internal pointers */ + +#pragma pack(1) +typedef struct { + unsigned char Line_Error; /* Line error: code violation in + * frame or in a token, or FCS error. + */ + unsigned char Internal_Error; /* IBM specific. (Reserved_1) */ + unsigned char Burst_Error; + unsigned char ARI_FCI_Error; /* ARI/FCI bit zero in AMP or + * SMP MAC frame. + */ + unsigned char AbortDelimeters; /* IBM specific. (Reserved_2) */ + unsigned char Reserved_3; + unsigned char Lost_Frame_Error; /* Receive of end of transmitted + * frame failed. + */ + unsigned char Rx_Congest_Error; /* Adapter in repeat mode has not + * enough buffer space to copy incoming + * frame. + */ + unsigned char Frame_Copied_Error;/* ARI bit not zero in frame + * addressed to adapter. + */ + unsigned char Frequency_Error; /* IBM specific. (Reserved_4) */ + unsigned char Token_Error; /* (active only in monitor station) */ + unsigned char Reserved_5; + unsigned char DMA_Bus_Error; /* DMA bus errors not exceeding the + * abort thresholds. + */ + unsigned char DMA_Parity_Error; /* DMA parity errors not exceeding + * the abort thresholds. + */ +} ERRORTAB; /* Adapter error counters */ +#pragma pack() + + +/*--------------------- Send and Receive definitions -------------------*/ +#pragma pack(1) +typedef struct { + unsigned short DataCount; /* Value 0, even and odd values are + * permitted; value is unaltered most + * significant bit set: following + * fragments last fragment: most + * significant bit is not evaluated. + * (???) + */ + unsigned long DataAddr; /* Pointer to frame data fragment; + * even or odd. + */ +} Fragment; +#pragma pack() + +#define MAX_FRAG_NUMBERS 9 /* Maximal number of fragments possible to use + * in one RPL/TPL. (depending on TI firmware + * version) + */ +#define MAX_TX_QUEUE 10 /* Maximal number of skb's queued in driver. */ + +/* + * AC (1), FC (1), Dst (6), Src (6), RIF (18), Data (4472) = 4504 + * The packet size can be one of the follows: 548, 1502, 2084, 4504, 8176, + * 11439, 17832. Refer to TMS380 Second Generation Token Ring User's Guide + * Page 2-27. + */ +#define HEADER_SIZE (1 + 1 + 6 + 6) +#define SRC_SIZE 18 +#define MIN_DATA_SIZE 516 +#define DEFAULT_DATA_SIZE 4472 +#define MAX_DATA_SIZE 17800 + +#define DEFAULT_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + DEFAULT_DATA_SIZE) +#define MIN_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + MIN_DATA_SIZE) +#define MAX_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + MAX_DATA_SIZE) + +/* + * Macros to deal with the frame status field. + */ +#define AC_NOT_RECOGNIZED 0x00 +#define GROUP_BIT 0x80 +#define GET_TRANSMIT_STATUS_HIGH_BYTE(Ts) ((unsigned char)((Ts) >> 8)) +#define GET_FRAME_STATUS_HIGH_AC(Fs) ((unsigned char)(((Fs) & 0xC0) >> 6)) +#define GET_FRAME_STATUS_LOW_AC(Fs) ((unsigned char)(((Fs) & 0x0C) >> 2)) +#define DIRECTED_FRAME(Context) (!((Context)->MData[2] & GROUP_BIT)) + + +/*--------------------- Send Functions ---------------------------------*/ +/* define TX_CSTAT _REQUEST (R) and _COMPLETE (C) values (high-low) */ + +#define TX_VALID 0x0080 /* R: set via TRANSMIT.VALID interrupt. + * C: always reset to zero! + */ +#define TX_FRAME_COMPLETE 0x0040 /* R: must be reset to zero. + * C: set to one. + */ +#define TX_START_FRAME 0x0020 /* R: start of a frame: 1 + * C: unchanged. + */ +#define TX_END_FRAME 0x0010 /* R: end of a frame: 1 + * C: unchanged. + */ +#define TX_FRAME_IRQ 0x0008 /* R: request interrupt generation + * after transmission. + * C: unchanged. + */ +#define TX_ERROR 0x0004 /* R: reserved. + * C: set to one if Error occurred. + */ +#define TX_INTERFRAME_WAIT 0x0004 +#define TX_PASS_CRC 0x0002 /* R: set if CRC value is already + * calculated. (valid only in + * FRAME_START TPL) + * C: unchanged. + */ +#define TX_PASS_SRC_ADDR 0x0001 /* R: adapter uses explicit frame + * source address and does not overwrite + * with the adapter node address. + * (valid only in FRAME_START TPL) + * + * C: unchanged. + */ +#define TX_STRIP_FS 0xFF00 /* R: reserved. + * C: if no Transmission Error, + * field contains copy of FS byte after + * stripping of frame. + */ + +/* + * Structure of Transmit Parameter Lists (TPLs) (only one frame every TPL, + * but possibly multiple TPLs for one frame) the length of the TPLs has to be + * initialized in the OPL. (OPEN parameter list) + */ +#define TPL_NUM 9 /* Number of Transmit Parameter Lists. + * !! MUST BE >= 3 !! + */ + +#pragma pack(1) +typedef struct s_TPL TPL; + +struct s_TPL { /* Transmit Parameter List (align on even word boundaries) */ + unsigned long NextTPLAddr; /* Pointer to next TPL in chain; if + * pointer is odd: this is the last + * TPL. Pointing to itself can cause + * problems! + */ + volatile unsigned short Status; /* Initialized by the adapter: + * CSTAT_REQUEST important: update least + * significant bit first! Set by the + * adapter: CSTAT_COMPLETE status. + */ + unsigned short FrameSize; /* Number of bytes to be transmitted + * as a frame including AC/FC, + * Destination, Source, Routing field + * not including CRC, FS, End Delimiter + * (valid only if START_FRAME bit in + * CSTAT nonzero) must not be zero in + * any list; maximum value: (BUFFER_SIZE + * - 8) * TX_BUF_MAX sum of DataCount + * values in FragmentList must equal + * Frame_Size value in START_FRAME TPL! + * frame data fragment list. + */ + + /* TPL/RPL size in OPEN parameter list depending on maximal + * numbers of fragments used in one parameter list. + */ + Fragment FragList[TX_FRAG_NUM]; /* Maximum: nine frame fragments in one + * TPL actual version of firmware: 9 + * fragments possible. + */ +#pragma pack() + + /* Special proprietary data and precalculations */ + + TPL *NextTPLPtr; /* Pointer to next TPL in chain. */ + unsigned char *MData; + struct sk_buff *Skb; + unsigned char TPLIndex; + volatile unsigned char BusyFlag;/* Flag: TPL busy? */ +}; + +/* ---------------------Receive Functions-------------------------------* + * define RECEIVE_CSTAT_REQUEST (R) and RECEIVE_CSTAT_COMPLETE (C) values. + * (high-low) + */ +#define RX_VALID 0x0080 /* R: set; tell adapter with + * RECEIVE.VALID interrupt. + * C: reset to zero. + */ +#define RX_FRAME_COMPLETE 0x0040 /* R: must be reset to zero, + * C: set to one. + */ +#define RX_START_FRAME 0x0020 /* R: must be reset to zero. + * C: set to one on the list. + */ +#define RX_END_FRAME 0x0010 /* R: must be reset to zero. + * C: set to one on the list + * that ends the frame. + */ +#define RX_FRAME_IRQ 0x0008 /* R: request interrupt generation + * after receive. + * C: unchanged. + */ +#define RX_INTERFRAME_WAIT 0x0004 /* R: after receiving a frame: + * interrupt and wait for a + * RECEIVE.CONTINUE. + * C: unchanged. + */ +#define RX_PASS_CRC 0x0002 /* R: if set, the adapter includes + * the CRC in data passed. (last four + * bytes; valid only if FRAME_START is + * set) + * C: set, if CRC is included in + * received data. + */ +#define RX_PASS_SRC_ADDR 0x0001 /* R: adapter uses explicit frame + * source address and does not + * overwrite with the adapter node + * address. (valid only if FRAME_START + * is set) + * C: unchanged. + */ +#define RX_RECEIVE_FS 0xFC00 /* R: reserved; must be reset to zero. + * C: on lists with START_FRAME, field + * contains frame status field from + * received frame; otherwise cleared. + */ +#define RX_ADDR_MATCH 0x0300 /* R: reserved; must be reset to zero. + * C: address match code mask. + */ +#define RX_STATUS_MASK 0x00FF /* Mask for receive status bits. */ + +#define RX_INTERN_ADDR_MATCH 0x0100 /* C: internally address match. */ +#define RX_EXTERN_ADDR_MATCH 0x0200 /* C: externally matched via + * XMATCH/XFAIL interface. + */ +#define RX_INTEXT_ADDR_MATCH 0x0300 /* C: internally and externally + * matched. + */ +#define RX_READY (RX_VALID | RX_FRAME_IRQ) /* Ready for receive. */ + +/* Constants for Command Status Interrupt. + * COMMAND_REJECT status field bit functions (SSB.Parm[0]) + */ +#define ILLEGAL_COMMAND 0x0080 /* Set if an unknown command + * is issued to the adapter + */ +#define ADDRESS_ERROR 0x0040 /* Set if any address field in + * the SCB is odd. (not word aligned) + */ +#define ADAPTER_OPEN 0x0020 /* Command issued illegal with + * open adapter. + */ +#define ADAPTER_CLOSE 0x0010 /* Command issued illegal with + * closed adapter. + */ +#define SAME_COMMAND 0x0008 /* Command issued with same command + * already executing. + */ + +/* OPEN_COMPLETION values (SSB.Parm[0], MSB) */ +#define NODE_ADDR_ERROR 0x0040 /* Wrong address or BIA read + * zero address. + */ +#define LIST_SIZE_ERROR 0x0020 /* If List_Size value not in 0, + * 14, 20, 26. + */ +#define BUF_SIZE_ERROR 0x0010 /* Not enough available memory for + * two buffers. + */ +#define TX_BUF_COUNT_ERROR 0x0004 /* Remaining receive buffers less than + * two. + */ +#define OPEN_ERROR 0x0002 /* Error during ring insertion; more + * information in bits 8-15. + */ + +/* Standard return codes */ +#define GOOD_COMPLETION 0x0080 /* =OPEN_SUCCESSFULL */ +#define INVALID_OPEN_OPTION 0x0001 /* OPEN options are not supported by + * the adapter. + */ + +/* OPEN phases; details of OPEN_ERROR (SSB.Parm[0], LSB) */ +#define OPEN_PHASES_MASK 0xF000 /* Check only the bits 8-11. */ +#define LOBE_MEDIA_TEST 0x1000 +#define PHYSICAL_INSERTION 0x2000 +#define ADDRESS_VERIFICATION 0x3000 +#define PARTICIPATION_IN_RING_POLL 0x4000 +#define REQUEST_INITIALISATION 0x5000 +#define FULLDUPLEX_CHECK 0x6000 + +/* OPEN error codes; details of OPEN_ERROR (SSB.Parm[0], LSB) */ +#define OPEN_ERROR_CODES_MASK 0x0F00 /* Check only the bits 12-15. */ +#define OPEN_FUNCTION_FAILURE 0x0100 /* Unable to transmit to itself or + * frames received before insertion. + */ +#define OPEN_SIGNAL_LOSS 0x0200 /* Signal loss condition detected at + * receiver. + */ +#define OPEN_TIMEOUT 0x0500 /* Insertion timer expired before + * logical insertion. + */ +#define OPEN_RING_FAILURE 0x0600 /* Unable to receive own ring purge + * MAC frames. + */ +#define OPEN_RING_BEACONING 0x0700 /* Beacon MAC frame received after + * ring insertion. + */ +#define OPEN_DUPLICATE_NODEADDR 0x0800 /* Other station in ring found + * with the same address. + */ +#define OPEN_REQUEST_INIT 0x0900 /* RPS present but does not respond. */ +#define OPEN_REMOVE_RECEIVED 0x0A00 /* Adapter received a remove adapter + * MAC frame. + */ +#define OPEN_FULLDUPLEX_SET 0x0D00 /* Got this with full duplex on when + * trying to connect to a normal ring. + */ + +/* SET_BRIDGE_PARMS return codes: */ +#define BRIDGE_INVALID_MAX_LEN 0x4000 /* MAX_ROUTING_FIELD_LENGTH odd, + * less than 6 or > 30. + */ +#define BRIDGE_INVALID_SRC_RING 0x2000 /* SOURCE_RING number zero, too large + * or = TARGET_RING. + */ +#define BRIDGE_INVALID_TRG_RING 0x1000 /* TARGET_RING number zero, too large + * or = SOURCE_RING. + */ +#define BRIDGE_INVALID_BRDGE_NO 0x0800 /* BRIDGE_NUMBER too large. */ +#define BRIDGE_INVALID_OPTIONS 0x0400 /* Invalid bridge options. */ +#define BRIDGE_DIAGS_FAILED 0x0200 /* Diagnostics of TMS380SRA failed. */ +#define BRIDGE_NO_SRA 0x0100 /* The TMS380SRA does not exist in HW + * configuration. + */ + +/* + * Bring Up Diagnostics error codes. + */ +#define BUD_INITIAL_ERROR 0x0 +#define BUD_CHECKSUM_ERROR 0x1 +#define BUD_ADAPTER_RAM_ERROR 0x2 +#define BUD_INSTRUCTION_ERROR 0x3 +#define BUD_CONTEXT_ERROR 0x4 +#define BUD_PROTOCOL_ERROR 0x5 +#define BUD_INTERFACE_ERROR 0x6 + +/* BUD constants */ +#define BUD_MAX_RETRIES 3 +#define BUD_MAX_LOOPCNT 6 +#define BUD_TIMEOUT 3000 + +/* Initialization constants */ +#define INIT_MAX_RETRIES 3 /* Maximum three retries. */ +#define INIT_MAX_LOOPCNT 22 /* Maximum loop counts. */ + +/* RING STATUS field values (high/low) */ +#define SIGNAL_LOSS 0x0080 /* Loss of signal on the ring + * detected. + */ +#define HARD_ERROR 0x0040 /* Transmitting or receiving beacon + * frames. + */ +#define SOFT_ERROR 0x0020 /* Report error MAC frame + * transmitted. + */ +#define TRANSMIT_BEACON 0x0010 /* Transmitting beacon frames on the + * ring. + */ +#define LOBE_WIRE_FAULT 0x0008 /* Open or short circuit in the + * cable to concentrator; adapter + * closed. + */ +#define AUTO_REMOVAL_ERROR 0x0004 /* Lobe wrap test failed, deinserted; + * adapter closed. + */ +#define REMOVE_RECEIVED 0x0001 /* Received a remove ring station MAC + * MAC frame request; adapter closed. + */ +#define COUNTER_OVERFLOW 0x8000 /* Overflow of one of the adapters + * error counters; READ.ERROR.LOG. + */ +#define SINGLE_STATION 0x4000 /* Adapter is the only station on the + * ring. + */ +#define RING_RECOVERY 0x2000 /* Claim token MAC frames on the ring; + * reset after ring purge frame. + */ + +#define ADAPTER_CLOSED (LOBE_WIRE_FAULT | AUTO_REMOVAL_ERROR |\ + REMOVE_RECEIVED) + +/* Adapter_check_block.Status field bit assignments: */ +#define DIO_PARITY 0x8000 /* Adapter detects bad parity + * through direct I/O access. + */ +#define DMA_READ_ABORT 0x4000 /* Aborting DMA read operation + * from system Parm[0]: 0=timeout, + * 1=parity error, 2=bus error; + * Parm[1]: 32 bit pointer to host + * system address at failure. + */ +#define DMA_WRITE_ABORT 0x2000 /* Aborting DMA write operation + * to system. (parameters analogous to + * DMA_READ_ABORT) + */ +#define ILLEGAL_OP_CODE 0x1000 /* Illegal operation code in the + * the adapters firmware Parm[0]-2: + * communications processor registers + * R13-R15. + */ +#define PARITY_ERRORS 0x0800 /* Adapter detects internal bus + * parity error. + */ +#define RAM_DATA_ERROR 0x0080 /* Valid only during RAM testing; + * RAM data error Parm[0-1]: 32 bit + * pointer to RAM location. + */ +#define RAM_PARITY_ERROR 0x0040 /* Valid only during RAM testing; + * RAM parity error Parm[0-1]: 32 bit + * pointer to RAM location. + */ +#define RING_UNDERRUN 0x0020 /* Internal DMA underrun when + * transmitting onto ring. + */ +#define INVALID_IRQ 0x0008 /* Unrecognized interrupt generated + * internal to adapter Parm[0-2]: + * adapter register R13-R15. + */ +#define INVALID_ERROR_IRQ 0x0004 /* Unrecognized error interrupt + * generated Parm[0-2]: adapter register + * R13-R15. + */ +#define INVALID_XOP 0x0002 /* Unrecognized XOP request in + * communication processor Parm[0-2]: + * adapter register R13-R15. + */ +#define CHECKADDR 0x05E0 /* Adapter check status information + * address offset. + */ +#define ROM_PAGE_0 0x0000 /* Adapter ROM page 0. */ + +/* + * RECEIVE.STATUS interrupt result SSB values: (high-low) + * (RECEIVE_COMPLETE field bit definitions in SSB.Parm[0]) + */ +#define RX_COMPLETE 0x0080 /* SSB.Parm[0]; SSB.Parm[1]: 32 + * bit pointer to last RPL. + */ +#define RX_SUSPENDED 0x0040 /* SSB.Parm[0]; SSB.Parm[1]: 32 + * bit pointer to RPL with odd + * forward pointer. + */ + +/* Valid receive CSTAT: */ +#define RX_FRAME_CONTROL_BITS (RX_VALID | RX_START_FRAME | RX_END_FRAME | \ + RX_FRAME_COMPLETE) +#define VALID_SINGLE_BUFFER_FRAME (RX_START_FRAME | RX_END_FRAME | \ + RX_FRAME_COMPLETE) + +typedef enum SKB_STAT SKB_STAT; +enum SKB_STAT { + SKB_UNAVAILABLE, + SKB_DMA_DIRECT, + SKB_DATA_COPY +}; + +/* Receive Parameter List (RPL) The length of the RPLs has to be initialized + * in the OPL. (OPEN parameter list) + */ +#define RPL_NUM 3 + +#define RX_FRAG_NUM 1 /* Maximal number of used fragments in one RPL. + * (up to firmware v2.24: 3, now: up to 9) + */ + +#pragma pack(1) +typedef struct s_RPL RPL; +struct s_RPL { /* Receive Parameter List */ + unsigned long NextRPLAddr; /* Pointer to next RPL in chain + * (normalized = physical 32 bit + * address) if pointer is odd: this + * is last RPL. Pointing to itself can + * cause problems! + */ + volatile unsigned short Status; /* Set by creation of Receive Parameter + * List RECEIVE_CSTAT_COMPLETE set by + * adapter in lists that start or end + * a frame. + */ + volatile unsigned short FrameSize; /* Number of bytes received as a + * frame including AC/FC, Destination, + * Source, Routing field not including + * CRC, FS (Frame Status), End Delimiter + * (valid only if START_FRAME bit in + * CSTAT nonzero) must not be zero in + * any list; maximum value: (BUFFER_SIZE + * - 8) * TX_BUF_MAX sum of DataCount + * values in FragmentList must equal + * Frame_Size value in START_FRAME TPL! + * frame data fragment list + */ + + /* TPL/RPL size in OPEN parameter list depending on maximal numbers + * of fragments used in one parameter list. + */ + Fragment FragList[RX_FRAG_NUM]; /* Maximum: nine frame fragments in + * one TPL. Actual version of firmware: + * 9 fragments possible. + */ +#pragma pack() + + /* Special proprietary data and precalculations. */ + RPL *NextRPLPtr; /* Logical pointer to next RPL in chain. */ + unsigned char *MData; + struct sk_buff *Skb; + SKB_STAT SkbStat; + int RPLIndex; +}; + +/* Information that need to be kept for each board. */ +typedef struct net_local { +#pragma pack(1) + IPB ipb; /* Initialization Parameter Block. */ + SCB scb; /* System Command Block: system to adapter + * communication. + */ + SSB ssb; /* System Status Block: adapter to system + * communication. + */ + OPB ocpl; /* Open Options Parameter Block. */ + + ERRORTAB errorlogtable; /* Adapter statistic error counters. + * (read from adapter memory) + */ + unsigned char ProductID[PROD_ID_SIZE + 1]; /* Product ID */ +#pragma pack() + + TPL Tpl[TPL_NUM]; + TPL *TplFree; + TPL *TplBusy; + unsigned char LocalTxBuffers[TPL_NUM][DEFAULT_PACKET_SIZE]; + + RPL Rpl[RPL_NUM]; + RPL *RplHead; + RPL *RplTail; + unsigned char LocalRxBuffers[RPL_NUM][DEFAULT_PACKET_SIZE]; + + int DataRate; + unsigned char ScbInUse; + unsigned short CMDqueue; + + unsigned int DeviceType; + + unsigned long AdapterOpenFlag:1; + unsigned long AdapterVirtOpenFlag:1; + unsigned long OpenCommandIssued:1; + unsigned long TransmitCommandActive:1; + unsigned long TransmitHaltScheduled:1; + unsigned long HaltInProgress:1; + unsigned long LobeWireFaultLogged:1; + unsigned long ReOpenInProgress:1; + unsigned long Sleeping:1; + + unsigned long LastOpenStatus; + unsigned short CurrentRingStatus; + unsigned long MaxPacketSize; + + unsigned long StartTime; + unsigned long LastSendTime; + + struct sk_buff_head SendSkbQueue; + unsigned short QueueSkb; + + struct tr_statistics MacStat; /* MAC statistics structure */ + + struct timer_list timer; + + wait_queue_head_t wait_for_tok_int; + + INTPTRS intptrs; /* Internal adapter pointer. Must be read + * before OPEN command. + */ +} NET_LOCAL; + +#endif /* __KERNEL__ */ +#endif /* __LINUX_SKTR_H */ diff --git a/drivers/net/tokenring/sktr_firmware.h b/drivers/net/tokenring/sktr_firmware.h new file mode 100644 index 000000000..25dd973d4 --- /dev/null +++ b/drivers/net/tokenring/sktr_firmware.h @@ -0,0 +1,3616 @@ +/* + * The firmware this driver downloads into the tokenring card is a + * separate program and is not GPL'd source code, even though the Linux + * side driver and the routine that loads this data into the card are. + * + * This firmware is licensed to you strictly for use in conjunction + * with the use of SysKonnect TokenRing adapters. There is no + * waranty expressed or implied about its fitness for any purpose. + */ + +/* sktr_firmware.h: SysKonnect TokenRing driver firmware dump for Linux. + * + * Notes: + * - Loaded from sktr_reset_adapter upon adapter reset. + * + * Authors: + * - Christoph Goos <cgoos@syskonnect.de> + */ + +#include <linux/config.h> + +#if defined(CONFIG_SKTR) || defined(CONFIG_SKTR_MODULE) + +unsigned char sktr_code[] = { + 0x00, 0x00, 0x00, 0xA0, 0x00, 0x20, 0x68, 0x54, + 0x73, 0x69, 0x63, 0x20, 0x64, 0x6F, 0x20, 0x65, + 0x73, 0x69, 0x72, 0x20, 0x6C, 0x65, 0x61, 0x65, + 0x65, 0x73, 0x20, 0x64, 0x6E, 0x75, 0x65, 0x64, + 0x20, 0x72, 0x69, 0x6C, 0x65, 0x63, 0x63, 0x6E, + 0x20, 0x65, 0x6E, 0x4F, 0x79, 0x6C, 0x20, 0x2C, + 0x6C, 0x41, 0x20, 0x6C, 0x69, 0x72, 0x68, 0x67, + 0x73, 0x74, 0x72, 0x20, 0x73, 0x65, 0x72, 0x65, + 0x65, 0x76, 0x2E, 0x64, 0x60, 0x01, 0x42, 0x01, + 0x00, 0x08, 0x08, 0x16, 0xB0, 0x03, 0xE0, 0x04, + 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0xFF, 0xFF, + 0xFC, 0x13, 0x80, 0x03, 0xA0, 0x07, 0x42, 0x01, + 0x00, 0x08, 0x20, 0x07, 0x00, 0x00, 0xE0, 0x04, + 0x00, 0x01, 0x8B, 0x07, 0x00, 0x3D, 0x60, 0x01, + 0x42, 0x01, 0x80, 0x00, 0x09, 0x13, 0x8B, 0x07, + 0x00, 0x2D, 0x20, 0xC0, 0x4E, 0x01, 0x80, 0x02, + 0x41, 0x0F, 0x02, 0x11, 0x8B, 0x07, 0x00, 0x3D, + 0x0B, 0xC8, 0x4A, 0x01, 0x00, 0x02, 0x00, 0x90, + 0xA0, 0x09, 0x00, 0xC8, 0x66, 0x01, 0xE0, 0x02, + 0xA0, 0x00, 0xA0, 0x07, 0x04, 0x01, 0x20, 0x00, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0xFE, 0x20, 0x48, + 0x2A, 0xE0, 0x42, 0x01, 0xE0, 0x04, 0x02, 0x01, + 0xE0, 0x04, 0x60, 0x09, 0xE0, 0x04, 0x82, 0x01, + 0x60, 0x01, 0x1C, 0x01, 0x04, 0x00, 0x03, 0x16, + 0xE0, 0x01, 0x40, 0x01, 0x00, 0x0C, 0xA0, 0x06, + 0xBC, 0xA1, 0xA0, 0x07, 0x04, 0x01, 0x2D, 0x00, + 0x20, 0xC2, 0x00, 0xE0, 0x88, 0x02, 0x11, 0xE3, + 0x14, 0x16, 0xA0, 0x07, 0x04, 0x01, 0x2E, 0x00, + 0x60, 0x01, 0x42, 0x01, 0x00, 0x03, 0x0D, 0x16, + 0xA0, 0x07, 0x04, 0x01, 0x21, 0x00, 0x88, 0x07, + 0x00, 0xA0, 0x89, 0x07, 0xFE, 0xFF, 0xA8, 0x09, + 0xA9, 0x09, 0x8A, 0x07, 0x02, 0xE0, 0xA0, 0x06, + 0x84, 0xEC, 0x56, 0x10, 0x88, 0x07, 0x00, 0x90, + 0x89, 0x07, 0xFE, 0x9F, 0xA8, 0x09, 0xA9, 0x09, + 0x8A, 0x07, 0x78, 0xE0, 0xA0, 0x06, 0x84, 0xEC, + 0x4B, 0x10, 0xA0, 0x05, 0x04, 0x01, 0x88, 0x07, + 0x08, 0x00, 0x89, 0x07, 0x7A, 0x00, 0x00, 0x03, + 0x01, 0x00, 0xA0, 0x06, 0xD2, 0xAC, 0x40, 0x10, + 0xA0, 0x06, 0xBC, 0xA1, 0xE0, 0x02, 0xF4, 0x03, + 0x88, 0x07, 0xA0, 0x00, 0x89, 0x07, 0xFE, 0x00, + 0xA0, 0x06, 0xD2, 0xAC, 0x35, 0x10, 0xE0, 0x02, + 0xA0, 0x00, 0xE0, 0x04, 0x7E, 0x01, 0xC8, 0x04, + 0x09, 0x02, 0xF2, 0x03, 0x48, 0x62, 0xE0, 0xC1, + 0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, + 0x18, 0xCE, 0x09, 0x06, 0xFD, 0x16, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0x40, 0x07, 0xC8, 0x40, 0x01, + 0x88, 0x07, 0xF4, 0x03, 0x89, 0x07, 0xFE, 0x3F, + 0xA0, 0x06, 0xD2, 0xAC, 0x19, 0x10, 0xE0, 0x02, + 0xA0, 0x00, 0xA0, 0x06, 0xFA, 0xAD, 0x14, 0x10, + 0x08, 0xC8, 0x44, 0x04, 0x09, 0xC8, 0x46, 0x04, + 0xA0, 0x06, 0x28, 0xAD, 0x0D, 0x10, 0x81, 0x07, + 0x7C, 0xE0, 0xB1, 0xC0, 0x26, 0x13, 0x01, 0xC8, + 0xE0, 0x00, 0xA0, 0x05, 0x04, 0x01, 0x92, 0x06, + 0x03, 0x10, 0x60, 0xC0, 0xE0, 0x00, 0xF5, 0x10, + 0xE0, 0x01, 0x04, 0x01, 0x10, 0x00, 0xB0, 0x03, + 0xFF, 0x10, 0xA0, 0x01, 0x04, 0x01, 0x00, 0x80, + 0x80, 0x03, 0x80, 0x07, 0xA0, 0x00, 0xC2, 0x04, + 0x80, 0xCC, 0x81, 0x07, 0xAA, 0xA1, 0x82, 0x02, + 0x1E, 0x00, 0x02, 0x16, 0x81, 0x07, 0xB4, 0xA1, + 0x81, 0xC4, 0x81, 0x8C, 0xE9, 0x16, 0x82, 0x02, + 0x7C, 0x00, 0xF2, 0x16, 0x00, 0x03, 0x0F, 0x00, + 0x5B, 0x04, 0x81, 0x07, 0x08, 0xE1, 0x82, 0x07, + 0x04, 0x00, 0xE0, 0x04, 0x80, 0x01, 0xE0, 0x04, + 0x82, 0x01, 0x91, 0xC4, 0xB1, 0x8C, 0xD8, 0x16, + 0x82, 0x02, 0x7C, 0x00, 0xFA, 0x16, 0x20, 0xC8, + 0x04, 0xE0, 0x82, 0x01, 0x20, 0xE8, 0x0C, 0xE0, + 0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0x80, 0x01, + 0x81, 0x07, 0x86, 0xE0, 0xB1, 0xC0, 0x07, 0x13, + 0xB1, 0xC4, 0xFC, 0x10, 0xA0, 0x07, 0x04, 0x01, + 0x2E, 0x00, 0x60, 0x04, 0xAA, 0xA1, 0x81, 0x07, + 0x34, 0xE0, 0x82, 0x07, 0xFC, 0x05, 0x83, 0x07, + 0x0A, 0x00, 0xB1, 0xCC, 0x43, 0x06, 0xFD, 0x16, + 0x02, 0x02, 0x00, 0x06, 0x60, 0xD0, 0x4E, 0x01, + 0xED, 0x13, 0x21, 0x02, 0x00, 0xF7, 0x21, 0x02, + 0x00, 0xC0, 0x81, 0xDC, 0x60, 0xD0, 0x4F, 0x01, + 0xC1, 0xC0, 0x41, 0x09, 0x21, 0x02, 0x00, 0xF0, + 0x81, 0xDC, 0x43, 0x02, 0x00, 0x0F, 0x23, 0x02, + 0x00, 0xF0, 0x83, 0xDC, 0x01, 0x02, 0x32, 0x0C, + 0xA0, 0xC0, 0x44, 0x04, 0xE0, 0xC0, 0x46, 0x04, + 0x03, 0xC1, 0x02, 0x61, 0x84, 0x05, 0x04, 0xC8, + 0x48, 0x04, 0x03, 0xC1, 0x84, 0x05, 0x04, 0xA1, + 0x01, 0xA1, 0x04, 0xC8, 0x30, 0x0C, 0x03, 0xC1, + 0x84, 0x05, 0xF1, 0x04, 0x04, 0x06, 0xFD, 0x16, + 0x08, 0x02, 0x00, 0xA0, 0xA8, 0x09, 0x60, 0xC2, + 0x30, 0x0C, 0x29, 0x02, 0xFF, 0x03, 0xA9, 0x09, + 0x29, 0x02, 0x40, 0x00, 0x80, 0x07, 0x00, 0x90, + 0xA0, 0x09, 0x8A, 0x07, 0xFE, 0x9F, 0x2A, 0x02, + 0xFF, 0x03, 0xAA, 0x09, 0x01, 0x02, 0x32, 0x0C, + 0x05, 0x02, 0x00, 0x00, 0x03, 0xC1, 0x84, 0x05, + 0x11, 0x07, 0xC1, 0x05, 0x85, 0x05, 0x04, 0x06, + 0x0B, 0x13, 0x85, 0x80, 0xF9, 0x1A, 0x05, 0x80, + 0xF8, 0x1A, 0x85, 0x82, 0xF5, 0x1A, 0x05, 0x82, + 0xF4, 0x1A, 0x45, 0x82, 0xF1, 0x1A, 0xF1, 0x10, + 0x20, 0x2D, 0x02, 0x00, 0x60, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x08, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 0x48, 0x10, + 0x60, 0x01, 0x42, 0x01, 0x00, 0x80, 0x06, 0x16, + 0x8A, 0x07, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01, + 0x00, 0x80, 0x3E, 0x10, 0x60, 0x01, 0x02, 0x01, + 0x00, 0x10, 0x0A, 0x16, 0x60, 0x01, 0x00, 0x01, + 0x00, 0x04, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x80, + 0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0x30, 0x10, + 0x60, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0A, 0x16, + 0x60, 0x01, 0x00, 0x01, 0x00, 0x04, 0x06, 0x16, + 0xA0, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0D, 0x02, + 0x01, 0x00, 0x0D, 0x10, 0x60, 0x01, 0x02, 0x01, + 0x00, 0x04, 0x16, 0x16, 0x60, 0x01, 0x00, 0x01, + 0x00, 0x08, 0x12, 0x16, 0xA0, 0x01, 0x02, 0x01, + 0x00, 0x04, 0x0D, 0x02, 0x02, 0x00, 0xA0, 0xC3, + 0x0E, 0x01, 0xE0, 0xC3, 0x10, 0x01, 0x8A, 0x07, + 0x00, 0x20, 0x60, 0x01, 0x00, 0x01, 0x00, 0x80, + 0x0B, 0x13, 0x8A, 0x07, 0x00, 0x40, 0x08, 0x10, + 0x8A, 0x07, 0x04, 0x00, 0x05, 0x10, 0x8A, 0x07, + 0x02, 0x00, 0x02, 0x10, 0x8A, 0x07, 0x08, 0x00, + 0x00, 0x03, 0x00, 0x00, 0xE0, 0x04, 0x82, 0x01, + 0x8B, 0x07, 0xE0, 0x05, 0xCA, 0xCE, 0xCD, 0xCE, + 0xCE, 0xCE, 0xCF, 0xC6, 0x20, 0xC3, 0x58, 0x07, + 0x20, 0x23, 0x04, 0xE0, 0x12, 0x13, 0x8B, 0x07, + 0x18, 0xFF, 0x8A, 0x02, 0x00, 0x80, 0x0A, 0x13, + 0x8B, 0x05, 0xCD, 0xA2, 0x8A, 0x02, 0x00, 0x40, + 0x05, 0x13, 0x8A, 0x02, 0x00, 0x20, 0x02, 0x13, + 0x8B, 0x07, 0x1D, 0xFF, 0x0B, 0xC8, 0x04, 0x01, + 0x0D, 0x10, 0x20, 0xD3, 0x05, 0x01, 0xFD, 0x11, + 0x20, 0xD8, 0xDF, 0x07, 0x17, 0x01, 0x8B, 0x07, + 0x80, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0x20, 0xE8, + 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x04, 0x01, + 0xE0, 0x22, 0x86, 0xE1, 0xFB, 0x16, 0xE0, 0x02, + 0xA0, 0x00, 0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8, + 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01, + 0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0xF6, 0x60, 0x04, 0x90, 0xA0, + 0x00, 0x03, 0x02, 0x00, 0xA0, 0x07, 0x02, 0x01, + 0xFF, 0xDF, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0x09, 0x07, 0xA0, 0xC2, + 0x04, 0x01, 0x8A, 0x01, 0x80, 0x00, 0x4A, 0x52, + 0x89, 0xD2, 0x0A, 0xC8, 0x04, 0x01, 0xA0, 0xD2, + 0x04, 0x01, 0xF9, 0x16, 0x49, 0x05, 0x89, 0x01, + 0x00, 0x80, 0x49, 0x01, 0x00, 0x40, 0x0E, 0x13, + 0x09, 0xF8, 0x3A, 0x07, 0x60, 0xC2, 0x36, 0x07, + 0x03, 0x16, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, + 0xE0, 0x04, 0x36, 0x07, 0x54, 0x04, 0x90, 0x03, + 0xFF, 0xFF, 0x80, 0x03, 0x60, 0x22, 0x86, 0xE1, + 0xC2, 0x13, 0xE0, 0x04, 0x82, 0x01, 0x60, 0x04, + 0xE0, 0xA3, 0x00, 0x03, 0x02, 0x00, 0xA0, 0x07, + 0x62, 0x09, 0xE8, 0x03, 0xC9, 0x04, 0xA0, 0xC1, + 0x34, 0x06, 0x04, 0x16, 0xA0, 0x06, 0x50, 0xB5, + 0xE0, 0x04, 0x20, 0x09, 0x86, 0x07, 0xE8, 0x05, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, 0x20, 0xC2, + 0x84, 0x01, 0x20, 0x48, 0x08, 0xE0, 0x84, 0x01, + 0x20, 0x22, 0x08, 0xE0, 0x08, 0x13, 0x60, 0x01, + 0xAE, 0x01, 0x01, 0x00, 0x04, 0x16, 0xE0, 0x01, + 0x34, 0x06, 0x00, 0x80, 0x06, 0x10, 0x20, 0xC2, + 0x32, 0x09, 0x06, 0x13, 0xE0, 0x01, 0x34, 0x06, + 0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x09, 0x07, + 0xA0, 0x05, 0xEE, 0x05, 0x20, 0x06, 0xEC, 0x05, + 0x02, 0x16, 0x16, 0xC2, 0x03, 0x16, 0x49, 0xC2, + 0x12, 0x16, 0x80, 0x03, 0x98, 0xC5, 0xE8, 0xC1, + 0x02, 0x00, 0xE0, 0xE9, 0x14, 0xE0, 0x04, 0x00, + 0xD7, 0x04, 0x27, 0x02, 0x08, 0x00, 0xA0, 0x06, + 0xE6, 0xB4, 0x16, 0xC2, 0x04, 0x13, 0x28, 0xC8, + 0x08, 0x00, 0xEC, 0x05, 0xEF, 0x13, 0x54, 0x04, + 0x00, 0x03, 0x02, 0x00, 0xE0, 0xC1, 0x86, 0x01, + 0x47, 0x02, 0x0E, 0x00, 0xA7, 0xC2, 0x90, 0xE1, + 0x5A, 0x04, 0x8A, 0x07, 0x00, 0xA0, 0x0A, 0xC8, + 0x86, 0x01, 0xC7, 0xA1, 0x27, 0x02, 0x98, 0xE1, + 0x37, 0xE8, 0x34, 0x06, 0x17, 0xE8, 0xD2, 0x06, + 0xE0, 0x04, 0x30, 0x06, 0x60, 0x04, 0xF2, 0xA9, + 0x0A, 0xE8, 0xD2, 0x06, 0xE0, 0x01, 0x34, 0x06, + 0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x20, 0xE0, + 0x18, 0xE0, 0x5B, 0x04, 0xA0, 0x05, 0x20, 0x09, + 0x20, 0x88, 0x20, 0x09, 0x16, 0xE0, 0xE5, 0x1A, + 0xE0, 0x04, 0x20, 0x09, 0xA0, 0x06, 0xD0, 0xD5, + 0x80, 0x03, 0xA0, 0x05, 0x32, 0x09, 0x80, 0x03, + 0x01, 0xC3, 0xFB, 0x13, 0x60, 0x01, 0x6A, 0x09, + 0x01, 0x00, 0x78, 0x13, 0xA0, 0x05, 0x32, 0x09, + 0x75, 0x10, 0x41, 0xC0, 0x06, 0x13, 0x01, 0xC8, + 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x01, 0x11, + 0x7B, 0x10, 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, + 0x79, 0x16, 0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01, + 0x41, 0xC0, 0x04, 0x13, 0x01, 0xC8, 0x8A, 0x01, + 0x01, 0xC8, 0x18, 0x09, 0x86, 0x07, 0x43, 0x00, + 0x06, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x02, 0xFC, + 0x17, 0xC2, 0x60, 0x04, 0xFA, 0xA6, 0xE0, 0x04, + 0x18, 0x09, 0xC7, 0x61, 0x08, 0x07, 0x60, 0x01, + 0x06, 0xFC, 0x40, 0x00, 0x02, 0x13, 0x08, 0x02, + 0x01, 0x00, 0x09, 0x10, 0x4C, 0xC2, 0x20, 0xC3, + 0x00, 0xFC, 0x2A, 0x13, 0x0C, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x02, 0xFC, 0x1B, 0x11, 0x4B, 0x01, + 0x00, 0x01, 0xF4, 0x16, 0xC8, 0x22, 0x12, 0x13, + 0xCB, 0x01, 0x00, 0x40, 0x0B, 0xC8, 0x02, 0xFC, + 0x0D, 0x10, 0xE0, 0xC1, 0x18, 0x09, 0x01, 0xC3, + 0x21, 0x13, 0x4C, 0xC2, 0x15, 0x13, 0x0C, 0xC8, + 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x06, 0x11, + 0xCC, 0x81, 0xD5, 0x13, 0x4C, 0xC2, 0x20, 0xC3, + 0x00, 0xFC, 0xF4, 0x10, 0x09, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x02, 0xFC, 0x1E, 0x16, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x80, 0x09, 0xC3, 0x19, 0x10, + 0x09, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, + 0x05, 0x16, 0xA0, 0x07, 0x02, 0xFC, 0x00, 0x80, + 0x09, 0xC3, 0x0F, 0x10, 0xE0, 0xC2, 0x02, 0x0C, + 0x01, 0x11, 0x1E, 0x10, 0x20, 0xD8, 0x00, 0xE2, + 0x83, 0x01, 0x8B, 0x09, 0x8B, 0x09, 0x8B, 0x09, + 0x8B, 0x09, 0xA0, 0x07, 0x8A, 0x01, 0x43, 0x00, + 0x13, 0x10, 0x0C, 0xC8, 0x8A, 0x01, 0x0C, 0xC8, + 0x18, 0x09, 0x0E, 0x10, 0x00, 0x03, 0x02, 0x00, + 0xE0, 0xC0, 0x6C, 0x01, 0x20, 0xC3, 0x8A, 0x01, + 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x81, 0x13, + 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0xB9, 0x13, + 0x01, 0x83, 0x31, 0x16, 0x03, 0xC8, 0x6C, 0x01, + 0x40, 0x01, 0x10, 0x00, 0x14, 0x16, 0xE0, 0xC2, + 0x2E, 0x06, 0x11, 0x13, 0xE0, 0xC2, 0xF8, 0x05, + 0x0E, 0x13, 0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, + 0x80, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x36, 0x07, + 0x06, 0x13, 0xE0, 0x04, 0x36, 0x07, 0x80, 0x01, + 0x20, 0x00, 0x60, 0x04, 0xF2, 0xA9, 0x40, 0x01, + 0x20, 0x00, 0xF9, 0x13, 0x90, 0x03, 0xFF, 0x11, + 0x80, 0x03, 0x08, 0x01, 0x00, 0x04, 0x19, 0x16, + 0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, 0x15, 0x16, + 0x88, 0x01, 0x00, 0x1A, 0xC8, 0x01, 0x00, 0x01, + 0xC8, 0xC5, 0x0F, 0x10, 0xE0, 0x04, 0x18, 0x09, + 0xC0, 0x01, 0x04, 0x00, 0x15, 0x10, 0x81, 0xC1, + 0x01, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x00, 0xFC, + 0x77, 0xC0, 0x17, 0xC2, 0x48, 0x01, 0x00, 0x18, + 0xE4, 0x13, 0x40, 0x01, 0x40, 0x00, 0x15, 0x16, + 0x80, 0x01, 0x45, 0x00, 0x46, 0xC1, 0x20, 0xD0, + 0x07, 0xFC, 0x60, 0x81, 0x18, 0x09, 0xE6, 0x13, + 0xE0, 0xC2, 0x08, 0xFC, 0x08, 0x11, 0xE0, 0xC2, + 0x0E, 0xFC, 0x07, 0x15, 0x06, 0x13, 0xE0, 0xC2, + 0x14, 0xFC, 0x03, 0x15, 0x02, 0x13, 0xC0, 0x01, + 0x01, 0x00, 0x48, 0x01, 0x00, 0x01, 0x11, 0x13, + 0x40, 0x01, 0x80, 0x40, 0x69, 0x13, 0x60, 0x04, + 0x66, 0xA6, 0x48, 0x01, 0x01, 0x00, 0x03, 0x16, + 0x40, 0x01, 0x00, 0x40, 0x0B, 0x16, 0xC8, 0x01, + 0x00, 0x40, 0xA0, 0x05, 0x32, 0x09, 0xC8, 0xC5, + 0x05, 0x10, 0xC0, 0x01, 0x40, 0x00, 0x40, 0x01, + 0x04, 0x00, 0xEF, 0x13, 0xB7, 0x01, 0x20, 0x00, + 0xD7, 0xC2, 0xC4, 0x62, 0x0B, 0x05, 0x2B, 0x02, + 0xFC, 0xFF, 0xCB, 0xC5, 0x02, 0x15, 0x46, 0x81, + 0x6A, 0x13, 0x08, 0x01, 0x00, 0x5E, 0x67, 0x16, + 0x08, 0x01, 0x88, 0x00, 0x13, 0x16, 0x86, 0x02, + 0x43, 0x00, 0x25, 0x16, 0x40, 0x01, 0x00, 0x40, + 0x0B, 0x13, 0x08, 0x01, 0x03, 0x00, 0x08, 0x13, + 0x84, 0xC2, 0x2A, 0x02, 0xD8, 0xFF, 0x06, 0xC8, + 0x6C, 0x01, 0x0A, 0x68, 0x04, 0xFC, 0x73, 0x10, + 0x60, 0x04, 0xD2, 0xA8, 0x40, 0x01, 0x01, 0x00, + 0xEA, 0x13, 0x08, 0x01, 0x02, 0x00, 0xE7, 0x16, + 0x48, 0x01, 0x01, 0x00, 0xE4, 0x16, 0x40, 0x01, + 0x00, 0x40, 0x04, 0x16, 0x60, 0x01, 0xA8, 0x09, + 0x80, 0x00, 0xDD, 0x13, 0x8A, 0x07, 0x80, 0x00, + 0xA0, 0x06, 0x32, 0xA5, 0xD8, 0x10, 0x00, 0xC0, + 0xE7, 0x11, 0x60, 0xC2, 0x6A, 0x09, 0x40, 0x01, + 0x00, 0x40, 0x0A, 0x13, 0x48, 0x01, 0x01, 0x00, + 0x34, 0x13, 0x48, 0x01, 0x02, 0x00, 0x0A, 0x13, + 0x49, 0x01, 0x04, 0x00, 0xD9, 0x16, 0x06, 0x10, + 0x49, 0x01, 0x02, 0x00, 0x03, 0x13, 0x08, 0x01, + 0x03, 0x00, 0x6E, 0x13, 0x49, 0x01, 0x01, 0x00, + 0x12, 0x13, 0x40, 0x01, 0x80, 0x40, 0x01, 0x16, + 0x46, 0xC1, 0xE0, 0x04, 0x00, 0xFC, 0x87, 0x07, + 0xF8, 0x05, 0x17, 0xC2, 0x14, 0x13, 0xC7, 0x05, + 0x17, 0xC8, 0x6C, 0x01, 0x05, 0xC8, 0x00, 0xFC, + 0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x07, 0x02, + 0x02, 0xFC, 0xE0, 0xA1, 0x2C, 0x09, 0xE0, 0xCD, + 0xEE, 0x05, 0xE0, 0xC5, 0x04, 0xFC, 0x20, 0xC8, + 0x2C, 0x09, 0x04, 0xFC, 0xE2, 0x10, 0xC5, 0xCD, + 0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x60, 0x04, + 0xB6, 0xA8, 0x06, 0xC8, 0x6C, 0x01, 0x85, 0x81, + 0x1A, 0x13, 0xE0, 0xC2, 0x04, 0xFC, 0x17, 0x15, + 0x86, 0xC2, 0x8A, 0xA2, 0xAA, 0xC1, 0x32, 0x0C, + 0x06, 0xC8, 0x6C, 0x01, 0x0B, 0xA8, 0x04, 0xFC, + 0x1A, 0x09, 0x0A, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, + 0x02, 0xFC, 0xE0, 0x04, 0x00, 0xFC, 0x06, 0xC8, + 0x6C, 0x01, 0x0B, 0xC8, 0x02, 0xFC, 0xA0, 0x06, + 0x3E, 0xB4, 0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, + 0x00, 0xFC, 0xA0, 0x01, 0x02, 0xFC, 0x02, 0x00, + 0x87, 0x07, 0x30, 0x06, 0xE7, 0x01, 0x04, 0x00, + 0x40, 0x00, 0xD7, 0x04, 0x27, 0x02, 0x0C, 0x00, + 0x05, 0xC2, 0x60, 0x01, 0x6A, 0x09, 0x04, 0x00, + 0x03, 0x16, 0xE0, 0x01, 0x02, 0xFC, 0x20, 0x00, + 0xA0, 0x06, 0xFC, 0xB4, 0xC0, 0x01, 0x20, 0x00, + 0x60, 0x04, 0x66, 0xA6, 0x48, 0x01, 0x00, 0x18, + 0x03, 0x13, 0x48, 0x01, 0x00, 0x10, 0x02, 0x16, + 0xA0, 0x05, 0x32, 0x09, 0x86, 0x02, 0x43, 0x00, + 0x03, 0x13, 0x40, 0x01, 0x80, 0x40, 0x98, 0x13, + 0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC, + 0x85, 0xC2, 0xA0, 0x06, 0x3E, 0xB4, 0x20, 0x06, + 0x62, 0x09, 0xE6, 0x16, 0xA0, 0x06, 0xD0, 0xD5, + 0xE3, 0x10, 0xA0, 0xC2, 0xF6, 0x05, 0x56, 0x16, + 0x19, 0xC8, 0xF0, 0x05, 0xA9, 0xC2, 0x0A, 0x00, + 0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, 0x0A, 0xD8, + 0x80, 0x01, 0x29, 0xC8, 0x06, 0x00, 0x8C, 0x01, + 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, 0x09, 0xC8, + 0xF4, 0x05, 0x46, 0x10, 0x29, 0xC8, 0x06, 0x00, + 0x6C, 0x01, 0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, + 0x20, 0xC8, 0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, + 0x12, 0xFC, 0xB2, 0x01, 0xA0, 0xF2, 0x2E, 0x09, + 0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0xC4, 0xE1, 0x10, 0x47, 0x01, 0x08, 0x00, + 0x06, 0x16, 0xA8, 0xC2, 0x06, 0x00, 0xA0, 0x06, + 0x3E, 0xB4, 0xE8, 0x04, 0x06, 0x00, 0x07, 0x01, + 0x20, 0x00, 0x31, 0x13, 0xE8, 0x04, 0x02, 0x00, + 0x3B, 0x10, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x06, + 0x3E, 0xB4, 0x29, 0x10, 0x00, 0x03, 0x02, 0x00, + 0x20, 0xC2, 0x8C, 0x01, 0xE0, 0xC0, 0x6C, 0x01, + 0x20, 0xC2, 0xF4, 0x05, 0x28, 0xC8, 0x08, 0x00, + 0x6C, 0x01, 0xE8, 0xC1, 0x0A, 0x00, 0x20, 0xC3, + 0x02, 0xFC, 0x8C, 0x01, 0x20, 0x00, 0x0C, 0xC8, + 0x02, 0xFC, 0x0C, 0x01, 0x00, 0xFE, 0x3B, 0x16, + 0x47, 0x01, 0x40, 0x00, 0x50, 0x13, 0x60, 0xC2, + 0xF0, 0x05, 0xA7, 0x16, 0xE0, 0x04, 0xF4, 0x05, + 0x0C, 0xCA, 0x08, 0x00, 0x47, 0x01, 0x80, 0x00, + 0xC9, 0x16, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0xA0, 0xC2, 0x00, 0xFC, 0xD2, 0x16, 0xE8, 0xC1, + 0x02, 0x00, 0xD7, 0xC2, 0x0F, 0x16, 0x27, 0x02, + 0x10, 0x00, 0xD8, 0x04, 0x57, 0xC2, 0x0E, 0x13, + 0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, + 0x03, 0xC8, 0x6C, 0x01, 0x0D, 0x11, 0x90, 0x03, + 0xFF, 0x11, 0x80, 0x03, 0xD7, 0x04, 0xC3, 0x01, + 0x00, 0x80, 0xED, 0x10, 0xE7, 0x01, 0xF4, 0xFF, + 0x20, 0x00, 0xC8, 0xCD, 0xC8, 0xC5, 0xF0, 0x10, + 0x90, 0x03, 0xF8, 0x11, 0xE0, 0x02, 0xC0, 0x00, + 0x60, 0xC3, 0xFA, 0x00, 0xA0, 0xC3, 0xFC, 0x00, + 0xE0, 0xC3, 0xFE, 0x00, 0x54, 0x04, 0xE8, 0xC2, + 0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x0C, 0xC3, + 0x33, 0x11, 0x20, 0x23, 0x0A, 0xE0, 0x45, 0x13, + 0x20, 0x23, 0x10, 0xE0, 0x46, 0x13, 0x20, 0x23, + 0x0E, 0xE0, 0x13, 0x13, 0xE0, 0x21, 0x16, 0xE0, + 0xB6, 0x16, 0x20, 0x23, 0x06, 0xE0, 0x03, 0x16, + 0x20, 0x27, 0xA8, 0xE4, 0x0A, 0x13, 0xE8, 0xC2, + 0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x4C, 0x01, + 0x88, 0x00, 0xA9, 0x16, 0x0C, 0x01, 0x44, 0x00, + 0xA6, 0x16, 0x20, 0x06, 0x16, 0x09, 0xA3, 0x13, + 0x0A, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x04, 0xE0, + 0x02, 0xFC, 0x0B, 0xC8, 0x6C, 0x01, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x81, 0x20, 0xC3, 0x80, 0x01, + 0xA0, 0x01, 0x80, 0x01, 0x00, 0xC4, 0x0C, 0xC8, + 0x80, 0x01, 0x0A, 0xC8, 0x8C, 0x01, 0xAC, 0x10, + 0x0A, 0xC2, 0x0F, 0x13, 0x08, 0xC8, 0x6C, 0x01, + 0xA0, 0xC2, 0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, + 0x20, 0x23, 0x12, 0xE0, 0xF5, 0x16, 0x0B, 0xC8, + 0x6C, 0x01, 0x0C, 0xC8, 0x02, 0xFC, 0x60, 0x04, + 0x72, 0xA9, 0x8A, 0x07, 0x00, 0x04, 0x60, 0x04, + 0x8A, 0xA3, 0x8A, 0x07, 0x20, 0x00, 0x60, 0x04, + 0x8A, 0xA3, 0x8A, 0x07, 0x00, 0x02, 0x20, 0x27, + 0x0E, 0xE0, 0x04, 0x16, 0xA0, 0x06, 0x32, 0xA5, + 0xC3, 0x01, 0x00, 0x80, 0xA8, 0xC2, 0x06, 0x00, + 0x60, 0x04, 0x98, 0xA9, 0x00, 0x03, 0x02, 0x00, + 0xC0, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x2E, 0x06, + 0x08, 0x13, 0xE0, 0xC2, 0xF8, 0x05, 0x05, 0x13, + 0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, 0x80, 0x01, + 0x10, 0x00, 0x90, 0x03, 0xFF, 0x7F, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0x20, 0xC2, 0xF6, 0x05, + 0x20, 0xE2, 0xF4, 0x05, 0x0E, 0x16, 0x20, 0xD8, + 0x2E, 0x09, 0x80, 0x01, 0x2B, 0xC8, 0x06, 0x00, + 0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, + 0x0B, 0xC8, 0xF4, 0x05, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, 0xDB, 0x04, + 0x57, 0xC2, 0x05, 0x16, 0xCB, 0xCD, 0xCB, 0xC5, + 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0xC7, 0x05, + 0x57, 0xC2, 0x4B, 0xC6, 0xCB, 0xC5, 0x90, 0x03, + 0xFF, 0xFF, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, + 0x0B, 0xC2, 0x20, 0xC3, 0xF4, 0x05, 0x0F, 0x13, + 0xA8, 0xC2, 0x0A, 0x00, 0x4A, 0x01, 0x10, 0x00, + 0x16, 0x16, 0xA0, 0x22, 0x04, 0xE0, 0x1A, 0x16, + 0x08, 0xC3, 0xA0, 0x06, 0x36, 0xAC, 0x0C, 0xC2, + 0x20, 0xC3, 0xF4, 0x05, 0x13, 0x16, 0x68, 0x01, + 0x0A, 0x00, 0x10, 0x00, 0x03, 0x13, 0xE0, 0xC2, + 0xF6, 0x05, 0x05, 0x16, 0xA0, 0x06, 0x78, 0xAC, + 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, + 0xF0, 0x05, 0xA0, 0x06, 0xE6, 0xB4, 0x90, 0x03, + 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, + 0xA0, 0x06, 0x2C, 0xB5, 0x80, 0x03, 0x00, 0x03, + 0x02, 0x00, 0x87, 0x07, 0xF0, 0x05, 0xCB, 0xC2, + 0x08, 0x16, 0xA0, 0x06, 0x36, 0xAC, 0x20, 0x07, + 0xF6, 0x05, 0x60, 0xCB, 0xF4, 0x05, 0x02, 0x00, + 0x80, 0x03, 0xE0, 0x04, 0xF6, 0x05, 0x20, 0xC2, + 0xF4, 0x05, 0x05, 0x16, 0x17, 0xC2, 0x03, 0x13, + 0xD8, 0xC5, 0xA0, 0x06, 0x78, 0xAC, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC3, 0xA0, 0x06, + 0x36, 0xAC, 0x8C, 0xC2, 0xCC, 0xC1, 0x27, 0x02, + 0x10, 0x00, 0x88, 0x07, 0xF0, 0x05, 0x88, 0xC1, + 0x18, 0xC2, 0x26, 0x13, 0xA8, 0x82, 0x02, 0x00, + 0xFA, 0x16, 0xE8, 0xC2, 0x0A, 0x00, 0xE0, 0x22, + 0x1E, 0xE0, 0xF5, 0x16, 0x98, 0xC5, 0xE0, 0x22, + 0x1C, 0xE0, 0x0B, 0x16, 0x28, 0xC8, 0x06, 0x00, + 0xF4, 0x00, 0xE0, 0x02, 0xE0, 0x00, 0xA0, 0x06, + 0x3E, 0xB4, 0xE0, 0x02, 0xC0, 0x00, 0xE8, 0x04, + 0x06, 0x00, 0xE0, 0x22, 0x18, 0xE0, 0xE4, 0x13, + 0x20, 0xEA, 0x22, 0xE0, 0x0A, 0x00, 0xA0, 0xEA, + 0x18, 0xE0, 0x04, 0x00, 0xDA, 0x04, 0xA0, 0x06, + 0xE6, 0xB4, 0x47, 0x06, 0x06, 0xC2, 0xD8, 0x10, + 0x06, 0xC8, 0xF2, 0x05, 0x60, 0xCB, 0xF4, 0x05, + 0x02, 0x00, 0x54, 0x04, 0x20, 0xC2, 0xF4, 0x05, + 0x13, 0x13, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, + 0x8B, 0x0B, 0x8B, 0x0B, 0x60, 0x01, 0x9C, 0x01, + 0x00, 0x40, 0x0A, 0x16, 0x60, 0xC2, 0x6C, 0x01, + 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC2, + 0x02, 0xFC, 0x03, 0x11, 0x09, 0xC8, 0x6C, 0x01, + 0x5B, 0x04, 0x09, 0xC8, 0x6C, 0x01, 0x4B, 0xC2, + 0x87, 0x07, 0xF0, 0x05, 0xA0, 0x06, 0x2C, 0xB5, + 0xE0, 0x04, 0xF4, 0x05, 0x59, 0x04, 0xA8, 0xC2, + 0x0A, 0x00, 0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, + 0x0A, 0xD8, 0x80, 0x01, 0x28, 0xC8, 0x06, 0x00, + 0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, + 0x08, 0xC8, 0xF4, 0x05, 0x5B, 0x04, 0x20, 0xC3, + 0x6C, 0x01, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, 0x20, 0xC8, + 0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, 0x12, 0xFC, + 0xB2, 0x01, 0x0C, 0xC8, 0x6C, 0x01, 0xA0, 0xF2, + 0x2E, 0x09, 0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, + 0x80, 0x01, 0x00, 0xC4, 0xDD, 0x10, 0x48, 0xC0, + 0x89, 0xC0, 0x81, 0x60, 0xC2, 0x05, 0x5B, 0x04, + 0x0B, 0xC3, 0xA0, 0x06, 0xC8, 0xAC, 0x41, 0xCC, + 0x42, 0x06, 0xFD, 0x16, 0xA0, 0x06, 0xC8, 0xAC, + 0x01, 0xC1, 0x44, 0x8C, 0x12, 0x16, 0xC4, 0x05, + 0x42, 0x06, 0xFB, 0x16, 0x04, 0x02, 0x0E, 0xAD, + 0x03, 0x02, 0x01, 0x01, 0x94, 0x06, 0x03, 0x02, + 0x5A, 0x5A, 0x94, 0x06, 0x43, 0x05, 0x94, 0x06, + 0x03, 0x07, 0x94, 0x06, 0xC3, 0x04, 0x94, 0x06, + 0xCC, 0x05, 0x5C, 0x04, 0xCB, 0xC1, 0xA0, 0x06, + 0xC8, 0xAC, 0x43, 0xCC, 0x42, 0x06, 0xFD, 0x16, + 0xA0, 0x06, 0xC8, 0xAC, 0x43, 0x8C, 0xF5, 0x16, + 0x42, 0x06, 0xFC, 0x16, 0x57, 0x04, 0x8B, 0xC2, + 0x08, 0xC0, 0x49, 0xC1, 0x85, 0x05, 0x80, 0x02, + 0x40, 0x00, 0x03, 0x11, 0x80, 0x02, 0x4F, 0x00, + 0x45, 0x12, 0x01, 0x02, 0xC8, 0xAC, 0xA1, 0x09, + 0x01, 0x80, 0x40, 0x13, 0x01, 0x02, 0xF8, 0xAD, + 0xA1, 0x09, 0x01, 0x80, 0x3B, 0x13, 0x60, 0xC0, + 0x06, 0x00, 0xA1, 0x09, 0x01, 0x80, 0x36, 0x13, + 0x81, 0x05, 0x01, 0x80, 0x33, 0x13, 0x4A, 0xC0, + 0xA1, 0x09, 0x01, 0x80, 0x2F, 0x13, 0x00, 0xC8, + 0x6A, 0x01, 0x80, 0x02, 0x80, 0x00, 0x17, 0x14, + 0x01, 0x02, 0x00, 0xF8, 0xA0, 0xC1, 0x40, 0x01, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, 0x02, 0x02, + 0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0xB1, 0xCC, + 0x43, 0x06, 0xFD, 0x16, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x08, 0x02, 0x10, 0xF8, 0x06, 0xC8, + 0x40, 0x01, 0x00, 0xC0, 0x02, 0x13, 0x08, 0x02, + 0x00, 0xF8, 0x09, 0x02, 0xFE, 0xFB, 0xA0, 0x06, + 0xD2, 0xAC, 0x25, 0x10, 0x80, 0x02, 0x80, 0x00, + 0x09, 0x14, 0x01, 0x02, 0x00, 0xF8, 0x02, 0x02, + 0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0x72, 0xCC, + 0x43, 0x06, 0xFD, 0x16, 0x80, 0x05, 0x80, 0x02, + 0x80, 0x00, 0x04, 0x12, 0x60, 0x01, 0x04, 0x01, + 0x20, 0x00, 0x05, 0x13, 0x40, 0x81, 0xAB, 0x16, + 0x80, 0x02, 0x80, 0x00, 0x0B, 0x14, 0xA0, 0x07, + 0x6A, 0x01, 0x7E, 0x00, 0x02, 0x02, 0x00, 0x10, + 0x03, 0x02, 0x00, 0x04, 0xC1, 0x04, 0x81, 0xCC, + 0x43, 0x06, 0xFD, 0x16, 0xCA, 0x05, 0x5A, 0x04, + 0x00, 0x02, 0xEA, 0xAD, 0x01, 0x02, 0x1A, 0xAF, + 0x40, 0x02, 0x00, 0xFC, 0x41, 0x02, 0x00, 0xFC, + 0x40, 0x80, 0x04, 0x13, 0xA0, 0x07, 0x04, 0x01, + 0x3C, 0x00, 0x5B, 0x04, 0xC0, 0x04, 0x01, 0x02, + 0x08, 0x00, 0x02, 0x02, 0x00, 0x12, 0xE0, 0xC1, + 0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, + 0x03, 0x02, 0x00, 0x01, 0x00, 0xC8, 0x6A, 0x01, + 0xA0, 0xCC, 0x10, 0xF8, 0x80, 0x05, 0x03, 0x06, + 0xF9, 0x16, 0x22, 0x02, 0x00, 0x02, 0x01, 0x06, + 0xF3, 0x16, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, + 0x07, 0xC8, 0x40, 0x01, 0x00, 0x02, 0x00, 0x08, + 0x40, 0xC0, 0x01, 0x06, 0x01, 0xC8, 0x6A, 0x01, + 0x61, 0x02, 0x00, 0x80, 0x01, 0xC8, 0x10, 0xF8, + 0x00, 0x06, 0xF6, 0x16, 0xC0, 0x04, 0xC8, 0x04, + 0xC9, 0x04, 0x03, 0x02, 0x00, 0x08, 0x00, 0xC8, + 0x6A, 0x01, 0x80, 0xC1, 0x66, 0x02, 0x00, 0x80, + 0x20, 0xC1, 0x10, 0xF8, 0x06, 0x81, 0x15, 0x16, + 0x08, 0xC2, 0x06, 0x13, 0x80, 0x05, 0x03, 0x06, + 0xF2, 0x16, 0x08, 0xC2, 0x0D, 0x13, 0x19, 0x10, + 0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, 0x20, 0xC1, + 0x10, 0xF8, 0x84, 0x02, 0x55, 0x55, 0x02, 0x16, + 0x06, 0xC2, 0xF0, 0x10, 0x06, 0x81, 0xEE, 0x13, + 0x5B, 0x04, 0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, + 0x60, 0xC1, 0x10, 0xF8, 0x05, 0x81, 0x03, 0x13, + 0x85, 0x02, 0x55, 0x55, 0xF5, 0x16, 0x08, 0xC2, + 0xE1, 0x13, 0x40, 0xC2, 0x09, 0x06, 0x48, 0x02, + 0xFF, 0x07, 0xC0, 0x04, 0x01, 0x02, 0x08, 0x00, + 0x02, 0x02, 0x00, 0x12, 0x03, 0x02, 0x00, 0x01, + 0x00, 0xC8, 0x6A, 0x01, 0x32, 0xC8, 0x10, 0xF8, + 0x80, 0x05, 0x03, 0x06, 0xF9, 0x16, 0x22, 0x02, + 0x00, 0x02, 0x01, 0x06, 0xF3, 0x16, 0x88, 0x02, + 0x40, 0x00, 0x13, 0x15, 0x89, 0x02, 0x4F, 0x00, + 0x10, 0x11, 0xC0, 0x04, 0x02, 0x02, 0x00, 0x12, + 0x01, 0x02, 0x08, 0x00, 0x03, 0x02, 0x00, 0x01, + 0x80, 0xCC, 0x03, 0x06, 0xFD, 0x16, 0x22, 0x02, + 0x00, 0x02, 0x01, 0x06, 0xF7, 0x16, 0xCB, 0x05, + 0x5B, 0x04, 0xA0, 0x07, 0x04, 0x01, 0x37, 0x00, + 0x5B, 0x04, 0x33, 0x07, 0x33, 0x07, 0x0C, 0x10, + 0x13, 0x07, 0x23, 0x07, 0x02, 0x00, 0xCB, 0xC8, + 0x06, 0x00, 0x23, 0x02, 0x18, 0x00, 0xE0, 0xCC, + 0x6C, 0x01, 0xCD, 0xCC, 0xCE, 0xCC, 0xCF, 0xCC, + 0x83, 0x07, 0x30, 0x06, 0xD3, 0xC1, 0x0A, 0x13, + 0x83, 0x07, 0x36, 0x07, 0xD3, 0xC1, 0x06, 0x13, + 0x83, 0x07, 0xA0, 0x00, 0x93, 0x00, 0x0C, 0xC8, + 0x6C, 0x01, 0x80, 0x03, 0x63, 0x07, 0x02, 0x00, + 0x2A, 0x15, 0x63, 0xC2, 0x04, 0x00, 0x63, 0x42, + 0x06, 0x00, 0xDB, 0x13, 0x63, 0xC3, 0x1A, 0x00, + 0x49, 0xD2, 0x0C, 0x13, 0xC9, 0x06, 0x49, 0x72, + 0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, 0x49, 0x72, + 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, + 0x02, 0x00, 0x52, 0x04, 0x69, 0xC2, 0xC0, 0xE1, + 0x49, 0x72, 0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, + 0xE9, 0xA2, 0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, + 0x12, 0x00, 0x0F, 0x13, 0xDC, 0xC6, 0x03, 0x16, + 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, + 0x02, 0x00, 0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, + 0xFF, 0x01, 0x93, 0x00, 0x0C, 0xC8, 0x6C, 0x01, + 0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, + 0x00, 0xFC, 0xF1, 0x16, 0xE9, 0x48, 0x04, 0xE0, + 0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, 0x4C, 0xCB, + 0x04, 0x00, 0xED, 0x10, 0x00, 0x03, 0x02, 0x00, + 0xDB, 0xC2, 0x63, 0xC2, 0x04, 0x00, 0x4B, 0x42, + 0x9F, 0x13, 0x49, 0xD2, 0x0E, 0x13, 0xC9, 0x06, + 0x49, 0x72, 0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, + 0x49, 0x72, 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, + 0x49, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x69, 0xC2, 0xC0, 0xE1, 0x49, 0x72, + 0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, 0xE9, 0xA2, + 0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, 0x12, 0x00, + 0x0C, 0x13, 0xDC, 0xC6, 0x03, 0x16, 0xE9, 0x48, + 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, + 0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, + 0x00, 0xFC, 0xF4, 0x16, 0xF0, 0x10, 0x00, 0x03, + 0x02, 0x00, 0xBB, 0xC2, 0xBB, 0xC1, 0x86, 0xD1, + 0x03, 0x13, 0x86, 0xEA, 0x04, 0x00, 0x13, 0x10, + 0xA6, 0xD1, 0xC0, 0xE1, 0xC6, 0x06, 0x86, 0x71, + 0xCA, 0xC1, 0xE6, 0xA1, 0xB8, 0xE1, 0xA6, 0xEA, + 0x14, 0xE0, 0x04, 0x00, 0x1B, 0xC2, 0x86, 0x02, + 0x02, 0x00, 0x03, 0x16, 0xA0, 0x06, 0x0C, 0xB5, + 0x02, 0x10, 0xA0, 0x06, 0xE6, 0xB4, 0xDA, 0x04, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xAB, 0xC2, + 0x06, 0x00, 0x8C, 0x07, 0xE8, 0x05, 0x5C, 0xC2, + 0x16, 0x13, 0xA0, 0xC1, 0xEC, 0x05, 0x8A, 0x81, + 0x1A, 0x1A, 0xC6, 0xC1, 0x09, 0xC2, 0x59, 0xC2, + 0x20, 0x13, 0xE9, 0xA1, 0x08, 0x00, 0x87, 0x82, + 0xF9, 0x12, 0xA9, 0xA2, 0x08, 0x00, 0x87, 0x62, + 0xCA, 0xCA, 0x08, 0x00, 0x4A, 0x6A, 0x08, 0x00, + 0xC9, 0xC6, 0x0B, 0xC6, 0x80, 0x03, 0xCA, 0xCA, + 0x08, 0x00, 0x0A, 0xC8, 0xEC, 0x05, 0xDB, 0x04, + 0x0B, 0xCF, 0x0B, 0xC7, 0x80, 0x03, 0x8A, 0x61, + 0x46, 0xCA, 0x08, 0x00, 0xCA, 0xCA, 0x08, 0x00, + 0x0A, 0xC8, 0xEC, 0x05, 0xC9, 0xC6, 0x0B, 0xC7, + 0x80, 0x03, 0x87, 0x62, 0xCA, 0xCA, 0x08, 0x00, + 0xDB, 0x04, 0x0B, 0xC6, 0x0B, 0xCB, 0x02, 0x00, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xBB, 0xC1, + 0xDB, 0xC2, 0x8C, 0x07, 0xE8, 0x05, 0x4C, 0xC2, + 0xED, 0x04, 0x02, 0x00, 0x09, 0xC2, 0x59, 0xC2, + 0x18, 0x13, 0xA9, 0x81, 0x02, 0x00, 0xFA, 0x16, + 0xE9, 0x82, 0x04, 0x00, 0xF7, 0x16, 0x49, 0xCB, + 0x04, 0x00, 0x99, 0xC2, 0x0A, 0xC6, 0x0A, 0x13, + 0x08, 0x83, 0x04, 0x13, 0xA9, 0xAA, 0x08, 0x00, + 0x08, 0x00, 0x80, 0x03, 0x2A, 0xA8, 0x08, 0x00, + 0xEC, 0x05, 0x80, 0x03, 0x08, 0xCB, 0x02, 0x00, + 0x80, 0x03, 0x2D, 0x07, 0x02, 0x00, 0x8C, 0x07, + 0x08, 0x00, 0x06, 0xA3, 0x4C, 0xC2, 0x09, 0xC2, + 0x59, 0xC2, 0x13, 0x13, 0xE9, 0x82, 0x04, 0x00, + 0xFA, 0x16, 0xAD, 0x07, 0x02, 0x00, 0x01, 0x00, + 0x49, 0xCB, 0x04, 0x00, 0x19, 0xC6, 0x01, 0x13, + 0x80, 0x03, 0x08, 0x83, 0x04, 0x16, 0xA0, 0x49, + 0x14, 0xE0, 0x04, 0x00, 0x80, 0x03, 0x08, 0xCB, + 0x02, 0x00, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, + 0x0B, 0x06, 0x1F, 0x11, 0x4D, 0x13, 0x8B, 0x07, + 0x00, 0x4E, 0x60, 0x01, 0x42, 0x01, 0x80, 0x00, + 0x09, 0x13, 0x8B, 0x07, 0x00, 0x3A, 0x20, 0xC1, + 0x4E, 0x01, 0x84, 0x02, 0x41, 0x0F, 0x02, 0x11, + 0x8B, 0x07, 0x00, 0x4E, 0x0B, 0xC8, 0x44, 0x01, + 0xA0, 0x07, 0x62, 0x09, 0xE8, 0x03, 0xE0, 0x01, + 0x40, 0x01, 0x00, 0x02, 0xE0, 0x01, 0x40, 0x01, + 0x00, 0x20, 0x84, 0x07, 0x34, 0xAF, 0x60, 0x04, + 0x42, 0xAF, 0x20, 0xC8, 0x16, 0xE0, 0xE0, 0x00, + 0xE0, 0xC2, 0x6A, 0x09, 0xE0, 0x22, 0x10, 0xE0, + 0x03, 0x13, 0x20, 0xE8, 0x14, 0xE0, 0xE0, 0x00, + 0x20, 0xC8, 0x04, 0xE0, 0x82, 0x01, 0x20, 0xC8, + 0xE2, 0x00, 0x8A, 0x01, 0xE0, 0x04, 0x18, 0x09, + 0xE0, 0x04, 0xF4, 0x05, 0xE0, 0x04, 0xF8, 0x05, + 0xE0, 0x04, 0xF0, 0x05, 0xE0, 0x04, 0x42, 0x07, + 0xA0, 0x07, 0x88, 0x01, 0x20, 0x00, 0xE0, 0xC2, + 0x30, 0x09, 0x09, 0x13, 0xA0, 0x07, 0x88, 0x01, + 0x80, 0x00, 0x20, 0xE8, 0x16, 0xE0, 0x80, 0x01, + 0xE0, 0x01, 0x82, 0x01, 0x00, 0x03, 0x8B, 0x07, + 0x00, 0xA0, 0x0B, 0xE8, 0x86, 0x01, 0x80, 0x03, + 0xE0, 0x04, 0x86, 0x01, 0xE0, 0x01, 0x9C, 0x01, + 0x40, 0x00, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, + 0xCB, 0x04, 0xB0, 0x03, 0x0B, 0x06, 0x04, 0x13, + 0x60, 0x01, 0x9C, 0x01, 0x00, 0x40, 0xF9, 0x16, + 0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8, 0x08, 0xE0, + 0x6A, 0x09, 0x8B, 0x07, 0x00, 0x80, 0x0B, 0xC8, + 0x98, 0x07, 0x0B, 0xC8, 0x78, 0x07, 0x20, 0xC8, + 0x04, 0xE0, 0x82, 0x01, 0x8B, 0x07, 0x6F, 0x87, + 0x0B, 0x48, 0x3A, 0x07, 0xE0, 0xC2, 0x50, 0x07, + 0x8B, 0x02, 0x58, 0x07, 0x10, 0x13, 0x20, 0xE8, + 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01, + 0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0x8B, 0x07, + 0x58, 0x07, 0x0B, 0xC8, 0x50, 0x07, 0x8B, 0x07, + 0x0C, 0xB8, 0x0B, 0xC8, 0x52, 0x07, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0xE0, 0xC2, 0x1A, 0x09, + 0x0C, 0x13, 0x20, 0x06, 0x1C, 0x09, 0x0B, 0xC8, + 0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, 0x1A, 0x09, + 0x4B, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x41, 0xC0, 0x0F, 0x13, 0x81, 0x80, + 0x0D, 0x13, 0x82, 0xA0, 0xE2, 0xC2, 0x32, 0x0C, + 0x12, 0x09, 0x0B, 0xC8, 0x6C, 0x01, 0xE0, 0x04, + 0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, 0x07, 0x11, + 0x02, 0xC8, 0x00, 0xFC, 0xED, 0x04, 0x02, 0x00, + 0xE0, 0x04, 0x6C, 0x01, 0x80, 0x03, 0x42, 0xCB, + 0x02, 0x00, 0x02, 0xC8, 0x6C, 0x01, 0x8B, 0xC0, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x83, 0x07, + 0x00, 0x80, 0x60, 0xC2, 0x7E, 0x09, 0x09, 0xC1, + 0x24, 0x02, 0xF8, 0xFF, 0xA9, 0x08, 0x01, 0x02, + 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x0B, 0x02, + 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x07, 0x02, + 0x00, 0x00, 0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, + 0x06, 0x13, 0x8B, 0x05, 0xCC, 0x05, 0x0B, 0x88, + 0x46, 0x04, 0x27, 0x1B, 0xF6, 0x10, 0x09, 0xC2, + 0x8B, 0xC2, 0x08, 0x06, 0x0A, 0x13, 0x8B, 0x05, + 0xCC, 0x05, 0x0B, 0x88, 0x46, 0x04, 0x1D, 0x1B, + 0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, 0xED, 0x16, + 0xF4, 0x10, 0x82, 0xC0, 0x14, 0x13, 0x02, 0xC8, + 0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, 0x0A, 0xC8, + 0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, + 0x0A, 0xC2, 0x08, 0xA2, 0x02, 0xCA, 0x32, 0x0C, + 0x8A, 0xC0, 0x87, 0x05, 0xD6, 0x10, 0x4A, 0xC0, + 0xEE, 0x10, 0x47, 0xCB, 0x02, 0x00, 0xE0, 0x04, + 0x6C, 0x01, 0x8B, 0x07, 0x43, 0x00, 0xE0, 0x04, + 0x00, 0x0C, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, + 0x6C, 0x01, 0x8B, 0x02, 0x43, 0x00, 0x04, 0x13, + 0x60, 0x01, 0x02, 0xFC, 0x20, 0x00, 0x06, 0x13, + 0x8B, 0xC2, 0xA0, 0x06, 0x42, 0xB4, 0x90, 0x03, + 0x7F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x02, 0xFC, + 0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, + 0x0B, 0x16, 0x0A, 0x02, 0x02, 0xFC, 0xA0, 0xA2, + 0x2C, 0x09, 0xA0, 0xCE, 0xEE, 0x05, 0xA0, 0xC6, + 0x04, 0xFC, 0x20, 0xC8, 0x2C, 0x09, 0x04, 0xFC, + 0x8A, 0x07, 0xF8, 0x05, 0x5A, 0xC2, 0x08, 0x13, + 0xCA, 0x05, 0x5A, 0xC2, 0x09, 0xC8, 0x6C, 0x01, + 0x0B, 0xC8, 0x00, 0xFC, 0x8B, 0xC6, 0x02, 0x10, + 0x8B, 0xCE, 0x8B, 0xC6, 0x20, 0x20, 0x1A, 0xE0, + 0x05, 0x16, 0x20, 0xE8, 0x04, 0xE0, 0x3A, 0x07, + 0xE0, 0x04, 0x36, 0x07, 0x90, 0x03, 0x7F, 0x00, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, + 0x6C, 0x01, 0xCC, 0x04, 0xE0, 0x04, 0x00, 0xFC, + 0x8B, 0xC2, 0xA0, 0x06, 0x50, 0xB4, 0x90, 0x03, + 0x7F, 0x00, 0x80, 0x03, 0xA0, 0x07, 0x02, 0xFC, + 0x00, 0x80, 0x20, 0xC8, 0x8C, 0xE1, 0x04, 0xFC, + 0x41, 0xC0, 0x0F, 0x16, 0x20, 0xD8, 0x00, 0xE2, + 0x83, 0x01, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, + 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, + 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x0A, 0xC8, + 0x8A, 0x01, 0x5B, 0x04, 0x0A, 0xC8, 0x6C, 0x01, + 0x20, 0xC3, 0x00, 0xFC, 0xE0, 0x04, 0x00, 0xFC, + 0x8A, 0x02, 0x43, 0x00, 0xDF, 0x13, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, + 0x20, 0x98, 0x84, 0x09, 0x1D, 0x09, 0x0A, 0x13, + 0x20, 0xC8, 0x1A, 0x09, 0x00, 0xFC, 0x0A, 0xC8, + 0x1A, 0x09, 0xA0, 0x05, 0x1C, 0x09, 0x8C, 0xC2, + 0xE5, 0x16, 0x5B, 0x04, 0x41, 0xC0, 0x10, 0x13, + 0x8A, 0xA2, 0x82, 0xCA, 0x32, 0x0C, 0x1A, 0x09, + 0x02, 0xC8, 0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, + 0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, + 0x09, 0x13, 0x8C, 0xC2, 0xD3, 0x16, 0x5B, 0x04, + 0x4A, 0xC0, 0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, + 0x00, 0xE2, 0x1B, 0x16, 0xE0, 0x01, 0x9C, 0x01, + 0x40, 0x00, 0xA0, 0x07, 0x64, 0x09, 0x00, 0x70, + 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0x07, 0x13, + 0x20, 0x06, 0x64, 0x09, 0xF9, 0x16, 0x0A, 0x02, + 0x00, 0x01, 0x60, 0x04, 0x8A, 0xA3, 0x60, 0x01, + 0x02, 0x0C, 0x00, 0x01, 0xE2, 0x13, 0x20, 0xD8, + 0x2F, 0x09, 0x83, 0x01, 0xA0, 0x07, 0x02, 0x0C, + 0x00, 0x80, 0x0A, 0xC8, 0x8A, 0x01, 0x0A, 0xC8, + 0x18, 0x09, 0xD7, 0x10, 0xD8, 0x04, 0x57, 0xC2, + 0x03, 0x16, 0xC8, 0xCD, 0xC8, 0xC5, 0x5B, 0x04, + 0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, + 0x5B, 0x04, 0x08, 0xC8, 0x6C, 0x01, 0x08, 0xA2, + 0x20, 0xCA, 0x00, 0xFC, 0x32, 0x0C, 0x18, 0x09, + 0x02, 0x10, 0x08, 0xC8, 0x6C, 0x01, 0xE0, 0x04, + 0x00, 0xFC, 0x57, 0xC2, 0x03, 0x16, 0xC8, 0xCD, + 0xC8, 0xC5, 0x5B, 0x04, 0xC7, 0x05, 0x17, 0xC8, + 0x6C, 0x01, 0x08, 0xC8, 0x00, 0xFC, 0xC8, 0xC5, + 0x5B, 0x04, 0x17, 0xC6, 0x02, 0x16, 0xC8, 0xC9, + 0x02, 0x00, 0xC8, 0xC5, 0x5B, 0x04, 0x17, 0xC2, + 0x08, 0xC8, 0x6C, 0x01, 0x07, 0x13, 0xE0, 0xC5, + 0x00, 0xFC, 0x08, 0xA2, 0x28, 0xC8, 0x32, 0x0C, + 0x00, 0xFC, 0x18, 0x09, 0x5B, 0x04, 0x60, 0x01, + 0x82, 0x01, 0x00, 0x20, 0x0A, 0x16, 0x60, 0xC2, + 0x84, 0x01, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x20, + 0xE0, 0x01, 0x82, 0x01, 0x00, 0x20, 0x09, 0xC8, + 0x84, 0x01, 0xC9, 0x04, 0x5B, 0x04, 0xA0, 0x06, + 0xBE, 0xB7, 0xD3, 0x04, 0xE0, 0x04, 0x02, 0x01, + 0x20, 0xE8, 0x14, 0xE0, 0x00, 0x01, 0x20, 0xC8, + 0x16, 0xE0, 0x04, 0x01, 0x05, 0x2C, 0x20, 0x48, + 0x14, 0xE0, 0x00, 0x01, 0x8C, 0x07, 0x00, 0x0A, + 0x8D, 0x07, 0xD8, 0x07, 0x8E, 0x07, 0x18, 0x00, + 0x7C, 0xCF, 0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x02, + 0xD8, 0x07, 0x8F, 0x07, 0x11, 0xFF, 0x8B, 0x02, + 0x3B, 0x59, 0x21, 0x16, 0x8A, 0x02, 0x3B, 0x59, + 0x1E, 0x13, 0x8F, 0x05, 0x20, 0x20, 0x16, 0xE0, + 0x01, 0x16, 0x19, 0x10, 0x20, 0x20, 0x04, 0xE0, + 0x16, 0x16, 0x00, 0x01, 0xBF, 0x00, 0x13, 0x16, + 0x8B, 0x07, 0xC0, 0x40, 0x00, 0x01, 0x00, 0x60, + 0x10, 0x13, 0x40, 0x01, 0x00, 0x60, 0x0B, 0x16, + 0x8B, 0x07, 0xC4, 0x44, 0xA0, 0xC3, 0x02, 0x01, + 0x0E, 0x48, 0x02, 0x01, 0x4E, 0x01, 0x00, 0x10, + 0x04, 0x16, 0x8F, 0x07, 0x18, 0xFF, 0x60, 0x04, + 0x94, 0xB7, 0x0B, 0xC3, 0x4B, 0xC3, 0x20, 0x20, + 0x0A, 0xE0, 0x02, 0x16, 0x6B, 0x02, 0x20, 0x20, + 0x20, 0x20, 0x0C, 0xE0, 0x02, 0x16, 0x6C, 0x02, + 0x00, 0x20, 0x20, 0x20, 0x0E, 0xE0, 0x02, 0x16, + 0x6C, 0x02, 0x20, 0x00, 0x8F, 0x05, 0x20, 0x20, + 0x10, 0xE0, 0x07, 0x16, 0x6D, 0x02, 0x20, 0x00, + 0x20, 0x21, 0x22, 0xE0, 0xE4, 0x13, 0x04, 0xC1, + 0x02, 0x16, 0x84, 0x07, 0xFE, 0x7F, 0x8F, 0x05, + 0x20, 0x20, 0x12, 0xE0, 0x02, 0x16, 0x6D, 0x02, + 0x00, 0x20, 0x60, 0x21, 0x22, 0xE0, 0xD7, 0x13, + 0x45, 0xC1, 0x02, 0x16, 0x85, 0x07, 0xFE, 0x7F, + 0x8F, 0x05, 0x86, 0xD1, 0x0B, 0x13, 0xA0, 0x25, + 0x26, 0xE0, 0x08, 0x13, 0x8F, 0x05, 0x20, 0x26, + 0x22, 0xE0, 0x04, 0x16, 0x8F, 0x05, 0xA0, 0x26, + 0x22, 0xE0, 0x02, 0x13, 0x60, 0x04, 0x94, 0xB7, + 0x01, 0xD8, 0xEC, 0x08, 0x20, 0xD8, 0xDB, 0x07, + 0x00, 0x09, 0x02, 0xD8, 0xF6, 0x08, 0x20, 0xD8, + 0xDD, 0x07, 0xE2, 0x08, 0xE0, 0x02, 0x58, 0x07, + 0x20, 0xD8, 0xEF, 0x07, 0xF4, 0x07, 0x20, 0xD8, + 0xF1, 0x07, 0xF6, 0x07, 0x20, 0xD8, 0xF3, 0x07, + 0xF8, 0x07, 0x09, 0x02, 0x06, 0x00, 0xCB, 0x04, + 0x0F, 0x02, 0xEE, 0x07, 0x8F, 0x05, 0xCB, 0xDF, + 0x09, 0x06, 0xFC, 0x16, 0xA0, 0x06, 0xBE, 0xB7, + 0x89, 0x07, 0x5C, 0xE3, 0xE0, 0x04, 0x1A, 0x01, + 0x20, 0xC8, 0xE4, 0x07, 0x18, 0x01, 0x19, 0xC8, + 0x0C, 0x01, 0x39, 0xC8, 0x0A, 0x01, 0x39, 0xC8, + 0x12, 0x01, 0x09, 0x16, 0x79, 0xC3, 0x0F, 0x02, + 0x00, 0xE0, 0x4F, 0x63, 0x2D, 0x02, 0x00, 0x90, + 0x0D, 0xC8, 0x14, 0x01, 0x02, 0x10, 0x39, 0xC8, + 0x14, 0x01, 0xF9, 0xC3, 0x3F, 0xC8, 0x0E, 0x01, + 0x1F, 0xC8, 0x10, 0x01, 0xE0, 0x04, 0x14, 0x09, + 0xB9, 0xC2, 0x1A, 0xC8, 0x00, 0x01, 0x96, 0x06, + 0x89, 0x02, 0x84, 0xE3, 0xE0, 0x16, 0x8F, 0x07, + 0x1C, 0xFF, 0x8C, 0x07, 0x00, 0x0A, 0x8D, 0x07, + 0x84, 0xE3, 0x8E, 0x07, 0x10, 0x00, 0x7C, 0x8F, + 0x44, 0x16, 0x4E, 0x06, 0xFC, 0x16, 0xA0, 0xC3, + 0xE2, 0x07, 0xE0, 0xC3, 0xE0, 0x07, 0xCE, 0x83, + 0x01, 0x14, 0xCE, 0xC3, 0x0F, 0xC8, 0x1A, 0x01, + 0x8C, 0x07, 0x94, 0xE3, 0x8D, 0x07, 0x00, 0x0A, + 0x8E, 0x07, 0xA4, 0xE3, 0x8C, 0x63, 0x7C, 0xCF, + 0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x04, 0x30, 0x09, + 0x20, 0x01, 0x42, 0x01, 0x00, 0x04, 0x02, 0x16, + 0x20, 0x07, 0x30, 0x09, 0x60, 0xC2, 0x62, 0x01, + 0xE0, 0x04, 0x62, 0x01, 0x8E, 0x07, 0x00, 0x80, + 0x8C, 0x07, 0x34, 0x09, 0x8D, 0x07, 0x06, 0x00, + 0x3E, 0xDF, 0x8E, 0x05, 0x0D, 0x06, 0xFC, 0x16, + 0xFE, 0xD3, 0xCF, 0x06, 0x8E, 0x05, 0xFE, 0xD3, + 0xCF, 0x06, 0x8C, 0x07, 0x34, 0x09, 0x09, 0xC8, + 0x62, 0x01, 0xC9, 0x04, 0x5C, 0xA3, 0x7C, 0xE2, + 0x5C, 0xA3, 0x7C, 0xE2, 0x5C, 0xA3, 0x7C, 0xE2, + 0x02, 0x13, 0xCD, 0x83, 0x09, 0x13, 0x20, 0x07, + 0x34, 0x09, 0x06, 0x10, 0x8F, 0x07, 0x19, 0xFF, + 0xCD, 0xA3, 0x0F, 0xC8, 0x04, 0x01, 0xFF, 0x10, + 0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0xE0, 0xC3, + 0xEE, 0x07, 0xE0, 0x43, 0x06, 0xE0, 0x0F, 0xC8, + 0x00, 0x01, 0x20, 0xC0, 0x04, 0xE0, 0xE0, 0x04, + 0xFE, 0x06, 0xD3, 0x04, 0xE0, 0x04, 0x04, 0x01, + 0x60, 0x04, 0x0C, 0xB8, 0x8C, 0x07, 0x00, 0x0A, + 0x8D, 0x07, 0x18, 0x00, 0x8E, 0x07, 0x3B, 0x59, + 0x0E, 0xCF, 0x4D, 0x06, 0xFD, 0x16, 0x5B, 0x04, + 0x93, 0x01, 0x00, 0x80, 0x20, 0x04, 0xC0, 0xE2, + 0x60, 0xD0, 0x98, 0x07, 0x1C, 0x13, 0x00, 0x03, + 0x02, 0x00, 0xA0, 0xC0, 0x46, 0x07, 0x12, 0xC8, + 0x46, 0x07, 0x02, 0x16, 0x93, 0x01, 0x20, 0x00, + 0x00, 0x03, 0x0F, 0x00, 0x20, 0x04, 0xE8, 0xE2, + 0x93, 0x01, 0x00, 0x20, 0x80, 0x01, 0x00, 0x40, + 0x00, 0x01, 0xFE, 0x00, 0x49, 0x16, 0xC4, 0xC3, + 0x25, 0x16, 0xD3, 0xC3, 0xC5, 0x43, 0x0C, 0x16, + 0xE0, 0xC3, 0x98, 0x07, 0x03, 0x11, 0xE0, 0x02, + 0x98, 0x07, 0x51, 0x04, 0xE0, 0xC3, 0x78, 0x07, + 0x0A, 0x11, 0xE0, 0x02, 0x78, 0x07, 0x51, 0x04, + 0xD3, 0x11, 0x4F, 0x01, 0x00, 0x20, 0xE4, 0x13, + 0x4F, 0x01, 0x20, 0x00, 0xD1, 0x13, 0x05, 0x2C, + 0x41, 0xA0, 0x21, 0x04, 0xC0, 0xE2, 0x8B, 0x07, + 0x0C, 0xB8, 0x00, 0x01, 0x00, 0x40, 0x0F, 0x13, + 0xDD, 0xC3, 0x4F, 0x02, 0x0F, 0x00, 0x2F, 0xE1, + 0x14, 0xE0, 0x5B, 0x04, 0xE4, 0xC3, 0xC0, 0xE1, + 0xCF, 0x73, 0x2F, 0x41, 0x14, 0xE0, 0x6F, 0xC3, + 0xEC, 0xEA, 0x8B, 0x07, 0x0C, 0xB8, 0x4B, 0xC2, + 0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, 0x08, 0x00, + 0xBD, 0xC0, 0xA0, 0xC3, 0xEA, 0x07, 0xE0, 0xC3, + 0xEC, 0x07, 0xA0, 0x06, 0x00, 0xBA, 0xC0, 0x01, + 0x00, 0x40, 0x02, 0xD8, 0x17, 0x01, 0x62, 0x02, + 0x80, 0xFF, 0xA0, 0x06, 0x54, 0xBA, 0x02, 0xC8, + 0x04, 0x01, 0x90, 0x03, 0x3F, 0x60, 0x59, 0x04, + 0xC0, 0xC3, 0xCF, 0x73, 0xEF, 0xC3, 0xC0, 0xE1, + 0xCF, 0x73, 0xAF, 0xC3, 0xDE, 0xEA, 0x9E, 0xC3, + 0x4E, 0x02, 0x0F, 0x00, 0x2E, 0x21, 0x14, 0xE0, + 0x08, 0x13, 0x2F, 0x40, 0x14, 0xE0, 0xCF, 0xA3, + 0x2F, 0x04, 0xF0, 0xE2, 0x40, 0x01, 0x00, 0x40, + 0xA4, 0x13, 0xC4, 0xC3, 0xC7, 0x16, 0x00, 0x01, + 0xFE, 0x00, 0xE6, 0x16, 0x9E, 0x10, 0x40, 0x01, + 0x00, 0x40, 0x05, 0x16, 0x20, 0xE0, 0x14, 0xE0, + 0x65, 0x02, 0x00, 0x58, 0x96, 0x10, 0x20, 0xD8, + 0xDE, 0x07, 0x17, 0x01, 0x8F, 0x07, 0x86, 0xFF, + 0x0F, 0xC8, 0x04, 0x01, 0xC0, 0x01, 0x00, 0x40, + 0x45, 0x02, 0xFF, 0xA7, 0x8A, 0x10, 0x20, 0xC3, + 0xFE, 0x06, 0x20, 0x27, 0x38, 0xE3, 0x07, 0x13, + 0x20, 0x23, 0x22, 0xE0, 0x1A, 0x13, 0x65, 0x02, + 0xFF, 0xDF, 0x20, 0x40, 0x14, 0xE0, 0x20, 0xE0, + 0x16, 0xE0, 0x0C, 0xC8, 0xE6, 0x08, 0x8D, 0x07, + 0xE2, 0x08, 0x58, 0x04, 0x20, 0x48, 0x08, 0xE0, + 0xFE, 0x06, 0x20, 0xC3, 0xE6, 0x08, 0x20, 0x27, + 0x38, 0xE3, 0x19, 0x16, 0x80, 0x03, 0x02, 0xC3, + 0x6C, 0xC2, 0x0A, 0x00, 0x99, 0x06, 0x60, 0x04, + 0x0C, 0xB8, 0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, + 0x01, 0x00, 0x8D, 0x07, 0x06, 0x06, 0xCE, 0x04, + 0xE0, 0xC3, 0x08, 0x06, 0x01, 0x13, 0x97, 0x06, + 0x20, 0xD8, 0x07, 0x06, 0x17, 0x01, 0x8B, 0x07, + 0x82, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0xA0, 0x06, + 0xB4, 0xBE, 0x60, 0x04, 0x0C, 0xB8, 0xA0, 0xC2, + 0xEE, 0x07, 0x8C, 0x07, 0x06, 0x00, 0x8D, 0x07, + 0xEE, 0x08, 0xA0, 0xC3, 0xE6, 0x07, 0xE0, 0xC3, + 0xE8, 0x07, 0x97, 0x06, 0xA0, 0xC2, 0xF4, 0x07, + 0x8D, 0x07, 0xF4, 0x08, 0xDD, 0x04, 0x8C, 0x07, + 0x02, 0x00, 0x97, 0x06, 0x8D, 0x07, 0x00, 0x80, + 0xA0, 0xC2, 0xEE, 0x08, 0x0A, 0x88, 0x0C, 0x06, + 0x14, 0x1B, 0x82, 0x07, 0xD0, 0xB9, 0xA0, 0xC3, + 0xF0, 0x08, 0xE0, 0xC3, 0xF2, 0x08, 0x8B, 0x07, + 0x0C, 0xE3, 0x8A, 0x02, 0x14, 0x00, 0x04, 0x1A, + 0x8B, 0x07, 0xBA, 0xEA, 0x2A, 0x02, 0xEC, 0xFF, + 0x8A, 0xA2, 0xCA, 0xA2, 0xDB, 0xC2, 0x01, 0x13, + 0x9B, 0x06, 0x20, 0xC8, 0xEE, 0x08, 0xF2, 0x08, + 0x20, 0xC8, 0x20, 0xE0, 0xEE, 0x08, 0x0D, 0xC8, + 0xF0, 0x08, 0x8D, 0x07, 0xEC, 0x08, 0x20, 0xE0, + 0x18, 0xE0, 0x65, 0x02, 0x00, 0x58, 0x58, 0x04, + 0x45, 0x02, 0xFF, 0xA7, 0x80, 0x03, 0x60, 0xC0, + 0xEE, 0x05, 0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, + 0x02, 0x01, 0x06, 0x00, 0x07, 0x16, 0x01, 0x88, + 0xEE, 0x05, 0xF9, 0x16, 0x39, 0x10, 0x60, 0xD0, + 0x03, 0x01, 0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, + 0x4C, 0xCC, 0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, + 0xB1, 0x07, 0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, + 0x00, 0x01, 0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, + 0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, + 0x06, 0x00, 0x07, 0x16, 0x01, 0x88, 0xEE, 0x05, + 0xF9, 0x16, 0x1E, 0x10, 0x60, 0xD0, 0x03, 0x01, + 0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, 0x4C, 0xCC, + 0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, 0xB1, 0x07, + 0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, 0x00, 0x01, + 0xA0, 0x03, 0x60, 0xD0, 0x03, 0x01, 0x01, 0x13, + 0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, 0x21, 0x02, + 0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, 0x06, 0x00, + 0xF7, 0x16, 0x01, 0x88, 0xEE, 0x05, 0xF9, 0x16, + 0xCD, 0x04, 0x8A, 0x07, 0x00, 0x40, 0x20, 0xC3, + 0x00, 0x01, 0x0C, 0x01, 0x00, 0x80, 0x02, 0x13, + 0x8A, 0x07, 0x00, 0x20, 0xA0, 0xC3, 0x0E, 0x01, + 0xE0, 0xC3, 0x10, 0x01, 0xB0, 0x03, 0x20, 0xC3, + 0x58, 0x07, 0x20, 0x23, 0x04, 0xE0, 0x02, 0x13, + 0x60, 0x04, 0x8E, 0xB7, 0x60, 0x04, 0x8A, 0xA3, + 0x8D, 0x07, 0x00, 0x20, 0x20, 0x20, 0x0A, 0xE0, + 0x01, 0x16, 0x5B, 0x04, 0x0D, 0x02, 0x32, 0x0C, + 0x5D, 0xC2, 0x01, 0x11, 0xDD, 0x04, 0xCD, 0x05, + 0x0D, 0x88, 0x30, 0x0C, 0xF9, 0x16, 0x60, 0xC2, + 0x0A, 0x06, 0x8D, 0x07, 0x6A, 0x09, 0xA0, 0x06, + 0xF4, 0xBE, 0x09, 0x02, 0x48, 0x00, 0xE0, 0xC3, + 0x30, 0x09, 0x03, 0x16, 0xE0, 0x01, 0x6A, 0x09, + 0x10, 0x00, 0xE0, 0xC2, 0x6A, 0x09, 0x0F, 0x02, + 0x00, 0x01, 0xC9, 0x26, 0x02, 0x13, 0x60, 0x04, + 0x86, 0xBD, 0x09, 0x02, 0x00, 0x12, 0x4B, 0x01, + 0x10, 0x00, 0x02, 0x13, 0x09, 0x02, 0x00, 0x13, + 0x09, 0xD8, 0x2E, 0x09, 0x8F, 0x07, 0x00, 0x40, + 0x89, 0x07, 0x6C, 0x09, 0xCB, 0x04, 0xF9, 0xE2, + 0xF9, 0xE2, 0xF9, 0xE2, 0x07, 0x16, 0x8B, 0x07, + 0x34, 0x09, 0x8C, 0x07, 0x6C, 0x09, 0x3B, 0xCF, + 0x3B, 0xCF, 0x1B, 0xC7, 0x20, 0xC3, 0x6C, 0x09, + 0x19, 0x11, 0x8F, 0x07, 0x00, 0x20, 0x89, 0x07, + 0x7A, 0x09, 0xA0, 0x06, 0x3A, 0xBB, 0xA0, 0x06, + 0x3A, 0xBB, 0x12, 0x10, 0x4C, 0xCE, 0x5B, 0x04, + 0x19, 0xC3, 0x02, 0x16, 0x8C, 0x07, 0x1A, 0x00, + 0x4C, 0xC3, 0x2D, 0x02, 0xF8, 0xFF, 0x0A, 0x02, + 0x09, 0x00, 0x2D, 0x02, 0xFA, 0xFF, 0xF2, 0x13, + 0x0A, 0x06, 0xFB, 0x16, 0x60, 0x04, 0x86, 0xBD, + 0x8F, 0x07, 0x00, 0x10, 0xD9, 0xC2, 0xFA, 0x11, + 0x02, 0x16, 0x8B, 0x07, 0x00, 0x04, 0x4B, 0xC3, + 0x8D, 0x02, 0x20, 0x00, 0x02, 0x14, 0x0D, 0x02, + 0x20, 0x00, 0x8D, 0x02, 0x00, 0x04, 0x02, 0x12, + 0x0D, 0x02, 0x00, 0x04, 0x2D, 0x02, 0xF8, 0xFF, + 0x0D, 0xC8, 0x2C, 0x09, 0x2B, 0x02, 0xFF, 0x03, + 0x8B, 0x01, 0xFF, 0x03, 0x4B, 0xCE, 0x60, 0xC3, + 0x6A, 0x09, 0x60, 0x23, 0x18, 0xE0, 0x0C, 0x16, + 0x49, 0xC3, 0xDD, 0xC2, 0x0F, 0x02, 0x01, 0x01, + 0x8B, 0x01, 0x80, 0xC0, 0xD7, 0x16, 0x8F, 0x05, + 0xED, 0xC2, 0x02, 0x00, 0xD3, 0x16, 0x02, 0x10, + 0x8D, 0x07, 0xBA, 0xEA, 0x3D, 0xC8, 0xA8, 0x09, + 0x1D, 0xC8, 0xAA, 0x09, 0xCB, 0x04, 0xE0, 0x04, + 0xF8, 0x05, 0xE0, 0x04, 0x66, 0x09, 0x20, 0xC8, + 0x30, 0x0C, 0x80, 0x09, 0xA0, 0x07, 0x82, 0x09, + 0xFE, 0xDF, 0x8D, 0x07, 0xFE, 0xDF, 0xE0, 0xC3, + 0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x24, 0x16, + 0xE0, 0xC3, 0x30, 0x0C, 0x4F, 0x63, 0xFF, 0x04, + 0xFF, 0x04, 0x4D, 0x06, 0xFD, 0x16, 0x8D, 0x07, + 0xFE, 0xDF, 0x20, 0x04, 0xA2, 0xEA, 0xA0, 0xC3, + 0xA2, 0xEA, 0xEE, 0xC3, 0x12, 0x00, 0xAA, 0x16, + 0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x8C, 0x07, + 0x00, 0xE0, 0xAC, 0x09, 0x0D, 0x63, 0x0C, 0x13, + 0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x2D, 0x02, + 0x40, 0x00, 0x1D, 0x0A, 0x2D, 0x02, 0x32, 0x0C, + 0xBD, 0x07, 0xFF, 0x7F, 0x0C, 0x06, 0xFC, 0x16, + 0x20, 0xC3, 0x46, 0x04, 0x8C, 0x02, 0x80, 0x00, + 0x13, 0x1A, 0xAC, 0x02, 0x0C, 0xC8, 0x9A, 0x00, + 0xE0, 0x02, 0x80, 0x00, 0x88, 0x07, 0x80, 0x00, + 0x60, 0xC2, 0x46, 0x04, 0xA0, 0x06, 0x28, 0xAD, + 0x02, 0x10, 0x9D, 0x00, 0x05, 0x10, 0x9D, 0x00, + 0x8F, 0x07, 0x00, 0x08, 0x60, 0x04, 0x86, 0xBD, + 0x4B, 0x2D, 0x81, 0xC3, 0xC9, 0x05, 0x8F, 0x07, + 0x00, 0x10, 0x8E, 0x02, 0x02, 0x00, 0xF6, 0x11, + 0x8F, 0x07, 0x00, 0x04, 0xC9, 0x05, 0xD9, 0xC2, + 0xE0, 0x26, 0x26, 0xE0, 0x02, 0x16, 0x2B, 0x02, + 0x06, 0x00, 0x4B, 0xC6, 0x4B, 0xC3, 0xCB, 0x72, + 0x2E, 0x02, 0xFE, 0xFF, 0x8B, 0x83, 0xE6, 0x1B, + 0xCD, 0x06, 0x4D, 0x73, 0xCD, 0x82, 0xE2, 0x1B, + 0xE0, 0x04, 0x1A, 0x09, 0xE0, 0x04, 0x1C, 0x09, + 0x4D, 0xC3, 0x02, 0x13, 0x60, 0x66, 0x12, 0xE0, + 0xC9, 0x05, 0xCF, 0x04, 0x81, 0x2D, 0x01, 0xC8, + 0x6C, 0x01, 0xD4, 0x13, 0x0F, 0xC8, 0x00, 0xFC, + 0xC1, 0xC3, 0x0D, 0x06, 0xF7, 0x15, 0x0D, 0x02, + 0x36, 0x07, 0x0E, 0x02, 0x98, 0x08, 0x0C, 0x02, + 0x03, 0x00, 0x8D, 0xCB, 0x02, 0x00, 0x81, 0x2D, + 0x81, 0xCB, 0x06, 0x00, 0xC3, 0x13, 0xEE, 0x04, + 0x0C, 0x00, 0x2E, 0x02, 0x18, 0x00, 0x0C, 0x06, + 0xF4, 0x16, 0xE0, 0x04, 0x96, 0x08, 0x1F, 0x2E, + 0xB9, 0xC3, 0xD9, 0xC3, 0x89, 0x07, 0x12, 0x00, + 0x8D, 0x07, 0x3A, 0x09, 0xA0, 0x06, 0xF4, 0xBE, + 0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, + 0x09, 0x16, 0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, + 0x20, 0xE8, 0x18, 0xE0, 0x98, 0x07, 0x20, 0xE8, + 0x12, 0xE0, 0x78, 0x07, 0x60, 0xC3, 0x6A, 0x09, + 0x60, 0x23, 0x1E, 0xE0, 0x03, 0x16, 0x20, 0x48, + 0xA4, 0xE3, 0x6A, 0x09, 0x60, 0x23, 0x22, 0xE0, + 0x06, 0x13, 0x60, 0x27, 0xA6, 0xE3, 0x03, 0x13, + 0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, 0x20, 0x2D, + 0x00, 0x00, 0x8E, 0x07, 0x00, 0x00, 0xA0, 0x06, + 0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, 0xA0, 0xC0, + 0x04, 0x08, 0xEF, 0xC3, 0x06, 0x00, 0x1B, 0x16, + 0xA0, 0xC3, 0x72, 0x09, 0xE0, 0xC3, 0x74, 0x09, + 0xA0, 0x06, 0xC2, 0xBD, 0xA0, 0xC3, 0x76, 0x09, + 0xE0, 0xC3, 0x78, 0x09, 0xA0, 0x06, 0xE0, 0xBD, + 0x20, 0xE0, 0x0A, 0xE0, 0x60, 0xC3, 0xD8, 0x07, + 0x60, 0x23, 0x16, 0xE0, 0x05, 0x16, 0xE0, 0x04, + 0x2E, 0x06, 0x60, 0x41, 0x04, 0xE0, 0x4D, 0x2E, + 0x8D, 0x07, 0x00, 0x80, 0x52, 0x04, 0xCF, 0x73, + 0x2F, 0x02, 0x00, 0x02, 0x4F, 0xC3, 0x52, 0x04, + 0x20, 0x20, 0x0A, 0xE0, 0x03, 0x13, 0x8D, 0x07, + 0x00, 0x10, 0x5B, 0x04, 0x20, 0x40, 0x0A, 0xE0, + 0x40, 0x02, 0xFF, 0xF0, 0x8E, 0x07, 0x02, 0x00, + 0xA0, 0x06, 0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, + 0xA0, 0xC0, 0x04, 0x08, 0xA0, 0x06, 0xB4, 0xBE, + 0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, + 0x66, 0x16, 0x20, 0x04, 0xB6, 0xEA, 0x63, 0x10, + 0x6E, 0x02, 0x00, 0x80, 0x8D, 0x07, 0x00, 0xC0, + 0x0D, 0xC8, 0xA6, 0x01, 0x0E, 0xC8, 0x72, 0x09, + 0x0F, 0xC8, 0x74, 0x09, 0x0E, 0xC8, 0xA8, 0x01, + 0x0F, 0xC8, 0xAA, 0x01, 0x12, 0x10, 0x8F, 0x01, + 0x01, 0x00, 0x8A, 0x07, 0x76, 0x09, 0xA0, 0xE3, + 0x4E, 0x09, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, + 0xE0, 0xE3, 0x50, 0x09, 0x8F, 0xE6, 0x8A, 0x07, + 0xAC, 0x01, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, + 0x8F, 0xE6, 0x20, 0x20, 0x0A, 0xE0, 0x3F, 0x13, + 0x8D, 0x07, 0x00, 0x10, 0x5B, 0x04, 0x20, 0x20, + 0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, + 0x5B, 0x04, 0x8E, 0xC3, 0x04, 0x13, 0xE0, 0x01, + 0x50, 0x09, 0x00, 0x01, 0x06, 0x10, 0xA0, 0x01, + 0x50, 0x09, 0x00, 0x01, 0xA0, 0x01, 0x78, 0x09, + 0x00, 0x01, 0xA0, 0xC3, 0x76, 0x09, 0xE0, 0xC3, + 0x78, 0x09, 0xA0, 0xE3, 0x4E, 0x09, 0xE0, 0xE3, + 0x50, 0x09, 0x0E, 0xC8, 0xAC, 0x01, 0x0F, 0xC8, + 0xAE, 0x01, 0x0E, 0xC8, 0x76, 0x09, 0x0F, 0xC8, + 0x78, 0x09, 0x19, 0x10, 0x6E, 0x02, 0x00, 0x80, + 0x0E, 0xC8, 0xA6, 0x01, 0x20, 0x20, 0x0A, 0xE0, + 0x12, 0x13, 0x0D, 0x02, 0x00, 0x10, 0x5B, 0x04, + 0x8D, 0x07, 0x28, 0x07, 0x89, 0x07, 0x0E, 0x00, + 0xA0, 0x06, 0xFA, 0xBE, 0x8D, 0x07, 0x28, 0x07, + 0xFD, 0x04, 0x8D, 0x02, 0x36, 0x07, 0xFC, 0x16, + 0x20, 0x48, 0x14, 0xE0, 0xFE, 0x06, 0x8D, 0x07, + 0x00, 0x80, 0x52, 0x04, 0xA0, 0xC2, 0xEE, 0x07, + 0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, 0xF0, 0x08, + 0x97, 0x06, 0x7D, 0xC2, 0x5D, 0xC3, 0x60, 0x43, + 0x22, 0xE0, 0xA0, 0x06, 0xFA, 0xBE, 0xEF, 0x10, + 0x0E, 0xC8, 0x06, 0x06, 0x0F, 0xC8, 0x08, 0x06, + 0xEA, 0x10, 0xB0, 0x03, 0xA0, 0x01, 0x60, 0x07, + 0x26, 0x00, 0x40, 0x02, 0x00, 0xC0, 0xE0, 0x04, + 0x06, 0x06, 0x8C, 0x07, 0x10, 0x40, 0xCC, 0x44, + 0xE0, 0x04, 0xFE, 0x06, 0x85, 0x07, 0x40, 0x80, + 0x5B, 0x04, 0x02, 0xC8, 0x04, 0x08, 0x8F, 0x07, + 0xFA, 0x07, 0xCE, 0xCB, 0x02, 0x00, 0x8E, 0x07, + 0x36, 0x07, 0xCE, 0xCB, 0x04, 0x00, 0x8D, 0x07, + 0x30, 0x06, 0x8E, 0x07, 0x10, 0x00, 0x4D, 0x2C, + 0x5B, 0x04, 0xA0, 0xC2, 0xF2, 0x07, 0x02, 0x10, + 0xA0, 0xC2, 0xF8, 0x07, 0x0B, 0xC8, 0xEA, 0x08, + 0x09, 0xC3, 0x0A, 0x13, 0xA0, 0x06, 0x36, 0xBA, + 0xA0, 0xC2, 0x00, 0x01, 0xA0, 0xE2, 0x06, 0xE0, + 0x4C, 0xA3, 0xCC, 0xA3, 0x01, 0x17, 0x8E, 0x05, + 0x4C, 0x62, 0xE0, 0xC2, 0xEA, 0x08, 0x5B, 0x04, + 0x8D, 0x07, 0x00, 0x10, 0x20, 0x20, 0x0A, 0xE0, + 0x01, 0x13, 0x5B, 0x04, 0x0D, 0x02, 0x48, 0x00, + 0xE0, 0xC3, 0x30, 0x09, 0x02, 0x16, 0xCE, 0x01, + 0x10, 0x00, 0x8D, 0x27, 0x03, 0x13, 0x0D, 0x02, + 0x00, 0x01, 0x52, 0x04, 0x00, 0x03, 0x02, 0x00, + 0x60, 0xC3, 0x6A, 0x09, 0x4D, 0x02, 0x08, 0x80, + 0x4E, 0x02, 0xF7, 0x7F, 0x8D, 0xE3, 0xE0, 0xC3, + 0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x04, 0x13, + 0x8D, 0x07, 0x06, 0x00, 0x8D, 0x27, 0x02, 0x13, + 0xA0, 0xE3, 0x10, 0xE0, 0x0E, 0xC8, 0x6A, 0x09, + 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x09, 0x13, + 0x0D, 0x02, 0x00, 0x12, 0x4E, 0x01, 0x10, 0x00, + 0x02, 0x13, 0x0D, 0x02, 0x00, 0x13, 0x0D, 0xD8, + 0x2E, 0x09, 0x60, 0xC3, 0x80, 0x01, 0x4E, 0x02, + 0x01, 0x00, 0x4D, 0x02, 0xFE, 0xFF, 0x4E, 0xE3, + 0x0D, 0xC8, 0x80, 0x01, 0x20, 0xD8, 0x40, 0xE2, + 0x2F, 0x09, 0x20, 0x01, 0x6A, 0x09, 0x06, 0x00, + 0x03, 0x13, 0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, + 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x03, 0x13, + 0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01, 0x00, 0x03, + 0x0F, 0x00, 0x60, 0x04, 0x88, 0xBE, 0x20, 0x20, + 0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, + 0x5B, 0x04, 0x09, 0x02, 0x08, 0x00, 0x0D, 0x02, + 0x58, 0x09, 0xA0, 0x06, 0xF4, 0xBE, 0xA0, 0x07, + 0x02, 0x02, 0x00, 0x00, 0x0D, 0x02, 0x00, 0x04, + 0xE0, 0xC3, 0x58, 0x09, 0x0F, 0x01, 0x00, 0x7C, + 0x01, 0x13, 0x52, 0x04, 0x8F, 0xC3, 0x4E, 0x02, + 0x0F, 0x00, 0xFB, 0x13, 0x8E, 0x02, 0x0F, 0x00, + 0xF8, 0x13, 0x0D, 0x02, 0x00, 0x40, 0x4F, 0xC2, + 0x49, 0x09, 0x49, 0x02, 0x3F, 0x00, 0x09, 0x01, + 0x01, 0x00, 0xEF, 0x16, 0x89, 0x02, 0x06, 0x00, + 0xEC, 0x1A, 0x89, 0x02, 0x20, 0x00, 0xE9, 0x14, + 0xC9, 0x06, 0x1F, 0x09, 0x4F, 0x02, 0x00, 0x40, + 0x4F, 0xE2, 0x69, 0x02, 0x00, 0x80, 0x09, 0xC8, + 0x58, 0x09, 0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, + 0x1F, 0x09, 0x09, 0x06, 0xFD, 0x16, 0x4F, 0x05, + 0x0D, 0x02, 0x00, 0x20, 0x60, 0xC2, 0x5A, 0x09, + 0xD4, 0x13, 0x4F, 0x26, 0xD2, 0x16, 0x0D, 0x02, + 0x00, 0x10, 0x60, 0xC2, 0x5C, 0x09, 0xCD, 0x13, + 0x4F, 0x26, 0xCB, 0x16, 0x0D, 0x02, 0x00, 0x30, + 0x20, 0x88, 0x5A, 0x09, 0x5C, 0x09, 0xC5, 0x13, + 0xE0, 0xC3, 0x5A, 0x09, 0x4E, 0xC2, 0x1F, 0x0A, + 0x09, 0x06, 0xFD, 0x16, 0xE0, 0xE3, 0x5E, 0x09, + 0x0F, 0xC8, 0x5A, 0x09, 0xE0, 0xC3, 0x5C, 0x09, + 0x4E, 0xC2, 0x1F, 0x0A, 0x09, 0x06, 0xFD, 0x16, + 0xE0, 0xE3, 0x5E, 0x09, 0x0F, 0xC8, 0x5C, 0x09, + 0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, 0x1F, 0x0A, + 0x09, 0x06, 0xFD, 0x16, 0x0D, 0x02, 0x00, 0x08, + 0x60, 0xC2, 0x5E, 0x09, 0x4F, 0x26, 0xA5, 0x16, + 0x4F, 0x05, 0x0F, 0xC8, 0x5E, 0x09, 0x0F, 0x02, + 0x02, 0x02, 0x0E, 0x02, 0x03, 0x00, 0x60, 0xC3, + 0x40, 0x01, 0x0C, 0x02, 0xFE, 0xC0, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0x04, 0xCF, 0x05, 0x09, 0x02, + 0x55, 0x55, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, + 0x09, 0x07, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, + 0x0E, 0x06, 0xF4, 0x16, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x09, 0x02, + 0x08, 0x00, 0x0E, 0x02, 0x58, 0x09, 0x0F, 0x02, + 0x02, 0x02, 0xFE, 0xCF, 0x49, 0x06, 0xFD, 0x16, + 0x60, 0x04, 0x88, 0xBE, 0xC9, 0xC7, 0x5F, 0x82, + 0x01, 0x16, 0x5B, 0x04, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x0D, 0x02, + 0x00, 0x01, 0x52, 0x04, 0x8D, 0x07, 0x00, 0x10, + 0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, + 0x00, 0x08, 0x20, 0x20, 0x10, 0xE0, 0x05, 0x13, + 0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, + 0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x10, 0xE0, + 0x20, 0x07, 0x9C, 0x08, 0x20, 0x07, 0xB4, 0x08, + 0x20, 0x07, 0xCC, 0x08, 0xA0, 0x07, 0xA2, 0x08, + 0x84, 0x02, 0xA0, 0x07, 0xBA, 0x08, 0x84, 0x02, + 0xA0, 0x07, 0xD2, 0x08, 0x84, 0x02, 0xA0, 0x07, + 0x04, 0x09, 0x00, 0x40, 0xE0, 0x04, 0x06, 0x09, + 0xE0, 0x04, 0x08, 0x09, 0x0E, 0xC8, 0x4C, 0x08, + 0x0F, 0xC8, 0x4E, 0x08, 0x0E, 0xC8, 0x8E, 0x08, + 0x0F, 0xC8, 0x90, 0x08, 0xE0, 0x04, 0x5A, 0x08, + 0xE0, 0x04, 0x60, 0x08, 0xE0, 0x02, 0x78, 0x07, + 0xE0, 0x04, 0x94, 0x08, 0x20, 0x40, 0x40, 0xE3, + 0x20, 0xE0, 0x0C, 0xE0, 0x60, 0x04, 0xBC, 0xC6, + 0x80, 0x01, 0x00, 0xF0, 0xC0, 0x01, 0x00, 0x40, + 0x10, 0x10, 0x80, 0x01, 0x00, 0xF0, 0x0D, 0x10, + 0xC0, 0x01, 0x00, 0xF0, 0x20, 0x40, 0x06, 0xE0, + 0x08, 0x10, 0xC0, 0x01, 0x00, 0xF0, 0x80, 0x01, + 0x00, 0x20, 0xE0, 0xC3, 0x94, 0x08, 0x01, 0x16, + 0x5B, 0x04, 0x4B, 0xC0, 0x20, 0x04, 0xDA, 0xEA, + 0x40, 0x01, 0x00, 0x20, 0xFB, 0x16, 0x51, 0x04, + 0xA0, 0xC2, 0xD8, 0x07, 0x4A, 0x01, 0x40, 0x00, + 0x01, 0x16, 0x5B, 0x04, 0xE0, 0x02, 0x78, 0x07, + 0x20, 0x20, 0x0C, 0xE0, 0xEF, 0x16, 0x43, 0xC2, + 0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, 0x20, 0x2F, + 0x36, 0x07, 0x20, 0x40, 0x0C, 0xE0, 0xA0, 0x06, + 0xAC, 0xC1, 0xA0, 0xC3, 0x94, 0x08, 0xFB, 0x16, + 0xA0, 0x06, 0x3A, 0xC2, 0x8E, 0x07, 0x04, 0x09, + 0x9E, 0x07, 0x00, 0x80, 0x20, 0x20, 0x10, 0xE0, + 0x05, 0x16, 0x8F, 0x07, 0x4C, 0x08, 0xBF, 0xCF, + 0xBF, 0xCF, 0x9F, 0xC7, 0xA0, 0x06, 0x5A, 0xC2, + 0x20, 0xE8, 0x3C, 0xE3, 0x62, 0x07, 0xA0, 0x06, + 0x3A, 0xC2, 0x20, 0x48, 0x3C, 0xE3, 0x62, 0x07, + 0x20, 0x40, 0x40, 0xE3, 0x20, 0xE0, 0x04, 0xE0, + 0x20, 0x48, 0x10, 0xE0, 0x58, 0x07, 0x5B, 0x04, + 0x80, 0x01, 0x00, 0xF0, 0x20, 0xE0, 0x04, 0xE0, + 0x60, 0x01, 0x60, 0x07, 0x02, 0x00, 0x02, 0x13, + 0x9B, 0x06, 0xB8, 0x10, 0x20, 0xE8, 0x1E, 0xE0, + 0x58, 0x07, 0xB4, 0x10, 0x9B, 0x06, 0x80, 0x03, + 0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, 0x00, 0x40, + 0x07, 0x16, 0x8D, 0x07, 0x00, 0x09, 0xA0, 0x06, + 0x68, 0xB8, 0xE0, 0x02, 0x78, 0x07, 0x5B, 0x04, + 0xC4, 0x01, 0x02, 0x00, 0xE0, 0x02, 0x78, 0x07, + 0x5B, 0x04, 0x0E, 0x68, 0x96, 0x08, 0xE9, 0x04, + 0x0C, 0x00, 0x11, 0x10, 0x0E, 0x02, 0x00, 0x23, + 0x4E, 0xDB, 0x01, 0x00, 0xCC, 0x01, 0x00, 0x04, + 0x4C, 0xD7, 0x1C, 0x10, 0x60, 0xC2, 0x5C, 0x07, + 0x20, 0x06, 0x94, 0x08, 0xA9, 0xC2, 0x08, 0x00, + 0xA9, 0xC3, 0x0C, 0x00, 0xEA, 0x16, 0x29, 0x07, + 0x04, 0x00, 0x69, 0x01, 0x0A, 0x00, 0x01, 0x00, + 0x2D, 0x13, 0x49, 0xC3, 0x2D, 0x02, 0x0E, 0x00, + 0x0A, 0xC3, 0x1D, 0xD3, 0x8C, 0x01, 0x00, 0x84, + 0xCC, 0x01, 0x00, 0x40, 0x0A, 0x01, 0x00, 0x5E, + 0xDD, 0x16, 0x4C, 0xC7, 0xA9, 0xC3, 0x10, 0x00, + 0xE9, 0xC3, 0x12, 0x00, 0x41, 0xCA, 0x10, 0x00, + 0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, 0x8E, 0x05, + 0x8C, 0x07, 0x02, 0x00, 0xA0, 0xC2, 0xF6, 0x07, + 0xA0, 0x06, 0x00, 0xBA, 0x69, 0xC0, 0x10, 0x00, + 0x29, 0xC8, 0x14, 0x00, 0x06, 0x09, 0x29, 0xC8, + 0x16, 0x00, 0x08, 0x09, 0x69, 0x01, 0x0E, 0x00, + 0x00, 0x08, 0x04, 0x16, 0x90, 0x03, 0x7F, 0x00, + 0xA0, 0x06, 0x5A, 0xC2, 0x40, 0x01, 0x00, 0x40, + 0x01, 0x16, 0x51, 0x04, 0x60, 0x04, 0xBE, 0xC1, + 0xA9, 0xC3, 0x0C, 0x00, 0x0B, 0x13, 0x0E, 0x68, + 0x96, 0x08, 0xE9, 0x04, 0x0C, 0x00, 0x29, 0xC8, + 0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC3, 0x00, 0xFC, + 0x01, 0x13, 0x1E, 0x2E, 0x29, 0x07, 0x04, 0x00, + 0x5B, 0x04, 0x81, 0x07, 0x20, 0x20, 0x89, 0x07, + 0x4C, 0x08, 0x41, 0xCE, 0x63, 0xCE, 0x10, 0x00, + 0x63, 0xC6, 0x12, 0x00, 0xA0, 0x06, 0x54, 0xBA, + 0x43, 0xC2, 0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, + 0x20, 0xE0, 0x10, 0xE0, 0x60, 0x04, 0xEC, 0xC1, + 0x40, 0x01, 0x00, 0x04, 0xEA, 0x16, 0xA0, 0x06, + 0xAC, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, 0x8C, 0x07, + 0x04, 0x00, 0x8D, 0x07, 0x4C, 0x08, 0xA0, 0xC3, + 0x8E, 0x08, 0xE0, 0xC3, 0x90, 0x08, 0xA0, 0x06, + 0x36, 0xBA, 0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, + 0x01, 0x00, 0x13, 0x16, 0xE0, 0xC2, 0x94, 0x08, + 0xEA, 0x16, 0x60, 0x04, 0xEC, 0xC1, 0xE0, 0xC3, + 0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, 0x09, 0x16, + 0x60, 0x04, 0xEC, 0xC1, 0xA0, 0x06, 0x54, 0xBA, + 0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, + 0xD7, 0x13, 0xA0, 0xC2, 0xF0, 0x07, 0x20, 0xC3, + 0x7C, 0x09, 0x8D, 0x07, 0x4C, 0x08, 0x9D, 0xC3, + 0xA0, 0x06, 0x36, 0xBA, 0xC0, 0x06, 0x20, 0xD0, + 0x50, 0x08, 0xC0, 0x06, 0x40, 0x01, 0x00, 0x04, + 0x0A, 0x16, 0x40, 0x01, 0x80, 0x00, 0x07, 0x13, + 0x0E, 0xC8, 0x4C, 0x08, 0x0F, 0xC8, 0x4E, 0x08, + 0xA0, 0x06, 0xA2, 0xC1, 0xD8, 0x10, 0x0E, 0xC8, + 0x8E, 0x08, 0x0F, 0xC8, 0x90, 0x08, 0x40, 0x01, + 0x00, 0x04, 0x0C, 0x13, 0x40, 0x01, 0x20, 0x00, + 0x58, 0x16, 0x81, 0x07, 0x10, 0x20, 0x9F, 0x10, + 0xA0, 0x06, 0xAC, 0xC1, 0xA0, 0xC3, 0x8E, 0x08, + 0xE0, 0xC3, 0x90, 0x08, 0x83, 0x07, 0x98, 0x08, + 0x63, 0x07, 0x04, 0x00, 0x2D, 0x11, 0x83, 0x07, + 0xB0, 0x08, 0x63, 0x07, 0x04, 0x00, 0x28, 0x11, + 0x83, 0x07, 0xC8, 0x08, 0x63, 0x07, 0x04, 0x00, + 0x23, 0x11, 0xC3, 0x60, 0x60, 0xC2, 0x46, 0x07, + 0xE7, 0x13, 0x69, 0x01, 0x0E, 0x00, 0x00, 0x08, + 0xE3, 0x13, 0x00, 0x03, 0x02, 0x00, 0x19, 0xC8, + 0x46, 0x07, 0x03, 0x16, 0xA0, 0x01, 0x3A, 0x07, + 0x20, 0x00, 0x00, 0x03, 0x0F, 0x00, 0xC0, 0x01, + 0x00, 0xF0, 0x80, 0x01, 0x00, 0x20, 0x01, 0x02, + 0x06, 0xC4, 0x60, 0x04, 0x9A, 0xC2, 0x81, 0x07, + 0x80, 0x20, 0xE0, 0xC8, 0x8E, 0x08, 0x14, 0x00, + 0xE0, 0xC8, 0x90, 0x08, 0x16, 0x00, 0xC7, 0x10, + 0xE0, 0xC8, 0x50, 0x08, 0x0E, 0x00, 0xCE, 0xC8, + 0x10, 0x00, 0xCF, 0xC8, 0x12, 0x00, 0x40, 0x01, + 0x20, 0x00, 0xBB, 0x16, 0xE3, 0xC1, 0x06, 0x00, + 0xC7, 0xC8, 0x08, 0x00, 0x07, 0xC8, 0x6C, 0x01, + 0x07, 0xC8, 0xE0, 0x08, 0x08, 0x02, 0x02, 0xFC, + 0xB8, 0x07, 0x00, 0x81, 0xE0, 0xC1, 0xE8, 0x00, + 0x07, 0xCE, 0x20, 0xC8, 0x52, 0x08, 0x92, 0x08, + 0xDA, 0x13, 0xCE, 0xC8, 0x14, 0x00, 0xCF, 0xC8, + 0x16, 0x00, 0x80, 0x01, 0x00, 0x04, 0x82, 0x07, + 0x54, 0x08, 0x32, 0xC1, 0x08, 0x11, 0x72, 0xC1, + 0x92, 0xC1, 0x82, 0x07, 0x8A, 0x08, 0x04, 0xC1, + 0x07, 0x16, 0x60, 0x04, 0x8E, 0xC5, 0x72, 0xC1, + 0xB2, 0xC1, 0x84, 0x01, 0x00, 0x80, 0xF9, 0x13, + 0x04, 0x68, 0x92, 0x08, 0xC7, 0xC1, 0x37, 0x16, + 0x20, 0x98, 0x97, 0x08, 0x85, 0x09, 0x16, 0x16, + 0x81, 0x07, 0x40, 0x20, 0xE0, 0xC1, 0x94, 0x08, + 0x57, 0x13, 0xA0, 0x06, 0xAC, 0xC1, 0xF4, 0x10, + 0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, 0x62, 0x07, + 0xE0, 0x26, 0x3A, 0xE3, 0x02, 0x13, 0xA0, 0x06, + 0x92, 0xC1, 0xA0, 0x06, 0x54, 0xBA, 0x22, 0x10, + 0xA0, 0x06, 0x9C, 0xC1, 0x81, 0x2D, 0x01, 0xC2, + 0xFB, 0x13, 0xA0, 0x05, 0x96, 0x08, 0x23, 0xC8, + 0x08, 0x00, 0x6C, 0x01, 0xA0, 0x07, 0x02, 0xFC, + 0x00, 0x80, 0xC3, 0xC1, 0x27, 0x02, 0x06, 0x00, + 0xA0, 0x06, 0x0C, 0xB5, 0xA3, 0x05, 0x0C, 0x00, + 0x08, 0xC8, 0x6C, 0x01, 0x08, 0xC8, 0xE0, 0x08, + 0x08, 0x02, 0x02, 0xFC, 0xB8, 0x07, 0x00, 0x81, + 0xF8, 0xC1, 0x04, 0xC1, 0x37, 0x13, 0xE0, 0xD2, + 0x03, 0x01, 0xD2, 0x13, 0x0B, 0x02, 0x0A, 0x01, + 0xC4, 0xCE, 0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, + 0xFB, 0x04, 0x09, 0x02, 0x00, 0x04, 0x48, 0xA2, + 0xC9, 0xC6, 0x20, 0xA8, 0xE0, 0x08, 0x12, 0x01, + 0x20, 0xC8, 0xF2, 0x07, 0x00, 0x01, 0x47, 0xC2, + 0xC4, 0x81, 0x01, 0x14, 0x44, 0xC2, 0xC9, 0x61, + 0x09, 0xA2, 0x89, 0xA1, 0x01, 0x17, 0x85, 0x05, + 0x09, 0x61, 0xA8, 0x16, 0x82, 0x02, 0x8A, 0x08, + 0x05, 0x16, 0x40, 0x01, 0x10, 0x00, 0x12, 0x13, + 0x60, 0x04, 0xA6, 0xC3, 0x60, 0x04, 0xBC, 0xC4, + 0x60, 0x04, 0x40, 0xC3, 0x81, 0x07, 0x80, 0x20, + 0xFB, 0x10, 0x81, 0x07, 0x80, 0x20, 0xF8, 0x10, + 0x81, 0x07, 0x02, 0x20, 0xF5, 0x10, 0x81, 0x07, + 0x04, 0x20, 0xF2, 0x10, 0x23, 0xC8, 0x08, 0x00, + 0x6C, 0x01, 0x07, 0x05, 0xE0, 0xA1, 0xE8, 0x00, + 0x0C, 0x02, 0x04, 0xFC, 0x07, 0xCF, 0xE0, 0xC2, + 0x92, 0x08, 0xE8, 0x16, 0xE0, 0xD2, 0x03, 0x01, + 0x10, 0x16, 0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, + 0x62, 0x07, 0xE0, 0x26, 0x3A, 0xE3, 0x07, 0x13, + 0x90, 0x03, 0xC8, 0x2F, 0xA0, 0x06, 0x92, 0xC1, + 0xE0, 0xD2, 0x03, 0x01, 0x02, 0x16, 0xA0, 0x06, + 0x54, 0xBA, 0x23, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0xA3, 0xC2, 0x0E, 0x00, 0x4A, 0x01, 0x00, 0x01, + 0x0B, 0x13, 0x0C, 0x02, 0x0E, 0xFC, 0x5C, 0xC2, + 0x49, 0x02, 0x00, 0x80, 0x0D, 0x02, 0x6C, 0x09, + 0x7D, 0xE2, 0x09, 0xCF, 0x3D, 0xCF, 0x3D, 0xCF, + 0x0C, 0x02, 0x00, 0xFC, 0x6C, 0xC3, 0x06, 0x00, + 0x4D, 0x02, 0xFF, 0xE0, 0x4A, 0x02, 0x00, 0x02, + 0x8A, 0xA2, 0x8A, 0xA2, 0x4A, 0xE3, 0x60, 0xE3, + 0x9E, 0x09, 0x0D, 0xCB, 0x06, 0x00, 0xCD, 0x06, + 0x0B, 0x02, 0x0F, 0x00, 0xEC, 0x82, 0x04, 0x00, + 0xAD, 0x11, 0xEC, 0xC3, 0x0E, 0x00, 0x11, 0x15, + 0x10, 0x13, 0x6C, 0xC2, 0x14, 0x00, 0x49, 0x02, + 0x00, 0x1F, 0xA7, 0x13, 0xC9, 0x06, 0x89, 0x02, + 0x12, 0x00, 0xA3, 0x1B, 0x49, 0x01, 0x01, 0x00, + 0xA0, 0x13, 0xC9, 0xA2, 0xEC, 0x82, 0x04, 0x00, + 0x9C, 0x11, 0x4D, 0xA3, 0x9D, 0x18, 0x14, 0x11, + 0x60, 0x01, 0x6A, 0x09, 0x00, 0x80, 0x18, 0x13, + 0x1D, 0x09, 0xCC, 0xA2, 0xEB, 0xC2, 0x08, 0x00, + 0x7B, 0x09, 0x4B, 0x02, 0x1E, 0x00, 0xA0, 0xC3, + 0xF0, 0x06, 0xAB, 0x23, 0x04, 0xE0, 0x8F, 0x16, + 0x60, 0x27, 0x3E, 0xE3, 0x8C, 0x16, 0x4D, 0xA3, + 0x4D, 0xA3, 0x4D, 0xA3, 0xCD, 0x06, 0x4D, 0x02, + 0x07, 0x00, 0x0D, 0x88, 0xEE, 0x06, 0x0A, 0x15, + 0x90, 0x03, 0xFF, 0x6F, 0x53, 0x2F, 0xA0, 0x05, + 0x94, 0x08, 0xC3, 0x04, 0xC0, 0x01, 0x00, 0x04, + 0x60, 0x04, 0xAA, 0xC3, 0x60, 0x01, 0x6A, 0x09, + 0x00, 0x80, 0xF2, 0x13, 0x01, 0x02, 0x08, 0x20, + 0x60, 0x04, 0xA2, 0xC5, 0x8D, 0x07, 0x00, 0x10, + 0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, + 0x00, 0x08, 0x20, 0x20, 0x0E, 0xE0, 0x05, 0x13, + 0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, + 0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x0E, 0xE0, + 0xA0, 0x07, 0xFA, 0x08, 0x00, 0x80, 0x0E, 0xC8, + 0xFA, 0x07, 0x0F, 0xC8, 0xFC, 0x07, 0x0E, 0xC8, + 0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xE0, 0x04, + 0x08, 0x08, 0xE0, 0x04, 0x0E, 0x08, 0xE0, 0x02, + 0x98, 0x07, 0x20, 0x40, 0x4C, 0xE3, 0x20, 0x07, + 0x2E, 0x06, 0x60, 0x04, 0x12, 0xCA, 0x00, 0x70, + 0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, 0x0B, 0x10, + 0x20, 0xF0, 0x4B, 0xE3, 0x02, 0x10, 0x20, 0xF0, + 0x4A, 0xE3, 0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, + 0xE0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x20, 0xE8, + 0x46, 0xE3, 0x62, 0x07, 0x20, 0x04, 0xDA, 0xEA, + 0x40, 0x01, 0x00, 0x20, 0x04, 0x13, 0xFA, 0x10, + 0x40, 0x01, 0x00, 0x40, 0xF7, 0x16, 0x20, 0x07, + 0x2E, 0x06, 0x20, 0x50, 0x50, 0xE3, 0x51, 0x04, + 0xF1, 0x10, 0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, + 0x00, 0x40, 0x07, 0x16, 0x8D, 0x07, 0xF6, 0x08, + 0xA0, 0x06, 0x68, 0xB8, 0xE0, 0x02, 0x98, 0x07, + 0x5B, 0x04, 0xC4, 0x01, 0x04, 0x00, 0xE0, 0x02, + 0x98, 0x07, 0x5B, 0x04, 0x60, 0x01, 0x60, 0x07, + 0x04, 0x00, 0x06, 0x16, 0x20, 0xE8, 0x1C, 0xE0, + 0x58, 0x07, 0x80, 0x03, 0xE0, 0x02, 0x98, 0x07, + 0x20, 0xD8, 0xDC, 0x07, 0x17, 0x01, 0x8F, 0x07, + 0x8E, 0xFF, 0x0F, 0xC8, 0x04, 0x01, 0x20, 0xE8, + 0x06, 0xE0, 0x58, 0x07, 0x80, 0x01, 0x00, 0x80, + 0x5B, 0x04, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, + 0x03, 0x13, 0xDB, 0x2D, 0x03, 0xC8, 0x4A, 0x08, + 0x49, 0x01, 0x00, 0x01, 0x02, 0x16, 0x60, 0x04, + 0x52, 0xC9, 0xE0, 0xC0, 0xF8, 0x05, 0xFD, 0x13, + 0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, + 0xF8, 0x05, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, + 0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x49, 0x01, + 0x00, 0x01, 0x4D, 0x16, 0x09, 0x01, 0x00, 0x5E, + 0x29, 0x16, 0x49, 0x01, 0x02, 0x00, 0x0B, 0x16, + 0x60, 0x01, 0x46, 0x08, 0x00, 0x02, 0x0A, 0x16, + 0x27, 0x02, 0x04, 0x00, 0x07, 0x88, 0x7E, 0x09, + 0x05, 0x12, 0x27, 0x02, 0xFC, 0xFF, 0xA0, 0x01, + 0x46, 0x08, 0x00, 0x02, 0xC7, 0xC1, 0x37, 0x15, + 0xD3, 0x2D, 0xE0, 0xC0, 0x4A, 0x08, 0x07, 0xA8, + 0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, 0x0C, 0x15, + 0x20, 0xC8, 0x3C, 0x08, 0xFA, 0x07, 0x20, 0xC8, + 0x3E, 0x08, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, + 0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, + 0x60, 0x04, 0x52, 0xC9, 0xA0, 0x06, 0x54, 0xBA, + 0xD3, 0x2D, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, + 0x01, 0x13, 0xDB, 0x2D, 0x20, 0x88, 0x3E, 0x08, + 0x3A, 0x08, 0x0D, 0x16, 0x20, 0x88, 0x3C, 0x08, + 0x38, 0x08, 0x09, 0x16, 0xE0, 0x04, 0x44, 0x08, + 0x82, 0x07, 0x02, 0x08, 0x04, 0x61, 0xE0, 0x04, + 0x48, 0x08, 0x60, 0x04, 0x1E, 0xCA, 0x20, 0xC8, + 0x38, 0x08, 0xFA, 0x07, 0x20, 0xC8, 0x3A, 0x08, + 0xFC, 0x07, 0x60, 0x04, 0x12, 0xCA, 0x07, 0xA8, + 0x48, 0x08, 0x04, 0xC1, 0x1B, 0x16, 0x82, 0x02, + 0x38, 0x08, 0x0A, 0x16, 0x60, 0x01, 0xFC, 0x07, + 0x01, 0x00, 0x02, 0x16, 0xA0, 0x06, 0x6E, 0xCB, + 0xA0, 0x06, 0xFC, 0xCA, 0x80, 0x01, 0x10, 0x00, + 0x32, 0xC1, 0x07, 0x11, 0x72, 0xC1, 0x92, 0xC1, + 0x82, 0x07, 0x38, 0x08, 0x04, 0xC1, 0x06, 0x16, + 0xEA, 0x10, 0x72, 0xC1, 0xB2, 0xC1, 0x84, 0x01, + 0x00, 0x80, 0xE5, 0x13, 0xE0, 0xD2, 0x03, 0x01, + 0x34, 0x13, 0x0B, 0x02, 0x0A, 0x01, 0xC4, 0xCE, + 0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, 0xFB, 0x04, + 0xC8, 0xC6, 0x03, 0xA8, 0x12, 0x01, 0x20, 0xC8, + 0xF8, 0x07, 0x00, 0x01, 0xC7, 0xC2, 0xC4, 0x81, + 0x01, 0x14, 0xC4, 0xC2, 0x0B, 0xA8, 0x44, 0x08, + 0x0B, 0x61, 0x0B, 0xA2, 0x8B, 0xA1, 0x01, 0x17, + 0x85, 0x05, 0xCB, 0x61, 0xC6, 0x16, 0x40, 0x01, + 0x40, 0x00, 0x15, 0x16, 0x87, 0x07, 0x20, 0x00, + 0xE0, 0x61, 0x44, 0x08, 0xC4, 0x81, 0x08, 0x1A, + 0x07, 0xA8, 0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, + 0x07, 0x61, 0x87, 0xA1, 0x01, 0x17, 0x85, 0x05, + 0x80, 0x01, 0x40, 0x00, 0x03, 0xC8, 0x6C, 0x01, + 0xE0, 0xC1, 0x04, 0xFC, 0xAC, 0x10, 0x60, 0x04, + 0xBC, 0xC7, 0x20, 0x01, 0x3A, 0x07, 0x00, 0x70, + 0x04, 0x13, 0xA0, 0x06, 0x28, 0xC7, 0x20, 0x07, + 0x2E, 0x06, 0xA0, 0x06, 0x54, 0xBA, 0xC1, 0x10, + 0xE0, 0xD2, 0x03, 0x01, 0x0A, 0x16, 0x20, 0x01, + 0x3A, 0x07, 0x00, 0x70, 0x04, 0x13, 0xA0, 0x06, + 0x28, 0xC7, 0x20, 0x07, 0x2E, 0x06, 0xA0, 0x06, + 0x54, 0xBA, 0x90, 0x03, 0xBF, 0x4F, 0xD3, 0x2D, + 0x60, 0x01, 0xFC, 0x07, 0x01, 0x00, 0x02, 0x16, + 0xA0, 0x06, 0x6E, 0xCB, 0x60, 0xD2, 0x46, 0x08, + 0x89, 0x01, 0x00, 0xF1, 0xC9, 0x01, 0x00, 0x70, + 0x40, 0x01, 0x10, 0x00, 0x1C, 0x13, 0x20, 0x88, + 0x3E, 0x08, 0x3A, 0x08, 0x04, 0x16, 0x20, 0x88, + 0x3C, 0x08, 0x38, 0x08, 0x14, 0x13, 0x89, 0x01, + 0x00, 0x10, 0x8D, 0x07, 0x44, 0x08, 0x9D, 0x07, + 0x00, 0x50, 0xA0, 0xC2, 0xF6, 0x07, 0x8C, 0x07, + 0x02, 0x00, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, + 0x3E, 0x08, 0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, + 0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x8D, 0x07, + 0x46, 0x08, 0x49, 0xC7, 0xA0, 0xC2, 0xF6, 0x07, + 0x8C, 0x07, 0x04, 0x00, 0xA0, 0xC3, 0x38, 0x08, + 0xE0, 0xC3, 0x3A, 0x08, 0xCC, 0xA3, 0x01, 0x17, + 0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x20, 0xC8, + 0x3C, 0x08, 0xFC, 0x08, 0x20, 0xC8, 0x3E, 0x08, + 0xFE, 0x08, 0x09, 0x01, 0x00, 0x0C, 0x0C, 0x13, + 0x49, 0x01, 0x00, 0x04, 0x05, 0x16, 0xA0, 0x06, + 0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0x04, 0x10, + 0x90, 0x03, 0x7F, 0x40, 0xA0, 0x06, 0x6C, 0xC7, + 0xC0, 0x01, 0x90, 0x00, 0xA0, 0x06, 0xFC, 0xCA, + 0x0B, 0xC8, 0x46, 0x08, 0xE0, 0xC2, 0x42, 0x07, + 0x2D, 0x13, 0xE0, 0xC2, 0x2E, 0x06, 0x2A, 0x13, + 0xE0, 0x02, 0x58, 0x07, 0x8F, 0x07, 0xBF, 0xFF, + 0x0F, 0x2C, 0xE0, 0x02, 0x98, 0x07, 0xE0, 0xC0, + 0x5C, 0x07, 0x03, 0xC8, 0x4A, 0x08, 0x03, 0xC8, + 0x6C, 0x01, 0xC3, 0xC2, 0xCB, 0xA2, 0xEB, 0xC2, + 0x32, 0x0C, 0x32, 0x13, 0x0B, 0xC8, 0x00, 0xFC, + 0x0B, 0xC3, 0x4B, 0xC3, 0x0B, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x00, 0xFC, 0xFA, 0x16, 0x00, 0x03, + 0x02, 0x00, 0x20, 0xC8, 0xF8, 0x05, 0x00, 0xFC, + 0x02, 0x16, 0x0D, 0xC8, 0xFA, 0x05, 0x0C, 0xC8, + 0xF8, 0x05, 0x00, 0x03, 0x0F, 0x00, 0x03, 0xC8, + 0x6C, 0x01, 0x1A, 0x10, 0xA0, 0xC3, 0x2E, 0x06, + 0x03, 0x13, 0xE0, 0xC0, 0xF8, 0x05, 0x0D, 0x16, + 0x4F, 0x2E, 0xC0, 0x01, 0x00, 0x80, 0xA0, 0x01, + 0x62, 0x07, 0x00, 0x80, 0x8E, 0xC3, 0x03, 0x13, + 0xA0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x60, 0x04, + 0x4E, 0xC7, 0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, + 0x00, 0xFC, 0xF8, 0x05, 0x03, 0xC8, 0x4A, 0x08, + 0x60, 0x01, 0x6A, 0x09, 0x00, 0x04, 0x02, 0x13, + 0x60, 0x04, 0xE4, 0xC7, 0x8C, 0x07, 0x0E, 0x00, + 0x20, 0xC2, 0x0E, 0xFC, 0x0A, 0x15, 0x09, 0x13, + 0x20, 0xC2, 0x14, 0xFC, 0x48, 0x02, 0x00, 0x1F, + 0xC8, 0x06, 0x88, 0x02, 0x12, 0x00, 0xF0, 0x1B, + 0x08, 0xA3, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, + 0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x07, 0x83, + 0xE7, 0x1A, 0xCC, 0x61, 0x07, 0xC8, 0x04, 0xFC, + 0xCC, 0xC1, 0xC0, 0x01, 0x40, 0x00, 0x60, 0x04, + 0xF0, 0xC7, 0x4B, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, + 0x20, 0xC3, 0x7A, 0x09, 0x8D, 0x07, 0xFA, 0x07, + 0x9D, 0xC3, 0xE0, 0xC3, 0xFC, 0x07, 0xA0, 0x06, + 0x00, 0xBA, 0x20, 0xC8, 0x3C, 0x08, 0x40, 0x08, + 0x20, 0xC8, 0x3E, 0x08, 0x42, 0x08, 0x0E, 0xC8, + 0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xC4, 0x04, + 0x82, 0x07, 0x02, 0x08, 0xE0, 0x04, 0x44, 0x08, + 0x40, 0x01, 0x80, 0x00, 0x06, 0x16, 0x0E, 0xC8, + 0x38, 0x08, 0x0F, 0xC8, 0x3A, 0x08, 0xE0, 0x04, + 0x48, 0x08, 0xA0, 0x06, 0x54, 0xBA, 0xE0, 0xC2, + 0xFE, 0x07, 0x0D, 0x11, 0x0E, 0xC8, 0xFA, 0x07, + 0x0F, 0xC8, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, + 0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, + 0xA0, 0x06, 0x32, 0xC7, 0xCB, 0x10, 0x80, 0x01, + 0x80, 0x00, 0x55, 0x04, 0x8B, 0xC0, 0xA0, 0xC2, + 0xF0, 0x07, 0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, + 0xFA, 0x07, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, + 0x3E, 0x08, 0xA0, 0x06, 0x36, 0xBA, 0x60, 0x01, + 0xFC, 0x07, 0x01, 0x00, 0x04, 0x13, 0xA0, 0x07, + 0xFA, 0x08, 0x00, 0x80, 0x52, 0x04, 0x60, 0x01, + 0x60, 0x07, 0x04, 0x00, 0x07, 0x16, 0x20, 0xD0, + 0x04, 0xE0, 0x20, 0xE8, 0x1A, 0xE0, 0x58, 0x07, + 0x60, 0x04, 0x3E, 0xC7, 0xA0, 0x07, 0xFA, 0x08, + 0x00, 0x40, 0x20, 0xC8, 0x3C, 0x08, 0xFC, 0x08, + 0x20, 0xC8, 0x3E, 0x08, 0xFE, 0x08, 0xA0, 0x06, + 0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0xD3, 0x10, + 0xAD, 0xC2, 0x02, 0x00, 0x6D, 0xC2, 0x00, 0x00, + 0x05, 0x16, 0xAA, 0x07, 0x02, 0x00, 0x36, 0x07, + 0x9A, 0x2C, 0x80, 0x03, 0xEA, 0x2C, 0x02, 0x00, + 0x41, 0xCB, 0x00, 0x00, 0x80, 0x03, 0x2D, 0xC3, + 0x18, 0x00, 0xAC, 0x07, 0x02, 0x00, 0x36, 0x07, + 0x20, 0x4B, 0x06, 0xEB, 0x0A, 0x00, 0x20, 0xEB, + 0x00, 0xEB, 0x0A, 0x00, 0x9C, 0x2E, 0x80, 0x03, + 0xA0, 0xC2, 0x22, 0xE0, 0x60, 0x04, 0x8A, 0xA3, + 0xED, 0xC0, 0x18, 0x00, 0xA0, 0x06, 0x3A, 0xCC, + 0x80, 0x03, 0x44, 0xC2, 0xC3, 0xC0, 0x02, 0x13, + 0xA0, 0x06, 0x3A, 0xCC, 0x19, 0xC3, 0x09, 0xCB, + 0x18, 0x00, 0xC9, 0x05, 0x19, 0xCB, 0x16, 0x00, + 0x4C, 0xC2, 0x2C, 0x02, 0x1A, 0x00, 0x0D, 0xCF, + 0x0E, 0xCF, 0x0F, 0xC7, 0x99, 0x00, 0x5B, 0x04, + 0x8C, 0x07, 0x0A, 0x09, 0x9C, 0xC2, 0xA0, 0x22, + 0x14, 0xE0, 0x06, 0x13, 0xA0, 0xC2, 0x58, 0x07, + 0xA0, 0x22, 0x20, 0xE0, 0x01, 0x16, 0x80, 0x03, + 0x03, 0xC1, 0xC3, 0x04, 0x8A, 0x07, 0x04, 0x00, + 0x84, 0xA2, 0x3A, 0xCF, 0x3A, 0xCF, 0x3A, 0xCF, + 0x3A, 0xCF, 0x3A, 0xCF, 0xE0, 0x02, 0x58, 0x07, + 0x8D, 0x07, 0x0A, 0x09, 0x0B, 0xC8, 0xC2, 0x07, + 0xA0, 0x06, 0x44, 0xB8, 0xE0, 0xC2, 0xC2, 0x07, + 0x20, 0xE0, 0x20, 0xE0, 0xE0, 0x02, 0xB8, 0x07, + 0x5B, 0x04, 0x2D, 0xC3, 0x18, 0x00, 0x8C, 0xC2, + 0x60, 0xC2, 0x6C, 0x01, 0x0A, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x00, 0xFC, 0x02, 0x13, 0x8B, 0xC2, + 0xF9, 0x10, 0x09, 0xC8, 0x6C, 0x01, 0x8B, 0x07, + 0xF8, 0x05, 0x5B, 0xC2, 0x0C, 0x13, 0xCB, 0x05, + 0x5B, 0xC2, 0xCA, 0xC6, 0xE0, 0xC2, 0x6C, 0x01, + 0x09, 0xC8, 0x6C, 0x01, 0x0C, 0xC8, 0x00, 0xFC, + 0x0B, 0xC8, 0x6C, 0x01, 0x02, 0x10, 0xCC, 0xCE, + 0xCA, 0xC6, 0xA0, 0xC2, 0xE0, 0x00, 0xA0, 0x22, + 0x1A, 0xE0, 0x06, 0x16, 0x20, 0xE8, 0x04, 0xE0, + 0x3A, 0x07, 0x20, 0x48, 0x1A, 0xE0, 0xE0, 0x00, + 0x80, 0x03, 0xE0, 0xD3, 0xAB, 0xE3, 0xE0, 0x04, + 0x8E, 0x09, 0xE0, 0xC1, 0xA8, 0x06, 0x05, 0x16, + 0x07, 0x02, 0xA2, 0x06, 0xA0, 0x06, 0x38, 0xB5, + 0x0B, 0x16, 0xE0, 0xC1, 0xBA, 0x06, 0x23, 0x16, + 0x07, 0x02, 0xB4, 0x06, 0xA0, 0x06, 0x38, 0xB5, + 0x1E, 0x13, 0x07, 0x02, 0xB8, 0x06, 0x02, 0x10, + 0x07, 0x02, 0xA6, 0x06, 0x60, 0xC1, 0x02, 0xFC, + 0x25, 0xC8, 0x0C, 0x00, 0x02, 0xFC, 0xC5, 0xC9, + 0x0C, 0x00, 0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xCD, + 0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xC5, 0xB7, 0x01, + 0x28, 0x00, 0x27, 0x02, 0xF4, 0xFF, 0xA7, 0x07, + 0x04, 0x00, 0x52, 0xCE, 0x20, 0xE8, 0x9E, 0x09, + 0x06, 0xFC, 0x97, 0x2E, 0xD2, 0x10, 0x00, 0x03, + 0x02, 0x00, 0xA0, 0x06, 0x50, 0xB5, 0x00, 0x03, + 0x0F, 0x00, 0x20, 0x2C, 0xF0, 0xED, 0xE0, 0x93, + 0xAB, 0xE3, 0x03, 0x16, 0x81, 0x02, 0x16, 0x00, + 0xC4, 0x16, 0x21, 0xC1, 0x10, 0xEB, 0x54, 0x04, + 0xE0, 0x93, 0x10, 0xE0, 0x03, 0x16, 0xA0, 0xD2, + 0xA8, 0xE3, 0x0B, 0x10, 0xCF, 0xD3, 0x09, 0x16, + 0xA0, 0x23, 0x08, 0xE0, 0x06, 0x16, 0x84, 0x07, + 0x20, 0x00, 0x04, 0xE8, 0xD2, 0x06, 0xA0, 0xD2, + 0x0C, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0x04, + 0x70, 0xD1, 0x22, 0xC1, 0x04, 0x00, 0xE2, 0x04, + 0x02, 0x00, 0x54, 0x04, 0x02, 0xC8, 0x6C, 0x01, + 0x82, 0xA0, 0x22, 0xC8, 0x32, 0x0C, 0x00, 0xFC, + 0x02, 0x02, 0x00, 0xFC, 0xE0, 0x93, 0xAA, 0xE3, + 0x13, 0x16, 0xB0, 0x03, 0x20, 0x98, 0xAA, 0xE3, + 0x65, 0x06, 0x0D, 0x16, 0x8B, 0x07, 0x17, 0xFC, + 0xDB, 0xD2, 0x8B, 0x09, 0x8B, 0x02, 0x15, 0x00, + 0x7B, 0x1B, 0xEB, 0xD2, 0xC4, 0xEA, 0x06, 0x13, + 0x77, 0x15, 0x20, 0x07, 0xA0, 0x09, 0x74, 0x10, + 0xA0, 0x06, 0x02, 0xD0, 0xA0, 0x48, 0x04, 0xE0, + 0x0E, 0x00, 0x85, 0x02, 0x07, 0x00, 0x0E, 0x13, + 0x0E, 0x01, 0x03, 0x00, 0x0B, 0x13, 0xA0, 0x23, + 0x22, 0xE0, 0x03, 0x16, 0xA0, 0xD2, 0x0E, 0xE0, + 0x02, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, 0x8E, 0x01, + 0x03, 0x00, 0x5E, 0x10, 0x05, 0xC8, 0xFC, 0x06, + 0xC3, 0xC0, 0x57, 0x16, 0xA0, 0x43, 0x10, 0xE0, + 0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, 0x0A, 0x16, + 0x22, 0x88, 0x10, 0x00, 0x6E, 0x09, 0x06, 0x16, + 0x22, 0x88, 0x12, 0x00, 0x70, 0x09, 0x02, 0x16, + 0xA0, 0xE3, 0x10, 0xE0, 0x85, 0x02, 0x09, 0x00, + 0x02, 0x13, 0xA0, 0x06, 0xB8, 0xD7, 0x45, 0xA1, + 0x65, 0xC1, 0xAC, 0xE3, 0x55, 0x04, 0x62, 0xC0, + 0x04, 0x00, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0x82, 0x02, 0x48, 0x04, 0x02, 0x1B, 0xA0, 0x43, + 0x0C, 0xE0, 0x22, 0xC1, 0x0E, 0x00, 0x51, 0x04, + 0x42, 0xC0, 0xE1, 0x04, 0x02, 0x00, 0xA2, 0xC0, + 0x0C, 0x00, 0x22, 0xC1, 0x0A, 0x00, 0x20, 0x21, + 0x18, 0xE0, 0x07, 0x13, 0xA1, 0xC8, 0x0A, 0x00, + 0x0A, 0x00, 0xA1, 0xC8, 0x08, 0x00, 0x08, 0x00, + 0xE2, 0x10, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0xA0, 0x06, 0x66, 0xD6, 0x60, 0x04, 0xB0, 0xCE, + 0x02, 0xC8, 0xD4, 0x06, 0x62, 0xC1, 0x02, 0x00, + 0x65, 0xC1, 0xD8, 0xE3, 0x55, 0x04, 0x0F, 0x10, + 0x0E, 0x10, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, + 0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, 0xA2, 0xD8, + 0xA0, 0xE3, 0x0C, 0xE0, 0x20, 0xE8, 0x9E, 0x09, + 0x06, 0x04, 0xA0, 0x2E, 0xF4, 0x03, 0x60, 0x04, + 0xE4, 0xCC, 0xA0, 0x06, 0x26, 0xD5, 0x0C, 0x10, + 0xA0, 0x06, 0x66, 0xD6, 0x09, 0x10, 0xA0, 0x06, + 0x2A, 0xD8, 0x06, 0x10, 0xA0, 0x06, 0x66, 0xD6, + 0x03, 0xC8, 0x2A, 0x09, 0xA0, 0xD2, 0xAA, 0xE3, + 0xA0, 0x06, 0x6E, 0xCF, 0xA0, 0x92, 0x26, 0xE0, + 0x0C, 0x16, 0xE0, 0xD3, 0x26, 0xE0, 0xE0, 0x23, + 0x14, 0xE0, 0x0A, 0x13, 0x0A, 0xC1, 0xC4, 0x83, + 0x07, 0x13, 0xC4, 0xC3, 0x24, 0xC1, 0xDC, 0xE3, + 0x54, 0x04, 0xCA, 0x93, 0xDC, 0x13, 0xCA, 0xD3, + 0xB0, 0x03, 0x0F, 0xD8, 0x59, 0x06, 0x04, 0x71, + 0x24, 0xC1, 0xEC, 0xE3, 0x54, 0x04, 0xA0, 0x23, + 0x0C, 0xE0, 0xD1, 0x13, 0x4D, 0xC3, 0xCF, 0x13, + 0x4D, 0x01, 0x00, 0x04, 0x0B, 0x13, 0x86, 0x07, + 0x02, 0x00, 0x84, 0x07, 0x26, 0x00, 0x46, 0x23, + 0x03, 0x13, 0x44, 0x06, 0x86, 0xA1, 0xFB, 0x10, + 0x46, 0x43, 0xB3, 0x10, 0x84, 0x07, 0x18, 0x00, + 0x8D, 0x01, 0x00, 0x04, 0x85, 0x07, 0xF4, 0x03, + 0xF5, 0x04, 0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, + 0xA2, 0xD8, 0x20, 0xE8, 0x9C, 0x09, 0xFE, 0x03, + 0x20, 0xE8, 0x9E, 0x09, 0x06, 0x04, 0xA8, 0x10, + 0x85, 0x07, 0x1C, 0x07, 0x86, 0x07, 0x1A, 0x04, + 0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0xC6, 0x05, + 0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0x83, 0x07, + 0x00, 0x90, 0xA9, 0x10, 0x0B, 0xC3, 0x86, 0x07, + 0x00, 0x01, 0x85, 0x07, 0x00, 0x80, 0x20, 0xC1, + 0xD2, 0x06, 0x37, 0x13, 0xC4, 0x04, 0x60, 0xC0, + 0xD2, 0x06, 0x45, 0x20, 0x04, 0x13, 0x84, 0x05, + 0x15, 0x09, 0xF9, 0x16, 0x2E, 0x10, 0xCF, 0xD3, + 0x06, 0x16, 0xE0, 0x23, 0x14, 0xE0, 0x03, 0x16, + 0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0xE0, 0x04, + 0xD2, 0x06, 0x23, 0x10, 0x64, 0xD0, 0x1C, 0x07, + 0x46, 0xB0, 0x10, 0x18, 0x01, 0xD9, 0x1C, 0x07, + 0x60, 0x23, 0x20, 0xE0, 0x0B, 0x13, 0x81, 0x07, + 0x18, 0x00, 0x61, 0xC0, 0xFC, 0xE3, 0x11, 0x88, + 0xCE, 0xED, 0x04, 0x13, 0x08, 0x02, 0x18, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x64, 0xD0, 0x28, 0x07, + 0x46, 0xB0, 0x08, 0x18, 0x01, 0xD9, 0x28, 0x07, + 0x46, 0xB0, 0x04, 0x17, 0x83, 0x07, 0x40, 0x80, + 0xA0, 0x06, 0x2A, 0xD8, 0x05, 0x48, 0xD2, 0x06, + 0xCA, 0x16, 0x20, 0xC1, 0x32, 0x09, 0x01, 0x16, + 0x5C, 0x04, 0x04, 0x02, 0x07, 0x00, 0x20, 0x06, + 0x32, 0x09, 0x05, 0x02, 0x00, 0x01, 0xC7, 0x10, + 0x0B, 0xC3, 0xC5, 0x04, 0x42, 0xC0, 0xC7, 0x04, + 0x20, 0xC2, 0x6C, 0x01, 0xE1, 0xA1, 0x04, 0x00, + 0x11, 0xC8, 0x6C, 0x01, 0xFB, 0x16, 0x08, 0xC8, + 0x6C, 0x01, 0xC8, 0x04, 0xA0, 0x43, 0x1A, 0xE0, + 0x22, 0xC1, 0x0E, 0x00, 0x0D, 0x15, 0x0C, 0x13, + 0xA0, 0xE3, 0x1A, 0xE0, 0xA0, 0x06, 0x14, 0xD8, + 0x08, 0xC2, 0x48, 0x13, 0x88, 0x02, 0x12, 0x00, + 0x45, 0x1B, 0x20, 0x22, 0x22, 0xE0, 0x42, 0x13, + 0x02, 0xC1, 0x08, 0xA1, 0x08, 0x05, 0x28, 0x02, + 0xF2, 0xFF, 0x07, 0xA2, 0x83, 0x07, 0x01, 0x80, + 0x88, 0x02, 0x04, 0x00, 0x6E, 0x11, 0x64, 0xC2, + 0x16, 0x00, 0x49, 0xD2, 0x02, 0x16, 0x02, 0x81, + 0x31, 0x16, 0x09, 0x01, 0x00, 0xF0, 0x28, 0x16, + 0x49, 0xC1, 0x45, 0x71, 0xC3, 0x04, 0x85, 0x02, + 0x09, 0x00, 0x7C, 0x13, 0x83, 0x07, 0x02, 0x80, + 0xA4, 0xC1, 0x14, 0x00, 0x88, 0x81, 0x76, 0x16, + 0x83, 0x05, 0x85, 0x02, 0x15, 0x00, 0x13, 0x1B, + 0x83, 0x05, 0x49, 0x99, 0x30, 0xEB, 0x0A, 0x13, + 0x09, 0x98, 0x0E, 0xE0, 0x6B, 0x16, 0x25, 0x98, + 0x30, 0xEB, 0x0C, 0xE0, 0x67, 0x16, 0xE0, 0xC1, + 0xEC, 0x06, 0x64, 0x16, 0xC3, 0x04, 0x52, 0xC2, + 0x0F, 0x13, 0x83, 0x07, 0x09, 0x80, 0xE0, 0xC1, + 0x6A, 0x09, 0x47, 0x01, 0x00, 0x10, 0x5A, 0x16, + 0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0x06, 0xBE, 0xD6, + 0x60, 0x04, 0xB0, 0xCE, 0x60, 0x04, 0xBA, 0xCE, + 0x89, 0x07, 0x0E, 0x07, 0xC7, 0x04, 0xE5, 0xD1, + 0x46, 0xEB, 0x05, 0x13, 0xC7, 0x06, 0x27, 0x02, + 0x5C, 0xEB, 0x77, 0xCE, 0xFE, 0x15, 0x44, 0xC0, + 0x21, 0x02, 0x18, 0x00, 0x28, 0x02, 0xFC, 0xFF, + 0x36, 0x13, 0x91, 0xC1, 0x86, 0xD1, 0x1F, 0x13, + 0xC6, 0x06, 0x87, 0x07, 0x0E, 0x07, 0xF7, 0xC0, + 0x46, 0x02, 0xFF, 0xBF, 0x43, 0x02, 0xFF, 0x3F, + 0xA0, 0x91, 0xF5, 0xED, 0x09, 0x16, 0xB0, 0x03, + 0x20, 0x98, 0x0E, 0xE0, 0x5D, 0x06, 0x0F, 0x16, + 0x21, 0xC8, 0x02, 0x00, 0x0C, 0x07, 0x17, 0x10, + 0x47, 0x82, 0x0C, 0x1B, 0xC6, 0x90, 0xEB, 0x16, + 0x47, 0x06, 0xF7, 0x04, 0xB0, 0x03, 0x20, 0x98, + 0x5D, 0x06, 0x57, 0x06, 0x0C, 0x13, 0x83, 0x07, + 0x05, 0x80, 0x1C, 0x10, 0xD1, 0xC0, 0xE0, 0x20, + 0x16, 0xE0, 0x03, 0x16, 0x83, 0x07, 0x08, 0x80, + 0x15, 0x10, 0x60, 0x44, 0x26, 0xE0, 0x86, 0x71, + 0x46, 0xA0, 0x06, 0x62, 0x83, 0x07, 0x05, 0x80, + 0x08, 0xC2, 0xCB, 0x15, 0x0B, 0x16, 0xC3, 0x04, + 0x87, 0x07, 0x0E, 0x07, 0x77, 0xC0, 0x47, 0x82, + 0x05, 0x1B, 0x60, 0x20, 0x06, 0xE0, 0xFA, 0x16, + 0x83, 0x07, 0x07, 0x80, 0x5C, 0x04, 0xA0, 0x92, + 0x0E, 0xE0, 0x11, 0x16, 0x20, 0xC8, 0x20, 0xE0, + 0x08, 0x07, 0xE0, 0x04, 0x84, 0x01, 0x60, 0x05, + 0x02, 0x07, 0x4B, 0x13, 0x20, 0x48, 0x06, 0xE0, + 0x82, 0x01, 0xA0, 0x06, 0xD0, 0xD4, 0x83, 0x07, + 0x00, 0xC0, 0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, + 0x1E, 0xE0, 0x02, 0x07, 0xA0, 0xE3, 0x04, 0xE0, + 0x08, 0x02, 0x24, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x42, 0x10, 0x20, 0xC1, 0x84, 0x01, 0x44, 0x02, + 0x00, 0x88, 0x2A, 0x13, 0x04, 0x48, 0x84, 0x01, + 0x20, 0x06, 0x02, 0x07, 0xF1, 0x16, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x80, 0x15, 0x13, 0xA0, 0x23, + 0x22, 0xE0, 0x05, 0x16, 0xA0, 0x43, 0x22, 0xE0, + 0xA0, 0xD2, 0x0E, 0xE0, 0xCF, 0x10, 0xE0, 0x23, + 0x14, 0xE0, 0x04, 0x13, 0x20, 0x98, 0xA9, 0xE3, + 0x65, 0x06, 0x0C, 0x16, 0xA0, 0x92, 0x0E, 0xE0, + 0xC5, 0x13, 0xA0, 0xD2, 0xA8, 0xE3, 0xD3, 0x10, + 0x20, 0xC8, 0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, + 0x00, 0xC0, 0x04, 0x10, 0x83, 0x07, 0x02, 0x00, + 0x60, 0x04, 0xCA, 0xCE, 0x60, 0x04, 0xC0, 0xCE, + 0x20, 0xE8, 0x06, 0xE0, 0x82, 0x01, 0xA0, 0x06, + 0xD0, 0xD4, 0x20, 0x07, 0x02, 0x07, 0xA0, 0x43, + 0x04, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, + 0x20, 0x88, 0x20, 0xE0, 0x08, 0x07, 0x03, 0x16, + 0x20, 0xC8, 0x78, 0xEB, 0x08, 0x07, 0x60, 0x04, + 0xD2, 0xCE, 0x0E, 0x01, 0x03, 0x00, 0x16, 0x13, + 0xCF, 0xD3, 0x08, 0x16, 0xA0, 0x23, 0x20, 0xE0, + 0x03, 0x16, 0xA0, 0xD2, 0xA8, 0xE3, 0x02, 0x10, + 0xA0, 0xD2, 0x0E, 0xE0, 0x8E, 0x01, 0x03, 0x00, + 0x09, 0x10, 0x60, 0xC1, 0x84, 0x01, 0x60, 0x21, + 0x0A, 0xE0, 0x04, 0x16, 0x83, 0x07, 0x00, 0x84, + 0x60, 0x04, 0xCA, 0xCE, 0x20, 0xC8, 0x2E, 0xE0, + 0x84, 0x01, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0xE3, + 0x20, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x93, + 0x26, 0xE0, 0x10, 0x16, 0xA0, 0x23, 0x08, 0xE0, + 0x0D, 0x16, 0xA0, 0x23, 0x06, 0xE0, 0x02, 0x13, + 0x60, 0xE3, 0x1C, 0xE0, 0x60, 0xE3, 0x18, 0xE0, + 0xA0, 0x43, 0x06, 0xE0, 0x08, 0x02, 0x3C, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, + 0xA0, 0x92, 0xA8, 0xE3, 0x03, 0x13, 0xA0, 0x92, + 0xA9, 0xE3, 0x1E, 0x16, 0xE0, 0x23, 0x14, 0xE0, + 0x08, 0x13, 0x20, 0x98, 0xA9, 0xE3, 0x65, 0x06, + 0x04, 0x13, 0x83, 0x07, 0x07, 0x00, 0x60, 0x04, + 0xCA, 0xCE, 0xA0, 0xD2, 0x0E, 0xE0, 0x20, 0xC8, + 0x20, 0xE0, 0x08, 0x07, 0xA0, 0x27, 0x04, 0xE0, + 0x0B, 0x16, 0x20, 0xC8, 0x1E, 0xE0, 0x08, 0x07, + 0xE0, 0x93, 0xA8, 0xE3, 0x05, 0x16, 0xA0, 0x23, + 0x12, 0xE0, 0x02, 0x13, 0x20, 0x06, 0x08, 0x07, + 0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, + 0x3E, 0x13, 0xB0, 0x03, 0x20, 0x98, 0x0E, 0xE0, + 0x6F, 0x06, 0x0F, 0x16, 0xCF, 0xD3, 0x37, 0x16, + 0xA0, 0xD2, 0xA8, 0xE3, 0x60, 0x04, 0xD2, 0xCE, + 0xA0, 0x92, 0x0C, 0xE0, 0x30, 0x16, 0xE0, 0x23, + 0x14, 0xE0, 0xF6, 0x13, 0x83, 0x07, 0x06, 0x00, + 0x07, 0x10, 0x83, 0x07, 0x05, 0x00, 0xE0, 0x93, + 0x0E, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x07, 0x00, + 0x60, 0x04, 0xCA, 0xCE, 0x60, 0xE3, 0x12, 0xE0, + 0xE0, 0x23, 0x14, 0xE0, 0x11, 0x13, 0x20, 0x98, + 0x0C, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, + 0xA9, 0xE3, 0x65, 0x06, 0x14, 0x10, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x80, 0x10, 0x13, 0x20, 0xC1, + 0x84, 0x01, 0x20, 0x21, 0x06, 0xE0, 0xD2, 0x16, + 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x07, 0x13, + 0x20, 0x48, 0x06, 0xE0, 0x84, 0x01, 0x08, 0x02, + 0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, + 0xD2, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x20, + 0xFA, 0x16, 0x08, 0x02, 0x78, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x20, 0xC2, 0xA2, 0x09, 0x03, 0x13, + 0x20, 0x06, 0xA2, 0x09, 0x21, 0x13, 0x20, 0xC2, + 0xA4, 0x09, 0xED, 0x13, 0x20, 0x06, 0xA4, 0x09, + 0xEA, 0x16, 0xA0, 0x07, 0xA4, 0x09, 0x05, 0x00, + 0xCD, 0x01, 0x00, 0x04, 0xE4, 0x10, 0x60, 0x01, + 0x8E, 0x09, 0x80, 0x00, 0x3E, 0x13, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x10, 0x02, 0x16, 0xA0, 0x06, + 0xE6, 0xD5, 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x10, + 0xE0, 0x01, 0x8E, 0x09, 0x80, 0x00, 0x83, 0x07, + 0x00, 0xA8, 0xA0, 0x06, 0x2A, 0xD8, 0x16, 0x10, + 0x60, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x21, 0x13, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x10, 0xA0, 0x07, + 0x08, 0x07, 0x05, 0x00, 0x83, 0x07, 0x08, 0xA8, + 0xA0, 0x23, 0x04, 0xE0, 0x05, 0x16, 0x20, 0xC8, + 0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, 0x08, 0xE8, + 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x01, 0x8E, 0x09, + 0x00, 0x20, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x01, + 0xE0, 0x01, 0x82, 0x01, 0x00, 0x08, 0xA0, 0xD2, + 0x0E, 0xE0, 0x83, 0x07, 0x10, 0x80, 0x60, 0x04, + 0xC0, 0xCE, 0x08, 0x02, 0x78, 0x00, 0xA0, 0x06, + 0xDA, 0xD4, 0x83, 0x07, 0x00, 0x82, 0x60, 0x04, + 0xCA, 0xCE, 0x60, 0x04, 0xD2, 0xCE, 0x20, 0x06, + 0x90, 0x09, 0x07, 0x15, 0xA0, 0xD2, 0x10, 0xE0, + 0xCA, 0x06, 0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, + 0xF4, 0x10, 0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x20, 0xC2, 0x90, 0x09, 0x88, 0x02, + 0x96, 0x00, 0x0D, 0x1B, 0xEA, 0x16, 0x20, 0x48, + 0x08, 0xE0, 0x82, 0x01, 0xA0, 0x01, 0x8E, 0x09, + 0x00, 0x10, 0xA0, 0x06, 0xE6, 0xD5, 0x83, 0x07, + 0x00, 0x28, 0x60, 0x04, 0xC0, 0xCE, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x10, 0xDA, 0x16, 0x84, 0x07, + 0x04, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, + 0xB5, 0x07, 0x30, 0x06, 0xA0, 0x06, 0xA2, 0xD8, + 0xA0, 0x07, 0xF8, 0x03, 0x34, 0xD4, 0x60, 0x04, + 0xC0, 0xDB, 0xA0, 0x07, 0x90, 0x09, 0xF4, 0x01, + 0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x08, 0x02, 0x36, 0x00, 0xA0, 0x06, 0xDA, 0xD4, + 0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x23, + 0x18, 0xE0, 0x06, 0x13, 0xA0, 0xE3, 0x18, 0xE0, + 0xE0, 0x2E, 0x00, 0x00, 0x41, 0xC0, 0xFA, 0x16, + 0xA0, 0x06, 0xE6, 0xD5, 0xB2, 0x10, 0x04, 0x02, + 0x64, 0x00, 0x04, 0x06, 0xFE, 0x16, 0x5B, 0x04, + 0xA0, 0xE3, 0x0A, 0xE0, 0x08, 0xC2, 0x02, 0x11, + 0xA0, 0x43, 0x0A, 0xE0, 0x20, 0x42, 0x04, 0xE0, + 0x28, 0x02, 0xFC, 0xE3, 0x58, 0xC0, 0x02, 0xC0, + 0x11, 0x88, 0xCE, 0xED, 0x03, 0x16, 0xD1, 0x2C, + 0x58, 0xC0, 0xD1, 0x04, 0x80, 0xC0, 0x0E, 0x01, + 0x00, 0x10, 0x0F, 0x13, 0x60, 0xCC, 0xCE, 0xED, + 0xC8, 0x05, 0x78, 0xCC, 0x03, 0x16, 0x41, 0x06, + 0x60, 0xCC, 0xD6, 0x06, 0x58, 0xC4, 0x02, 0x16, + 0x60, 0xC4, 0x00, 0x07, 0x21, 0x02, 0xFA, 0xFF, + 0x91, 0x2C, 0x5B, 0x04, 0x0B, 0xC3, 0xA0, 0x06, + 0xC2, 0xD5, 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, + 0x05, 0x16, 0x62, 0xC2, 0x02, 0x00, 0x60, 0x26, + 0xA8, 0xE4, 0x0D, 0x16, 0x42, 0xC2, 0xC9, 0x05, + 0x60, 0xCE, 0xF2, 0xED, 0x60, 0xC6, 0x7C, 0xEB, + 0xA0, 0x06, 0x10, 0xD6, 0x18, 0xCA, 0x0A, 0x00, + 0x20, 0x46, 0x26, 0xE0, 0x04, 0x16, 0xA0, 0xC0, + 0x6C, 0x01, 0x12, 0x2E, 0x1D, 0x10, 0x12, 0xC1, + 0x05, 0x13, 0x60, 0xC1, 0x6C, 0x01, 0x14, 0x2E, + 0x05, 0xC8, 0x6C, 0x01, 0xD2, 0x04, 0x48, 0x06, + 0x84, 0x07, 0x02, 0x00, 0x48, 0xC1, 0xA0, 0xC0, + 0x6C, 0x01, 0x02, 0xC0, 0xA0, 0x06, 0xA2, 0xD8, + 0x60, 0xC5, 0x02, 0xFC, 0x07, 0x02, 0xA2, 0x06, + 0x25, 0x02, 0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, + 0x20, 0xC2, 0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, + 0x5C, 0x04, 0x42, 0xC2, 0x29, 0x02, 0x08, 0x00, + 0x39, 0xC2, 0x48, 0x02, 0x00, 0xC0, 0x88, 0x02, + 0x00, 0xC0, 0x08, 0x16, 0x60, 0x8E, 0x2E, 0xE0, + 0x05, 0x16, 0x60, 0x86, 0x2E, 0xE0, 0x02, 0x16, + 0xC8, 0x04, 0x5B, 0x04, 0x08, 0x07, 0x5B, 0x04, + 0x20, 0x88, 0x8E, 0xE1, 0x6C, 0x01, 0x02, 0x16, + 0x60, 0x04, 0xBA, 0xCE, 0x5B, 0x04, 0x88, 0x07, + 0xAE, 0x01, 0x20, 0xE8, 0x0E, 0xE0, 0x80, 0x01, + 0x08, 0x06, 0xFE, 0x16, 0x20, 0x48, 0x0E, 0xE0, + 0x80, 0x01, 0x5B, 0x04, 0xC2, 0x04, 0xA0, 0x23, + 0x0C, 0xE0, 0x10, 0x16, 0x20, 0x2F, 0x30, 0x06, + 0x82, 0x07, 0xDF, 0xFF, 0x02, 0x2C, 0x82, 0x02, + 0xF4, 0x03, 0x06, 0x13, 0xE2, 0x04, 0x02, 0x00, + 0xA2, 0xC0, 0x06, 0x00, 0x12, 0x2E, 0xF4, 0x10, + 0xA0, 0x43, 0x0C, 0xE0, 0x5B, 0x04, 0x42, 0xC2, + 0x88, 0x07, 0x0E, 0x00, 0x09, 0xA2, 0x29, 0x02, + 0x08, 0x00, 0x78, 0xCE, 0x78, 0xCE, 0x78, 0xCE, + 0x60, 0xCE, 0x6C, 0x09, 0x60, 0xCE, 0x6E, 0x09, + 0x60, 0xCE, 0x70, 0x09, 0xA0, 0x23, 0x1A, 0xE0, + 0x0F, 0x16, 0x58, 0xC2, 0x49, 0x02, 0x80, 0x1F, + 0x60, 0x2A, 0x14, 0xE0, 0xA0, 0xE8, 0x04, 0xE0, + 0x0E, 0x00, 0x09, 0xC6, 0x49, 0x02, 0x00, 0x1F, + 0xC9, 0x06, 0x09, 0xA2, 0x89, 0xA8, 0x04, 0x00, + 0x28, 0x02, 0x02, 0x00, 0x58, 0xC2, 0x49, 0x0A, + 0x49, 0x02, 0x00, 0xF0, 0x09, 0xD6, 0xE2, 0x04, + 0x06, 0x00, 0x5B, 0x04, 0x00, 0x07, 0x82, 0xC0, + 0x53, 0x13, 0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0xC1, + 0x06, 0xFC, 0x46, 0x02, 0x0F, 0x00, 0x86, 0x02, + 0x01, 0x00, 0x3D, 0x12, 0x06, 0x88, 0xF2, 0x06, + 0x12, 0x16, 0x01, 0x02, 0x0E, 0xFC, 0x31, 0x88, + 0xF4, 0x06, 0x0D, 0x16, 0x31, 0x88, 0xF6, 0x06, + 0x0A, 0x16, 0x31, 0x88, 0xF8, 0x06, 0x07, 0x16, + 0x86, 0x02, 0x02, 0x00, 0x2C, 0x16, 0x20, 0x88, + 0x0A, 0x07, 0xFA, 0x06, 0x28, 0x13, 0x20, 0xC1, + 0x6A, 0x09, 0x44, 0x01, 0x00, 0x08, 0x06, 0x13, + 0x86, 0x02, 0x02, 0x00, 0x20, 0x16, 0x44, 0x01, + 0x80, 0x00, 0x1D, 0x16, 0x00, 0x07, 0xE0, 0x23, + 0x14, 0xE0, 0x19, 0x16, 0x82, 0x02, 0x43, 0x00, + 0x16, 0x13, 0x00, 0x02, 0x02, 0xFC, 0x40, 0xC0, + 0xB0, 0x01, 0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, + 0x01, 0x00, 0x07, 0x16, 0x60, 0xA0, 0x2C, 0x09, + 0x60, 0xCC, 0xEE, 0x05, 0x50, 0xC4, 0x20, 0xC4, + 0x2C, 0x09, 0x80, 0x07, 0x36, 0x07, 0x81, 0x07, + 0x40, 0x00, 0x40, 0x2C, 0xC0, 0x04, 0x84, 0x07, + 0xF2, 0x06, 0x06, 0xCD, 0x01, 0x02, 0x0E, 0xFC, + 0x31, 0xCD, 0x31, 0xCD, 0x31, 0xCD, 0x20, 0xC5, + 0x0A, 0x07, 0x00, 0xC0, 0x01, 0x13, 0x12, 0x2E, + 0xE0, 0x04, 0x6C, 0x01, 0x5B, 0x04, 0x60, 0x01, + 0x8A, 0x09, 0x00, 0x80, 0x12, 0x13, 0x0B, 0xC8, + 0x22, 0x09, 0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, + 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x08, 0x02, + 0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xC2, + 0x22, 0x09, 0x5B, 0x04, 0x20, 0x48, 0xAC, 0xE4, + 0x80, 0x01, 0x20, 0x48, 0x7E, 0xEB, 0x82, 0x01, + 0x20, 0x48, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0x48, + 0x22, 0xE0, 0x78, 0x09, 0x60, 0x43, 0x18, 0xE0, + 0xA0, 0x43, 0x08, 0xE0, 0x60, 0x01, 0x8A, 0x09, + 0x00, 0x80, 0xEB, 0x13, 0x0B, 0xC3, 0x08, 0x02, + 0x42, 0x00, 0xA0, 0x06, 0xDA, 0xD4, 0x5C, 0x04, + 0x0B, 0xC3, 0x20, 0xE8, 0x0E, 0xE0, 0x82, 0x01, + 0x20, 0xE8, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0xE8, + 0x22, 0xE0, 0x78, 0x09, 0xA0, 0xE3, 0x08, 0xE0, + 0x60, 0xE3, 0x18, 0xE0, 0xA0, 0x43, 0x06, 0xE0, + 0x08, 0x02, 0x3C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x5C, 0x04, 0x0B, 0xC3, 0x83, 0x07, 0x00, 0x68, + 0xA0, 0x06, 0x2A, 0xD8, 0x83, 0x07, 0x10, 0x80, + 0xA0, 0x06, 0x2A, 0xD8, 0x5C, 0x04, 0x0B, 0xC3, + 0xA0, 0x06, 0x14, 0xD8, 0x02, 0xA2, 0x68, 0xC2, + 0x14, 0x00, 0x29, 0x02, 0xFC, 0xFF, 0x24, 0x13, + 0x28, 0x02, 0x18, 0x00, 0x87, 0x07, 0x0E, 0x00, + 0x81, 0x07, 0x0E, 0x07, 0xF1, 0x04, 0x47, 0x06, + 0xFD, 0x15, 0x58, 0xC0, 0xB0, 0x03, 0x01, 0x78, + 0x63, 0x06, 0x41, 0x02, 0x3F, 0x00, 0x0E, 0x13, + 0x81, 0x02, 0x1F, 0x00, 0x0B, 0x1B, 0x41, 0xA0, + 0x61, 0xC0, 0x86, 0xE4, 0xF8, 0xC1, 0xC7, 0x06, + 0xC7, 0x71, 0x47, 0x06, 0x78, 0xCC, 0x47, 0x06, + 0xFD, 0x15, 0x04, 0x10, 0x58, 0xC0, 0xC1, 0x06, + 0x41, 0x70, 0x01, 0xA2, 0x49, 0xC2, 0xE5, 0x15, + 0x5C, 0x04, 0xA0, 0x23, 0x1A, 0xE0, 0x02, 0x13, + 0xC8, 0x04, 0x5B, 0x04, 0x22, 0xC2, 0x14, 0x00, + 0x48, 0x02, 0x00, 0x1F, 0xC8, 0x06, 0x5B, 0x04, + 0x83, 0x02, 0x0F, 0x00, 0x17, 0x1B, 0xA0, 0xC1, + 0xD4, 0x06, 0x35, 0x13, 0x26, 0x02, 0x04, 0x00, + 0xA0, 0xCD, 0xCE, 0xED, 0x83, 0xC5, 0x04, 0x13, + 0x4A, 0xC2, 0x39, 0x0A, 0xC9, 0xE0, 0x83, 0xC5, + 0x86, 0x07, 0x36, 0x07, 0x87, 0x07, 0x10, 0x00, + 0x20, 0xC2, 0xD4, 0x06, 0xE0, 0x04, 0xD4, 0x06, + 0x46, 0x2C, 0x5B, 0x04, 0x60, 0xC0, 0xFE, 0x06, + 0x20, 0xC2, 0x6A, 0x09, 0x48, 0x02, 0x00, 0x60, + 0x20, 0x22, 0x06, 0xE0, 0x04, 0x16, 0x20, 0xE2, + 0x0A, 0xE0, 0x20, 0xE2, 0x18, 0xE0, 0x13, 0x0A, + 0x04, 0x18, 0x41, 0x05, 0x03, 0x48, 0xFE, 0x06, + 0x06, 0x10, 0x83, 0x02, 0x02, 0x00, 0x01, 0x16, + 0x13, 0x09, 0x03, 0xE8, 0xFE, 0x06, 0xC8, 0x40, + 0xC1, 0x40, 0x05, 0x13, 0x88, 0x07, 0x36, 0x07, + 0x89, 0x07, 0x00, 0x40, 0x48, 0x2C, 0x5B, 0x04, + 0xC9, 0x04, 0x24, 0xC1, 0x94, 0xEB, 0x84, 0xC1, + 0x86, 0x71, 0x86, 0xA1, 0x26, 0x02, 0x56, 0xEC, + 0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xC2, 0xEB, + 0x14, 0xD2, 0xC8, 0x09, 0x08, 0xA2, 0xB0, 0x03, + 0x34, 0xD8, 0x5F, 0x06, 0x47, 0x02, 0x0F, 0x00, + 0xC7, 0xA1, 0x28, 0xC2, 0x82, 0xEB, 0x58, 0x04, + 0x76, 0xCD, 0x47, 0x06, 0xFD, 0x16, 0x32, 0x10, + 0x36, 0xC2, 0x26, 0x10, 0x17, 0x09, 0x47, 0xA1, + 0x2D, 0x10, 0x17, 0x09, 0x47, 0x61, 0x2A, 0x10, + 0xA0, 0x43, 0x16, 0xE0, 0x5B, 0x04, 0xA0, 0x43, + 0x16, 0xE0, 0x49, 0xC2, 0x03, 0x16, 0x44, 0xC2, + 0x06, 0xC8, 0x22, 0x09, 0x27, 0xC1, 0x8E, 0xED, + 0x84, 0xC1, 0x86, 0x71, 0x26, 0x02, 0xC4, 0xED, + 0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xAA, 0xED, + 0xD3, 0x10, 0x09, 0xC1, 0xA0, 0xC1, 0x22, 0x09, + 0xC9, 0x04, 0x10, 0x10, 0x36, 0xC2, 0x78, 0xD5, + 0x60, 0x41, 0x22, 0xE0, 0xC5, 0x05, 0x0A, 0x10, + 0x78, 0xCD, 0x47, 0x06, 0xFD, 0x15, 0x06, 0x10, + 0xA0, 0x23, 0x16, 0xE0, 0xCD, 0x16, 0x49, 0xC2, + 0xEC, 0x16, 0xD6, 0x10, 0xA0, 0xE3, 0x16, 0xE0, + 0xBB, 0x10, 0x08, 0x02, 0x5A, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x44, 0x10, 0xA0, 0x92, 0x0C, 0xE0, + 0x15, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x14, 0x16, + 0x20, 0x48, 0xAC, 0xE4, 0x80, 0x01, 0xA0, 0x06, + 0x72, 0xD7, 0x20, 0xC8, 0x9E, 0x01, 0x9E, 0x01, + 0xE0, 0x2E, 0x01, 0x00, 0xA0, 0x43, 0x18, 0xE0, + 0xA0, 0xD2, 0x26, 0xE0, 0x83, 0x07, 0x10, 0x00, + 0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xD2, 0xCE, + 0x84, 0x07, 0x08, 0x00, 0x60, 0x04, 0x94, 0xCE, + 0x85, 0x07, 0x03, 0x02, 0x05, 0xC8, 0xCE, 0x06, + 0xA0, 0x43, 0x12, 0xE0, 0xE0, 0x04, 0xFA, 0x06, + 0xA0, 0x06, 0xA4, 0xD7, 0x08, 0x02, 0x48, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x17, 0x10, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x80, 0x02, 0x16, 0x60, 0x04, + 0x9C, 0xD4, 0xA0, 0x27, 0x2C, 0xE0, 0x04, 0x16, + 0x08, 0x02, 0x54, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x83, 0x07, 0x00, 0xA8, 0x20, 0x88, 0x08, 0x07, + 0x20, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x00, 0xE8, + 0xA0, 0x06, 0x2A, 0xD8, 0x08, 0x02, 0x36, 0x00, + 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, 0x0C, 0xE0, + 0x82, 0x01, 0xA0, 0x23, 0x18, 0xE0, 0x06, 0x13, + 0xA0, 0xE3, 0x18, 0xE0, 0xE0, 0x2E, 0x00, 0x00, + 0x41, 0xC0, 0xFA, 0x16, 0xA0, 0x06, 0xE6, 0xD5, + 0x82, 0xC0, 0x02, 0x13, 0x4F, 0x02, 0x80, 0xFF, + 0xC4, 0x04, 0x0F, 0xD1, 0xC4, 0x06, 0x60, 0x04, + 0x94, 0xCE, 0xA0, 0x06, 0x32, 0xDA, 0x08, 0x02, + 0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, 0x20, 0xDA, + 0xA0, 0x06, 0xDA, 0xD4, 0x10, 0x10, 0xA0, 0x06, + 0x32, 0xDA, 0x20, 0xD1, 0xCE, 0x06, 0xE6, 0x13, + 0x20, 0x78, 0x12, 0xE0, 0xCE, 0x06, 0xE2, 0x10, + 0x20, 0xC1, 0x16, 0x04, 0x14, 0x0A, 0xC4, 0x06, + 0x0A, 0x91, 0x01, 0x16, 0x5B, 0x04, 0x60, 0x04, + 0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, 0xAB, 0xE3, + 0x65, 0x06, 0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, + 0x60, 0xC1, 0x94, 0x09, 0x02, 0x13, 0x60, 0x04, + 0x22, 0xDE, 0x60, 0xD1, 0x0E, 0xE0, 0x3D, 0x10, + 0x85, 0x07, 0xBE, 0xEA, 0x35, 0xC8, 0x8A, 0x09, + 0x15, 0xC8, 0x8C, 0x09, 0x0B, 0x10, 0xE0, 0x04, + 0xA0, 0x09, 0x20, 0xD8, 0x2E, 0x09, 0xA6, 0x09, + 0x20, 0xC8, 0xA8, 0x09, 0x8A, 0x09, 0x20, 0xC8, + 0xAA, 0x09, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, + 0xCA, 0x04, 0xCD, 0x04, 0xCE, 0x04, 0xCF, 0x04, + 0xE0, 0x04, 0xA8, 0x06, 0xE0, 0x04, 0xBA, 0x06, + 0x84, 0x07, 0xA0, 0x01, 0x85, 0x07, 0x10, 0x00, + 0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, + 0xD8, 0x06, 0x85, 0x07, 0x34, 0x07, 0x44, 0x61, + 0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, + 0xC8, 0x00, 0x04, 0xC8, 0x00, 0x07, 0x84, 0x07, + 0xFF, 0x7F, 0x04, 0xC8, 0xF0, 0x06, 0x84, 0x07, + 0x06, 0x00, 0x04, 0xC8, 0xEE, 0x06, 0x85, 0x07, + 0x02, 0x0C, 0x20, 0xC1, 0x8A, 0x09, 0x01, 0x11, + 0xC5, 0x06, 0xB0, 0x03, 0x05, 0xD8, 0x65, 0x06, + 0x60, 0x04, 0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0x79, 0x16, 0x60, 0xD1, + 0x10, 0xE0, 0xF3, 0x10, 0x60, 0xD1, 0xAB, 0xE3, + 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0xE0, 0x01, + 0x80, 0x01, 0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, + 0x80, 0x01, 0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, + 0x2E, 0x09, 0xE3, 0x10, 0x20, 0xF8, 0x19, 0xEE, + 0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0xC6, 0x06, + 0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x20, 0xC8, + 0xC2, 0xEA, 0x90, 0x09, 0xE0, 0x2E, 0x00, 0x00, + 0xA0, 0x06, 0xE6, 0xD5, 0x20, 0xC8, 0x6C, 0x09, + 0xA0, 0x01, 0x20, 0xC8, 0x6E, 0x09, 0xA2, 0x01, + 0x20, 0xC8, 0x70, 0x09, 0xA4, 0x01, 0x20, 0xC8, + 0x6E, 0x09, 0xB0, 0x01, 0x20, 0xC8, 0x70, 0x09, + 0xB2, 0x01, 0x20, 0xC8, 0x70, 0x09, 0xCC, 0x06, + 0x20, 0xF8, 0x18, 0xEE, 0x80, 0x01, 0xB0, 0x03, + 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0x3A, 0x13, 0xE0, 0x01, + 0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x56, 0xDF, + 0xE0, 0xC2, 0x8A, 0x09, 0x05, 0x11, 0xA0, 0x01, + 0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x9A, 0xDF, + 0x98, 0x06, 0x08, 0x02, 0x12, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x84, 0x07, 0x0A, 0x00, 0x85, 0x07, + 0xF4, 0x03, 0x20, 0x88, 0xC6, 0x06, 0x20, 0xE0, + 0x08, 0x1B, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0xA5, 0x13, 0x84, 0x07, 0x1C, 0x00, 0x85, 0x07, + 0xF8, 0x03, 0xA0, 0x06, 0xA2, 0xD8, 0x85, 0x07, + 0x42, 0xDC, 0x05, 0xC8, 0xF8, 0x03, 0x20, 0xC8, + 0xA0, 0x09, 0xA0, 0x09, 0x6C, 0x16, 0x20, 0xE8, + 0x9C, 0x09, 0xFE, 0x03, 0x20, 0xE8, 0x9E, 0x09, + 0x06, 0x04, 0xA0, 0x23, 0x0C, 0xE0, 0x32, 0x13, + 0xA0, 0xE3, 0x0C, 0xE0, 0xA0, 0x2E, 0xF4, 0x03, + 0x2D, 0x10, 0xA0, 0x06, 0x56, 0xDF, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x40, 0x08, 0x13, 0x08, 0x02, + 0x6C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x22, 0x10, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x40, 0x08, 0x02, + 0x60, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x84, 0x07, + 0x2A, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xA0, 0x06, + 0xA2, 0xD8, 0xD5, 0x10, 0xB0, 0x03, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0x0F, 0x16, 0x20, 0x06, + 0x90, 0x09, 0x9A, 0x16, 0x60, 0x01, 0x8A, 0x09, + 0x00, 0x40, 0x39, 0x13, 0xE0, 0x04, 0x8A, 0x09, + 0xE0, 0x04, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, + 0x60, 0x04, 0x62, 0xDA, 0x60, 0x04, 0xB0, 0xCE, + 0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, + 0xF9, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x04, 0x16, + 0x20, 0x06, 0xC6, 0x06, 0x9A, 0x16, 0x0A, 0x10, + 0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, + 0xED, 0x16, 0x20, 0x06, 0xC8, 0x06, 0x02, 0x13, + 0x60, 0x04, 0x5A, 0xDB, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x01, 0x02, 0x16, 0xCE, 0x01, 0x03, 0x00, + 0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0x83, 0x07, + 0x00, 0x82, 0x07, 0x10, 0x83, 0x07, 0x01, 0x00, + 0xE0, 0x04, 0x8E, 0x09, 0x20, 0xE8, 0x0C, 0xE0, + 0x82, 0x01, 0x60, 0x04, 0xCA, 0xCE, 0x60, 0x01, + 0x8A, 0x09, 0x00, 0x40, 0xC7, 0x16, 0x83, 0x07, + 0x0D, 0x00, 0xF2, 0x10, 0xB0, 0x03, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0xC7, 0x16, 0x20, 0x88, + 0x98, 0x09, 0x20, 0xE0, 0xF0, 0x16, 0x22, 0xC8, + 0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, 0x10, 0x00, + 0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00, 0xE0, 0x06, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x08, 0x02, + 0x66, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB2, 0x10, + 0xA0, 0x07, 0x9A, 0x09, 0x5A, 0x00, 0xA0, 0x07, + 0xA2, 0x09, 0x19, 0x00, 0xA0, 0x07, 0xA4, 0x09, + 0x05, 0x00, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x20, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x08, 0x02, + 0x78, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB0, 0x03, + 0x20, 0x98, 0xAB, 0xE3, 0x65, 0x06, 0x9A, 0x16, + 0x08, 0x02, 0x72, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x06, + 0xD0, 0xD5, 0x20, 0x06, 0x9A, 0x09, 0xBF, 0x13, + 0x84, 0x07, 0x2C, 0x00, 0x85, 0x07, 0xF4, 0x03, + 0xA0, 0x06, 0xA2, 0xD8, 0x60, 0x04, 0xC0, 0xDB, + 0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, 0x82, 0x10, + 0x0E, 0x01, 0x03, 0x00, 0x0A, 0x13, 0x08, 0x02, + 0x0C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xE3, + 0x14, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, + 0x26, 0x10, 0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, + 0xE0, 0x2E, 0x01, 0x00, 0x60, 0xC1, 0x1E, 0x09, + 0x35, 0x0A, 0x05, 0xE8, 0x82, 0x01, 0x20, 0xC1, + 0x6A, 0x09, 0x04, 0x01, 0x06, 0x00, 0x06, 0x13, + 0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, 0x20, 0xD8, + 0xD0, 0xE1, 0x83, 0x01, 0x20, 0x21, 0x22, 0xE0, + 0x03, 0x16, 0x20, 0xE8, 0x22, 0xE0, 0x80, 0x01, + 0x20, 0x21, 0x04, 0xE0, 0x04, 0x16, 0xA0, 0xE3, + 0x14, 0xE0, 0x60, 0x04, 0x0A, 0xD3, 0x08, 0x02, + 0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, + 0x08, 0xE0, 0x82, 0x01, 0xE0, 0xC2, 0x8A, 0x09, + 0x02, 0x11, 0x60, 0x04, 0xB0, 0xCE, 0xA0, 0x01, + 0x8E, 0x09, 0x00, 0x04, 0x6B, 0x10, 0x20, 0xC8, + 0xAE, 0xE4, 0x86, 0x01, 0x08, 0x02, 0x00, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC2, 0x1E, 0x09, + 0x08, 0xA2, 0x08, 0x05, 0x28, 0xC8, 0x22, 0xE0, + 0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xC6, 0x06, + 0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x60, 0xE3, + 0x16, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x44, 0xC1, + 0x44, 0x02, 0x00, 0x5E, 0xF8, 0x16, 0x60, 0x25, + 0xA8, 0xE4, 0x0F, 0x16, 0x20, 0x06, 0xC6, 0x06, + 0xF2, 0x16, 0x20, 0x06, 0xCA, 0x06, 0x03, 0x13, + 0xA0, 0x05, 0xCC, 0x06, 0xE6, 0x10, 0xB0, 0x03, + 0x20, 0xD8, 0x0C, 0xE0, 0x65, 0x06, 0x60, 0x04, + 0xD2, 0xCE, 0x20, 0x06, 0xC8, 0x06, 0xE3, 0x16, + 0x20, 0x88, 0x70, 0x09, 0xCC, 0x06, 0x03, 0x16, + 0x83, 0x07, 0x08, 0x00, 0x02, 0x10, 0x83, 0x07, + 0x0C, 0x00, 0x60, 0x04, 0x8A, 0xDC, 0x60, 0x04, + 0xD2, 0xCE, 0xA0, 0x23, 0x08, 0xE0, 0x03, 0x13, + 0x60, 0x23, 0x12, 0xE0, 0x06, 0x16, 0xB0, 0x03, + 0x20, 0xD8, 0xA9, 0xE3, 0x65, 0x06, 0x60, 0x04, + 0xD2, 0xCE, 0x08, 0x02, 0x00, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x60, 0x04, 0xB0, 0xCE, 0x08, 0x02, + 0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC8, + 0x1E, 0xE0, 0xC6, 0x06, 0x20, 0xC8, 0x1E, 0xE0, + 0xC8, 0x06, 0x60, 0xE3, 0x10, 0xE0, 0x60, 0x04, + 0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, 0x30, 0x13, + 0x44, 0xC1, 0x44, 0x02, 0x00, 0x1E, 0xF5, 0x16, + 0x60, 0x25, 0xA8, 0xE4, 0x1D, 0x16, 0x20, 0x06, + 0xC8, 0x06, 0xEF, 0x16, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x80, 0x13, 0x16, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x01, 0x0C, 0x16, 0xA0, 0x01, 0x8E, 0x09, + 0x00, 0x01, 0xA0, 0x01, 0x8E, 0x09, 0x80, 0x00, + 0xA0, 0x43, 0x04, 0xE0, 0x83, 0x07, 0x18, 0x68, + 0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, 0xAE, 0xE4, + 0x86, 0x01, 0xC2, 0x04, 0x60, 0x04, 0x2C, 0xE4, + 0x08, 0x02, 0x1E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x07, 0x10, 0x20, 0x06, 0xC6, 0x06, 0xCD, 0x16, + 0x83, 0x07, 0x09, 0x00, 0xA0, 0x06, 0x8A, 0xDC, + 0x60, 0x04, 0xB0, 0xCE, 0xCE, 0x04, 0xE0, 0x04, + 0x2A, 0x09, 0xE0, 0xD3, 0xAA, 0xE3, 0x8F, 0xC2, + 0x20, 0xC8, 0xB0, 0xE4, 0x86, 0x01, 0x20, 0x48, + 0x08, 0xE0, 0x82, 0x01, 0x86, 0x07, 0x05, 0x00, + 0x84, 0x07, 0x72, 0x06, 0x54, 0xC1, 0x01, 0x13, + 0xD4, 0x2C, 0x24, 0x02, 0x0A, 0x00, 0x06, 0x06, + 0xF9, 0x16, 0x08, 0x02, 0x2A, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x20, 0x2C, 0x1A, 0xE0, 0x60, 0x04, + 0x50, 0xCD, 0xA0, 0x06, 0x3E, 0xD7, 0xCD, 0x04, + 0xA0, 0x23, 0x1C, 0xE0, 0x0D, 0x13, 0x0E, 0x01, + 0x03, 0x00, 0x0A, 0x13, 0xA0, 0xE3, 0x1C, 0xE0, + 0xB0, 0x03, 0x20, 0xD8, 0x10, 0xE0, 0x65, 0x06, + 0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, 0x08, 0x10, + 0x20, 0x2D, 0x01, 0x00, 0xE0, 0xC0, 0x2A, 0x09, + 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0xD2, 0xAB, 0xE3, + 0x60, 0x04, 0xD2, 0xCE, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0x01, 0xE0, 0x01, 0x80, 0x01, 0x00, 0xAC, + 0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, 0xE0, 0x01, + 0x82, 0x01, 0x00, 0x08, 0x88, 0x07, 0xAE, 0x01, + 0x08, 0x06, 0xFE, 0x16, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x02, 0x03, 0x16, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, 0x80, 0x01, + 0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, 0x2E, 0x09, + 0xA0, 0x07, 0x9E, 0x09, 0x00, 0x10, 0x5B, 0x04, + 0x20, 0xD8, 0xA6, 0x09, 0x2E, 0x09, 0xE0, 0x01, + 0x80, 0x01, 0x00, 0x04, 0xE0, 0x01, 0x82, 0x01, + 0x00, 0x08, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, + 0x20, 0xC2, 0x30, 0x09, 0x03, 0x13, 0xE0, 0x01, + 0x82, 0x01, 0x00, 0x03, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0xA1, 0x20, 0xF8, 0x2E, 0x09, 0x80, 0x01, + 0x88, 0x07, 0xAE, 0x01, 0x08, 0x06, 0xFE, 0x16, + 0xA0, 0x01, 0x80, 0x01, 0x00, 0x0C, 0xE0, 0x04, + 0x9E, 0x01, 0xE0, 0x04, 0x9C, 0x09, 0xE0, 0x04, + 0x9E, 0x09, 0x5B, 0x04, 0x20, 0x01, 0xA8, 0x09, + 0x00, 0x80, 0x11, 0x13, 0xE0, 0x93, 0x26, 0xE0, + 0x0E, 0x16, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0x0A, 0x13, 0x08, 0x02, 0x84, 0x80, 0x00, 0x00, + 0x00, 0xE0, 0xDC, 0x0F, 0xA0, 0x06, 0xDA, 0xD4, + 0x20, 0x48, 0x08, 0xE0, 0x82, 0x01, 0x02, 0x10, + 0x60, 0x04, 0x70, 0xDA, 0x60, 0x04, 0xBA, 0xCE, + 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x19, 0x13, + 0x83, 0x07, 0x80, 0x80, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x13, 0x83, 0x07, 0x0A, 0x00, 0x60, 0x04, + 0xC6, 0xCE, 0x20, 0xC1, 0x06, 0x06, 0x0D, 0x13, + 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x09, 0x13, + 0x83, 0x07, 0x0B, 0x00, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x16, 0x83, 0x07, 0x01, 0x80, 0x60, 0x04, + 0xC6, 0xCE, 0x83, 0x07, 0x0A, 0x80, 0x60, 0x04, + 0xB4, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0x06, 0x16, 0xA0, 0x06, 0xA8, 0xE5, 0x47, 0x10, + 0xD0, 0x03, 0x60, 0x04, 0xB0, 0xD3, 0xE0, 0x93, + 0x0E, 0xE0, 0x5E, 0x13, 0xE0, 0x93, 0x10, 0xE0, + 0x17, 0x13, 0xE0, 0x23, 0x14, 0xE0, 0x04, 0x13, + 0x83, 0x07, 0x07, 0x00, 0x60, 0x04, 0xC6, 0xCE, + 0x83, 0x07, 0x00, 0xA0, 0xA0, 0x06, 0x2A, 0xD8, + 0x83, 0x07, 0x00, 0x48, 0xA0, 0x06, 0x2A, 0xD8, + 0xA0, 0xD2, 0x10, 0xE0, 0x20, 0xC8, 0x1C, 0xE0, + 0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, + 0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, 0x4E, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0xA0, 0x23, 0x1C, 0xE0, + 0x20, 0x13, 0x20, 0x88, 0x6C, 0x09, 0x0E, 0x07, + 0x1C, 0x16, 0x20, 0x88, 0x6E, 0x09, 0x10, 0x07, + 0x18, 0x16, 0x20, 0x88, 0x70, 0x09, 0x12, 0x07, + 0x14, 0x16, 0x20, 0x88, 0x0A, 0x07, 0x22, 0xE0, + 0x10, 0x13, 0x20, 0x06, 0xCA, 0x06, 0x38, 0x16, + 0xA0, 0xE3, 0x20, 0xE0, 0x06, 0x10, 0xE0, 0x23, + 0x14, 0xE0, 0xCA, 0x16, 0xA0, 0xE3, 0x22, 0xE0, + 0xC2, 0x04, 0xA0, 0xD2, 0xAA, 0xE3, 0x60, 0x04, + 0xBA, 0xCE, 0x20, 0xC8, 0x1C, 0xE0, 0xCA, 0x06, + 0xA0, 0x88, 0xDC, 0x06, 0x0E, 0x00, 0x10, 0x16, + 0xA0, 0x88, 0xDE, 0x06, 0x10, 0x00, 0x0C, 0x16, + 0xA0, 0x88, 0xE0, 0x06, 0x12, 0x00, 0x08, 0x16, + 0x20, 0x06, 0xCC, 0x06, 0x19, 0x16, 0x20, 0xE8, + 0x0E, 0xE0, 0x82, 0x01, 0xA0, 0xE3, 0x1E, 0xE0, + 0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, 0x10, 0x10, + 0xA0, 0x23, 0x10, 0xE0, 0x08, 0x16, 0x64, 0xC1, + 0x06, 0x00, 0x60, 0x21, 0x0C, 0xE0, 0x08, 0x13, + 0xA0, 0xD2, 0xA8, 0xE3, 0x05, 0x10, 0x20, 0x88, + 0x0A, 0x07, 0x08, 0x07, 0x96, 0x12, 0x00, 0x10, + 0x60, 0x04, 0xBA, 0xCE, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x80, 0x06, 0x16, 0x83, 0x07, 0x00, 0x82, + 0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, + 0xE0, 0x93, 0x0E, 0xE0, 0x50, 0x13, 0xE0, 0x93, + 0xA9, 0xE3, 0x4D, 0x13, 0xE0, 0x93, 0xA8, 0xE3, + 0x1C, 0x13, 0xA0, 0x06, 0xA4, 0xD7, 0xA0, 0x23, + 0x10, 0xE0, 0x45, 0x13, 0xA0, 0x23, 0x08, 0xE0, + 0x06, 0x16, 0x60, 0xE3, 0x1E, 0xE0, 0x20, 0xC8, + 0x22, 0xE0, 0x06, 0x07, 0x34, 0x10, 0xE0, 0x23, + 0x14, 0xE0, 0x31, 0x16, 0x60, 0xC1, 0x6A, 0x09, + 0x60, 0x21, 0x12, 0xE0, 0x2C, 0x16, 0xA0, 0x06, + 0x0E, 0xE2, 0x31, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, + 0x2E, 0x10, 0xA0, 0xE3, 0x12, 0xE0, 0xA0, 0x06, + 0x0E, 0xE2, 0x64, 0xC1, 0x06, 0x00, 0x60, 0x21, + 0x0C, 0xE0, 0x25, 0x13, 0x20, 0x88, 0x0E, 0x07, + 0xDC, 0x06, 0x14, 0x16, 0x20, 0x88, 0x10, 0x07, + 0xDE, 0x06, 0x10, 0x16, 0x20, 0x88, 0x12, 0x07, + 0xE0, 0x06, 0x0C, 0x16, 0x20, 0x98, 0xCE, 0x06, + 0xCF, 0x06, 0x15, 0x13, 0x20, 0x06, 0xCE, 0x06, + 0x12, 0x16, 0x60, 0xE3, 0x1A, 0xE0, 0xA0, 0xD2, + 0x0C, 0xE0, 0x0D, 0x10, 0x60, 0xE3, 0x1E, 0xE0, + 0x20, 0xC8, 0x32, 0xE0, 0x06, 0x07, 0xA0, 0x06, + 0x3E, 0xD7, 0x08, 0x02, 0x48, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0xA0, 0xD2, 0xA9, 0xE3, 0x60, 0x04, + 0xBA, 0xCE, 0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, + 0xC9, 0x1A, 0x0B, 0x1B, 0x22, 0x88, 0x10, 0x00, + 0x6E, 0x09, 0xC4, 0x1A, 0x06, 0x1B, 0x22, 0x88, + 0x12, 0x00, 0x70, 0x09, 0xBF, 0x1A, 0x01, 0x1B, + 0x5B, 0x04, 0x60, 0xC1, 0x6C, 0x01, 0x85, 0x02, + 0x43, 0x00, 0xE1, 0x13, 0xE0, 0x93, 0xA8, 0xE3, + 0xDE, 0x16, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, + 0x84, 0x07, 0x0E, 0x00, 0x42, 0xC1, 0xA0, 0xC0, + 0x6C, 0x01, 0x02, 0xC0, 0x25, 0x02, 0x48, 0x00, + 0x81, 0x07, 0x60, 0xE2, 0x83, 0x07, 0x14, 0xAE, + 0x60, 0x04, 0x9E, 0xE5, 0x02, 0x02, 0x00, 0xFC, + 0xCA, 0x10, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0x06, 0x16, 0x83, 0x07, 0x00, 0x82, 0xA0, 0x06, + 0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, 0x20, 0x98, + 0x0E, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, + 0xA8, 0xE3, 0x65, 0x06, 0xE0, 0x93, 0xA9, 0xE3, + 0x0D, 0x13, 0xA0, 0x23, 0x08, 0xE0, 0x19, 0x16, + 0xA0, 0x23, 0x10, 0xE0, 0x16, 0x13, 0x60, 0xE3, + 0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, + 0xA0, 0x06, 0x3E, 0xD7, 0xA0, 0x43, 0x18, 0xE0, + 0xE0, 0x2E, 0x01, 0x00, 0xA0, 0xD2, 0x26, 0xE0, + 0x83, 0x07, 0x10, 0x00, 0xA0, 0x06, 0x2A, 0xD8, + 0xE0, 0x23, 0x14, 0xE0, 0x02, 0x16, 0xA0, 0x06, + 0x18, 0xD7, 0xA0, 0x43, 0x2C, 0xE0, 0x20, 0xC8, + 0x20, 0xE0, 0x24, 0x09, 0x60, 0x04, 0xBA, 0xCE, + 0xA0, 0x06, 0xA8, 0xE5, 0x01, 0x10, 0x03, 0x10, + 0x20, 0x07, 0xA0, 0x09, 0x03, 0x10, 0xA0, 0x07, + 0xA2, 0x09, 0x19, 0x00, 0x60, 0x04, 0xBA, 0xCE, + 0xA0, 0x43, 0x0E, 0xE0, 0xA0, 0xC1, 0x24, 0x09, + 0x02, 0x13, 0x20, 0x06, 0x24, 0x09, 0xE0, 0x23, + 0x14, 0xE0, 0x03, 0x13, 0xA0, 0x23, 0x08, 0xE0, + 0x29, 0x16, 0x20, 0xC2, 0x8A, 0x09, 0xE4, 0x11, + 0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0xA0, 0x23, 0x08, 0xE0, 0x1F, 0x16, 0xA0, 0x23, + 0x10, 0xE0, 0x0A, 0x16, 0x22, 0xC1, 0x02, 0x00, + 0x20, 0x25, 0xA8, 0xE4, 0x23, 0x16, 0x83, 0x07, + 0x20, 0x80, 0xA0, 0x06, 0x2A, 0xD8, 0x12, 0x10, + 0xA0, 0x06, 0x3E, 0xD7, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x16, 0xA0, 0x06, 0x18, 0xD7, 0x60, 0xE3, + 0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, + 0xA0, 0x23, 0x08, 0xE0, 0x03, 0x16, 0xA0, 0x23, + 0x06, 0xE0, 0x51, 0x13, 0x20, 0x98, 0x0E, 0xE0, + 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, 0xA8, 0xE3, + 0x65, 0x06, 0x22, 0xC1, 0x02, 0x00, 0x20, 0x25, + 0xA8, 0xE4, 0x0E, 0x13, 0x83, 0x07, 0x20, 0x00, + 0xA0, 0x06, 0x2A, 0xD8, 0x22, 0xC8, 0x0E, 0x00, + 0xE6, 0x06, 0x22, 0xC8, 0x10, 0x00, 0xE8, 0x06, + 0x22, 0xC8, 0x12, 0x00, 0xEA, 0x06, 0x37, 0x10, + 0x22, 0x88, 0x0E, 0x00, 0xDC, 0x06, 0x08, 0x16, + 0x22, 0x88, 0x10, 0x00, 0xDE, 0x06, 0x04, 0x16, + 0x22, 0x88, 0x12, 0x00, 0xE0, 0x06, 0x0B, 0x13, + 0x22, 0xC8, 0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, + 0x10, 0x00, 0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00, + 0xE0, 0x06, 0x60, 0xE3, 0x14, 0xE0, 0xA0, 0x23, + 0x0E, 0xE0, 0x08, 0x16, 0xA0, 0xC1, 0x24, 0x09, + 0x1A, 0x16, 0x86, 0x07, 0x00, 0x10, 0x06, 0xE8, + 0xD2, 0x06, 0x15, 0x10, 0xA0, 0xE3, 0x0E, 0xE0, + 0xA0, 0x23, 0x08, 0xE0, 0x09, 0x16, 0xA0, 0xE3, + 0x06, 0xE0, 0xE0, 0x04, 0xE6, 0x06, 0xE0, 0x04, + 0xE8, 0x06, 0xE0, 0x04, 0xEA, 0x06, 0x07, 0x10, + 0x08, 0x02, 0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, + 0x36, 0xD3, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, + 0xBA, 0xCE, 0x20, 0x98, 0x65, 0x06, 0x10, 0xE0, + 0x03, 0x16, 0x20, 0xD8, 0x0E, 0xE0, 0x65, 0x06, + 0x60, 0x04, 0xBA, 0xCE, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, 0x2E, 0x10, + 0xB0, 0x03, 0x20, 0x98, 0xA9, 0xE3, 0x6F, 0x06, + 0x19, 0x16, 0x24, 0xC2, 0x08, 0x00, 0x16, 0x11, + 0xE0, 0xE3, 0x14, 0xE0, 0x83, 0x07, 0x00, 0x00, + 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x23, 0x14, 0xE0, + 0x04, 0x13, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x08, 0x02, 0x1E, 0x00, 0xA0, 0x06, + 0xDA, 0xD4, 0xA0, 0x23, 0x08, 0xE0, 0x02, 0x13, + 0xA0, 0x06, 0x18, 0xD7, 0x82, 0xC0, 0x02, 0x16, + 0x60, 0x04, 0xD2, 0xCE, 0x20, 0xE8, 0x1C, 0xEE, + 0xF0, 0x06, 0x20, 0x99, 0x0E, 0xE0, 0x16, 0x00, + 0x05, 0x16, 0xE0, 0x04, 0xEC, 0x06, 0x20, 0x48, + 0x14, 0xE0, 0xF0, 0x06, 0x83, 0x07, 0x01, 0x00, + 0x60, 0x04, 0xB4, 0xCE, 0x64, 0xC2, 0x14, 0x00, + 0x24, 0x02, 0x18, 0x00, 0xC4, 0xC1, 0xC2, 0x61, + 0x27, 0x02, 0xFC, 0xFF, 0x74, 0xC1, 0x85, 0xC1, + 0x45, 0x71, 0x85, 0x02, 0x27, 0x00, 0x46, 0x16, + 0x54, 0xC1, 0x45, 0x02, 0xCF, 0xFF, 0x42, 0x16, + 0xC8, 0x04, 0x64, 0xC1, 0x08, 0x00, 0x06, 0x15, + 0x05, 0x13, 0x24, 0xC2, 0x0E, 0x00, 0x48, 0x02, + 0x00, 0x1F, 0xC8, 0x06, 0x28, 0x02, 0x11, 0x00, + 0x04, 0xA2, 0x18, 0x98, 0x21, 0xEE, 0x32, 0x16, + 0x42, 0xC1, 0x25, 0x02, 0x04, 0x00, 0x47, 0x65, + 0x35, 0xC2, 0x74, 0xCD, 0x48, 0x06, 0xFD, 0x15, + 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC1, 0x04, 0xC8, + 0x6C, 0x01, 0xA0, 0xC1, 0x00, 0xFC, 0x05, 0x13, + 0x20, 0xC8, 0x80, 0xEB, 0x02, 0xFC, 0x06, 0xC1, + 0xF6, 0x10, 0x20, 0xC8, 0x00, 0xEE, 0x02, 0xFC, + 0x02, 0xC8, 0x6C, 0x01, 0x81, 0x07, 0x08, 0xE5, + 0x04, 0xC0, 0x83, 0x07, 0x10, 0x02, 0x84, 0x07, + 0x0E, 0x00, 0x3B, 0x10, 0x84, 0x07, 0x0C, 0x00, + 0xE2, 0xC0, 0x08, 0x00, 0x05, 0x02, 0x00, 0xFC, + 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x95, 0xC1, + 0x30, 0x13, 0xD5, 0x04, 0x16, 0x2E, 0x02, 0xC8, + 0x6C, 0x01, 0x2B, 0x10, 0xA0, 0xC8, 0x22, 0xEE, + 0x0E, 0x00, 0xA0, 0xC8, 0x24, 0xEE, 0x10, 0x00, + 0xA0, 0xC8, 0x26, 0xEE, 0x12, 0x00, 0x83, 0x07, + 0x06, 0x80, 0x60, 0x04, 0xB4, 0xCE, 0x60, 0x04, + 0xD2, 0xCE, 0x84, 0x07, 0x10, 0x00, 0x85, 0x07, + 0x34, 0x00, 0x09, 0x10, 0x84, 0x07, 0x12, 0x00, + 0x85, 0x07, 0x32, 0x00, 0x04, 0x10, 0x84, 0x07, + 0x14, 0x00, 0x85, 0x07, 0x38, 0x00, 0xA0, 0x06, + 0xC2, 0xD5, 0x85, 0xC8, 0x04, 0x00, 0xA0, 0x06, + 0x10, 0xD6, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, + 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x48, 0x06, + 0x48, 0xC1, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, + 0xA2, 0x06, 0x60, 0xC5, 0x02, 0xFC, 0x25, 0x02, + 0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, 0x20, 0xC2, + 0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, 0x60, 0x04, + 0xB0, 0xCE, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, + 0xB4, 0x06, 0xEF, 0x10, 0x22, 0x88, 0x12, 0x00, + 0x70, 0x09, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, + 0x6E, 0x09, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, + 0x6C, 0x09, 0x0E, 0x13, 0x22, 0x88, 0x12, 0x00, + 0xE0, 0x06, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, + 0xDE, 0x06, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, + 0xDC, 0x06, 0x01, 0x13, 0xCB, 0x05, 0xCB, 0x05, + 0x5B, 0x04, 0x0B, 0xC3, 0x00, 0x03, 0x02, 0x00, + 0x82, 0x07, 0xC0, 0x00, 0x20, 0xC8, 0x0C, 0x00, + 0xC0, 0x00, 0x20, 0xC8, 0x0E, 0x00, 0xC2, 0x00, + 0x20, 0xC8, 0x10, 0x00, 0xC4, 0x00, 0x20, 0xC8, + 0x12, 0x00, 0xC6, 0x00, 0x20, 0xC8, 0x14, 0x00, + 0xC8, 0x00, 0x20, 0xC8, 0x16, 0x00, 0xCA, 0x00, + 0x20, 0xC8, 0x04, 0x00, 0xCC, 0x00, 0x20, 0xC8, + 0x06, 0x00, 0xCE, 0x00, 0x02, 0xC8, 0x0C, 0x00, + 0xA0, 0x07, 0x0E, 0x00, 0x7E, 0xE6, 0x02, 0xC8, + 0x10, 0x00, 0xA0, 0x07, 0x12, 0x00, 0x88, 0xE6, + 0x02, 0xC8, 0x14, 0x00, 0xA0, 0x07, 0x16, 0x00, + 0xB8, 0xE6, 0x02, 0xC8, 0x04, 0x00, 0xA0, 0x07, + 0x06, 0x00, 0xCE, 0xE6, 0x60, 0x01, 0x1C, 0x01, + 0x04, 0x00, 0x09, 0x16, 0xE0, 0x01, 0x40, 0x01, + 0x00, 0x08, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, + 0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xA0, 0x06, + 0x8E, 0xE9, 0x05, 0x02, 0x00, 0x80, 0x05, 0xD8, + 0x80, 0x04, 0xC7, 0x04, 0x00, 0x03, 0x0F, 0x00, + 0x88, 0x07, 0x00, 0x10, 0x09, 0x02, 0x00, 0x20, + 0x8A, 0x07, 0xE6, 0xE6, 0x03, 0x02, 0x3E, 0xE6, + 0x5A, 0x04, 0x00, 0x03, 0x00, 0x00, 0x20, 0xD2, + 0x87, 0x01, 0x06, 0x10, 0x00, 0x03, 0x00, 0x00, + 0x20, 0xC2, 0x8A, 0x01, 0x08, 0x02, 0x00, 0x1A, + 0x60, 0xC2, 0xAE, 0x00, 0x48, 0xDA, 0x80, 0x04, + 0x89, 0x05, 0x89, 0x02, 0x06, 0x00, 0x07, 0x15, + 0x88, 0x07, 0x00, 0x80, 0x48, 0xDA, 0x80, 0x04, + 0x09, 0xC8, 0xAE, 0x00, 0x80, 0x03, 0xE0, 0x02, + 0xA0, 0x00, 0x5C, 0x04, 0x00, 0x03, 0x00, 0x00, + 0x60, 0x01, 0x9C, 0x01, 0x20, 0x00, 0xE2, 0x13, + 0x20, 0xC2, 0x8C, 0x01, 0x08, 0x02, 0x00, 0x1C, + 0xE3, 0x10, 0x00, 0x03, 0x00, 0x00, 0x60, 0x01, + 0x40, 0x01, 0x00, 0x40, 0xEC, 0x16, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0x40, 0x08, 0x02, 0x00, 0x02, + 0xD7, 0x10, 0xB3, 0xC0, 0x92, 0x06, 0xFD, 0x10, + 0xB3, 0xC0, 0x48, 0xC0, 0x72, 0xCC, 0x72, 0xCC, + 0x32, 0xC1, 0x44, 0xCC, 0x72, 0xDC, 0x04, 0x06, + 0xFD, 0x16, 0x5B, 0x04, 0x48, 0xC0, 0x02, 0x02, + 0xD0, 0xE9, 0x84, 0x07, 0x06, 0x00, 0xF6, 0x10, + 0x02, 0x02, 0x1E, 0xE6, 0x49, 0xC0, 0x84, 0x07, + 0x06, 0x00, 0xF0, 0x10, 0xB3, 0xC0, 0x32, 0xC1, + 0x01, 0x02, 0x01, 0x00, 0x44, 0xD0, 0xC1, 0x06, + 0x44, 0x02, 0xFF, 0x00, 0xE7, 0x10, 0x33, 0xC1, + 0x73, 0xC0, 0x44, 0xD1, 0x44, 0x02, 0xFF, 0x00, + 0x45, 0xDC, 0x04, 0x06, 0xFD, 0x16, 0x5A, 0x04, + 0xA0, 0x06, 0x0E, 0xE9, 0x33, 0xC8, 0x9E, 0x01, + 0x5A, 0x04, 0xA0, 0x06, 0x0C, 0xE7, 0x89, 0xC1, + 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, + 0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, 0x66, 0x02, + 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, 0xC2, 0x04, + 0xC7, 0xC1, 0x03, 0x16, 0x02, 0x06, 0xFC, 0x16, + 0x4D, 0x10, 0x5A, 0x04, 0xA0, 0x06, 0x58, 0xE8, + 0x89, 0xC1, 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, + 0x06, 0xC8, 0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, + 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, + 0x33, 0xC8, 0x9E, 0x01, 0xE8, 0x10, 0x33, 0x8A, + 0x02, 0x00, 0x38, 0x16, 0x73, 0x8A, 0x02, 0x00, + 0x35, 0x16, 0x5A, 0x04, 0x20, 0x8A, 0xCA, 0xE9, + 0x02, 0x00, 0x30, 0x16, 0x60, 0x8A, 0xCE, 0xE9, + 0x02, 0x00, 0x2C, 0x16, 0x82, 0x07, 0x74, 0xEA, + 0x01, 0x10, 0xB3, 0xC0, 0x04, 0x02, 0x80, 0x04, + 0x52, 0xD1, 0x03, 0x13, 0x32, 0x9D, 0x22, 0x16, + 0xFB, 0x10, 0x85, 0x07, 0x00, 0x80, 0x05, 0xD8, + 0x80, 0x04, 0xC7, 0x04, 0x5A, 0x04, 0x20, 0xC8, + 0xC0, 0x00, 0x0C, 0x00, 0x20, 0xC8, 0xC2, 0x00, + 0x0E, 0x00, 0x20, 0xC8, 0xC4, 0x00, 0x10, 0x00, + 0x20, 0xC8, 0xC6, 0x00, 0x12, 0x00, 0x20, 0xC8, + 0xC8, 0x00, 0x14, 0x00, 0x20, 0xC8, 0xCA, 0x00, + 0x16, 0x00, 0x20, 0xC8, 0xCC, 0x00, 0x04, 0x00, + 0x20, 0xC8, 0xCE, 0x00, 0x06, 0x00, 0x00, 0x03, + 0x0F, 0x00, 0xCC, 0x05, 0x5C, 0x04, 0xE0, 0x04, + 0x82, 0x01, 0x02, 0x02, 0x18, 0xE6, 0x32, 0xC8, + 0x82, 0x01, 0x32, 0xC8, 0x80, 0x01, 0xA0, 0x06, + 0x24, 0xE8, 0x12, 0xC8, 0x82, 0x01, 0xCA, 0xC2, + 0x84, 0x07, 0xD0, 0x07, 0xE0, 0x04, 0x84, 0x01, + 0x04, 0x06, 0xFC, 0x16, 0x20, 0xC1, 0x84, 0x01, + 0xE9, 0x16, 0x04, 0x02, 0x32, 0x00, 0x85, 0x07, + 0x00, 0x80, 0x05, 0xD8, 0x80, 0x04, 0xC7, 0x04, + 0x60, 0xC1, 0x86, 0x01, 0x04, 0x06, 0xFC, 0x16, + 0x20, 0xC1, 0x84, 0x01, 0x5B, 0x04, 0xB3, 0xC0, + 0xB3, 0xC4, 0x5B, 0x04, 0x48, 0xC0, 0xB3, 0xC0, + 0x73, 0xA0, 0x42, 0xC4, 0x5B, 0x04, 0x33, 0x88, + 0x84, 0x01, 0xE6, 0x16, 0x5A, 0x04, 0x89, 0xC1, + 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, + 0x8A, 0x01, 0x5B, 0x04, 0xC5, 0x04, 0xA0, 0x07, + 0x9C, 0x01, 0x40, 0x00, 0x60, 0x01, 0x9C, 0x01, + 0x40, 0x00, 0x03, 0x13, 0x05, 0x06, 0xF7, 0x16, + 0x5C, 0x04, 0x5B, 0x04, 0xA0, 0x06, 0xAC, 0xE8, + 0x60, 0xC0, 0x40, 0x01, 0x05, 0xC8, 0x40, 0x01, + 0x02, 0xC5, 0x01, 0xC8, 0x40, 0x01, 0x5A, 0x04, + 0xA0, 0x06, 0xAC, 0xE8, 0x08, 0xA1, 0xF4, 0x10, + 0xB3, 0xC0, 0x33, 0xC1, 0x60, 0xC1, 0x40, 0x01, + 0x85, 0x01, 0x00, 0x04, 0xC5, 0x01, 0x00, 0x10, + 0x5B, 0x04, 0x08, 0xC1, 0x09, 0xC2, 0x44, 0xC2, + 0x5B, 0x04, 0x05, 0x02, 0xC8, 0x00, 0x05, 0x06, + 0xFE, 0x16, 0x5B, 0x04, 0x33, 0xC1, 0x03, 0xC0, + 0xC4, 0xC0, 0x5B, 0x04, 0xC0, 0xC0, 0x5B, 0x04, + 0xE0, 0x94, 0x9E, 0x01, 0xC2, 0x16, 0xC3, 0x05, + 0x5B, 0x04, 0x73, 0xC0, 0xA0, 0x06, 0x26, 0xE9, + 0x2D, 0x02, 0x08, 0x00, 0x85, 0x07, 0x08, 0x00, + 0x71, 0x9F, 0xB7, 0x16, 0x05, 0x06, 0xFC, 0x16, + 0x5A, 0x04, 0x02, 0x02, 0x24, 0xE6, 0x60, 0x04, + 0x10, 0xE7, 0xE9, 0x8C, 0x04, 0x00, 0xAD, 0x16, + 0x5B, 0x04, 0x20, 0xC1, 0x80, 0x01, 0x85, 0x07, + 0xD0, 0x07, 0xE0, 0x01, 0x80, 0x01, 0x00, 0x04, + 0x45, 0x06, 0xFE, 0x16, 0x04, 0xC8, 0x80, 0x01, + 0x5B, 0x04, 0x33, 0xC1, 0x48, 0xC3, 0x04, 0xC1, + 0x04, 0x13, 0x2D, 0x02, 0x00, 0x04, 0x04, 0x06, + 0xFC, 0x16, 0x5B, 0x04, 0x8D, 0xC3, 0xA0, 0x06, + 0x26, 0xE9, 0x8D, 0xC1, 0xA6, 0x09, 0x66, 0x02, + 0x40, 0x00, 0x86, 0xC7, 0x5A, 0x04, 0x8D, 0xC1, + 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, + 0x8A, 0x01, 0x5B, 0x04, 0x8D, 0xC1, 0xA6, 0x09, + 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, + 0x5B, 0x04, 0x4D, 0xC0, 0x04, 0x02, 0x28, 0x00, + 0x85, 0x07, 0x00, 0x55, 0x60, 0x04, 0x34, 0xE7, + 0x4D, 0xC0, 0xB3, 0xC0, 0x32, 0xC1, 0x60, 0x04, + 0xF8, 0xE6, 0x33, 0xC1, 0x60, 0x01, 0x1C, 0x01, + 0x04, 0x00, 0x01, 0x16, 0x5B, 0x04, 0xC4, 0xC0, + 0x5B, 0x04, 0x89, 0x07, 0x66, 0xE5, 0x39, 0xC2, + 0x07, 0x13, 0x39, 0xC6, 0x39, 0x86, 0x25, 0x16, + 0x39, 0xC6, 0x39, 0x86, 0x22, 0x16, 0xF7, 0x10, + 0x02, 0x02, 0xAC, 0xE9, 0xC4, 0x04, 0xC5, 0x04, + 0x39, 0xC2, 0x02, 0x13, 0x60, 0x04, 0xE8, 0xE9, + 0x02, 0x02, 0xBA, 0xE9, 0xC4, 0x04, 0x39, 0xC2, + 0x03, 0x13, 0x79, 0xC1, 0x60, 0x04, 0xE8, 0xE9, + 0x02, 0x02, 0xCA, 0xE9, 0xC5, 0x04, 0x39, 0xC2, + 0x03, 0x13, 0x39, 0xC1, 0x60, 0x04, 0xE8, 0xE9, + 0x79, 0xC0, 0xB9, 0xC0, 0x81, 0x60, 0xC2, 0x05, + 0x12, 0x09, 0xF1, 0x04, 0x02, 0x06, 0xFD, 0x16, + 0x5B, 0x04, 0x5C, 0x04, 0x01, 0x02, 0xAA, 0xAA, + 0x01, 0xC6, 0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, + 0xF8, 0x16, 0x01, 0x02, 0x14, 0x00, 0x01, 0x06, + 0xFE, 0x16, 0x01, 0x02, 0x55, 0x55, 0x01, 0xC6, + 0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, 0xED, 0x16, + 0x52, 0x04, 0xE0, 0x02, 0xA0, 0x00, 0x88, 0x07, + 0xC0, 0x00, 0x09, 0x02, 0x62, 0xEA, 0x84, 0x07, + 0x2A, 0xE6, 0x05, 0x02, 0x01, 0x00, 0x8B, 0xC2, + 0xCC, 0x04, 0xA0, 0x06, 0x6C, 0xEA, 0x60, 0x2C, + 0x01, 0x00, 0x99, 0x06, 0xA0, 0x2C, 0x02, 0x00, + 0x99, 0x06, 0x20, 0x2D, 0x04, 0x00, 0x99, 0x06, + 0x20, 0x2E, 0x08, 0x00, 0x99, 0x06, 0xA0, 0x2F, + 0x10, 0x00, 0x8C, 0x05, 0x09, 0x16, 0x80, 0xCC, + 0x81, 0xC4, 0x83, 0x07, 0xB0, 0xEA, 0x88, 0xC0, + 0x02, 0x04, 0x8C, 0x05, 0x01, 0x16, 0x33, 0x10, + 0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x8C, 0x05, + 0xFB, 0x16, 0x80, 0xCC, 0x81, 0xC4, 0x15, 0x0A, + 0xB4, 0xC0, 0x12, 0xC0, 0x88, 0xCC, 0x52, 0xC0, + 0xB4, 0xC4, 0x42, 0x06, 0x5B, 0x04, 0x2D, 0x07, + 0x18, 0x00, 0x41, 0x8B, 0x0A, 0x00, 0xEC, 0x16, + 0xC1, 0x82, 0xEA, 0x16, 0xC2, 0x02, 0x42, 0x02, + 0x00, 0x02, 0xE6, 0x16, 0x80, 0x03, 0x81, 0x07, + 0x01, 0x00, 0xF1, 0x10, 0x01, 0x02, 0x02, 0x00, + 0xEE, 0x10, 0x01, 0x02, 0x04, 0x00, 0xEB, 0x10, + 0x01, 0x02, 0x08, 0x00, 0xE8, 0x10, 0x01, 0x02, + 0x10, 0x00, 0xE5, 0x10, 0xA1, 0x02, 0x41, 0x8B, + 0x10, 0x00, 0x02, 0x13, 0x60, 0x04, 0x5C, 0xEA, + 0x2D, 0x07, 0x18, 0x00, 0x80, 0x03, 0x09, 0x02, + 0x00, 0x08, 0x03, 0x02, 0x04, 0x00, 0xC7, 0x04, + 0xA0, 0x06, 0xDC, 0xEB, 0x60, 0x01, 0x1C, 0x01, + 0x04, 0x00, 0x1C, 0x16, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x08, 0xE0, 0x01, 0x40, 0x01, 0x00, 0x10, + 0x04, 0x02, 0x01, 0x00, 0x44, 0xCE, 0xC4, 0x06, + 0x44, 0xC6, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x10, + 0x49, 0x06, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, + 0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xE0, 0x01, + 0x40, 0x01, 0x00, 0x08, 0xA0, 0x06, 0x7A, 0xEC, + 0xA0, 0x06, 0x7A, 0xEC, 0xC7, 0x05, 0x04, 0x02, + 0xE4, 0xE4, 0xE0, 0x04, 0xD0, 0x03, 0x74, 0xC1, + 0xB4, 0xC1, 0x86, 0x05, 0x1C, 0x13, 0xE0, 0x02, + 0xC0, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0xC0, + 0x80, 0xC0, 0xC0, 0xC0, 0x00, 0xC1, 0x40, 0xC1, + 0x80, 0xC1, 0xC0, 0xC1, 0x00, 0xC2, 0x40, 0xC2, + 0x80, 0xC2, 0xC0, 0xC2, 0x00, 0xC3, 0x40, 0xC3, + 0x80, 0xC3, 0xC0, 0xC3, 0xA0, 0x04, 0xAA, 0x00, + 0xD0, 0x03, 0xD0, 0x03, 0x3F, 0x10, 0x85, 0x05, + 0x85, 0x81, 0xE1, 0x13, 0xE4, 0x10, 0xC7, 0x05, + 0x05, 0x02, 0xFF, 0x7F, 0x45, 0xA1, 0xD0, 0x03, + 0xD0, 0x03, 0x34, 0x10, 0xC0, 0xCC, 0xC1, 0xC4, + 0x03, 0x02, 0x28, 0x00, 0xA0, 0x06, 0xDC, 0xEB, + 0xE0, 0x01, 0x42, 0x01, 0x00, 0x10, 0xC7, 0x05, + 0xD0, 0x03, 0xD0, 0x03, 0x27, 0x10, 0xC7, 0x05, + 0xA0, 0xC1, 0x4A, 0x01, 0xA0, 0x07, 0x4A, 0x01, + 0x00, 0x0E, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x02, + 0x20, 0x07, 0x44, 0x01, 0x60, 0xC1, 0x44, 0x01, + 0x85, 0x02, 0x00, 0xFF, 0x17, 0x16, 0xE0, 0x01, + 0x40, 0x01, 0x00, 0x22, 0x05, 0x02, 0xC0, 0x00, + 0x05, 0x06, 0xD0, 0x03, 0xFD, 0x16, 0x60, 0xC1, + 0x46, 0x01, 0x85, 0x02, 0x00, 0xFF, 0x0A, 0x13, + 0x05, 0x02, 0x93, 0x33, 0x05, 0x06, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0xD0, 0x03, 0xF8, 0x16, 0x51, 0x10, 0x06, 0xC8, + 0x4A, 0x01, 0xC0, 0xCC, 0xC1, 0xC4, 0x4B, 0x10, + 0x13, 0xC0, 0xC8, 0xCC, 0x53, 0xC0, 0x02, 0x02, + 0xEC, 0xEB, 0xC2, 0xC4, 0x43, 0x06, 0x5B, 0x04, + 0x60, 0xC0, 0xAE, 0x00, 0xC4, 0x02, 0x44, 0x02, + 0x0F, 0x00, 0x44, 0x88, 0xCA, 0xE4, 0x3C, 0x16, + 0x81, 0x02, 0x08, 0x00, 0x27, 0x13, 0x21, 0xC1, + 0xDC, 0xE4, 0x14, 0xC1, 0x21, 0x21, 0xBA, 0xE4, + 0x33, 0x16, 0x21, 0xC1, 0xC2, 0xE4, 0x81, 0x02, + 0x00, 0x00, 0x0B, 0x13, 0x0D, 0x02, 0xA0, 0x00, + 0x84, 0x83, 0x09, 0x13, 0xC4, 0x05, 0x84, 0x83, + 0x06, 0x13, 0xC4, 0x05, 0x84, 0x83, 0x03, 0x13, + 0x23, 0x10, 0x0E, 0x81, 0x21, 0x16, 0x21, 0xC1, + 0xDC, 0xE4, 0x21, 0x45, 0xBA, 0xE4, 0xE0, 0x01, + 0x42, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01, + 0x00, 0x10, 0xA1, 0xC3, 0xD4, 0xE4, 0x0F, 0x02, + 0x2F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x02, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, + 0x6D, 0xC0, 0x0A, 0x00, 0x09, 0x13, 0x81, 0x02, + 0x5C, 0x12, 0x06, 0x1B, 0x0E, 0x02, 0xD2, 0xEB, + 0x0F, 0x02, 0x0F, 0x00, 0x80, 0x03, 0xCA, 0x05, + 0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x59, 0xCE, + 0x20, 0x88, 0xE4, 0xE4, 0xE4, 0xE4, 0xF8, 0x10, + 0xC1, 0x04, 0x48, 0x62, 0x89, 0x05, 0xA0, 0xC0, + 0x6C, 0x01, 0x08, 0xC8, 0x6C, 0x01, 0x03, 0x02, + 0x00, 0xFC, 0x04, 0x02, 0x00, 0x02, 0x73, 0xA0, + 0x04, 0x06, 0xFD, 0x16, 0x88, 0x05, 0x09, 0x06, + 0xF4, 0x16, 0x02, 0xC8, 0x6C, 0x01, 0x81, 0x86, + 0x02, 0x16, 0xD0, 0x03, 0xCB, 0x05, 0x5B, 0x04, + 0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, + 0x38, 0x38, 0x42, 0x20, 0x20, 0x59, 0x49, 0x54, + 0x4B, 0xC2, 0xA8, 0x02, 0x98, 0x00, 0x83, 0x07, + 0x02, 0x00, 0x28, 0x02, 0x08, 0x00, 0x23, 0xC6, + 0x36, 0xE5, 0x48, 0x06, 0xC4, 0xC0, 0x73, 0x0A, + 0x65, 0x17, 0xA0, 0x06, 0xAA, 0xED, 0xC8, 0xC1, + 0xC7, 0x05, 0x03, 0x02, 0xA5, 0x00, 0xB0, 0x03, + 0xF8, 0xCD, 0xF8, 0xCD, 0xA6, 0x02, 0x06, 0x62, + 0x88, 0x02, 0x0A, 0x00, 0x57, 0x16, 0x03, 0x29, + 0x55, 0x16, 0x05, 0x29, 0xC4, 0x80, 0x52, 0x16, + 0x15, 0x09, 0x50, 0x17, 0x15, 0x09, 0x4E, 0x18, + 0x85, 0x02, 0x29, 0x00, 0x4B, 0x16, 0xC6, 0x05, + 0x96, 0x00, 0x03, 0x07, 0xC4, 0x04, 0x45, 0x06, + 0x95, 0x00, 0x44, 0x05, 0x43, 0x16, 0x44, 0x81, + 0x41, 0x16, 0x00, 0x03, 0x05, 0x00, 0xC4, 0x02, + 0x00, 0x03, 0x0A, 0x00, 0x44, 0x02, 0x0F, 0x00, + 0x84, 0x02, 0x05, 0x00, 0x37, 0x16, 0xC4, 0x02, + 0x00, 0x03, 0x0F, 0x00, 0x44, 0x02, 0x0F, 0x00, + 0x84, 0x02, 0x0A, 0x00, 0x2F, 0x16, 0x04, 0x02, + 0xFE, 0xFF, 0x2C, 0x13, 0x2B, 0x15, 0x2A, 0x1A, + 0x84, 0x05, 0x28, 0x12, 0x27, 0x15, 0x26, 0x1A, + 0x25, 0x18, 0x84, 0x05, 0x23, 0x16, 0x22, 0x1B, + 0x21, 0x17, 0x84, 0x05, 0x1F, 0x13, 0x1E, 0x1A, + 0x1D, 0x11, 0x04, 0x06, 0x1B, 0x16, 0xA5, 0x02, + 0xC5, 0xC1, 0x25, 0x02, 0x06, 0x00, 0x03, 0x02, + 0xA5, 0xA5, 0x83, 0xC1, 0x95, 0x00, 0x03, 0x38, + 0x94, 0x00, 0x83, 0x02, 0x2E, 0x6B, 0x0E, 0x16, + 0x84, 0x02, 0x59, 0x1C, 0x0B, 0x16, 0x24, 0x02, + 0x69, 0x00, 0x95, 0x00, 0x03, 0x3C, 0x94, 0x00, + 0x83, 0x81, 0x04, 0x16, 0x84, 0x02, 0x69, 0x00, + 0x01, 0x16, 0xC9, 0x05, 0x59, 0x04, 0xC3, 0xD0, + 0xFD, 0x13, 0x01, 0x1C, 0xFB, 0x10, 0xE0, 0x90, + 0x3D, 0xE5, 0xF8, 0x16, 0xC3, 0x06, 0xC3, 0xD0, + 0xF5, 0x1C, 0xF4, 0x16, 0xE0, 0x90, 0x3A, 0xE5, + 0xF1, 0x16, 0x5B, 0x04, 0x0B, 0xC3, 0x09, 0x02, + 0x3E, 0xE5, 0xA0, 0x06, 0x92, 0xE9, 0xCC, 0x05, + 0x5C, 0x04, 0x88, 0x07, 0x00, 0xA0, 0x89, 0x07, + 0xFE, 0xFF, 0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, + 0x02, 0xE0, 0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, + 0x88, 0x07, 0x00, 0x90, 0x89, 0x07, 0xFE, 0x9F, + 0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, 0x78, 0xE0, + 0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, 0xA0, 0x06, + 0xC4, 0xEC, 0x00, 0x00, 0xE6, 0x10, 0xE5, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, + 0x00, 0x08, 0x11, 0xE3, 0x6C, 0xCC, 0x00, 0x80, + 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, + 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0xFF, + 0xFF, 0x00, 0xF0, 0xFF, 0x00, 0xF0, 0x0F, 0x00, + 0xFF, 0xFF, 0xFF, 0x7F, 0x03, 0x00, 0x00, 0x00, + 0xC3, 0x00, 0xE7, 0xE7, 0xF3, 0xE7, 0xF1, 0xF1, + 0x43, 0x28, 0x20, 0x29, 0x4F, 0x43, 0x59, 0x50, + 0x49, 0x52, 0x48, 0x47, 0x20, 0x54, 0x42, 0x49, + 0x20, 0x4D, 0x39, 0x31, 0x33, 0x38, 0x34, 0x2C, + 0x35, 0x2C, 0x36, 0x2C, 0x43, 0x28, 0x20, 0x29, + 0x4F, 0x43, 0x59, 0x50, 0x49, 0x52, 0x48, 0x47, + 0x20, 0x54, 0x49, 0x54, 0x31, 0x20, 0x38, 0x39, + 0x2D, 0x33, 0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, + 0x38, 0x39, 0x00, 0x00, 0x61, 0x9B, 0xC4, 0xEC, + 0x0E, 0xEA, 0xDE, 0xE5, 0xC8, 0xED, 0x00, 0x00, + 0xC4, 0x00, 0xB8, 0xAF, 0x4A, 0x06, 0x50, 0x06, + 0x4C, 0x06, 0xDC, 0xCC, 0x4E, 0x06, 0x0F, 0x00, + 0x32, 0x06, 0x01, 0x00, 0x50, 0x07, 0x58, 0x07, + 0x52, 0x07, 0x70, 0xB5, 0x54, 0x07, 0x0F, 0x00, + 0x38, 0x07, 0x01, 0x00, 0xBA, 0x00, 0xA0, 0x00, + 0xBC, 0x00, 0xD6, 0xED, 0xBE, 0x00, 0x0F, 0x00, + 0x5E, 0x07, 0x3A, 0x07, 0x62, 0x07, 0x40, 0x80, + 0x64, 0x07, 0x54, 0xBA, 0x66, 0x07, 0x36, 0xBA, + 0x68, 0x07, 0x40, 0xB8, 0x98, 0x07, 0x00, 0x80, + 0x78, 0x07, 0x00, 0x80, 0xE2, 0x08, 0x04, 0x00, + 0xE4, 0x08, 0x01, 0x00, 0xEC, 0x08, 0x08, 0x00, + 0xF6, 0x08, 0x0A, 0x00, 0xF8, 0x08, 0x06, 0x00, + 0x00, 0x09, 0x0C, 0x00, 0x02, 0x09, 0x04, 0x00, + 0xAE, 0x01, 0x00, 0x00, 0x1E, 0x09, 0x00, 0x00, + 0x66, 0x09, 0x00, 0x00, 0x0C, 0x06, 0x13, 0x00, + 0x0A, 0x06, 0x20, 0x00, 0x00, 0x00, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0xE6, 0xA2, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x02, 0xA5, 0xE0, 0x00, + 0x5E, 0xA6, 0xE0, 0x00, 0x66, 0xA9, 0xE0, 0x00, + 0x12, 0xA4, 0xC0, 0x00, 0x22, 0xA4, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, + 0x74, 0xA4, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, + 0xDE, 0xAF, 0xC0, 0x00, 0x48, 0xB0, 0xC0, 0x00, + 0x84, 0xB0, 0xC0, 0x00, 0xF4, 0xB0, 0xC0, 0x00, + 0x76, 0xB1, 0xE0, 0x00, 0xE4, 0xB2, 0xE0, 0x00, + 0x8A, 0xB2, 0xE0, 0x00, 0xF4, 0xB3, 0xE0, 0x00, + 0x7C, 0xB3, 0xE0, 0x00, 0xC6, 0xAA, 0xC0, 0x00, + 0x36, 0xAB, 0xC0, 0x00, 0x90, 0xAB, 0xC0, 0x00, + 0xC2, 0xAB, 0xC0, 0x00, 0xEA, 0xAA, 0xC0, 0x00, + 0x80, 0xA3, 0xC0, 0x00, 0x80, 0xA3, 0x00, 0x3F, + 0x00, 0x7F, 0x00, 0x5E, 0x30, 0x00, 0x28, 0x00, + 0x43, 0x00, 0xB6, 0xA6, 0xB6, 0xA6, 0x1C, 0xA5, + 0x14, 0xA5, 0x46, 0xA5, 0x46, 0xA5, 0x62, 0xA5, + 0xB6, 0xA6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10, + 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, + 0x14, 0x00, 0x0E, 0x10, 0x0C, 0x0C, 0x0A, 0x0A, + 0x0A, 0x0A, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x98, 0x07, 0x7E, 0xCA, 0x58, 0x07, + 0xF8, 0xB8, 0x58, 0x07, 0xFE, 0xB7, 0x58, 0x07, + 0x68, 0xB9, 0x58, 0x07, 0xD0, 0xB8, 0x98, 0x07, + 0x5A, 0xC7, 0x98, 0x07, 0x52, 0xC7, 0x78, 0x07, + 0xC2, 0xC1, 0x58, 0x07, 0x30, 0xB9, 0x98, 0x07, + 0x38, 0xCA, 0x78, 0x07, 0x96, 0xC2, 0x58, 0x07, + 0x6A, 0xC7, 0x58, 0x07, 0xE0, 0xB8, 0x58, 0x07, + 0x1E, 0xB9, 0x58, 0x07, 0xE2, 0xB9, 0x98, 0x07, + 0xAE, 0xCB, 0x98, 0x07, 0x8E, 0xC7, 0x78, 0x07, + 0x56, 0xC2, 0xB8, 0x07, 0x14, 0xCC, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xA2, 0xBA, 0x16, 0xC1, + 0xCA, 0xC1, 0xD6, 0xC6, 0x8A, 0xBD, 0xC2, 0xBD, + 0xE0, 0xBD, 0x6A, 0xBE, 0x8E, 0xBE, 0xAA, 0xBE, + 0x22, 0xBF, 0x22, 0xBF, 0x56, 0xBE, 0xC8, 0xBF, + 0x10, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, + 0x00, 0x0C, 0x01, 0x0F, 0xFF, 0xFE, 0x00, 0x58, + 0x00, 0x0E, 0xFF, 0xFE, 0x0E, 0x00, 0x00, 0x70, + 0x40, 0x80, 0x00, 0x5E, 0xA0, 0xC0, 0xDF, 0xFF, + 0x00, 0x18, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x50, + 0x00, 0x60, 0x00, 0x70, 0x00, 0x0C, 0x06, 0x00, + 0x00, 0x00, 0x84, 0xE3, 0xE6, 0x07, 0xF4, 0x07, + 0x08, 0x00, 0x00, 0x00, 0x8A, 0xE3, 0xEA, 0x07, + 0xF4, 0x07, 0x06, 0x00, 0x40, 0x00, 0x00, 0x0A, + 0xE6, 0x07, 0xEE, 0x07, 0x08, 0x00, 0x40, 0x00, + 0x06, 0x0A, 0xEA, 0x07, 0xEE, 0x07, 0x00, 0x00, + 0xE2, 0xC1, 0x8B, 0xD4, 0xFF, 0xFF, 0xD7, 0xD1, + 0xD9, 0xC5, 0xD4, 0xC3, 0x3B, 0x59, 0x34, 0x09, + 0xFC, 0x05, 0x6C, 0x09, 0xD8, 0x06, 0x06, 0x04, + 0xBA, 0xEA, 0x30, 0x09, 0x48, 0x04, 0x80, 0x08, + 0x06, 0x00, 0x0A, 0x06, 0x0E, 0x0C, 0xBA, 0xCE, + 0x2E, 0xE0, 0x56, 0xE0, 0x50, 0xE1, 0x66, 0xE2, + 0xEC, 0xE2, 0x4C, 0xE3, 0xFE, 0xE3, 0xBA, 0xCE, + 0x80, 0xE4, 0x10, 0xE4, 0x14, 0xE0, 0x1C, 0xE4, + 0x1C, 0xE4, 0x46, 0xE5, 0x50, 0xE5, 0x5A, 0xE5, + 0xBA, 0xCE, 0xA6, 0xDC, 0xBA, 0xCE, 0x44, 0xDA, + 0xE6, 0xDF, 0x70, 0xDA, 0xDE, 0xDE, 0xB0, 0xCE, + 0x16, 0xDB, 0x3A, 0xDD, 0xB8, 0xDD, 0x34, 0xDE, + 0x58, 0xDE, 0x16, 0xDB, 0xDA, 0xDC, 0x08, 0xCF, + 0xB0, 0xCE, 0xA8, 0xD9, 0x8A, 0xD9, 0x44, 0xD9, + 0xB0, 0xCE, 0xEA, 0xDE, 0xB0, 0xCE, 0x72, 0x06, + 0xF6, 0xD2, 0x08, 0x07, 0x72, 0x06, 0x54, 0xD2, + 0xF4, 0x01, 0x72, 0x06, 0x34, 0xD2, 0x08, 0x07, + 0x7C, 0x06, 0x5A, 0xDC, 0x04, 0x00, 0x7C, 0x06, + 0x78, 0xD2, 0x00, 0x00, 0x7C, 0x06, 0xCC, 0xDE, + 0xFA, 0x00, 0x86, 0x06, 0xAC, 0xD1, 0x05, 0x00, + 0x90, 0x06, 0x1C, 0xDF, 0x28, 0x00, 0x90, 0x06, + 0x50, 0xD3, 0x04, 0x01, 0x90, 0x06, 0x00, 0x00, + 0x02, 0x00, 0x90, 0x06, 0x80, 0xD2, 0xBC, 0x02, + 0x9A, 0x06, 0x06, 0xD3, 0xDC, 0x05, 0x9A, 0x06, + 0xAA, 0xD2, 0x64, 0x00, 0x9A, 0x06, 0x0A, 0xD3, + 0x14, 0x00, 0x9A, 0x06, 0xE2, 0xE0, 0x40, 0x06, + 0x9A, 0x06, 0x12, 0xD3, 0x64, 0x00, 0x7C, 0x06, + 0x16, 0xDC, 0x04, 0x00, 0x7C, 0x06, 0xE6, 0xDA, + 0x16, 0x00, 0x7C, 0x06, 0xFA, 0xDB, 0x05, 0x00, + 0x7C, 0x06, 0x00, 0xDD, 0x14, 0x00, 0x9A, 0x06, + 0x7C, 0xD3, 0x14, 0x00, 0x9A, 0x06, 0x38, 0xD4, + 0x02, 0x00, 0x7C, 0x06, 0x0C, 0xE0, 0x19, 0x00, + 0x00, 0x00, 0x0A, 0x07, 0x0E, 0x07, 0x04, 0x07, + 0xD8, 0x06, 0x00, 0x07, 0xF0, 0x06, 0xEE, 0x06, + 0xEC, 0x06, 0x0C, 0x07, 0xE6, 0x06, 0x18, 0x07, + 0x92, 0x09, 0x94, 0x09, 0x96, 0x09, 0x98, 0x09, + 0x00, 0x50, 0xCC, 0x00, 0x03, 0x00, 0x00, 0x84, + 0x00, 0xA8, 0x00, 0xA0, 0x00, 0x20, 0x00, 0x80, + 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 0x80, + 0x00, 0x40, 0x00, 0x10, 0x82, 0xEC, 0x48, 0xEB, + 0x62, 0xEB, 0x7C, 0xEB, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0xEA, 0xEB, + 0x52, 0xEB, 0x68, 0xEB, 0x82, 0xEB, 0x40, 0x01, + 0x42, 0x01, 0x42, 0x01, 0x42, 0x01, 0x00, 0x00, + 0x7F, 0x00, 0xA0, 0x00, 0xFF, 0x00, 0x10, 0x02, + 0x1F, 0x02, 0x30, 0x02, 0x3F, 0x02, 0x50, 0x02, + 0x5F, 0x02, 0x70, 0x02, 0x7F, 0x02, 0x90, 0x02, + 0x9F, 0x02, 0xB0, 0x02, 0xBF, 0x02, 0xD0, 0x02, + 0xDF, 0x02, 0xE1, 0x02, 0xFF, 0x02, 0x01, 0x03, + 0x7F, 0x03, 0x81, 0x03, 0x8F, 0x03, 0x91, 0x03, + 0x9F, 0x03, 0xA1, 0x03, 0xAF, 0x03, 0xB1, 0x03, + 0xBF, 0x03, 0xC1, 0x03, 0xCF, 0x03, 0xE1, 0x03, + 0xFF, 0x03, 0xC0, 0x07, 0xFF, 0x07, 0x00, 0x0C, + 0xFF, 0x0F, 0x00, 0x30, 0xFF, 0x37, 0xFF, 0xFF, + 0xFF, 0xFF, 0xBC, 0xFE, 0x07, 0x00, 0x5E, 0x02, + 0x00, 0x01, 0xFF, 0xBA, 0x80, 0xBA, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x0A, 0x01, + 0x0E, 0x01, 0x10, 0x01, 0x14, 0x01, 0x00, 0x00, + 0x12, 0x01, 0x00, 0xF8, 0x16, 0x01, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x1C, 0x01, + 0x82, 0x01, 0x66, 0x96, 0x66, 0x96, 0x55, 0x55, + 0x00, 0x00, 0x82, 0x01, 0x2A, 0x8A, 0x2A, 0x8A, + 0x18, 0xC9, 0x18, 0xC9, 0x86, 0x01, 0xAA, 0xA2, + 0x1E, 0xA0, 0x55, 0x55, 0x1E, 0x54, 0x8A, 0x01, + 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, + 0x8C, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, + 0x00, 0x00, 0x8E, 0x01, 0x00, 0x50, 0x00, 0x00, + 0x00, 0xA8, 0x00, 0x00, 0x90, 0x01, 0x00, 0x50, + 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x92, 0x01, + 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, + 0x94, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, + 0x00, 0x00, 0x96, 0x01, 0x00, 0x50, 0x00, 0x00, + 0x00, 0xA8, 0x00, 0x00, 0x98, 0x01, 0x00, 0x50, + 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x9A, 0x01, + 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, + 0x9C, 0x01, 0x55, 0x55, 0xC0, 0x7F, 0xAA, 0xAA, + 0xC0, 0x7F, 0x00, 0x00, 0xA2, 0x01, 0xA4, 0x01, + 0xA8, 0x01, 0xAA, 0x01, 0xAE, 0x01, 0xB0, 0x01, + 0xB2, 0x01, 0x80, 0x01, 0x00, 0x00, 0x88, 0x01, + 0x00, 0xFF, 0x9E, 0x01, 0xFF, 0x00, 0xA0, 0x01, + 0x00, 0x80, 0xAC, 0x01, 0x00, 0x80, 0x00, 0x00, + 0xA6, 0x01, 0x00, 0x80, 0x00, 0x00, 0x80, 0x01, + 0xBC, 0x01, 0x00, 0x88, 0x00, 0x06, 0x00, 0xC8, + 0x00, 0x00, 0x00, 0x80, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x02, 0x00, 0x44, 0x00, 0x92, 0xEA, + 0x48, 0x00, 0x98, 0xEA, 0x50, 0x00, 0x9E, 0xEA, + 0x60, 0x00, 0xA4, 0xEA, 0x78, 0x00, 0xAA, 0xEA, + 0x0A, 0xE8, 0x18, 0xE7, 0x3C, 0xEA, 0x2A, 0xE7, + 0x14, 0x55, 0xA0, 0x01, 0xEC, 0xE6, 0xD0, 0xE9, + 0x46, 0xE7, 0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, + 0x00, 0x00, 0x1E, 0x00, 0x46, 0xE7, 0x92, 0xE7, + 0x00, 0x41, 0x01, 0x41, 0xB6, 0xE7, 0x73, 0xEA, + 0x18, 0xE7, 0x48, 0xEA, 0xEC, 0xE6, 0x04, 0xEA, + 0x56, 0xE7, 0x62, 0xE7, 0xB6, 0xE7, 0x6E, 0xEA, + 0x62, 0xE8, 0x00, 0x00, 0x36, 0xE8, 0xEC, 0xE6, + 0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, 0x36, 0xE8, + 0x62, 0xE8, 0x00, 0x00, 0xEC, 0xE6, 0xF0, 0xE9, + 0x0C, 0xE7, 0x4A, 0xE7, 0x62, 0xE7, 0x36, 0xE8, + 0xEC, 0xE6, 0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, + 0x36, 0xE8, 0x62, 0xE8, 0x00, 0x20, 0x2A, 0xE7, + 0x14, 0x55, 0xA0, 0x01, 0x18, 0xE7, 0x50, 0xEA, + 0xEC, 0xE6, 0xD0, 0xE9, 0x58, 0xE8, 0x50, 0x55, + 0x0C, 0x00, 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, + 0x00, 0x00, 0xB6, 0xE7, 0x75, 0xEA, 0x00, 0xE7, + 0x58, 0xE8, 0x55, 0x55, 0x0C, 0x00, 0x56, 0xE7, + 0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, 0xFF, 0xFF, + 0x08, 0x00, 0x58, 0xE8, 0x02, 0x10, 0x06, 0x00, + 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, + 0xB6, 0xE7, 0x80, 0xEA, 0x00, 0xE7, 0x58, 0xE8, + 0x00, 0xC0, 0x08, 0x00, 0x58, 0xE8, 0xFF, 0xFF, + 0x0A, 0x00, 0x58, 0xE8, 0xFF, 0xFF, 0x0C, 0x00, + 0x58, 0xE8, 0x0D, 0x10, 0x06, 0x00, 0x46, 0xE7, + 0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, 0xB6, 0xE7, + 0x74, 0xEA, 0x62, 0xE8, 0x08, 0x20, 0x00, 0xE7, + 0x52, 0xE8, 0x82, 0x01, 0x02, 0xC9, 0x46, 0xE7, + 0xB6, 0xE7, 0x80, 0xEA, 0x62, 0xE8, 0x34, 0x20, + 0x00, 0xE7, 0x58, 0xE8, 0x00, 0x10, 0x06, 0x00, + 0x46, 0xE7, 0xC6, 0xE8, 0xB6, 0xE7, 0x78, 0xEA, + 0x52, 0xE8, 0x9C, 0x01, 0x40, 0x00, 0x18, 0xE7, + 0x50, 0xEA, 0x2A, 0xE7, 0xFF, 0x00, 0x80, 0x07, + 0x26, 0xE9, 0x03, 0x00, 0x66, 0xE9, 0x74, 0xE9, + 0x12, 0xEA, 0x38, 0xE9, 0x00, 0x00, 0x74, 0xE9, + 0x1C, 0xEA, 0x38, 0xE9, 0x04, 0x00, 0x74, 0xE9, + 0x24, 0xEA, 0x38, 0xE9, 0x07, 0x00, 0x74, 0xE9, + 0x2C, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x38, 0xE9, 0x02, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x38, 0xE9, 0x06, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x38, 0xE9, 0x05, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x4A, 0xE9, + 0x26, 0xE9, 0x03, 0x00, 0x58, 0xE9, 0x62, 0xE7, + 0xE6, 0xE8, 0xD8, 0xE9, 0x01, 0x00, 0xE6, 0xE8, + 0x25, 0xEA, 0x02, 0x00, 0xE6, 0xE8, 0x2F, 0xEA, + 0x06, 0x00, 0xE6, 0xE8, 0x3A, 0xEA, 0x05, 0x00, + 0xB6, 0xE7, 0x74, 0xEA, 0x36, 0xE8, 0xEC, 0xE6, + 0xD0, 0xE9, 0x56, 0xE7, 0xC6, 0xE8, 0x0C, 0xE7, + 0x92, 0xE7, 0x00, 0x01, 0x00, 0x80, 0xB6, 0xE7, + 0x78, 0xEA, 0x00, 0xE7, 0xFE, 0xE8, 0x52, 0xE8, + 0x80, 0x01, 0x41, 0x8E, 0x4A, 0xE7, 0x92, 0xE7, + 0x00, 0x01, 0x01, 0x1B, 0x06, 0xE9, 0xE4, 0xFF, + 0xB6, 0xE7, 0x7C, 0xEA, 0xBE, 0xE8, 0x18, 0xE7, + 0x56, 0xEA, 0x0C, 0xE7, 0x6A, 0xE8, 0x3C, 0xE7, + 0x00, 0xE0, 0xC6, 0xE8, 0xB6, 0xE7, 0x86, 0xEA, + 0x3C, 0xE7, 0x00, 0xE8, 0x62, 0xE7, 0xB6, 0xE7, + 0x85, 0xEA, 0x3C, 0xE7, 0x00, 0x08, 0xC6, 0xE8, + 0xB6, 0xE7, 0x86, 0xEA, 0x3C, 0xE7, 0x00, 0xF8, + 0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, + 0x80, 0x01, 0x00, 0x02, 0x3C, 0xE7, 0x00, 0xE0, + 0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, + 0x84, 0x01, 0x00, 0x00, 0x62, 0xE8, 0x34, 0x00, + 0x3C, 0xE7, 0x00, 0x00, 0xC6, 0xE8, 0x62, 0xE8, + 0x34, 0x60, 0x0E, 0xE9, 0x52, 0xE8, 0x84, 0x01, + 0x00, 0x00, 0xB6, 0xE7, 0x86, 0xEA, 0x52, 0xE8, + 0x82, 0x01, 0x00, 0xC8, 0x3C, 0xE7, 0x00, 0xE0, + 0xC6, 0xE8, 0x3C, 0xE7, 0x00, 0x10, 0xC6, 0xE8, + 0x62, 0xE8, 0x34, 0x60, 0x52, 0xE8, 0x80, 0x01, + 0x00, 0x06, 0x3C, 0xE7, 0x10, 0x00, 0x78, 0xE8, + 0x36, 0xE8, 0x52, 0xE8, 0x84, 0x01, 0x00, 0x00, + 0x62, 0xE8, 0x34, 0x00, 0xEC, 0xE6, 0xD0, 0xE9, + 0x18, 0xE7, 0x5C, 0xEA, 0xD0, 0xE8, 0x92, 0xE9, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xF0, + 0x06, 0x00, 0x00, 0xC7, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0xE0, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, + 0x40, 0xD0, 0x06, 0x00, 0x00, 0xE0, 0xA0, 0xE7, + 0xDC, 0xE8, 0x00, 0xC0, 0x00, 0xE7, 0x0C, 0xE7, + 0x70, 0xE7, 0x40, 0x90, 0x06, 0x00, 0x00, 0xA0, + 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x80, 0x00, 0xE7, + 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x50, 0x06, 0x00, + 0x00, 0x60, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x40, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x10, + 0x06, 0x00, 0x00, 0x20, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0x00, 0xD0, 0xE8, 0x92, 0xE9, 0x00, 0xE7, + 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xD0, 0x06, 0x00, + 0x00, 0xA6, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0xC0, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x90, + 0x06, 0x00, 0x00, 0xC0, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0x80, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, + 0x40, 0x50, 0x06, 0x00, 0x00, 0x40, 0xA0, 0xE7, + 0xDC, 0xE8, 0x00, 0x40, 0x00, 0xE7, 0x0C, 0xE7, + 0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, 0x00, 0x60, + 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, 0x7E, 0xE9, + 0x90, 0xE9, 0x18, 0xE7, 0x62, 0xEA, 0xEC, 0xE6, + 0xD0, 0xE9, 0xA4, 0xE8, 0x55, 0x55, 0x16, 0x00, + 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x00, 0x00, 0x00, + 0xB6, 0xE7, 0x8B, 0xEA, 0x0A, 0xE8, 0x18, 0xE7, + 0x62, 0xEA, 0x58, 0xE8, 0x55, 0x55, 0x16, 0x00, + 0x00, 0xE7, 0x46, 0xE7, 0xA0, 0xE7, 0x2A, 0xE7, + 0xFF, 0x00, 0x00, 0x08, 0x2A, 0xE7, 0xFF, 0x00, + 0x00, 0x0C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x10, + 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x14, 0x2A, 0xE7, + 0xFF, 0x00, 0x00, 0x18, 0x2A, 0xE7, 0xFF, 0x00, + 0x00, 0x1C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x20, + 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x24, 0x2A, 0xE7, + 0xFF, 0x00, 0x00, 0x28, 0x2A, 0xE7, 0xFF, 0x00, + 0x00, 0x2C, 0xD2, 0xE7, 0x00, 0xE7, 0x0C, 0xE7, + 0x70, 0xE7, 0x40, 0x30, 0x06, 0x00, 0x00, 0x01, + 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x20, 0x00, 0xE7, + 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, + 0x00, 0x43, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xB0, + 0x06, 0x00, 0x00, 0x85, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0xA0, 0xD8, 0xE8, 0x00, 0x01, 0x03, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x81, 0x1A, 0x00, + 0x40, 0x10, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x72, 0x82, + 0x4A, 0xA9, 0xA5, 0x5A, 0xDA, 0xE7, 0x03, 0x09, + 0x11, 0x9D, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, + 0xD8, 0x90, 0x00, 0x10, 0x00, 0x00, 0x00, 0x81, + 0x04, 0x00, 0xD8, 0x90, 0xD8, 0xB4, 0x00, 0x00, + 0x00, 0x81, 0x08, 0x00, 0xD8, 0x90, 0x46, 0x16, + 0x00, 0x40, 0xD8, 0xB4, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x13, 0x00, 0x40, 0x10, 0x16, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x81, 0x0F, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x12, 0x00, 0x0A, 0x80, + 0x40, 0x9E, 0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, + 0x0F, 0x00, 0x06, 0x80, 0x40, 0xFE, 0x00, 0xCC, + 0x00, 0x00, 0x04, 0x80, 0x40, 0x8E, 0x00, 0xC9, + 0x04, 0x80, 0x00, 0x06, 0x00, 0xCC, 0x04, 0x80, + 0x40, 0x0A, 0x00, 0xC8, 0x0A, 0x80, 0x40, 0x8A, + 0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, 0x0F, 0x00, + 0x0A, 0x08, 0x80, 0x1C, 0x0A, 0x00, 0x1C, 0x1A, + 0x00, 0x80, 0x1C, 0x0C, 0x00, 0x80, 0x1C, 0x1A, + 0x00, 0x80, 0x1A, 0x0E, 0x80, 0x1C, 0x04, 0x00, + 0x00, 0x80, 0x80, 0x02, 0x02, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x58, 0x07, 0x0C, 0xB8, + 0x16, 0xE0, 0xE2, 0x08, 0xEC, 0x08, 0xF6, 0x08, + 0x16, 0xE0, 0x00, 0x09, 0x0A, 0x09, 0x00, 0x00, + 0x00, 0x00, 0xE2, 0x08, 0x00, 0x00, 0xEC, 0x08, + 0xF6, 0x08, 0x00, 0x09, 0x00, 0x00, 0xB8, 0x07, + 0xCA, 0xCB, 0x80, 0x02, 0xB8, 0x07, 0xE8, 0xCB, + 0x84, 0xFF, 0xB8, 0x07, 0x0A, 0xCC, 0xB8, 0x07, + 0x84, 0xCC, 0x6E, 0xCD, 0x62, 0xCD, 0x88, 0xCD, + 0x90, 0xCE, 0x84, 0xCD, 0x92, 0xCE, 0x92, 0xCE, + 0x92, 0xCE, 0x8C, 0xCD, 0x96, 0xCD, 0x38, 0xCE, + 0x82, 0xCE, 0x92, 0xCE, 0x92, 0xCE, 0x92, 0xCE, + 0x92, 0xCE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x08, 0x01, 0x05, 0x08, + 0x08, 0x08, 0x03, 0x08, 0x03, 0x03, 0x03, 0x03, + 0x00, 0x00, 0x04, 0x02, 0x04, 0x04, 0x00, 0x04, + 0x0A, 0x08, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x1A, 0x00, 0x00, + 0x04, 0x41, 0x06, 0x0B, 0x08, 0xC2, 0x00, 0xE6, + 0x00, 0xE7, 0x04, 0x06, 0x04, 0x07, 0x04, 0x03, + 0x06, 0x04, 0x04, 0x05, 0x04, 0x88, 0x04, 0xCF, + 0x04, 0xCD, 0x03, 0x00, 0x05, 0x00, 0x1C, 0x00, + 0x00, 0x0C, 0x00, 0x80, 0xD2, 0xD8, 0xDA, 0xD8, + 0x1E, 0xD9, 0xDE, 0xD8, 0xEA, 0xD8, 0xF0, 0xD8, + 0x14, 0xD9, 0xE4, 0xD8, 0x32, 0xD9, 0x00, 0x06, + 0x00, 0x00, 0x03, 0x07, 0x0A, 0x0E, 0x0F, 0x14, + 0x26, 0x2A, 0x52, 0x42, 0x50, 0x48, 0x5D, 0x4D, + 0x62, 0x62, 0x6D, 0x57, 0x46, 0x39, 0x1A, 0x1D, + 0x7C, 0x76, 0x1F, 0x23, 0x15, 0x1D, 0x74, 0x6F, + 0x84, 0x7C, 0x8B, 0x82, 0x92, 0x89, 0x00, 0x00, + 0x32, 0x2F, 0x3F, 0x34, 0x32, 0x01, 0x01, 0x57, + 0x32, 0x11, 0x81, 0x51, 0x02, 0x56, 0x03, 0x55, + 0x54, 0x11, 0x56, 0x81, 0x55, 0x02, 0x54, 0x02, + 0x56, 0x81, 0x01, 0x76, 0x02, 0x34, 0x02, 0x55, + 0x81, 0x54, 0x02, 0x58, 0x02, 0x55, 0x81, 0x54, + 0x02, 0x58, 0x11, 0x12, 0x02, 0x52, 0x58, 0x83, + 0x52, 0x05, 0x83, 0x04, 0x02, 0x58, 0x08, 0x55, + 0x58, 0x83, 0x55, 0x02, 0x81, 0x02, 0x05, 0x58, + 0x03, 0x52, 0x5C, 0x15, 0x53, 0x5B, 0x52, 0x87, + 0x11, 0x03, 0x41, 0x51, 0x78, 0x51, 0x34, 0x11, + 0x81, 0x11, 0x20, 0x31, 0x54, 0x57, 0x01, 0x53, + 0x5A, 0x12, 0x81, 0x51, 0x20, 0x31, 0x5B, 0x57, + 0x01, 0x5A, 0x01, 0x11, 0x51, 0x11, 0x31, 0x81, + 0x57, 0x20, 0x15, 0x01, 0x13, 0x01, 0x11, 0x01, + 0x11, 0x11, 0x81, 0x51, 0x05, 0x58, 0x02, 0x52, + 0x5B, 0x54, 0x5D, 0x81, 0x52, 0x05, 0x54, 0x02, + 0x58, 0x81, 0x50, 0x02, 0x13, 0x03, 0x58, 0x81, + 0x50, 0x02, 0x11, 0x03, 0x81, 0x54, 0x72, 0x5D, + 0x50, 0x03, 0x13, 0x03, 0x13, 0x01, 0x40, 0x54, + 0x0E, 0x00, 0x20, 0x06, 0x56, 0x06, 0x0C, 0xDA, + 0x24, 0x00, 0x02, 0x10, 0x16, 0x00, 0x02, 0x00, + 0x01, 0x04, 0x08, 0x07, 0x0C, 0xDA, 0x20, 0x00, + 0x03, 0x10, 0x12, 0x00, 0x03, 0x00, 0x4E, 0xD9, + 0x14, 0x8E, 0x20, 0x00, 0x04, 0x10, 0x12, 0x00, + 0x04, 0x00, 0xD2, 0xCE, 0x20, 0x00, 0x05, 0xE0, + 0x12, 0x00, 0x05, 0x00, 0xD2, 0xCE, 0x20, 0x00, + 0x06, 0xE0, 0x12, 0x00, 0x06, 0x00, 0xE8, 0xDD, + 0x12, 0x00, 0x01, 0xE0, 0x6C, 0x09, 0xCC, 0x06, + 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x30, 0x06, + 0x42, 0xDC, 0xF0, 0x05, 0x00, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE2, 0x05, 0x08, 0x00, + 0x26, 0xFF, 0xDC, 0x05, 0x00, 0x00, 0x30, 0x06, + 0xF8, 0xDB, 0x1E, 0x00, 0x01, 0xE0, 0x10, 0x00, + 0x11, 0x30, 0x0C, 0x04, 0x01, 0x00, 0x0E, 0x04, + 0x02, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x32, 0xDD, 0x12, 0x00, 0x01, 0xE0, + 0x04, 0x00, 0x13, 0x30, 0x74, 0xDE, 0x3E, 0x00, + 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x02, 0x00, + 0x30, 0x00, 0x20, 0x50, 0x23, 0x0C, 0xFC, 0x05, + 0x52, 0x06, 0x56, 0x06, 0x00, 0x00, 0x00, 0x81, + 0x16, 0x00, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x2A, 0x40, 0x2A, 0x04, + 0x56, 0x06, 0x26, 0x00, 0x19, 0xED, 0x2B, 0x06, + 0x72, 0x09, 0x22, 0x00, 0x24, 0x00, 0x2F, 0xED, + 0x23, 0x0C, 0xFC, 0x05, 0x28, 0x08, 0x34, 0x09, + 0x29, 0x08, 0x58, 0x07, 0x78, 0x07, 0x98, 0x07, + 0x23, 0x00, 0x2A, 0x00, 0x3D, 0xED, 0x06, 0x04, + 0xF0, 0x06, 0x07, 0x04, 0xEE, 0x06, 0x24, 0x00, + 0xD2, 0xCE, 0x34, 0x00, 0x00, 0xE0, 0x00, 0xC0, + 0x00, 0x00, 0x10, 0x00, 0x26, 0x00, 0x25, 0x40, + 0xD2, 0xCE, 0x20, 0x00, 0x00, 0xE0, 0x00, 0xC0, + 0x00, 0x00, 0x10, 0x00, 0x12, 0x00, 0x26, 0x40, + 0xD2, 0xCE, 0x1A, 0x00, 0x00, 0xE0, 0x0C, 0x00, + 0x27, 0x60, 0x0A, 0x08, 0xE6, 0x06, 0xD2, 0xCE, + 0x24, 0x00, 0x00, 0xE0, 0x16, 0x00, 0x28, 0x60, + 0x30, 0x04, 0x06, 0x07, 0x52, 0xCF, 0x00, 0x81, + 0x30, 0x00, 0x00, 0xE0, 0x22, 0x00, 0x29, 0x60, + 0x2D, 0x08, 0x1C, 0x07, 0x2E, 0x08, 0x22, 0x07, + 0x00, 0x00, 0x08, 0x02, 0x06, 0x01, 0x14, 0x06, + 0x18, 0x08, 0x20, 0x0C, 0x26, 0x0E, 0x30, 0x0F, + 0x34, 0x11, 0x3E, 0x12, 0x42, 0x14, 0x46, 0x16, + 0x1C, 0x0A, 0x4A, 0x18, 0x13, 0x03, 0x11, 0x83, + 0x01, 0x11, 0x11, 0x81, 0x12, 0x81, 0x13, 0x01, + 0x52, 0x83, 0x81, 0x85, 0x85, 0x11, 0x12, 0x81, + 0x12, 0x81, 0x19, 0x81, 0x60, 0x85, 0x00, 0xC0, + 0x00, 0x00, 0x08, 0x00, 0x6C, 0x09, 0x00, 0x00, + 0x30, 0x06, 0x08, 0xE5, 0x54, 0x06, 0x50, 0x06, + 0x38, 0x02, 0x21, 0x04, 0x1E, 0x09, 0x0B, 0x06, + 0xD8, 0x06, 0x02, 0x08, 0xDC, 0x06, 0x00, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x00, 0x41, 0x00, + 0x14, 0xAE, 0x00, 0x00, 0x00, 0x81, 0x09, 0x04, + 0x0C, 0x07, 0x41, 0x00, 0x41, 0x00, 0x14, 0x02, + 0x00, 0x00, 0x00, 0x81, 0x0B, 0x06, 0xD8, 0x06, + 0x2C, 0x06, 0x76, 0x09, 0x22, 0x14, 0x3A, 0x09, + 0x41, 0x00, 0x41, 0x00, 0x54, 0x02, 0x00, 0x00, + 0x00, 0x81, 0xD8, 0x06, 0x00, 0x84, 0x00, 0x48, + 0xFC, 0xFF, 0x09, 0x00, 0x00, 0xC0, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0x20, 0x00, + 0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, + 0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, 0x38, 0x39, + 0x54, 0x20, 0x78, 0x65, 0x73, 0x61, 0x49, 0x20, + 0x73, 0x6E, 0x72, 0x74, 0x6D, 0x75, 0x6E, 0x65, + 0x73, 0x74, 0x28, 0x0A, 0x29, 0x43, 0x39, 0x31, + 0x33, 0x38, 0x34, 0x2C, 0x35, 0x2C, 0x36, 0x2C, + 0x49, 0x20, 0x4D, 0x42, 0x43, 0x20, 0x72, 0x6F, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0x34, 0x90, + 0x00, 0x00, 0xFA, 0xFF, 0x01, 0x00, 0xB8, 0xFF, + 0x00, 0x00, 0xFC, 0xFF, 0x02, 0x00, 0x80, 0x00, + 0x3E, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#endif /* CONFIG_SKTR */ |