From cbc941282074856fc6179761b70a0c9879b0b64d Mon Sep 17 00:00:00 2001 From: Yves Fischer Date: Tue, 11 Oct 2011 21:56:36 +0200 Subject: update firmware to @319 --- firmware/93c46.c | 18 +- firmware/93c46.h | 14 - firmware/Makefile | 914 +++++++-------- firmware/adc.c | 152 +-- firmware/adc.h | 17 +- firmware/can.c | 756 ++++++++++++ firmware/can.h | 101 ++ firmware/common.c | 16 +- firmware/common.h | 25 +- firmware/debug.c | 38 +- firmware/debug.h | 9 +- firmware/eeprom.c | 119 ++ firmware/eeprom.h | 11 + firmware/fifo.c | 20 +- firmware/i2c.c | 113 +- firmware/i2c.h | 11 +- firmware/io.c | 402 +++---- firmware/io.h | 168 +-- firmware/main.c | 344 +++--- firmware/main.hex | 2169 +++++++++++++++++++++-------------- firmware/octopus_can_stable_1_1.hex | 1133 ++++++++++++++++++ firmware/octopus_relais.hex | 959 ++++++++++++++++ firmware/octopus_stable_1_1.hex | 971 ++++++++++++++++ firmware/pin.c | 93 ++ firmware/pin.h | 84 ++ firmware/protocol.h | 27 +- firmware/pwm.c | 6 +- firmware/spi.c | 190 ++- firmware/spi.h | 23 +- firmware/uart.c | 68 +- firmware/uart_fifo.c | 368 ++++++ firmware/usbn2mc.c | 2 +- 32 files changed, 7113 insertions(+), 2228 deletions(-) create mode 100644 firmware/can.c create mode 100644 firmware/can.h create mode 100644 firmware/eeprom.c create mode 100644 firmware/eeprom.h create mode 100644 firmware/octopus_can_stable_1_1.hex create mode 100644 firmware/octopus_relais.hex create mode 100644 firmware/octopus_stable_1_1.hex create mode 100644 firmware/pin.c create mode 100644 firmware/pin.h create mode 100644 firmware/uart_fifo.c (limited to 'firmware') diff --git a/firmware/93c46.c b/firmware/93c46.c index 4af0f45..9ec4e11 100644 --- a/firmware/93c46.c +++ b/firmware/93c46.c @@ -93,10 +93,10 @@ int flash_93c46_init(void) //SETPIN(DIN0) = D4 = low //SETPIN(DIN1) = D4 = low - octopus.ports[19]=PIN_OUT; - octopus.ports[18]=PIN_OUT; - octopus.ports[17]=PIN_OUT; octopus.ports[16]=PIN_IN; + octopus.ports[17]=PIN_OUT; + octopus.ports[18]=PIN_OUT; + octopus.ports[19]=PIN_OUT; return RSP_OK; } @@ -111,9 +111,10 @@ void flash_93c46_deinit_usb(void) int flash_93c46_deinit(void) { - octopus.ports[5]=PIN_OUT; // this is wrong! - octopus.ports[6]=PIN_OUT; // this is wrong! - octopus.ports[7]=PIN_OUT; // this is wrong! + octopus.ports[16]=PIN_NONE; + octopus.ports[17]=PIN_NONE; + octopus.ports[18]=PIN_NONE; + octopus.ports[19]=PIN_NONE; return RSP_OK; } @@ -122,7 +123,8 @@ void flash_93c46_read_usb(unsigned char address, unsigned int length, char * buf { answer[0]=CMD_93C46_READ; answer[1]=(unsigned char)flash_93c46_read(address,length,(char*)&answer[2]); - CommandAnswer(length+2); + answer[2+length] = 0; + CommandAnswer(3+length); } int flash_93c46_read(unsigned char address, unsigned int length, char * buf) @@ -142,7 +144,7 @@ void flash_93c46_write_usb(unsigned char address, unsigned int length, char * bu { answer[0]=CMD_93C46_WRITE; answer[1]=(unsigned char)flash_93c46_write(address,length, buf); - answer[2]=0x00; + answer[2]=0; CommandAnswer(3); } diff --git a/firmware/93c46.h b/firmware/93c46.h index 817eade..d919036 100644 --- a/firmware/93c46.h +++ b/firmware/93c46.h @@ -47,10 +47,6 @@ #define DO (B, 3) - - - - #define DIN0 (B, 4) #define DIN1 (B, 5) @@ -100,14 +96,4 @@ void erase_write_disable(void); uint8_t flash_93c46_read_word(uint8_t add); uint8_t flash_93c46_write_word(uint8_t add,uint8_t wd); - - - - - - - - - - #endif /* SPI_H */ diff --git a/firmware/Makefile b/firmware/Makefile index f3553b5..c8ae6de 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -1,458 +1,458 @@ -# Hey Emacs, this is a -*- makefile -*- -# -# WinAVR makefile written by Eric B. Weddington, Jörg Wunsch, et al. -# Released to the Public Domain -# Please read the make user manual! -# -# Additional material for this makefile was submitted by: -# Tim Henigan -# Peter Fleury -# Reiner Patommel -# Sander Pool -# Frederik Rouleau -# Markus Pfaff -# -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB). -# -# make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio -# 4.07 or greater). -# -# make program = Download the hex file to the device, using avrdude. Please -# customize the avrdude settings below first! -# -# make filename.s = Just compile filename.c into the assembler code only -# -# To rebuild project do "make clean" then "make all". -# - -# mth 2004/09 -# Differences from WinAVR 20040720 sample: -# - DEPFLAGS according to Eric Weddingtion's fix (avrfreaks/gcc-forum) -# - F_OSC Define in CFLAGS and AFLAGS - - -# MCU name -#MCU = atmega128 -MCU = at90can128 - -# Main Oscillator Frequency -# This is only used to define F_OSC in all assembler and c-sources. +# Hey Emacs, this is a -*- makefile -*- +# +# WinAVR makefile written by Eric B. Weddington, Jörg Wunsch, et al. +# Released to the Public Domain +# Please read the make user manual! +# +# Additional material for this makefile was submitted by: +# Tim Henigan +# Peter Fleury +# Reiner Patommel +# Sander Pool +# Frederik Rouleau +# Markus Pfaff +# +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB). +# +# make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio +# 4.07 or greater). +# +# make program = Download the hex file to the device, using avrdude. Please +# customize the avrdude settings below first! +# +# make filename.s = Just compile filename.c into the assembler code only +# +# To rebuild project do "make clean" then "make all". +# + +# mth 2004/09 +# Differences from WinAVR 20040720 sample: +# - DEPFLAGS according to Eric Weddingtion's fix (avrfreaks/gcc-forum) +# - F_OSC Define in CFLAGS and AFLAGS + + +# MCU name +#MCU = atmega128 +MCU = at90can128 + +# Main Oscillator Frequency +# This is only used to define F_OSC in all assembler and c-sources. F_OSC = 16000000 - -# Output format. (can be srec, ihex, binary) -FORMAT = ihex - -# Target file name (without extension). -TARGET = main - - -# List C source files here. (C dependencies are automatically generated.) -#SRC = $(TARGET).c uart.c usbn2mc/main/usbn960x.c usbn2mc.c usbn2mc/main/usbnapi.c - -SRC = $(TARGET).c wait.c uart.c ../usbn2mc/main/usbn960x.c usbn2mc.c ../usbn2mc/main/usbnapi.c common.c fifo.c io.c adc.c i2c.c spi.c 93c46.c pwm.c debug.c - - -# List Assembler source files here. -# Make them always end in a capital .S. Files ending in a lowercase .s -# will not be considered source files but generated files (assembler -# output from the compiler), and will be deleted upon "make clean"! -# Even though the DOS/Win* filesystem matches both .s and .S the same, -# it will preserve the spelling of the filenames, and gcc itself does -# care about how the name is spelled on its command-line. -ASRC = - - - -# Optimization level, can be [0, 1, 2, 3, s]. -# 0 = turn off optimization. s = optimize for size. -# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) -OPT = s - -# Debugging format. -# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. -# AVR (extended) COFF requires stabs, plus an avr-objcopy run. -DEBUG = stabs -#DEBUG = dwarf-2 - -# List any extra directories to look for include files here. -# Each directory must be seperated by a space. -EXTRAINCDIRS = - - -# Compiler flag to set the C Standard level. -# c89 - "ANSI" C -# gnu89 - c89 plus GCC extensions -# c99 - ISO C99 standard (not yet fully implemented) -# gnu99 - c99 plus GCC extensions -CSTANDARD = -std=gnu99 - -# Place -D or -U options here -CDEFS = - -# Place -I options here -CINCS = - - -# Compiler flags. -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CFLAGS = -g$(DEBUG) -CFLAGS += $(CDEFS) $(CINCS) -CFLAGS += -O$(OPT) -CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -CFLAGS += -Wall -Wstrict-prototypes -#CFLAGS += -Wall -CFLAGS += -Wa,-adhlns=$(<:.c=.lst) -CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -CFLAGS += $(CSTANDARD) -CFLAGS += -DF_OSC=$(F_OSC) - - - -# Assembler flags. -# -Wa,...: tell GCC to pass this to the assembler. -# -ahlms: create listing -# -gstabs: have the assembler create line number information; note that -# for use in COFF files, additional information about filenames -# and function names needs to be present in the assembler source -# files -- see avr-libc docs [FIXME: not yet described there] -ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs -ASFLAGS += -DF_OSC=$(F_OSC) - - -#Additional libraries. - -# Minimalistic printf version -PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min - -# Floating point printf version (requires MATH_LIB = -lm below) -PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt - -PRINTF_LIB = - -# Minimalistic scanf version -SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min - -# Floating point + %[ scanf version (requires MATH_LIB = -lm below) -SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt - -SCANF_LIB = - -MATH_LIB = -lm - -# External memory options - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# used for variables (.data/.bss) and heap (malloc()). -#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff - -# 64 KB of external RAM, starting after internal RAM (ATmega128!), -# only used for heap (malloc()). -#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff - -EXTMEMOPTS = - -# Linker flags. -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += $(EXTMEMOPTS) -LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) - - - - -# Programming support using avrdude. Settings and variables. - -# Programming hardware: alf avr910 avrisp bascom bsd -# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 -# -# Type: avrdude -c ? -# to get a full listing. -# -AVRDUDE_PROGRAMMER = stk500 - -# com1 = serial port. Use lpt1 to connect to parallel port. -AVRDUDE_PORT = com1 # programmer connected to serial device - -AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex -#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep - - -# Uncomment the following if you want avrdude's erase cycle counter. -# Note that this counter needs to be initialized first using -Yn, -# see avrdude manual. -#AVRDUDE_ERASE_COUNTER = -y - -# Uncomment the following if you do /not/ wish a verification to be -# performed after programming the device. -#AVRDUDE_NO_VERIFY = -V - -# Increase verbosity level. Please use this when submitting bug -# reports about avrdude. See -# to submit bug reports. -#AVRDUDE_VERBOSE = -v -v - -AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) -AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) -AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) - - - -# --------------------------------------------------------------------------- - -# Define directories, if needed. -DIRAVR = c:/winavr -DIRAVRBIN = $(DIRAVR)/bin -DIRAVRUTILS = $(DIRAVR)/utils/bin -DIRINC = . -DIRLIB = $(DIRAVR)/avr/lib - - -# Define programs and commands. -SHELL = sh -CC = avr-gcc -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -NM = avr-nm -AVRDUDE = avrdude -REMOVE = rm -f -COPY = cp - - - - -# Define Messages -# English -MSG_ERRORS_NONE = Errors: none -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_COFF = Converting to AVR COFF: -MSG_EXTENDED_COFF = Converting to AVR Extended COFF: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_LINKING = Linking: -MSG_COMPILING = Compiling: -MSG_ASSEMBLING = Assembling: -MSG_CLEANING = Cleaning project: - - - - -# Define all object files. -OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) - -# Define all listing files. -LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) - - -# Compiler flags to generate dependency files. -### GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d -GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - - - - -# Default target. -all: begin gccversion sizebefore build sizeafter finished end - -build: elf hex eep lss sym - -elf: $(TARGET).elf -hex: $(TARGET).hex -eep: $(TARGET).eep -lss: $(TARGET).lss -sym: $(TARGET).sym - - - -# Eye candy. -# AVR Studio 3.x does not check make's exit code but relies on -# the following magic strings to be generated by the compile job. -begin: - @echo - @echo $(MSG_BEGIN) - -finished: - @echo $(MSG_ERRORS_NONE) - -end: - @echo $(MSG_END) - @echo - - -# Display size of file. -HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex -ELFSIZE = $(SIZE) -A $(TARGET).elf -sizebefore: - @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi - -sizeafter: - @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi - - - -# Display compiler version information. -gccversion : - @$(CC) --version - - - -# Program the device. -program: $(TARGET).hex $(TARGET).eep - $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) - - - - -# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. -COFFCONVERT=$(OBJCOPY) --debugging \ ---change-section-address .data-0x800000 \ ---change-section-address .bss-0x800000 \ ---change-section-address .noinit-0x800000 \ ---change-section-address .eeprom-0x810000 - - -coff: $(TARGET).elf - @echo - @echo $(MSG_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-avr $< $(TARGET).cof - - -extcoff: $(TARGET).elf - @echo - @echo $(MSG_EXTENDED_COFF) $(TARGET).cof - $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof - - - -# Create final output files (.hex, .eep) from ELF output file. -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ - -%.eep: %.elf - @echo - @echo $(MSG_EEPROM) $@ - -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ - -# Create extended listing file from ELF output file. -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -S $< > $@ - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - - - -# Link: create ELF output file from object files. -.SECONDARY : $(TARGET).elf -.PRECIOUS : $(OBJ) -%.elf: $(OBJ) - @echo - @echo $(MSG_LINKING) $@ - $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) - - -# Compile: create object files from C source files. -%.o : %.c - @echo - @echo $(MSG_COMPILING) $< - $(CC) -c $(ALL_CFLAGS) $< -o $@ - - -# Compile: create assembler files from C source files. -%.s : %.c - $(CC) -S $(ALL_CFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. -%.o : %.S - @echo - @echo $(MSG_ASSEMBLING) $< - $(CC) -c $(ALL_ASFLAGS) $< -o $@ - - - -# Target: clean project. -clean: begin clean_list finished end - -clean_list : - @echo - @echo $(MSG_CLEANING) - $(REMOVE) $(TARGET).hex - $(REMOVE) $(TARGET).eep - $(REMOVE) $(TARGET).obj - $(REMOVE) $(TARGET).cof - $(REMOVE) $(TARGET).elf - $(REMOVE) $(TARGET).map - $(REMOVE) $(TARGET).obj - $(REMOVE) $(TARGET).a90 - $(REMOVE) $(TARGET).sym - $(REMOVE) $(TARGET).lnk - $(REMOVE) $(TARGET).lss - $(REMOVE) $(OBJ) - $(REMOVE) $(LST) - $(REMOVE) $(SRC:.c=.s) - $(REMOVE) $(SRC:.c=.d) - $(REMOVE) .dep/* - - - -# Include the dependency files. --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - - -# Listing of phony targets. -.PHONY : all begin finish end sizebefore sizeafter gccversion \ -build elf hex eep lss sym coff extcoff \ -clean clean_list program - -download: - avrdude -p m128 -c avrispv2 -P usb -U flash:w:main.hex - -download_can: - avrdude -p c128 -c avrispv2 -P usb -U flash:w:main.hex - -fuse: - avrdude -p m128 -c avrispv2 -P usb -U lfuse:w:0xe0:m - avrdude -p m128 -c avrispv2 -P usb -U efuse:w:0xff:m - avrdude -p m128 -c avrispv2 -P usb -U hfuse:w:0xdd:m - -fuse_can: - avrdude -p c128 -c avrispv2 -B 10 -P usb -U lfuse:w:0xe0:m - avrdude -p c128 -c avrispv2 -B 10 -P usb -U efuse:w:0xff:m - avrdude -p c128 -c avrispv2 -B 10 -P usb -U hfuse:w:0xdd:m - -usbprog: - avrdude -p c128 -c avrispv2 -P usb -U flash:w:main.hex + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + +# Target file name (without extension). +TARGET = main + + +# List C source files here. (C dependencies are automatically generated.) +#SRC = $(TARGET).c uart.c usbn2mc/main/usbn960x.c usbn2mc.c usbn2mc/main/usbnapi.c + +SRC = $(TARGET).c wait.c uart.c ../usbn2mc/main/usbn960x.c usbn2mc.c ../usbn2mc/main/usbnapi.c common.c fifo.c io.c adc.c i2c.c spi.c 93c46.c pwm.c debug.c can.c eeprom.c pin.c + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + +# Debugging format. +# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. +# AVR (extended) COFF requires stabs, plus an avr-objcopy run. +DEBUG = stabs +#DEBUG = dwarf-2 + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +EXTRAINCDIRS = + + +# Compiler flag to set the C Standard level. +# c89 - "ANSI" C +# gnu89 - c89 plus GCC extensions +# c99 - ISO C99 standard (not yet fully implemented) +# gnu99 - c99 plus GCC extensions +CSTANDARD = -std=gnu99 + +# Place -D or -U options here +CDEFS = + +# Place -I options here +CINCS = + + +# Compiler flags. +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) $(CINCS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +CFLAGS += -Wall -Wstrict-prototypes +#CFLAGS += -Wall +CFLAGS += -Wa,-adhlns=$(<:.c=.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) +CFLAGS += -DF_OSC=$(F_OSC) + + + +# Assembler flags. +# -Wa,...: tell GCC to pass this to the assembler. +# -ahlms: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs +ASFLAGS += -DF_OSC=$(F_OSC) + + +#Additional libraries. + +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +PRINTF_LIB = + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +SCANF_LIB = + +MATH_LIB = -lm + +# External memory options + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + +# Linker flags. +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) + + + + +# Programming support using avrdude. Settings and variables. + +# Programming hardware: alf avr910 avrisp bascom bsd +# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 +# +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = stk500 + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = com1 # programmer connected to serial device + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + + + +# --------------------------------------------------------------------------- + +# Define directories, if needed. +DIRAVR = c:/winavr +DIRAVRBIN = $(DIRAVR)/bin +DIRAVRUTILS = $(DIRAVR)/utils/bin +DIRINC = . +DIRLIB = $(DIRAVR)/avr/lib + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +COPY = cp + + + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: + + + + +# Define all object files. +OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) + +# Define all listing files. +LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) + + +# Compiler flags to generate dependency files. +### GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d +GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +all: begin gccversion sizebefore build sizeafter finished end + +build: elf hex eep lss sym + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +finished: + @echo $(MSG_ERRORS_NONE) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) -A $(TARGET).elf +sizebefore: + @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi + +sizeafter: + @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT=$(OBJCOPY) --debugging \ +--change-section-address .data-0x800000 \ +--change-section-address .bss-0x800000 \ +--change-section-address .noinit-0x800000 \ +--change-section-address .eeprom-0x810000 + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + + +# Target: clean project. +clean: begin clean_list finished end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).obj + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).obj + $(REMOVE) $(TARGET).a90 + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lnk + $(REMOVE) $(TARGET).lss + $(REMOVE) $(OBJ) + $(REMOVE) $(LST) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) .dep/* + + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff \ +clean clean_list program + +download_old: + avrdude -p m128 -c avrispv2 -P usb -U flash:w:main.hex + +download: + avrdude -p c128 -c avrispv2 -P usb -U flash:w:main.hex -B 1 + +fuse_old: + avrdude -p m128 -c avrispv2 -P usb -U lfuse:w:0xe0:m + avrdude -p m128 -c avrispv2 -P usb -U efuse:w:0xff:m + avrdude -p m128 -c avrispv2 -P usb -U hfuse:w:0xdd:m + +fuse: + avrdude -p c128 -c avrispv2 -B 10 -P usb -U lfuse:w:0xe0:m + avrdude -p c128 -c avrispv2 -B 10 -P usb -U efuse:w:0xff:m + avrdude -p c128 -c avrispv2 -B 10 -P usb -U hfuse:w:0xdd:m + +usbprog: + avrdude -p c128 -c avrispv2 -P usb -U flash:w:main.hex diff --git a/firmware/adc.c b/firmware/adc.c index a9449b7..915dbce 100644 --- a/firmware/adc.c +++ b/firmware/adc.c @@ -37,19 +37,27 @@ #include "protocol.h" #include "adc.h" +#include +#include "debug.h" + + void adc_parser(char *buf) { + //debugf("adc parser CMD %02x\n",buf[0]); switch(buf[0]) { case CMD_ADC_INIT_PIN: - adc_init_usb((int)buf[2]); - break; + adc_init_usb(buf[2]); + break; + case CMD_ADC_DEINIT_PIN: + adc_deinit_usb(buf[2]); + break; case CMD_ADC_GET: - adc_get_usb((int)buf[2]); - break; + adc_get_usb(buf[2]); + break; case CMD_ADC_REF: - adc_ref_usb((int)buf[2]); - break; + adc_ref_usb(buf[2]); + break; default: answer[0]=buf[0]; @@ -59,42 +67,49 @@ void adc_parser(char *buf) } } -int adc_init(int pin) +int adc_init(uint8_t pin) { - if (pin >= 33 && pin <= 40) - { - octopus.ports[pin] = PIN_AD; - - switch(pin) - { - case 40: break; - case 39: break; - case 38: break; - case 37: break; - case 36: break; - case 35: break; - case 34: break; - case 33: break; - default: - return RSP_IMPOSSIBLE_PIN_CONFIG; - } - return RSP_OK; - } - return RSP_UNKOWN_PIN; + if (pin >= 10 && pin <= 17) + { + octopus.ports[pin] = PIN_AD; + ADMUX |= (1< 0 + // 39 => 1 + // 38 => 2 + // pin => 40-pin + *value =_adc_read_channel(17 - pin); + debugf("Wert %i\r\n",*value); + return RSP_OK; + } + else + return RSP_WRONG_PIN_CONFIG; } -void adc_ref_usb(int ref) +void adc_ref_usb(uint8_t ref) { answer[0]=CMD_ADC_REF; answer[1]=adc_ref(ref); - CommandAnswer(2); + answer[2]=0; + CommandAnswer(3); } -int adc_ref(int ref) +int adc_ref(uint8_t ref) { - ADMUX = 0x00; - - switch(ref){ - case PARAM_ADC_AREF: break; - case PARAM_ADC_AVCC: ADMUX |= (1< + * All rights reserved. + * + * Short descripton of file: + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the FH Augsburg nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES{} LOSS OF USE, + * DATA, OR PROFITS{} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef __AVR_AT90CAN128__ + +#include "common.h" +#include "protocol.h" +#include "can.h" + +#include +#include +#include +#include +#include + +struct { + uint32_t id; + int8_t data[8]; +} message; + +int8_t iemob[15] = { + IEMOB0, IEMOB1, IEMOB2, IEMOB3, IEMOB4, IEMOB5, IEMOB6, IEMOB7, + IEMOB8, IEMOB9, IEMOB10, IEMOB11, IEMOB12, IEMOB13, IEMOB14 }; + +// extended id +int8_t extended_id; + +void can_parser(uint8_t *buf) +{ + switch(buf[0]) + { + case CMD_CAN_INIT: + can_init_usb((uint8_t)buf[2], (uint8_t)buf[3]); + break; + case CMD_CAN_DEINIT: + can_deinit_usb(); + break; + case CMD_CAN_ENABLE_MOB: + asm("nop"); + uint32_t idm = 0; + uint32_t id = 0; + + id = ((uint32_t)buf[4]) + + ((uint32_t)buf[5] << 8) + + ((uint32_t)buf[6] << 16) + + ((uint32_t)buf[7] << 24); + + idm = ((uint32_t)buf[8]) + + ((uint32_t)buf[9] << 8) + + ((uint32_t)buf[10] << 16) + + ((uint32_t)buf[11] << 24); + + // mob, mode, id, idm + can_enable_mob_usb(buf[2], buf[3], id, idm); + break; + case CMD_CAN_DISABLE_MOB: + can_disable_mob_usb((uint8_t)buf[2]); + break; + case CMD_CAN_SEND_DATA: + can_send_data_usb(buf[2], buf[3], &buf[4]); + break; + case CMD_CAN_SEND_REMOTE: + can_send_remote_usb(buf[2]); + break; + case CMD_CAN_RECEIVE_DATA: + can_receive_data_usb(buf[2]); + break; + case CMD_CAN_SET_AUTOREPLY: + can_set_autoreply_usb(buf[2], buf[3], &buf[4]); + break; + default: + answer[0] = buf[0]; + answer[1] = RSP_UNKOWN_CMD; + answer[2] = 0; + CommandAnswer(3); + } +} + +void can_init_usb(uint8_t baudrate, uint8_t eid) +{ + answer[0] = CMD_CAN_INIT; + answer[1] = (uint8_t)can_init(baudrate, CAN_INTERRUPTS_RX, eid); + answer[2] = 0; + + CommandAnswer(3); +} + +// Message Objects zuruecksetzen, CAN-Controller aktivieren +// Parameter: +// uint8_t baud: 0,1,2...5 (fuer 100, 125, 200, 250, 500, 1000) +// uint8_t intmode: Ereignis, bei dem ein Interrupt ausgelöst werden soll +// - NONE - Deaktiviert +// - TX - Daten gesendet +// - RX - Daten empfangen +// - TXRX - Daten gesendet und/oder empfangen +int can_init(uint8_t baudrate, uint8_t intmode, uint8_t eid) +{ + uint8_t i; + + octopus.ports[17] = PIN_CAN; + octopus.ports[18] = PIN_CAN; + + extended_id = eid ? 1 : 0; + + message.id = 0; + for(i = 0; i < 8; i++) + message.data[i] = 0; + + // Status- und Steuerregister aller Message Objects initialisieren + for(i = 0; i < NO_MOBS; i++) + { + can_get_mob(i); + CANSTMOB = 0; + CANCDMOB = 0; + } + + // set baudrate + if(can_set_baudrate(baudrate) == 0) + return RSP_ERROR; + + if(can_set_interrupt(intmode) == 0) + return RSP_ERROR; + + // CAN-Controller in Enabled Mode setzen + setbit(CANGCON, ENASTB); + + // Warten bis der CAN-Controller das Enabled-Bit gesetzt hat und + // einsatzbereit ist + while (!getbit(CANGSTA, ENFG)); + + return RSP_OK; +} + +void can_deinit_usb(void) +{ + answer[0] = CMD_CAN_DEINIT; + answer[1] = (int8_t)can_deinit(); + answer[2] = 0; + + CommandAnswer(3); +} + +int can_deinit(void) +{ + uint8_t i; + + octopus.ports[17] = PIN_NONE; + octopus.ports[18] = PIN_NONE; + + for(i = 0; i < 15; i++) + can_disable_mob(i); + + // CAN-Controller ausschalten + clearbit(CANGCON, ENASTB); + + // warten bis wirklich ausgechaltet + while (getbit(CANGSTA, ENFG)); + + return RSP_OK; +} + +void can_set_autoreply(uint8_t mob, uint8_t length, uint8_t *buf) +{ + can_get_mob(mob); + can_set_mode(CAN_MODE_AUTO_REPLY); + can_set_data(length, buf); +} + +void can_set_autoreply_usb(uint8_t mob, uint8_t length, uint8_t *buf) +{ + can_set_autoreply(mob, length, buf); + + answer[0] = CMD_CAN_SET_AUTOREPLY; + answer[1] = RSP_OK; + answer[2] = 0; + + CommandAnswer(3); +} + +int can_set_baudrate(uint8_t baudrate) +{ + // @16 MHz + switch(baudrate) + { + case CAN_BAUDRATE_100K: + CANBT1 = 0x12; + CANBT2 = 0x0c; + CANBT3 = 0x37; + break; + + case CAN_BAUDRATE_125K: + CANBT1 = 0x0e; + CANBT2 = 0x0c; + CANBT3 = 0x37; + break; + + case CAN_BAUDRATE_200K: + CANBT1 = 0x08; + CANBT2 = 0x0c; + CANBT3 = 0x37; + break; + + case CAN_BAUDRATE_250K: + CANBT1 = 0x06; + CANBT2 = 0x0c; + CANBT3 = 0x37; + break; + + case CAN_BAUDRATE_500K: + CANBT1 = 0x02; + CANBT2 = 0x0c; + CANBT3 = 0x37; + break; + + case CAN_BAUDRATE_1000K: + CANBT1 = 0x00; + CANBT2 = 0x0c; + CANBT3 = 0x37; + break; + + default: + return 0; + } + + return 1; +} + +void can_enable_mob_usb(uint8_t mob, uint8_t mode, uint32_t id, uint32_t idm) +{ + answer[0] = CMD_CAN_ENABLE_MOB; + answer[1] = (int8_t)can_enable_mob(mob, mode, id, idm); + answer[2] = 0; + + CommandAnswer(3); +} + + +// Parameter: +// uint8_t mob: Nummer des zu wählenden Objekts (0-14) +// +// uint8_t mode +// - Betriebsart des Message Objekts: +// - DISABLED Deaktiviert +// - TRANSMIT_DATA Daten senden +// - TRANSMIT_REMOTE Anfrage senden +// - RECEIVE_DATA Empfangsmodus +// - AUTO_REPLY automatischer Antwortmodus +// +// Funktion setzt die Betriebsart des vorher gewählten Objekts +int can_enable_mob(uint8_t mob, uint8_t mode, uint32_t id, uint32_t idm) +{ + // Objekt wählen + can_get_mob(mob); + + // Interrupt für dieses Objekt aktivieren + can_set_mob_interrupt(mob); + + // ID-Maske setzen + can_set_id_mask(idm); + + // ID setzen + can_set_id(id); + + // Betriebsmodus setzen + if(can_set_mode(mode) == 0) + return RSP_ERROR; + + return RSP_OK; +} + + +void can_send_data_usb(uint8_t mob, uint8_t length, uint8_t *data) +{ + answer[0] = CMD_CAN_SEND_DATA; + answer[1] = (int8_t)can_send_data(mob, length, data); + answer[2] = 0; + + CommandAnswer(3); +} + +int can_send_data(uint8_t mob, uint8_t length, uint8_t * data) +{ + uint8_t mode; + + // Objekt wählen + can_get_mob(mob); + + // Aktuelle Betriebsart sichern + mode = can_get_mode(); + + // Nutzdaten in Register schreiben + can_set_data(length, data); + + // Datenübertragung starten + can_set_mode(CAN_MODE_TRANSMIT_DATA); + + // Warten bis die Datenübertragung beendet ist (TXOK-Flag von CAN-Controller + // gesetzt) + while (!getbit(CANSTMOB, TXOK)); + + // TXOK-Flag von Hand löschen + clearbit(CANSTMOB, TXOK); + + // Alte Betriebsart wiederherstellen + can_set_mode(mode); + + return RSP_OK; +} + + +// Parameter: uint8_t mode: Ereignis, bei dem Interrupt ausgelöst werden soll +// - NONE - Deaktiviert +// - TX - Daten gesendet +// - RX - Daten empfangen +// - TXRX - Daten gesendet und/oder empfangen +int can_set_interrupt(uint8_t mode) +{ + switch(mode) + { + case CAN_INTERRUPTS_NONE: + clearbit(CANGIE, ENIT); + clearbit(CANGIE, ENRX); + clearbit(CANGIE, ENTX); + break; + + case CAN_INTERRUPTS_TX: + setbit(CANGIE, ENIT); + clearbit(CANGIE, ENRX); + setbit(CANGIE, ENTX); + break; + + case CAN_INTERRUPTS_RX: + setbit(CANGIE, ENIT); + setbit(CANGIE, ENRX); + clearbit(CANGIE, ENTX); + break; + + case CAN_INTERRUPTS_TXRX: + setbit(CANGIE, ENIT); + setbit(CANGIE, ENRX); + setbit(CANGIE, ENTX); + break; + + default: + return 0; + } + + return 1; +} + + +// Funktion wählt CANPAGE des betreffenden Objekts aus und stellt Zugang zu +// Registern des Objekts her +void can_get_mob(uint8_t mob) +{ + CANPAGE = (mob << 4); +} + + +// Parameter: uint32_t idm: ID-Maske in Dezimalschreibweise +// Funktion setzt ID-Maske eines Objekts auf einen neuen Wert. In CANIDM4 +// bleiben dabei die Werte der unteren 3 Bit (RTRTAG, Reserved und IDEMSK) +// erhalten. +void can_set_id_mask(uint32_t idm) +{ + //Standart identifier (11 bit) + if(!extended_id) + { + CANIDM2 = (uint8_t)(idm << 5); + CANIDM1 = (uint8_t)(idm >> 3); + } + //extended identifier + else + { + idm <<= 3; + idm |= 7; + + CANIDM4 = (int8_t) (idm); + CANIDM3 = (int8_t) (idm>>8); + CANIDM2 = (int8_t) (idm>>16); + CANIDM1 = (int8_t) (idm>>24); + } +} + +// Funktion holt ID der empfangenen Nachricht +uint32_t can_get_id(void) +{ + uint32_t id = 0; + + //Standart identifier (11 bit) + if(!extended_id) + { + id = (uint8_t) CANIDT2 >> 5; + id |= (uint16_t) CANIDT1 << 3; + } + //extended identifier + else + { + id |= ((uint32_t) CANIDT1 << 24); + id |= ((uint32_t) CANIDT2 << 16); + id |= ((uint32_t) CANIDT3 << 8); + id |= (CANIDT4&0xF8); + id >>= 3; + } + + return id; +} + +// Funktion setzt ID eines Objekts auf einen neuen Wert. In CANIDM4 bleiben +// dabei die Werte der unteren 3 Bit (RTRTAG, RB1TAG und RB0TAG) erhalten. +void can_set_id(uint32_t id) +{ + //Standart identifier (11 bit) + if(!extended_id) + { + CANIDT2 = (uint8_t)(id << 5); + CANIDT1 = (uint8_t)(id >> 3); + } + //extended identifier + else + { + id <<= 3; + id &= 0xfffffff8; + id |= (CANIDT4 & 0x07); + + CANIDT4 = (int8_t) (id); + CANIDT3 = (int8_t) (id>>8); + CANIDT2 = (int8_t) (id>>16); + CANIDT1 = (int8_t) (id>>24); + } +} + + +// Funktion setzt die Betriebsart des vorher gewählten Objekts. +// Parameter: uint8_t mode: +// - Betriebsart des Message Objekts: +// - DISABLED - Deaktiviert +// - TRANSMIT_DATA - Daten senden +// - TRANSMIT_REMOTE - Anfrage senden +// - RECEIVE_DATA - Empfangsmodus +// - AUTO_REPLY - automatischer Antwortmodus +int can_set_mode(uint8_t mode) +{ + if(extended_id) + setbit(CANCDMOB, IDE); + else + clearbit(CANCDMOB, IDE); + + switch(mode) + { + case CAN_MODE_DISABLED: + clearbit(CANCDMOB, CONMOB0); + clearbit(CANCDMOB, CONMOB1); + clearbit(CANCDMOB, RPLV); + clearbit(CANIDT4, RTRTAG); + clearbit(CANIDM4, RTRMSK); + break; + + case CAN_MODE_TRANSMIT_DATA: + CANCDMOB &= ~(1 << CONMOB1 || 1 << CONMOB0 || 1 << RPLV); + CANCDMOB |= (1 << CONMOB0 || 0 << CONMOB1); + clearbit(CANIDT4, RTRTAG); + break; + + case CAN_MODE_TRANSMIT_REMOTE: + clearbit(CANCDMOB, CONMOB1); + setbit(CANCDMOB, CONMOB0); + clearbit(CANCDMOB, RPLV); + setbit(CANIDT4, RTRTAG); + break; + + case CAN_MODE_RECEIVE_DATA: + clearbit(CANCDMOB, CONMOB0); + setbit(CANCDMOB, CONMOB1); + clearbit(CANCDMOB, RPLV); + clearbit(CANIDT4, RTRTAG); + break; + + case CAN_MODE_AUTO_REPLY: + clearbit(CANCDMOB, CONMOB0); + setbit(CANCDMOB, CONMOB1); + setbit(CANCDMOB, RPLV); + setbit(CANIDT4, RTRTAG); + break; + + default: + return 0; + } + + return 1; +} + + +// Funktion holt die Betriebsart des vorher gewaehlten Objekts +uint8_t can_get_mode(void) +{ + uint8_t mode = 0; + + if(!getbit(CANCDMOB, CONMOB1) && !getbit(CANCDMOB, CONMOB0)) + { + mode = CAN_MODE_DISABLED; + } + else if(!getbit(CANCDMOB, CONMOB1) && getbit(CANCDMOB, CONMOB0) && + !getbit(CANIDT4, RTRTAG)) + { + mode = CAN_MODE_TRANSMIT_DATA; + } + else if(!getbit(CANCDMOB, CONMOB1) && getbit(CANCDMOB, CONMOB0) && + getbit(CANIDT4, RTRTAG)) + { + mode = CAN_MODE_TRANSMIT_REMOTE; + } + else if(getbit(CANCDMOB, CONMOB1) && !getbit(CANCDMOB, CONMOB0) && + !getbit(CANIDT4, RTRTAG)) + { + mode = CAN_MODE_RECEIVE_DATA; + } + else if(getbit(CANCDMOB, CONMOB1) && !getbit(CANCDMOB, CONMOB0) && + getbit(CANCDMOB,RPLV) && getbit(CANIDT4, RTRTAG)) + { + mode = CAN_MODE_AUTO_REPLY; + } + + return mode; +} + + +// Funktion schreibt in das Objekt die zu uebermittelnden Daten +void can_set_data(uint8_t length, uint8_t * data) +{ + uint8_t i; + uint8_t cancdmob; + + if(length > 8) + length = 8; + + // Anzahl der Datenbytes in der Nachricht + // scheinbar darf man das CANCDMOB register nicht beliebig oft + // schreiben/lesen, daher speichern wir den wert dazwischen, loeschen die + // entsprechenden bits fuer die laenge und schreiben dann unsere laenge rein + // wie dem auch sei: so funktionierts zumindest, also vorsicht beim aufraeumen ;-) + cancdmob = CANCDMOB; + clearbit(cancdmob, DLC0); + clearbit(cancdmob, DLC1); + clearbit(cancdmob, DLC2); + clearbit(cancdmob, DLC3); + CANCDMOB = (cancdmob | (length << DLC0)); + for(i = 0; i < length; i++) + CANMSG = data[i]; +} + +void can_get_data(int8_t *msg) +{ + uint8_t i; + + for(i = 0; i < 8; i++) + msg[i] = CANMSG; +} + +// Parameter: uint8_t mob: Nummer des Objekts (0-14) +// Funktion setzt den Interrupt für das jeweilige Objekt +void can_set_mob_interrupt(uint8_t mob) +{ + // bugfix von C.H. + // http://www.mikrocontroller.net/topic/98697#1232848 + if (mob < 8) { setbit(CANIE2, iemob[mob]); } + else { setbit(CANIE1, iemob[mob]); } +} + +// Parameter: uint8_t mob: Nummer des Objekts (0-14) +// Funktion löscht den Interrupt für das jeweilige Objekt +void can_clear_mob_interrupt(uint8_t mob) +{ + clearbit(CANIE2, iemob[mob]); +} + +// Rückgabe: uint8_t mob: Nummer des Objekts +// Funktion ermittelt, welches Objekt Interrupt ausgeloest hat +uint8_t can_get_mob_interrupt(void) +{ + uint8_t mob; + uint16_t maske; + maske = CANSIT2 | (CANSIT1 << 8); + + // Wenn alle 32 Bit der Bitmaske 0 sind dann ist ein Fehler aufgetreten + if(maske == 0) + return NOMOB; + + // Die Bitmaske wird so lange nach rechts geschoben, bis Bit0 eine 1 hat. + // Die Anzahl der Schiebeoperatoren gibt somit die Nummer des MOBs zurück + for(mob=0; (maske & 0x01)==0; maske >>= 1, ++mob); + + // Kontrolle: Wenn mob größer als die Anzahl der verfügbaren + // Message Objects ist das Ergebnis falsch + if(mob > 14) + return NOMOB; + + return mob; +} + +void can_disable_mob_usb(uint8_t mob) +{ + answer[0] = CMD_CAN_DISABLE_MOB; + answer[1] = (int8_t)can_disable_mob(mob); + answer[2] = 0; + + CommandAnswer(3); +} + +// Funktion deaktiviert das gewählte Objekt +int can_disable_mob(uint8_t mob) +{ + // Objekt wählen + can_get_mob(mob); + + // Interrupt für dieses Objekt aktivieren + can_clear_mob_interrupt(mob); + + // Betriebsmodus setzen + can_set_mode(CAN_MODE_DISABLED); + + return RSP_OK; +} + + +void can_send_remote_usb(uint8_t mob) +{ + answer[0] = CMD_CAN_SEND_REMOTE; + answer[1] = (int8_t)can_send_remote(mob); + answer[2] = 0; + + CommandAnswer(3); +} + +// Funktion sendet eine Anfrage (Remote Frame) +int can_send_remote(uint8_t mob) +{ + uint8_t mode; + + // Objekt wählen + can_get_mob(mob); + + // Aktuelle Betriebsart sichern + mode = can_get_mode(); + + // Datenübertragung starten + can_set_mode(CAN_MODE_TRANSMIT_REMOTE); + + // Warten bis die Datenübertragung beendet ist (TXOK-Flag von CAN-Controller + // gesetzt) + while (!getbit(CANSTMOB, TXOK)); + + // TXOK-Flag von Hand löschen + clearbit(CANSTMOB, TXOK); + + // Alte Betriebsart wiederherstellen + can_set_mode(mode); + + return RSP_OK; +} + +void can_receive_data_usb(int mob) +{ + uint8_t i; + answer[0] = CMD_CAN_RECEIVE_DATA; + answer[1] = RSP_OK; + + // id + answer[2] = (int8_t) (message.id); + answer[3] = (int8_t) (message.id >> 8); + answer[4] = (int8_t) (message.id >> 16); + answer[5] = (int8_t) (message.id >> 24); + + message.id = 0; + for(i = 0; i < 8; i++) + { + answer[6+i] = message.data[i]; + message.data[i] = 0; + } + answer[14] = 0; + + CommandAnswer(15); +} + +// Interrupt fuer Empfang einer Nachricht +SIGNAL(SIG_CAN_INTERRUPT1) +{ + uint8_t save_canpage; + uint8_t mob; + + // Aktuelle CANPAGE sichern + save_canpage = CANPAGE; + + // Index des MOB ermitteln, der den Interrupt ausgelöst hat + mob = can_get_mob_interrupt(); + + // Falls es kein gültiges MOB war abbrechen + if(mob == NOMOB) + return; + + // Objekt das den Interrupt ausgelöst hat holen + can_get_mob(mob); + + // Id der Nachricht holen + message.id = can_get_id(); + + // Daten des MOBs aus CANMSG auslesen + can_get_data(message.data); + + // Id der Nachricht holen + message.id = can_get_id(); + + // RXOK-Flag löschen + clearbit(CANSTMOB, RXOK); + + // MOB auf Empfang setzen + can_set_mode(CAN_MODE_RECEIVE_DATA); + + // CANPAGE wiederherstellen + CANPAGE = save_canpage; +} + +#endif diff --git a/firmware/can.h b/firmware/can.h new file mode 100644 index 0000000..1bab0ba --- /dev/null +++ b/firmware/can.h @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2007 Marco Glietsch (http://www.mikrocontroller.net/topic/98697) + * Original author: Marco Glietsch + * Modified for octopus by Michael Hartmann + * All rights reserved. + * + * Short descripton of file: + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the FH Augsburg nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES{} LOSS OF USE, + * DATA, OR PROFITS{} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef CAN_H +#define CAN_H + +#include + +#define setbit(ADR,BIT) (ADR |= (1< +#include enum signals {PIN_NONE,PIN_IN,PIN_OUT,PIN_TRI, PIN_AD,PIN_RX,PIN_TX, PIN_SS,PIN_SCK,PIN_MISO,PIN_MOSI, PIN_SCL,PIN_SDA,PIN_PWM, - PIN_UART}; + PIN_UART,PIN_CAN}; +#ifdef __AVR_AT90CAN128__ + #define OCTOPUS_CAN +#endif -#define OCTOPUS_CAN +//#define OCTOPUS_RELAIS -//#define DEBUG +#define DEBUG 1 #define F_CPU 16000000UL #define STATUS_LED_PIN PB7 #define STATUS_LED_PORT PORTB /* red status led */ +#ifndef OCTOPUS_RELAIS #define STATUS_LED_on (STATUS_LED_PORT |= (1 << STATUS_LED_PIN)) #define STATUS_LED_off (STATUS_LED_PORT &= ~(1 << STATUS_LED_PIN)) +#else +#define STATUS_LED_on (1); +#define STATUS_LED_off (1); +#endif volatile struct octopus_t { volatile unsigned char latency_timer; - int ports[45]; + volatile unsigned char status_led; + uint8_t ports[43]; volatile char * msg[20]; volatile int datatogl; volatile unsigned int long_rx_cmd; @@ -71,7 +85,7 @@ volatile struct octopus_t void CommandAnswer(unsigned int length); -void CommandAnswerRest(void); +void CommandAnswerRest (void); void USBCommandRX(char *buf); void USBMessageIn(char *buf); @@ -91,3 +105,4 @@ void common_init(void); void common_hwdesc(void); +#endif //COMMON_H diff --git a/firmware/debug.c b/firmware/debug.c index 539a3e2..5e7a950 100644 --- a/firmware/debug.c +++ b/firmware/debug.c @@ -1,4 +1,7 @@ #include +#include +#include +#include #include #include "uart.h" @@ -8,21 +11,39 @@ #define UART_PORT 0 -void debug_init(void) { +void debug_dummy(char *fmt, ...) {} + +void debug_init() +{ +#ifdef DEBUG +#warning Compiling with debug-support! uart_init(UART_PORT); uart_baudrate(UART_PORT, 25, 0, 0, 0); uart_stopbits(UART_PORT, 1); uart_databits(UART_PORT, 8); uart_parity(UART_PORT, 'N'); + + static FILE mystdout = FDEV_SETUP_STREAM(debug_putchar, NULL, + _FDEV_SETUP_WRITE); + stdout = &mystdout; +#endif } -void debug_deinit(void) { - uart_deinit(UART_PORT); +int debug_putchar(char c, FILE *stream) +{ +#ifdef DEBUG + if (c == '\n') + uart_putchar(UART_PORT, '\r'); + uart_putchar(UART_PORT, c); +#endif + return 1; } -void debug_write(char *buf) { - while(*buf) - uart_putchar(UART_PORT, *buf++); +void debug_deinit(void) +{ +#ifdef DEBUG + uart_deinit(UART_PORT); +#endif } unsigned char debug_AsciiToHex(unsigned char high, unsigned char low) @@ -52,6 +73,7 @@ unsigned char debug_AsciiToHex(unsigned char high, unsigned char low) void debug_SendHex(unsigned char hex) { +#ifdef DEBUG unsigned char high,low; // get highnibble high = hex & 0xF0; @@ -69,4 +91,8 @@ void debug_SendHex(unsigned char hex) uart_putchar(UART_PORT, low+48); else uart_putchar(UART_PORT, low+87); + + //_debug_write("\r\n"); +#endif } + diff --git a/firmware/debug.h b/firmware/debug.h index 8aa15d9..202ef22 100644 --- a/firmware/debug.h +++ b/firmware/debug.h @@ -1,5 +1,12 @@ +#ifdef DEBUG +#define debugf printf("%s,%d: ", __FILE__, __LINE__); printf +#else +#define debugf debug_dummy +#endif + +void debug_dummy(char *fmt, ...); void debug_init(void); +int debug_putchar(char c, FILE *stream); void debug_deinit(void); -void debug_write(char *buf); unsigned char debug_AsciiToHex(unsigned char high, unsigned char low); void debug_SendHex(unsigned char hex); diff --git a/firmware/eeprom.c b/firmware/eeprom.c new file mode 100644 index 0000000..3f0c1a1 --- /dev/null +++ b/firmware/eeprom.c @@ -0,0 +1,119 @@ +#include "common.h" +#include "protocol.h" + +#include +#include +#include +#include +#include + +#include "eeprom.h" +#include "debug.h" + +#define EEPROM_READY() while(EECR & (1 << EEWE)); + +void eeprom_parser(char *buf) +{ + uint16_t addr; + uint16_t length; + + addr = ((uint16_t)buf[2]) + + ((uint16_t)buf[3] << 8); + + length = ((uint16_t)buf[4]) + + ((uint16_t)buf[5] << 8); + + debugf("eeprom_parser: length: %u, addr: %u\n", length, addr); + + switch(buf[0]) + { + case CMD_EEPROM_READ_BYTES: + eeprom_read_bytes_usb(addr, length); + break; + + case CMD_EEPROM_WRITE_BYTES: + eeprom_write_bytes_usb(addr, &buf[6], length); + break; + + default: + answer[0] = buf[0]; + answer[1] = RSP_UNKOWN_CMD; + answer[2] = 0; + CommandAnswer(3); + } +} + + +void eeprom_read_bytes_usb(uint16_t addr, uint16_t length) +{ + answer[0] = CMD_EEPROM_READ_BYTES; + answer[1] = eeprom_read_bytes(addr, (char *)&answer[2], length); + answer[2+length] = 0; + + debugf("read: %s\n", &answer[2]); + + CommandAnswer(3+length); +} + +uint8_t eeprom_read_bytes(uint16_t addr, char * buf, uint16_t length) +{ + uint8_t i; + + if(addr > MAX_ADDR) + return RSP_ERROR; + + // wait for eeprom + EEPROM_READY(); + + for(i = 0; i < length; i++) + { + + buf[i] = eeprom_read_byte((uint8_t*) addr++); + // set addr + //EEAR = addr++; + + //EECR |= (1 << EERE); + + //buf[i] = EEDR; + //debug_SendHex(buf[i]); + } + + return RSP_OK; +} + +void eeprom_write_bytes_usb(uint16_t addr, char * buf, uint16_t length) +{ + answer[0] = CMD_EEPROM_WRITE_BYTES; + answer[1] = eeprom_write_bytes(addr, buf, length); + answer[2] = 0; + + debugf("written: %s\n", buf); + + CommandAnswer(3); +} + +uint8_t eeprom_write_bytes(uint16_t addr, char * buf, uint16_t length) +{ + uint8_t i; + + if(addr > MAX_ADDR) + return RSP_ERROR; + + // wait for eeprom + EEPROM_READY(); + + for(i = 0; i < length; i++) + { + eeprom_write_byte ((uint8_t*) addr++, buf[i]); + + //EEAR = addr++; + //EEDR = buf[i]; + + //EECR |= (1 << EEMWE); + //EECR |= (1 << EEWE); + } + + eeprom_read_bytes(addr, buf, length); + + return RSP_OK; +} diff --git a/firmware/eeprom.h b/firmware/eeprom.h new file mode 100644 index 0000000..2ac7d4a --- /dev/null +++ b/firmware/eeprom.h @@ -0,0 +1,11 @@ +#include +#include + +#define MAX_ADDR 4095 + +void eeprom_parser(char *buf); + +void eeprom_read_bytes_usb(uint16_t addr, uint16_t length); +uint8_t eeprom_read_bytes(uint16_t addr, char * buf, uint16_t length); +void eeprom_write_bytes_usb(uint16_t addr, char * buf, uint16_t length); +uint8_t eeprom_write_bytes(uint16_t addr, char * buf, uint16_t length); diff --git a/firmware/fifo.c b/firmware/fifo.c index a1e0f87..17551d7 100644 --- a/firmware/fifo.c +++ b/firmware/fifo.c @@ -2,26 +2,26 @@ void fifo_init (fifo_t *f, uint8_t *buffer, const uint8_t size) { - f->count = 0; - f->pread = f->pwrite = buffer; - f->read2end = f->write2end = f->size = size; + f->count = 0; + f->pread = f->pwrite = buffer; + f->read2end = f->write2end = f->size = size; } uint8_t fifo_put (fifo_t *f, const uint8_t data) { - return _inline_fifo_put (f, data); + return _inline_fifo_put (f, data); } uint8_t fifo_get_wait (fifo_t *f) { - while (!f->count); - - return _inline_fifo_get (f); + while (!f->count); + + return _inline_fifo_get (f); } int fifo_get_nowait (fifo_t *f) { - if (!f->count) return -1; - - return (int) _inline_fifo_get (f); + if (!f->count) return -1; + + return (int) _inline_fifo_get (f); } diff --git a/firmware/i2c.c b/firmware/i2c.c index b7d55fe..4baa7bb 100644 --- a/firmware/i2c.c +++ b/firmware/i2c.c @@ -36,9 +36,12 @@ #include "common.h" #include "protocol.h" #include "i2c.h" +#define I2C_WAIT_FOR_COMPLETE() while (!(TWCR & (1< * All rights reserved. * * Short descripton of file: @@ -36,6 +36,8 @@ #include "common.h" #include "protocol.h" #include "io.h" +#include "pin.h" + void io_parser(char *buf) { @@ -77,6 +79,9 @@ void io_parser(char *buf) case CMD_IO_PIN_GET: io_get_pin_usb((uint8_t)buf[2]); break; + case CMD_IO_SET_STATUS_LED: + io_set_status_led_usb((uint8_t)buf[2]); + break; default: answer[0] = buf[0]; answer[1] = RSP_UNKOWN_CMD; @@ -87,12 +92,7 @@ void io_parser(char *buf) uint8_t io_init(uint8_t pin) { - if ((pin >= 1 && pin <= 19) || (pin >= 26 && pin <= 44)) - { - io_set_pin_direction_out(pin); - return RSP_OK; - } - return RSP_UNKOWN_PIN; + return io_set_pin_direction_out(pin); } void io_init_usb(uint8_t pin) @@ -120,16 +120,16 @@ void io_init_port_usb(uint8_t port) uint8_t io_set_port_direction_out(uint8_t port,uint8_t mask) { /* TODO - switch (port) - { - case 1: DDRB = mask; break; + switch (port) + { + case 1: DDRB = mask; break; case 2: DDRC = mask; break; // PC7 = /CS (output) - do we need to mask this ? - case 3: DDRD = mask; break; + case 3: DDRD = mask; break; case 4: DDRE = mask; break; // PE4 = INT4 (input) - do we need to mask this ? - case 5: DDRF = mask; break; - default: return RSP_UNKOWN_PIN; + case 5: DDRF = mask; break; + default: return RSP_UNKOWN_PIN; } - */ + */ return RSP_OK; } @@ -160,6 +160,7 @@ void io_set_port_direction_in_usb(uint8_t port, uint8_t mask) answer[2] = 0; CommandAnswer(3); } + void io_set_port_direction_tri_usb(uint8_t port, uint8_t mask) { answer[0] = CMD_IO_PORT_DIRECTION_TRI; @@ -171,131 +172,41 @@ void io_set_port_direction_tri_usb(uint8_t port, uint8_t mask) uint8_t io_set_pin_direction_out(uint8_t pin) { - if((pin >= 1 && pin <= 19) || (pin >=26 && pin <=44) ) - { - octopus.ports[pin] = PIN_OUT; - - switch(pin) - { - case 1: OX_DDR1 |=(1<= 1 && pin <= 19) || (pin >=26 && pin <=44) ) - { - octopus.ports[pin] = PIN_IN; - switch (pin) - { - case 1: OX_DDR1 &=~(1<= 1 && pin <= 19) || (pin >=26 && pin <=44) ) + if(io_set_pin_direction_out(pin) == RSP_OK && + io_set_pin(pin,1) == RSP_OK) { - octopus.ports[pin] = PIN_TRI; - io_set_pin_direction_out(pin); - io_set_pin(pin,1); - return RSP_OK; - } - else - { - return RSP_UNKOWN_PIN; + octopus.ports[pin] = PIN_TRI; + return RSP_OK; } + else + return RSP_UNKOWN_PIN; } @@ -324,55 +235,58 @@ void io_set_pin_direction_tri_usb(uint8_t pin) } - +//XXX uint8_t io_get_port (uint8_t port, uint8_t *pvalue) { - uint8_t value; - - *pvalue = 0; - switch (port) - { - case 1: value = PINB; break; - case 2: value = PINC; break; /* PC7 = /CS */ - case 3: value = PIND; break; - case 4: value = PINE; break; /* PE4 = INTR */ - case 5: value = PINF; break; - default: return RSP_UNKOWN_PORT; - } - *pvalue = value; - return RSP_OK; + uint8_t value; + + *pvalue = 0; + switch (port) + { + case 1: value = PINB; break; + case 2: value = PINC; break; /* PC7 = /CS */ + case 3: value = PIND; break; + case 4: value = PINE; break; /* PE4 = INTR */ + case 5: value = PINF; break; + default: return RSP_UNKOWN_PORT; + } + + *pvalue = value; + return RSP_OK; } -void io_get_port_usb (uint8_t port) -{ - uint8_t value; +void io_get_port_usb (uint8_t port) +{ + uint8_t value; - answer[0] = CMD_IO_PORT_GET; - answer[1] = (unsigned char)io_get_port (port, &value); - answer[2] = (unsigned char)value; - CommandAnswer(3); + answer[0] = CMD_IO_PORT_GET; + answer[1] = (unsigned char)io_get_port (port, &value); + answer[2] = (unsigned char)value; + answer[3] = 0; + CommandAnswer(4); } +// XXX uint8_t io_set_port(uint8_t port, uint8_t value) { - switch (port) - { - case 1: PORTB = value; break; - case 2: PORTC = value; break; // PC7 = /CS - case 3: PORTD = value; break; - case 4: PORTE = value; break; // PE4 = INTR - case 5: PORTF = value; break; - default: return RSP_UNKOWN_PIN; - } + switch (port) + { + case 1: PORTB = value; break; + case 2: PORTC = value; break; // PC7 = /CS + case 3: PORTD = value; break; + case 4: PORTE = value; break; // PE4 = INTR + case 5: PORTF = value; break; + default: return RSP_UNKOWN_PIN; + } return RSP_OK; } -void io_set_port_usb (uint8_t port, uint8_t value) -{ - answer[0] = CMD_IO_PORT_SET; - answer[1] = (unsigned char)io_set_port (port, value); - answer[2] = 0; - CommandAnswer(3); +void io_set_port_usb (uint8_t port, uint8_t value) +{ + answer[0] = CMD_IO_PORT_SET; + answer[1] = (unsigned char)io_set_port (port, value); + answer[2] = 0; + CommandAnswer(3); } @@ -387,59 +301,20 @@ void io_set_pin_usb(uint8_t pin, uint8_t value) uint8_t io_set_pin(uint8_t pin, uint8_t value) { - if(octopus.ports[pin] == PIN_OUT) - { - switch(pin) - { - case 1: if(value) OX_PORT1 |=(1< #include - -#define OX_PIN1 PINE -#define OX_PIN2 PINE -#define OX_PIN3 PINE -#define OX_PIN4 PINB -#define OX_PIN5 PINB -#define OX_PIN6 PINB -#define OX_PIN7 PINB -#define OX_PIN8 PINB -#define OX_PIN9 PINB -#define OX_PIN10 PINB -#define OX_PIN11 PINB -#define OX_PIN12 PIND -#define OX_PIN13 PIND -#define OX_PIN14 PIND -#define OX_PIN15 PIND -#define OX_PIN16 PIND -#define OX_PIN17 PIND -#define OX_PIN18 PIND -#define OX_PIN19 PIND - -#define OX_PIN26 PINC -#define OX_PIN27 PINC -#define OX_PIN28 PINC -#define OX_PIN29 PINC -#define OX_PIN30 PINC -#define OX_PIN31 PINC -#define OX_PIN32 PINC -#define OX_PIN33 PINF -#define OX_PIN34 PINF -#define OX_PIN35 PINF -#define OX_PIN36 PINF -#define OX_PIN37 PINF -#define OX_PIN38 PINF -#define OX_PIN39 PINF -#define OX_PIN40 PINF -#define OX_PIN41 PINE -#define OX_PIN42 PINE -#define OX_PIN43 PINE -#define OX_PIN44 PINE - -#define OX_PORT1 PORTE -#define OX_PORT2 PORTE -#define OX_PORT3 PORTE -#define OX_PORT4 PORTB -#define OX_PORT5 PORTB -#define OX_PORT6 PORTB -#define OX_PORT7 PORTB -#define OX_PORT8 PORTB -#define OX_PORT9 PORTB -#define OX_PORT10 PORTB -#define OX_PORT11 PORTB -#define OX_PORT12 PORTD -#define OX_PORT13 PORTD -#define OX_PORT14 PORTD -#define OX_PORT15 PORTD -#define OX_PORT16 PORTD -#define OX_PORT17 PORTD -#define OX_PORT18 PORTD -#define OX_PORT19 PORTD - -#define OX_PORT26 PORTC -#define OX_PORT27 PORTC -#define OX_PORT28 PORTC -#define OX_PORT29 PORTC -#define OX_PORT30 PORTC -#define OX_PORT31 PORTC -#define OX_PORT32 PORTC -#define OX_PORT33 PORTF -#define OX_PORT34 PORTF -#define OX_PORT35 PORTF -#define OX_PORT36 PORTF -#define OX_PORT37 PORTF -#define OX_PORT38 PORTF -#define OX_PORT39 PORTF -#define OX_PORT40 PORTF -#define OX_PORT41 PORTE -#define OX_PORT42 PORTE -#define OX_PORT43 PORTE -#define OX_PORT44 PORTE - -#define OX_DDR1 DDRE -#define OX_DDR2 DDRE -#define OX_DDR3 DDRE -#define OX_DDR4 DDRB -#define OX_DDR5 DDRB -#define OX_DDR6 DDRB -#define OX_DDR7 DDRB -#define OX_DDR8 DDRB -#define OX_DDR9 DDRB -#define OX_DDR10 DDRB -#define OX_DDR11 DDRB -#define OX_DDR12 DDRD -#define OX_DDR13 DDRD -#define OX_DDR14 DDRD -#define OX_DDR15 DDRD -#define OX_DDR16 DDRD -#define OX_DDR17 DDRD -#define OX_DDR18 DDRD -#define OX_DDR19 DDRD - -#define OX_DDR26 DDRC -#define OX_DDR27 DDRC -#define OX_DDR28 DDRC -#define OX_DDR29 DDRC -#define OX_DDR30 DDRC -#define OX_DDR31 DDRC -#define OX_DDR32 DDRC -#define OX_DDR33 DDRF -#define OX_DDR34 DDRF -#define OX_DDR35 DDRF -#define OX_DDR36 DDRF -#define OX_DDR37 DDRF -#define OX_DDR38 DDRF -#define OX_DDR39 DDRF -#define OX_DDR40 DDRF -#define OX_DDR41 DDRE -#define OX_DDR42 DDRE -#define OX_DDR43 DDRE -#define OX_DDR44 DDRE - - -#define OX_P1 PE5 -#define OX_P2 PE6 -#define OX_P3 PE7 -#define OX_P4 PB0 -#define OX_P5 PB1 -#define OX_P6 PB2 -#define OX_P7 PB3 -#define OX_P8 PB4 -#define OX_P9 PB5 -#define OX_P10 PB6 -#define OX_P11 PB7 -#define OX_P12 PD0 -#define OX_P13 PD1 -#define OX_P14 PD2 -#define OX_P15 PD3 -#define OX_P16 PD4 -#define OX_P17 PD5 -#define OX_P18 PD6 -#define OX_P19 PD7 - -#define OX_P26 PC0 -#define OX_P27 PC1 -#define OX_P28 PC2 -#define OX_P29 PC3 -#define OX_P30 PC4 -#define OX_P31 PC5 -#define OX_P32 PC6 -#define OX_P33 PF7 -#define OX_P34 PF6 -#define OX_P35 PF5 -#define OX_P36 PF4 -#define OX_P37 PF3 -#define OX_P38 PF2 -#define OX_P39 PF1 -#define OX_P40 PF0 -#define OX_P41 PE0 -#define OX_P42 PE1 -#define OX_P43 PE2 -#define OX_P44 PE3 - - +#ifdef __AVR_AT90CAN128__ + #define OCTOPUS_CAN +#endif void io_parser(char *buf); @@ -240,6 +80,8 @@ void io_set_pin_usb(uint8_t pin, uint8_t value); uint8_t io_get_pin(uint8_t pin, uint8_t *value); void io_get_pin_usb(uint8_t pin); +void io_set_status_led(uint8_t on); +void io_set_status_led_usb(uint8_t on); #define PORT(port,pin) (PORT##port) #define DDR(port,pin) (DDR##port) diff --git a/firmware/main.c b/firmware/main.c index ef802a2..6bd7c32 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -16,19 +16,19 @@ #include "protocol.h" #include "wait.h" -#include "io.h" +#include "93c46.h" #include "adc.h" +#include "can.h" +#include "eeprom.h" #include "i2c.h" -#include "spi.h" +#include "io.h" #include "pwm.h" +#include "spi.h" #include "uart.h" -#include "93c46.h" +#include #include "debug.h" -//#define DEBUG 1 - - SIGNAL (SIG_INTERRUPT4) { @@ -48,185 +48,218 @@ SIGNAL (SIG_OVERFLOW0) } -void -USBCommandRX (char *buf) +void USBCommandRX (char *buf) { int i; -#ifdef DEBUG - debug_write("get \0"); - debug_SendHex(buf[1]); - debug_write("\r\n"); -#endif + debugf("receiving command: %X (length: %u)\n", buf[1]); /* a paket can be max 255 bytes */ if (octopus.long_rx_cmd == 1) - { -#ifdef DEBUG - debug_write("get next\r\n"); -#endif - for (i = 0; i < 64; i++) - request[octopus.long_rx_index + i] = buf[i]; + { + debugf("get next\n"); + + for (i = 0; i < 64; i++) + request[octopus.long_rx_index + i] = buf[i]; - octopus.long_rx_index = octopus.long_rx_index + i; + octopus.long_rx_index = octopus.long_rx_index + i; - if (octopus.long_rx_index >= octopus.long_rx_bytes) - { - octopus.long_rx_cmd = 0; - USBMessageIn (request); - } - } + if (octopus.long_rx_index >= octopus.long_rx_bytes) + { + octopus.long_rx_cmd = 0; + USBMessageIn (request); + } + } else - { -#ifdef DEBUG - debug_write("get and execute\r\n\0"); -#endif - octopus.long_rx_index = 0; - for (i = 0; i < 64; i++) - request[octopus.long_rx_index + i] = buf[i]; - - octopus.long_rx_index = i; - - if ((unsigned int) buf[1] < 64) - { - octopus.long_rx_cmd = 0; - USBMessageIn (request); - } - else - { - octopus.long_rx_cmd = 1; - octopus.long_rx_bytes = (unsigned int) buf[1]; - } - } + { + debugf("get and execute\n"); + + octopus.long_rx_index = 0; + for (i = 0; i < 64; i++) + request[octopus.long_rx_index + i] = buf[i]; + + octopus.long_rx_index = i; + + if ((unsigned int) buf[1] < 64) + { + octopus.long_rx_cmd = 0; + USBMessageIn (request); + } + else + { + octopus.long_rx_cmd = 1; + octopus.long_rx_bytes = (unsigned int) buf[1]; + } + } } /* is called when received data from pc */ -void -USBMessageIn (char *buf) +void USBMessageIn (char *buf) { octopus.long_index = 0; octopus.long_running = 0; - STATUS_LED_on; -#ifdef DEBUG - debug_write("parser\r\n\0"); -#endif + if(octopus.status_led) + STATUS_LED_on; + int check = ((int) buf[0] >> 4) & 0x0F; + debugf("parser, check: %X, command: %X\n", check, buf[0]); + switch (check) - { - case 0: - if (buf[0] == CMD_EXTERNAL_DEVICE) - { - switch (buf[2]) - { - case CMD_EXTERNAL_93C46: - flash_93c46_parser (buf); - break; - default: - ; - } - } - else - common_parser (buf); - break; - case 1: - io_parser (buf); - break; - case 2: - adc_parser (buf); - break; - case 3: - i2c_parser (buf); - break; - case 4: - spi_parser (buf); - break; - case 5: - pwm_parser (buf); - break; - case 6: - uart_parser (buf); - break; - default: - answer[0] = buf[0]; - answer[1] = RSP_UNKOWN_CMD; - answer[2] = 0; - CommandAnswer (3); - } + { + case 0: + if (buf[0] == CMD_EXTERNAL_DEVICE) + { + switch (buf[2]) + { + case CMD_EXTERNAL_93C46: + flash_93c46_parser(buf); + break; + } + } + else + common_parser(buf); + + break; + + case 1: + debugf("calling io_parser\n"); + io_parser (buf); + break; + case 2: + debugf("calling adc_parser\n"); + adc_parser (buf); + break; + case 3: + debugf("calling i2c_parser\n"); + i2c_parser (buf); + break; + case 4: + debugf("calling spi_parser\n"); + spi_parser (buf); + break; + case 5: + debugf("calling pwm_parser\n"); + pwm_parser (buf); + break; + case 6: + debugf("calling adc_parser\n"); + uart_parser (buf); + break; + case 7: +#ifdef OCTOPUS_CAN + debugf("calling can_parser\n"); + can_parser ((uint8_t *)buf); +#else + debugf("can't call can_parser - no CAN-support\n"); +#endif + break; + case 8: + debugf("calling eeprom_parser\n"); + eeprom_parser(buf); + break; + default: + debugf("unknown cmd\n"); + answer[0] = buf[0]; + answer[1] = RSP_UNKOWN_CMD; + answer[2] = 0; + CommandAnswer(3); + } + + if(octopus.status_led) + STATUS_LED_off; +} - STATUS_LED_off; + +unsigned int strlen(volatile unsigned char *str) +{ + unsigned int len = 0; + + while (*str++) + len++; + + return len; } -void -CommandAnswer (unsigned int length) +void CommandAnswer(unsigned int length) { int i; - // if first packet of a lang message + // if first packet of a long message if (length > 64 && octopus.long_running == 0) - { - octopus.long_index = 0; - octopus.long_bytes = length; - octopus.long_running = 1; - length = 64; - } + { + debugf("first packet of a long message (length: %d)\n", length); + octopus.long_index = 0; + octopus.long_bytes = length; + octopus.long_running = 1; + length = 64; + } USBNWrite (FIFOTXC1, FLUSH); for (i = 0; i < length; i++) - USBNWrite (TXD1, answer[octopus.long_index + i]); + USBNWrite (TXD1, answer[octopus.long_index + i]); /* control togl bit */ if (octopus.datatogl == 1) - { - USBNWrite (FIFOTXC1, TX_LAST + TX_EN + TX_TOGL); - octopus.datatogl = 0; - } + { + USBNWrite (FIFOTXC1, TX_LAST + TX_EN + TX_TOGL); + octopus.datatogl = 0; + } else - { - USBNWrite (FIFOTXC1, TX_LAST + TX_EN); - octopus.datatogl = 1; - } + { + USBNWrite (FIFOTXC1, TX_LAST + TX_EN); + octopus.datatogl = 1; + } } -void -CommandAnswerRest (void) +void CommandAnswerRest (void) { if (octopus.long_running == 1) - { - if (octopus.long_index < octopus.long_bytes) - { - int dif = octopus.long_bytes - octopus.long_index; - octopus.long_index = octopus.long_index + 64; - - if (dif > 64) - CommandAnswer (64); - - else - { - /* last packet */ - CommandAnswer (dif); - octopus.long_running = 0; - } - } - } + { + debugf("octopus long running message\n"); + if (octopus.long_index < octopus.long_bytes) + { + debugf("octopus.long_index < octopus.long_bytes\n"); + int diff = octopus.long_bytes - octopus.long_index; + octopus.long_index = octopus.long_index + 64; + + if (diff > 64) + { + debugf("not last packet: diff > 64\n"); + CommandAnswer (64); + } + else + { + debugf("last packet\n"); + /* last packet */ + CommandAnswer (diff); + octopus.long_running = 0; + } + } + } } -int -main (void) +int main(void) { - DDRB = 0xFF; - PORTB = 0xFF; + cli(); + USBNInitMC (); + USBNStartClock(); + + DDRB = 0xFF; + PORTB = 0x00; + + /* use status led */ + octopus.status_led = 1; int interf; int conf; - STATUS_LED_off; USBNInit (); @@ -237,17 +270,19 @@ main (void) USBNDeviceBCDDevice (0x0001); // you can use it as version e.g. version 1.02 char lang[] = { 0x09, 0x04, 0x00 }; - _USBNAddStringDescriptor (lang); // language descriptor + _USBNAddStringDescriptor (lang); // language descriptor /* Attention!!! Descriptors must be a factor of 8 (error in the stack) */ USBNDeviceManufacture ("EmbeddedProjects"); USBNDeviceProduct ("OctopusUSB Interface Converter and I/O Extension"); - USBNDeviceSerialNumber ("20081108"); + //USBNDeviceProduct ("Octopus USB v3.3"); + USBNDeviceSerialNumber ("20090718"); conf = USBNAddConfiguration (); - USBNConfigurationPower (conf, 100); + // we reserve 500mA, because users could drive LEDs and need more power + USBNConfigurationPower (conf, 200); interf = USBNAddInterface (conf, 0); USBNAlternateSetting (conf, interf, 0); @@ -255,33 +290,32 @@ main (void) /* communication */ USBNAddInEndpoint (conf, interf, 1, 0x01, BULK, 64, 0, &CommandAnswerRest); USBNAddOutEndpoint (conf, interf, 1, 0x01, BULK, 64, 0, &USBCommandRX); - - USBNInitMC (); + //USBNAddOutEndpoint (conf, interf, 1, 0x02, BULK, 64, 0, NULL); octopus.datatogl = 0; octopus.long_rx_cmd = 0; - /* start usb chip */ - USBNStart (); - /* UARTInit2(38400,8,'N',1); */ - #ifdef DEBUG - debug_init(); - #endif + debug_init(); /* hello world led pattern */ - DDRC = 0xFF; - PORTC = 0xAA; + DDRC = 0x7F; + PORTC = 0x2A; delay_250ms (); - PORTC = 0xD5; + PORTC = 0x55; delay_250ms (); - PORTC = 0x80; + PORTC = 0x00; - // testpin - //PORTB = 0xFF; - //PORTB = 0x00; + common_init(); - while (1); + /* init connection between avr and usbn9604 */ + USBNInitMC (); + /* start usb chip */ + USBNStart (); + sei(); + + while (1); return 0; } + diff --git a/firmware/main.hex b/firmware/main.hex index 3d38158..d7795f1 100644 --- a/firmware/main.hex +++ b/firmware/main.hex @@ -1,844 +1,1327 @@ -:100000000C94FA000C9417010C9417010C9417012E -:100010000C9417010C9408030C9417010C9417010D -:100020000C9417010C9417010C9417010C941701F0 -:100030000C9475170C9417010C9417010C9417016C -:100040000C9417010C94E1020C9417010C94170105 -:100050000C9417010C9419010C9417010C941701BE -:100060000C9417010C9417010C9417010C941701B0 -:100070000C9417010C9417010C9417010C941701A0 -:100080000C9417010C9417010C9417010C94170190 -:100090000C941701AA0DAC0DAE0DB00DB20DB40D40 -:1000A000B60DB80DBA0DBC0DBE0DC00DC20DC40D00 -:1000B000C60DC80DCA0DCC0DCE0DFC0DFC0DFC0DF2 -:1000C000FC0DFC0DFC0DD00DD20DD40DD60DD80DB0 -:1000D000DA0DDC0DDE0DE00DE20DE40DE60DE80DB0 -:1000E000EA0DEC0DEE0DF00DF20DF60D490E4B0E76 -:1000F0004D0E4F0E510E530E550E570E590E5B0EF0 -:100100005D0E5F0E610E630E650E670E690E6B0E5F -:100110006D0E9B0E9B0E9B0E9B0E9B0E9B0E6F0EF1 -:10012000710E730E750E770E790E7B0E7D0E7F0E9F -:10013000810E830E850E870E890E8B0E8D0E8F0E0F -:10014000910E950E090F0F0F150F1B0F210F270F83 -:100150002D0F330F390F3F0F450F4B0F510F570F17 -:100160005D0F630F690F6F0F750F060F060F060FF8 -:10017000060F060F060F7B0F810F870F8D0F930F52 -:10018000990F9F0FA50FAB0FB10FB70FBD0FC30F87 -:10019000C90FCF0FD50FDB0FE10FE70F37103A1064 -:1001A0003D1040104310461049104C104F10521093 -:1001B000551058105B105E106110641067106A10C3 -:1001C0006D1034103410341034103410341070109A -:1001D0007310761079107C107F10821085108810B3 -:1001E0008B108E109110941097109A109D10A010E3 -:1001F000A310A61011241FBECFEFD0E1DEBFCDBFEC -:1002000011E0A0E0B1E0E2E4F4E300E00BBF02C0E3 -:1002100007900D92A435B107D9F714E0A4E5B1E039 -:1002200001C01D92A93BB107E1F70C9423010C9486 -:1002300000001F920F920FB60F9211240F900FBE65 -:100240000F901F901895CCEFD0E1DEBFCDBF8FEFA0 -:1002500084B985B92F980E94650781E897E10E94CB -:10026000B00785E69CE00E94B50781E090E00E941F -:10027000BA07DE011196EBE4F1E083E001900D9204 -:100280008150E1F7CE0101960E94AF0B80E091E032 -:100290000E944B0C81E191E00E94430C82E491E0CA -:1002A0000E943B0C0E94850B4C0164E670E00E94AA -:1002B000C80760E070E0C4010E94F10A3C0140E020 -:1002C00050E0BC01C4010E94E90720EFA22E21E00A -:1002D000B22ECC24DD2490E4E92EF12C02E021E0C2 -:1002E00030E041E050E0B301C4010E94860A87E794 -:1002F000A82E82E0B82E21E030E041E050E0B301CA -:10030000C4010E94BE0A0E940A071092E1011092E5 -:10031000E0011092E3011092E2010E94790C8FEF4C -:1003200087B98AEA88B90E942C0385ED88B90E94B2 -:100330002C0380E888B9FFCF0F931F93CF93DF93EF -:10034000EC0181349105B0F08091EC019091ED01C8 -:10035000892B81F41092E9011092E801D093EB010E -:10036000C093EA0181E090E09093ED018093EC016D -:10037000C0E4D0E068E08BE20E94500700E010E0AB -:100380000EC0E091E801F091E901E00FF11FEE5C91 -:10039000FC4F608189E20E9450070F5F1F4F0C17CE -:1003A0001D0779F78091E0019091E101019749F4EF -:1003B00067E08BE20E9450071092E1011092E00189 -:1003C0000AC063E08BE20E94500781E090E09093C6 -:1003D000E1018093E001DF91CF911F910F9108958A -:1003E0008091EC019091ED01019771F52091E80168 -:1003F0003091E9018091EA019091EB0128173907CA -:1004000018F52091EA013091EB018091E80190917B -:10041000E901281B390B8091E8019091E901805C8A -:100420009F4F9093E9018093E801213431052CF02E -:1004300080E490E00E949C010895C9010E949C0103 -:100440001092ED011092EC010895FC011092E90167 -:100450001092E8011092ED011092EC0100002F9A29 -:100460002081822F82958F7099278230910511F11A -:10047000833091052CF4009761F0019759F516C06F -:1004800084309105F9F084309105C4F0059711F599 -:100490001DC0263039F48281813039F5CF010E94A8 -:1004A000421723C0CF010E94F30C1FC0CF010E944E -:1004B00084111BC0CF010E94E71217C0CF010E9418 -:1004C0002A1413C0CF010E945C150FC0CF010E94F7 -:1004D00092180BC02093320383E080933303109271 -:1004E000340383E090E00E949C012F980895CF93FD -:1004F000DF93EC018091E2019091E301019751F5C6 -:1005000020E030E0E091E401F091E501E20FF31F1B -:10051000DE01A20FB31F8C91EE50FE4F80832F5F40 -:100520003F4F2034310571F78091E4019091E5014E -:10053000805C9F4F9093E5018093E4012091E4015A -:100540003091E5018091E6019091E7012817390784 -:10055000A8F11FC01092E5011092E40120E030E004 -:10056000E091E401F091E501E20FF31FDE01A20F3B -:10057000B31F8C91EE50FE4F80832F5F3F4F20348E -:10058000310571F73093E5012093E401A981A0348E -:1005900048F41092E3011092E20182EF91E00E9490 -:1005A00025020CC081E090E09093E3018093E2018A -:1005B0008A2F99279093E7018093E601DF91CF91ED -:1005C00008951F920F920FB60F9211242F933F930D -:1005D0004F935F936F937F938F939F93AF93BF934B -:1005E000EF93FF930E94C50C80915D0186BDFF9142 -:1005F000EF91BF91AF919F918F917F916F915F919B -:100600004F913F912F910F900FBE0F901F90189513 -:100610001F920F920FB60F9211242F933F934F9377 -:100620005F936F937F938F939F93AF93BF93EF935A -:10063000FF930E94530CFF91EF91BF91AF919F9157 -:100640008F917F916F915F914F913F912F910F907B -:100650000FBE0F901F90189520E080E49CE9019751 -:10066000F1F72F5F2931C9F70895FF920F931F9378 -:10067000162F042FF22E9C01442737FD4095542F4E -:1006800060E472E48FE090E00E94D0192150304085 -:10069000163061F0173019F0153019F404C0E1E09C -:1006A00003C0E1E004C0E0E070E002C0E0E071E01F -:1006B000053439F00F3419F451E041E004C050E042 -:1006C00001C051E040E082E0F81611F462E001C0A0 -:1006D00060E0832F992787FD9A958093C50020932A -:1006E000C40088E18093C100770FEE0FEE0FE72B77 -:1006F0005295550F507E5E2B4295407F452B660FDD -:10070000660F660F642B6093C2001F910F91FF90DC -:1007100008951092C50089E18093C40088E1809318 -:10072000C10086E08093C20008950895982F8091BB -:10073000C00085FFFCCF9093C60008958091C00053 -:1007400087FFFCCF8091C600992708958A3310F463 -:10075000805301C087556A3310F4605301C0675558 -:100760006F708295807F682B862F99270895FC01F2 -:1007700007C08091C00085FFFCCF31969093C600E2 -:1007800090819923B1F70895982F92959F70282F03 -:100790002F709A3030F48091C00085FFFCCF905DBF -:1007A00005C08091C00085FFFCCF995A9093C60088 -:1007B0002A3030F48091C00085FFFCCF205D05C059 -:1007C0008091C00085FFFCCF295A2093C600089570 -:1007D00087E280939A0485E28093990490E2909353 -:1007E0009B0410929C0428E030E030939E042093F8 -:1007F0009D0483E28093A60481E28093A5049093F4 -:10080000A7041092A8043093AA042093A904089581 -:1008100008956091B20481E20E945007089568E053 -:100820008BE20E94500761E188E20E94500768E075 -:100830008FE20E94500761E18CE20E94500761E064 -:100840008FE20E9450071092E1011092E00165E0F2 -:1008500083E20E94500708950F931F938C0160E478 -:1008600080E20E945007F8016281605884E00E9493 -:100870005007F80182818093B1041F910F91089570 -:100880000F931F93CF93DF93EC01288539851216C0 -:100890001306DCF58E819F81821793071CF568E0B3 -:1008A00083E20E94500700E010E00FC08A859B851C -:1008B000E80FF91F608181E20E9450078E819F81BD -:1008C00001969F838E830F5F1F4FEE81FF81888586 -:1008D0009985083011051CF4E817F9073CF3E8176F -:1008E000F90724F061E087E20E9450078B81813094 -:1008F00031F465E089810E9450071B8206C061E0E7 -:1009000089810E94500781E08B83DF91CF911F91F5 -:100910000F910895CF93DF93CDB7DEB724970FB62D -:10092000F894DEBF0FBECDBFDC01FC012281338114 -:100930001092AC041092AB0481E08093A804832F42 -:1009400099278230D9F0833069F1813009F057C09E -:100950008091850499279093AE048093AD0485E837 -:1009600094E09093B0048093AF04868197818034A3 -:10097000910509F044C088E090E029C0FD0186811E -:1009800097819093AE048093AD04E22FFF27EE0F82 -:10099000FF1F8091970490919804E80FF91F8081C0 -:1009A000918129C02223C1F0E22FFF27EE0FFF1F04 -:1009B0008091F0019091F101E80FF91F0190F08111 -:1009C000E02DF093B004E093AF04808199279093D9 -:1009D000AE048093AD0413C094E0998383E08A83CE -:1009E00089E08B839C8384E090E09093AE048093B5 -:1009F000AD04CE0101969093B0048093AF0485EAD4 -:100A000094E00E94400424960FB6F894DEBF0FBE17 -:100A1000CDBFDF91CF910895CF93DF9382E20E9403 -:100A20002B07C82FDD27C5FF1AC068E083E20E94AC -:100A30005007C6FF10C02091AB043091AC048091E8 -:100A4000AD049091AE04281739072CF485EA94E0A0 -:100A50000E94400404C061E087E20E945007DF91D9 -:100A6000CF9108951F93CF93DF9388E00E942B07C7 -:100A7000182FC82FDD27C6FF18C060E085E00E9450 -:100A8000500760E884E00E94500760E080E20E9426 -:100A9000500768E083E20E94500761E087E20E940D -:100AA000500762E085E00E945007C4FF04C060EC7C -:100AB00089E00E94500717FF04C060ED89E00E94A2 -:100AC0005007DF91CF911F9108958AE00E942B0774 -:100AD000992780FF03C00E940C05089581FF0DC077 -:100AE0008AE20E942B0780917204813061F4E091C8 -:100AF0007504F09176040995089582E30E942B070E -:100B00008AE30E942B0708958EE00E942B0768E07D -:100B10008FE20E94500761E08FE20E94500720910F -:100B2000AD043091AE048091A9049091AA0482177B -:100B300093075CF468E083E20E94500761E087E27B -:100B40000E94500781E08093A8040895AF92BF925D -:100B5000CF92DF92EF92FF920F931F93CF93DF9389 -:100B6000CDB7DEB728970FB6F894DEBF0FBECDBF66 -:100B700086E20E942B0786FF7EC08E010F5F1F4F0B -:100B8000580169E0C62ED12CCC0EDD1E809199044F -:100B90000E942B07F80181938F017501EC15FD056B -:100BA000A9F768E087E20E94500768E083E20E94AC -:100BB000500780E20E942B078F77682F80E20E9407 -:100BC000500789819927807690708032910509F4C9 -:100BD00040C080349105D1F1892BF1F5F501818177 -:100BE0008630D9F0873048F48130F1F18130C8F097 -:100BF0008330D1F1853081F521C0893019F18A30F7 -:100C000018F4883049F505C08A3071F18B3021F530 -:100C100020C0C5010E94090427C0C5010E948A04A2 -:100C200023C068E083E20E94500761E081E20E94F5 -:100C3000500760E081E20E9450070BC0C5010E948E -:100C40002C0412C0C5010E940F040EC0C5010E94F1 -:100C5000080765E083E206C080E20E942B07805807 -:100C6000682F80E20E945007F70180818823D1F429 -:100C700065E083E215C02091AD043091AE0480910F -:100C8000A9049091AA048217930764F41092AE0409 -:100C90001092AD0468E083E20E94500761E087E2B1 -:100CA0000E94500728960FB6F894DEBF0FBECDBF46 -:100CB000DF91CF911F910F91FF90EF90DF90CF9038 -:100CC000BF90AF900895CF92DF92EF92FF920F9373 -:100CD0001F93CF93DF93CDB7DEB7C054D0400FB68C -:100CE000F894DEBF0FBECDBF8CE00E942B07992782 -:100CF00080FF03C00E94A6057BC081FF2AC08EE250 -:100D00000E942B078DE20E942B0789838E010F5FC3 -:100D10001F4F6801FFE3EF2EF12CE00EF11E0F5F75 -:100D20001F4F0E941907F80180830E151F05B9F7A0 -:100D300080915401813031F4E0915701F0915801D4 -:100D4000C601099568E08FE20E94500761E08FE2DA -:100D50002BC082FF2CC086E30E942B0785E30E94F4 -:100D60002B0789838E010F5F1F4F6801EFE3EE2E83 -:100D7000F12CE00EF11E0F5F1F4F0E941907F801C2 -:100D800080830E151F05B9F780915501813031F42C -:100D9000E0915901F0915A01C601099568E087E395 -:100DA0000E94500761E087E30E94500721C083FF43 -:100DB0001FC08EE30E942B078E010F5F1F4F68013B -:100DC00071E4E72EF12CEC0EFD1E8DE30E942B0743 -:100DD000F80181938F01EE15FF05B9F78091560157 -:100DE000813031F4E0915701F0915801C601099525 -:100DF000C05CDF4F0FB6F894DEBF0FBECDBFDF91F2 -:100E0000CF911F910F91FF90EF90DF90CF900895B9 -:100E10000895089581E080936A0080E18DBB83B3DB -:100E2000876083BB84B3836084BB3F9A479A78947E -:100E3000089588B1805888B984B322E0822784BBA2 -:100E40000000000080B198B1905898B994B39227EF -:100E500094BB992708959FEF91B982B988B18058C2 -:100E600088B984B395E0892784BB88B1805888B954 -:100E700084B3892784BB000011B80E941907992701 -:100E8000089582B988B1805888B984B391E08927E0 -:100E900084BB88B1805888B984B3892784BB0895FE -:100EA00082B98FEF81B988B1805888B984B395E051 -:100EB000892784BB88B1805888B984B3892784BBCB -:100EC000862F0E9441070895089582E1809385044A -:100ED00081E08093860480E191E090938804809380 -:100EE00087041092890410928A0410928B0488E07F -:100EF00080938C0410928E0410928D0410929004B2 -:100F000010928F0410929204109291041092930404 -:100F10001092940410929504109296041092540129 -:100F2000109255011092560110927204109273049F -:100F30001092740410927C0410927B041092EF01C2 -:100F40001092EE01089590938E0480938D04709317 -:100F5000900460938F0450939204409391040895F9 -:100F600090938E0480938D040895909390048093C1 -:100F70008F04089590939204809391040895809330 -:100F80008904089580938A04089580938B040895BA -:100F9000CF93DF939C01CB01E0917B04F0917C0423 -:100FA00062E070E00E94BD190FC0A081B181828112 -:100FB000823039F4ED018D8199278217930709F466 -:100FC00068870780F085E02D309779F7DF91CF9122 -:100FD0000895CF93DF939C01E0917B04F0917C0412 -:100FE00014C0A081B1818281843061F48481992709 -:100FF0008217930739F4868199278617970711F48A -:10100000ED014B830780F085E02D309751F7DF919C -:10101000CF910895BF92CF92DF92EF92FF920F93FC -:101020001F93CF93DF936C01162FF42EB22EC09135 -:101030007B04D0917C042097A1F489E090E00E9489 -:10104000C418FC0190937C0480937B04D182C082FD -:10105000138310861782F282B4820583E68215C05C -:10106000EC018F8198850097D9F789E090E00E9484 -:10107000C418FC0198878F83D182C0821383F282C7 -:10108000B4820583E68210861782DF91CF911F918B -:101090000F91FF90EF90DF90CF90BF900895EF9267 -:1010A000FF921F93CF93DF937C01C091EE01D0910B -:1010B000EF01209711F011E012C085E090E00E944E -:1010C000C418FC019093EF018093EE01F182E0825D -:1010D00012821482138210E012C01F5FEC018B8118 -:1010E0009C810097D1F785E090E00E94C418FC0134 -:1010F0009C838B83F182E082128314821382812F7E -:101100009927DF91CF911F91FF90EF900895EF9273 -:10111000FF920F931F93CF93DF93E091EE01F09135 -:10112000EF0180E090E00380F481E02D019630979C -:10113000D1F7880F991F0E94C4189093F1018093F2 -:10114000F0010091EE011091EF01E801E880F980D3 -:101150008A81C82FDD27CC0FDD1F8091F00190918F -:10116000F101C80FD91FF701808199270E94C41887 -:101170009983888320E030E017C0E801EA81FF27E7 -:10118000EE0FFF1F8091F0019091F101E80FF91F20 -:101190000190F081E02DE20FF31FD701A20FB31FE2 -:1011A0008C9180832F5F3F4FF7018081992728170B -:1011B00039071CF3E8018B819C81009711F08C01A9 -:1011C000C4CFDF91CF911F910F91FF90EF900895C1 -:1011D0004F925F926F927F928F929F92AF92BF9247 -:1011E000CF92DF92EF92FF920F931F93CF93DF93F3 -:1011F000E0917B04F0917C046624772409C082810D -:10120000823019F40894611C711C0780F085E02D70 -:101210003097A9F74301880C991CC4010E94C41897 -:101220009093980480939704E1E0EE2EF12CAA2489 -:10123000BB2455C0E0917B04F0917C0479E0C72E7B -:10124000D12C15C0A081B181848199278E159F056D -:1012500019F48381C80ED11CED018D818E1521F406 -:101260008281823009F45D010780F085E02D30979E -:1012700049F7009197041091980402501040080D0E -:10128000191DC6010E94C418F8019183808320E0D3 -:1012900030E0E0919704F0919804E80DF91D329741 -:1012A0000190F081E02DE20FF31FD501A20FB31FD3 -:1012B0008C9180832F5F3F4F2930310551F7E091AA -:1012C0009704F0919804E80DF91D32970190F08190 -:1012D000E02D8C2D875F82830894E11CF11C6E1435 -:1012E0007F040CF0A7CF61E0C62ED12C59E0A52ECB -:1012F000B12C4424552442E0842E912CA1C0A0910D -:101300007B04B0917C0412C0ED91FC911197818116 -:10131000823049F4858199278C159D0521F48481BB -:10132000482E552405C0ED01AF81B885109761F7AF -:1013300031E0E32EF12C79C060917B0470917C0444 -:101340006DC0FB01C081D1818981843009F063C007 -:10135000868199278E159F0509F05DC084819927A4 -:101360008C159D0509F057C0950140E050E0E091D3 -:101370009704F0919804E80DF91D32970190F081DF -:10138000E02DE20FF31FDE01A40FB51F8C918083C7 -:101390002F5F3F4F4F5F5F4F4930510541F789E065 -:1013A00090E0A80EB91EC0917B04D0917C0431C09E -:1013B0008A81853059F58C8199278C159D0531F5E9 -:1013C0008D8199278E159F0509F508811981950151 -:1013D00040E050E0E0919704F0919804E80DF91D89 -:1013E00032970190F081E02DE20FF31FD801A40F96 -:1013F000B51F8C9180832F5F3F4F4F5F5F4F47300A -:10140000510541F7E7E0F0E0AE0EBF1E0F80D88532 -:10141000C02D209769F6EB016F8178856115710504 -:1014200009F08FCF0894E11CF11C4E145F040CF0FE -:1014300083CF0894C11CD11CE2E0F0E08E0E9F1E09 -:101440006C147D040CF05BCFDF91CF911F910F9155 -:10145000FF90EF90DF90CF90BF90AF909F908F90D4 -:101460007F906F905F904F9008956F927F928F92D0 -:101470009F92AF92BF92CF92DF92EF92FF920F9323 -:10148000CF93DF935C013B014901E0917B04F09134 -:101490007C0416C0A081B18184819927A816B90661 -:1014A00061F4868199278615970539F48281843005 -:1014B00021F4ED018C818F5F8C830780F085E02D16 -:1014C000309741F787E090E00E94C418FC0187E064 -:1014D000808385E0818382820383F582E482C682F1 -:1014E000EE24062D2A2D45E067E0CF010E940A0870 -:1014F000DF91CF910F91FF90EF90DF90CF90BF9051 -:10150000AF909F908F907F906F900895AF92BF9211 -:10151000CF92DF92EF92FF920F93FC01A114B104DE -:1015200001F14230510571F04330510599F04130DD -:101530005105B9F481E080937204B0927604A092D0 -:1015400075040FC081E080937304B0927804A09278 -:10155000770407C081E080937404B0927A04A0926B -:10156000790420583F4FCF010E94350A0F91FF9018 -:10157000EF90DF90CF90BF90AF900895AF92BF9261 -:10158000CF92DF92EF92FF920F93FC014230510510 -:1015900071F04330510599F041305105B9F481E0C3 -:1015A00080935401B0925801A09257010FC081E07E -:1015B00080935501B0925A01A092590107C081E071 -:1015C00080935601B0925C01A0925B01CF010E9412 -:1015D000350A0F91FF90EF90DF90CF90BF90AF90C2 -:1015E0000895CF92DF92EF920F931F93CF93DF93E3 -:1015F0006C018B01A0917B04B0917C04C0E0D0E031 -:1016000014C02D913C911197F90185818C1551F4ED -:10161000FD018281823031F4F90184818F5F8483FE -:10162000C82FDD27FD01A781B085109751F789E00C -:1016300090E00E94C418FC0189E0808384E08183EB -:101640000283138214821582168217821086EC2E72 -:1016500000E02C2D44E069E0CF010E940A08CE0191 -:10166000DF91CF911F910F91EF90DF90CF90089570 -:10167000BF92CF92DF92EF92FF920F931F93CF937F -:10168000DF936C017B01142FB22EA0917B04B091EB -:101690007C04C0E0D0E014C02D913C911197F90179 -:1016A00085818C1551F4FD018281823031F4F9017C -:1016B00084818F5F8483C82FDD27FD01A781B085DA -:1016C000109751F789E090E00E94C418FC0189E06E -:1016D000808384E08183E282138214821583B68240 -:1016E00007831086EC2E00E02C2D44E069E0CF014A -:1016F0000E940A08CE01DF91CF911F910F91FF90B8 -:10170000EF90DF90CF90BF900895EF920F931F93CB -:10171000109196041F5F1093960489E090E00E9458 -:10172000C418FC0189E0808389E090E09383828380 -:1017300082E0818314821583168280EA87838AE19E -:101740008087EE2400E020E042E069E0CF010E94C3 -:101750000A08812F99271F910F91EF900895CF9339 -:10176000DF93EC01FC0101900020E9F7E81BF90B85 -:10177000CF01880F991F0E94C4189C01FE0101909F -:101780000020E9F7EC1BFD0BEE0FFF1FDC01EC93D3 -:1017900083E0F901818340E050E009C0FE01E40FDD -:1017A000F51F80818C93FD0111824F5F5F4F129670 -:1017B000FE0101900020E9F73197EC1BFD0B4E175D -:1017C0005F0760F3C9010E944F089927DF91CF910D -:1017D0000895EF92FF920F931F93CF93DF938C01A5 -:1017E0007B01CA010E94AF0B9C01E0917B04F09148 -:1017F0007C0414C0A081B1818281843061F4848131 -:1018000099278017910739F4868199278E159F05AE -:1018100011F4ED0128870780F085E02D309751F70E -:10182000DF91CF911F910F91FF90EF9008950F934B -:101830001F93CF93DF938C01CB010E94AF0B9C01D0 -:10184000E0917B04F0917C040FC0A081B181828182 -:10185000823039F4ED018D8199278017910709F4C1 -:101860002E830780F085E02D309779F7DF91CF91B7 -:101870001F910F9108950E94AF0B1816190614F4CA -:101880008093950408950E94AF0B1816190614F45E -:101890008093940408950E94AF0B1816190614F44F -:1018A0008093930408951F9386E00E942B07992745 -:1018B00086FF03C00E9463060EC082FF03C00E9421 -:1018C000650509C081FF03C00E94320504C084FF82 -:1018D00002C00E94840587E00E942B07182F60E059 -:1018E00087E00E945007612F87E00E9450071F91F8 -:1018F00008950E94E8080E9487080E94E80361E0BA -:1019000080E00E94500780E00E942B0780FDFBCF03 -:1019100062E081E00E94500760E884E00E94500786 -:1019200060E480E20E94500768E083E20E94500772 -:1019300069E087E20E9450076FE08DE00E94500747 -:101940006FE08BE00E94500768ED89E00E9450072D -:1019500063E38FE00E94500766ED87E00E94500726 -:1019600062E085E00E9450076CEC80E00E94500726 -:1019700008958EEC80935D0181E080936E008091EC -:101980005D0186BD83E084BD08950895089583E0D8 -:101990008093320381E0809333038BE080933403A0 -:1019A0002FE62093350393E69093360384E78093E4 -:1019B0003703209338039093390381E680933A03E9 -:1019C0008EE680933B038FE580933C0380E3809316 -:1019D0003D0381E380933E0310923F038EE090E04D -:1019E0000E949C010895FC018081833011F40E94C3 -:1019F000C70C0895CF93DF93C1E0D0E08C2F0E94F5 -:101A00000B0E2196C431D105C9F7CAE1D0E08C2F65 -:101A10000E940B0E2196CD32D105C9F7DF91CF91EF -:101A20000895CF93DF93DC01EC01EA81FB812191E2 -:101A30008E81815019F48981E81BF109ED01FB8346 -:101A4000EA838E839FB7F8948C9181508C939FBFCB -:101A5000822F9927DF91CF910895FC011082758321 -:101A60006483738362834183478346830895CF935E -:101A7000DF93DC019C91ED018981981718F080E0DB -:101A800090E016C0ED01EC81FD8161938F81815062 -:101A900019F48981E81BF109ED018F83FD83EC8343 -:101AA0009FB7F8948C918F5F8C939FBF81E090E0FB -:101AB000DF91CF910895FC0180818823E9F3CF0164 -:101AC0000E94110D99270895FC018081882319F443 -:101AD0008FEF9FEF0895CF010E94110D9927089570 -:101AE00081E090E0089581E090E0089581E090E049 -:101AF000089581E090E00895CF93DF93CDB7DEB7EE -:101B000022970FB6F894DEBF0FBECDBF282F8150AD -:101B1000833120F08951833108F06EC0E22FFF2716 -:101B2000EE0FFF1FE35AFE4F82E090E09283818325 -:101B3000822F9927AA27BB27FC013197EC32F105A8 -:101B400008F05AC0E65BFF4FEE0FFF1F0590F491BF -:101B5000E02D09946D9A47C06E9A49C06F9A43C0B0 -:101B6000209A45C0219A3FC0229A41C0239A3BC087 -:101B7000249A3DC0259A37C0269A39C0279A33C087 -:101B8000509A35C0519A2FC0529A31C0539A2BC0E7 -:101B9000549A2DC0559A27C0569A29C0579A23C0E7 -:101BA000389A25C0399A1FC03A9A21C03B9A1BC067 -:101BB0003C9A1DC03D9A17C03E9A19C0879A13C01F -:101BC000869A15C0859A0FC0849A11C0839A0BC05B -:101BD000829A0DC0819A07C0809A09C0689A03C092 -:101BE000699A05C06A9A81E090E008C06B9AE1E0CA -:101BF000F0E0FA83E98304C084E090E09A8389836B -:101C000089819A8122960FB6F894DEBF0FBECDBFB0 -:101C1000DF91CF910895982F8150833130F0895111 -:101C2000833118F084E090E00895892F0E947C0DA4 -:101C300081E090E00895CF93DF93CDB7DEB7229790 -:101C40000FB6F894DEBF0FBECDBF282F8150833171 -:101C500020F08951833108F06EC0E22FFF27EE0F8C -:101C6000FF1FE35AFE4F81E090E092838183822F31 -:101C70009927AA27BB27FC013197EC32F10508F020 -:101C80005AC0EA58FF4FEE0FFF1F0590F491E02D68 -:101C900009946D9847C06E9849C06F9843C02098CA -:101CA00045C021983FC0229841C023983BC024984A -:101CB0003DC0259837C0269839C0279833C0509822 -:101CC00035C051982FC0529831C053982BC05498AA -:101CD0002DC0559827C0569829C0579823C03898CA -:101CE00025C039981FC03A9821C03B981BC03C982A -:101CF0001DC03D9817C03E9819C0879813C086989C -:101D000015C085980FC0849811C083980BC0829825 -:101D10000DC0819807C0809809C0689803C0699871 -:101D200005C06A9881E090E008C06B98E1E0F0E0BF -:101D3000FA83E98304C084E090E09A8389838981EF -:101D40009A8122960FB6F894DEBF0FBECDBFDF9109 -:101D5000CF910895FB011082833091F0843028F4F4 -:101D6000813051F0823029F409C0843059F0853037 -:101D700059F085E090E0089583B107C086B105C0B1 -:101D800089B103C08CB101C08FB1808381E090E044 -:101D90000895833091F0843028F4813051F08230FE -:101DA00029F409C0843059F0853069F084E090E06E -:101DB000089565B905C068B903C06BB901C06EB9B3 -:101DC00081E090E0089561BB81E090E00895282FC4 -:101DD000E82FFF27EE0FFF1FE35AFE4F818192810C -:101DE000029719F086E090E00895822F9927AA279C -:101DF000BB27FC013197EC32F10540F4EE55FF4F63 -:101E0000EE0FFF1F0590F491E02D099484E090E01F -:101E10000895662311F0759ADDC07598DBC06623BE -:101E200011F0769AD7C07698D5C0662311F0779ACC -:101E3000D1C07798CFC0662311F0289ACBC02898DC -:101E4000C9C0662311F0299AC5C02998C3C066236A -:101E500011F02A9ABFC02A98BDC0662311F02B9AB0 -:101E6000B9C02B98B7C0662311F02C9AB3C02C9838 -:101E7000B1C0662311F02D9AADC02D98ABC066237A -:101E800011F02E9AA7C02E98A5C0662311F02F9AA4 -:101E9000A1C02F989FC0662311F0589A9BC05898F4 -:101EA00099C0662311F0599A95C0599893C066233A -:101EB00011F05A9A8FC05A988DC0662311F05B9A20 -:101EC00089C05B9887C0662311F05C9A83C05C98D8 -:101ED00081C0662311F05D9A7DC05D987BC066234A -:101EE00011F05E9A77C05E9875C0662311F05F9A14 -:101EF00071C05F986FC0662311F0409A6BC0409824 -:101F000069C0662311F0419A65C0419863C0662399 -:101F100011F0429A5FC042985DC0662311F0439A67 -:101F200059C0439857C0662311F0449A53C044984F -:101F300051C0662311F0459A4DC045984BC06623A9 -:101F400011F0469A47C0469845C0662311F08F9A13 -:101F500041C08F983FC0662311F08E9A3BC08E9887 -:101F600039C0662311F08D9A35C08D9833C0662331 -:101F700011F08C9A2FC08C982DC0662311F08B9A8B -:101F800029C08B9827C0662311F08A9A23C08A98AB -:101F900021C0662311F0899A1DC089981BC0662351 -:101FA00011F0889A17C0889815C0662311F0709AAE -:101FB00011C070980FC0662311F0719A0BC0719810 -:101FC00009C0662311F0729A05C0729803C0662397 -:101FD00021F0739A81E090E00895739881E090E099 -:101FE00008951F93182F8150833130F08951833128 -:101FF00018F084E090E013C0E12FFF27EE0FFF1FE1 -:10200000E35AFE4F83E090E092838183812F0E9408 -:102010007C0D61E0812F0E94E70E81E090E01F912E -:102020000895CF93DF93282FEB011882E82FFF2725 -:10203000EE0FFF1FE35AFE4F81819281019719F045 -:1020400086E090E089C0822F9927AA27BB27FC0150 -:102050003197EC32F10540F4E253FF4FEE0FFF1FD2 -:102060000590F491E02D099484E090E075C0659BA3 -:1020700071C06EC0669B6EC06BC0679B6BC068C052 -:10208000189B68C065C0199B65C062C01A9B62C07E -:102090005FC01B9B5FC05CC01C9B5CC059C01D9B8C -:1020A00059C056C01E9B56C053C01F9B53C050C042 -:1020B000489B50C04DC0499B4DC04AC04A9B4AC036 -:1020C00047C04B9B47C044C04C9B44C041C04D9B44 -:1020D00041C03EC04E9B3EC03BC04F9B3BC038C042 -:1020E000309B38C035C0319B35C032C0329B32C0C6 -:1020F0002FC0339B2FC02CC0349B2CC029C0359BD4 -:1021000029C026C0369B26C023C07F9B23C020C089 -:102110007E9B20C01DC07D9B1DC01AC07C9B1AC029 -:1021200017C07B9B17C014C07A9B14C011C0799B49 -:1021300011C00EC0789B0EC00BC0609B0BC008C0C6 -:10214000619B08C005C0629B05C002C0639B02C0C2 -:1021500081E0888381E090E0DF91CF910895CF9373 -:10216000DF93CDB7DEB721970FB6F894DEBF0FBE71 -:10217000CDBF9BE190933203BE016F5F7F4F0E9402 -:1021800011108093330389818093340383E090E0BE -:102190000E949C0121960FB6F894DEBF0FBECDBF02 -:1021A000DF91CF9108959AE1909332030E94E70E58 -:1021B000809333031092340383E090E00E949C01EB -:1021C000089598E1909332030E94C90E80933303DF -:1021D0001092340383E090E00E949C010895982FB0 -:1021E00089E180933203933099F0943028F4913050 -:1021F00059F0923029F40AC0943061F0953061F0C2 -:1022000085E090E020E00BC023B107C026B105C0F7 -:1022100029B103C02CB101C02FB181E090E08093BF -:1022200033032093340383E090E00E949C010895DF -:1022300097E1909332030E94F10F80933303109241 -:10224000340383E090E00E949C01089595E190930F -:1022500032030E941B0E809333031092340383E0F9 -:1022600090E00E949C01089596E1909332030E94B1 -:102270007C0D809333031092340383E090E00E943E -:102280009C01089584E18093320381E080933303BD -:102290001092340383E090E00E949C01089582E153 -:1022A0008093320381E0809333031092340383E000 -:1022B00090E00E949C01089583E18093320381E0C5 -:1022C000809333031092340383E090E00E949C01DA -:1022D000089580E18093320381E08093330310926C -:1022E000340383E090E00E949C01089591E1909373 -:1022F00032030E940B0E809333031092340383E069 -:1023000090E00E949C010895FC0180818531C9F113 -:10231000863180F4823131F1833130F48031D1F073 -:10232000813109F04CC01AC0833109F1843109F0C0 -:1023300046C022C0883189F1893128F4863129F1DB -:102340008731E9F526C08A3189F18A3158F18B311C -:10235000B1F531C082810E946911089582810E9485 -:1023600076110895638182810E944F1108956381DF -:1023700082810E945C110895638182810E944211D2 -:10238000089582810E942611089582810E9434114D -:10239000089582810E9418110895638182810E94AC -:1023A000E110089582810E94EF1008956381828177 -:1023B0000E94D310089582810E94AF1008958093E7 -:1023C000320383E0809333031092340383E090E080 -:1023D0000E949C010895FC018197089718F084E001 -:1023E00090E00895EE0FFF1FE35AFE4F84E090E067 -:1023F0009283818381E090E0089510927C00823086 -:10240000910541F08330910569F0019741F082E038 -:1024100090E0089580917C00806480937C0081E04E -:1024200090E0089580917C00806C80937C0081E036 -:1024300090E0089593E890937A0090917C00907FCB -:10244000982B90937C0080917A00806480937A002E -:1024500080917A0086FDFCCF809178009091790080 -:1024600020E030E040E050E080917A00806480938A -:102470007A0080917A0086FDFCCF8091780090915F -:102480007900480F591F2F5F3F4F2430310561F706 -:1024900080917A008F7780937A00CA01969587950C -:1024A000969587950895CF93DF939C01EB01198250 -:1024B0001882FC01EE0FFF1FE35AFE4F81819281CB -:1024C000049719F086E090E03CC02432310541F1D8 -:1024D0002532310554F42232310541F123323105E0 -:1024E00014F52132310569F424C02632310591F00A -:1024F0002632310594F02732310549F02832310572 -:1025000019F087E090E01DC080E090E014C081E009 -:1025100090E011C082E090E00EC083E090E00BC03C -:1025200084E090E008C085E090E005C086E090E09F -:1025300002C087E090E00E941A129983888381E0AC -:1025400090E0DF91CF91089522E2209332030E9420 -:10255000FD118093330382E090E00E949C01089576 -:10256000CF93DF93CDB7DEB722970FB6F894DEBFD7 -:102570000FBECDBF21E220933203BE016F5F7F4FBC -:102580000E9453128093330329813A81832F992724 -:10259000809334032093350384E090E00E949C01F3 -:1025A00022960FB6F894DEBF0FBECDBFDF91CF915C -:1025B000089520E2209332030E94EB1180933303AD -:1025C0001092340383E090E00E949C010895FC0186 -:1025D0008081813249F0823261F0803279F48281E7 -:1025E00099270E94D9120895828199270E94B012DA -:1025F0000895828199270E94A4120895809332033E -:1026000083E0809333031092340383E090E00E94D0 -:102610009C0108958091B9009927887F9070089552 -:102620008091BC0087FFFCCF0895ECEBF0E0808147 -:10263000846080838BE090E09093770180937601B3 -:102640008CE090E0909379018093780181E090E0B4 -:102650000895ECEBF0E080818B7F808382E090E056 -:10266000909377018093760190937901809378011C -:1026700081E090E008958130910511F48CE00BC069 -:102680008230910511F488E106C0039719F082E0C9 -:1026900090E0089588E48093B8008091B9008C7F21 -:1026A0008093B9008091B9008093B90081E090E0F7 -:1026B00008958091B90084EA8093BC008091BC00A9 -:1026C00087FFFCCF81E090E0089584E98093BC000F -:1026D00081E090E008958093BB0084E88093BC0083 -:1026E0008091BC0087FFFCCF80E090E0089584E8F3 -:1026F0008093BC008091BC0087FFFCCF8091BB0021 -:102700009927089585E38093320381E08093330312 -:102710008093340384E88093BC008091BC0087FFE1 -:10272000FCCF8091BB008093350385E090E00E9450 -:102730009C01089540E050E00FC0F901E40FF51F3F -:1027400080818093BB0084E88093BC008091BC00B2 -:1027500087FFFCCF4F5F5F4F4617570774F384E343 -:102760008093320381E0809333031092340383E03B -:1027700090E00E949C01089587E38093320384E9EE -:102780008093BC0081E0809333031092340383E094 -:1027900090E00E949C01089586E38093320380912B -:1027A000B90084EA8093BC008091BC0087FFFCCF15 -:1027B00081E0809333031092340383E090E00E9421 -:1027C0009C01089522E3209332030E943B138093DF -:1027D00033031092340383E090E00E949C0108953B -:1027E00081E380933203ECEBF0E080818B7F808388 -:1027F00082E090E090937701809376019093790145 -:102800008093780181E0809333031092340383E056 -:1028100090E00E949C01089580E380933203ECEBEA -:10282000F0E08081846080838BE090E0909377017A -:10283000809376018CE090E0909379018093780109 -:1028400081E0809333031092340383E090E00E9490 -:102850009C010895FC0180818433D9F0853338F4DC -:10286000813379F0823381F0803389F507C0863374 -:1028700041F18633D8F0873351F526C00E940C14FD -:1028800008950E94F0130895828199270E94E2130F -:102890000895428155276181772764507040838174 -:1028A00034969F0199270E949A13089542815527D3 -:1028B0006181772764507040838199270E94821339 -:1028C00008950E94CC1308950E94BC13089580932C -:1028D000320383E0809333031092340383E090E06B -:1028E0000E949C01089585B1817F85B9239886E077 -:1028F00084B91CBC1DBC83E58CBD88E090E090933E -:102900006901809368018AE090E090936B01809365 -:102910006A0189E090E090936D0180936C0181E001 -:1029200090E008951CBC1DBC82E090E0909369018A -:102930008093680190936B0180936A0190936D017D -:1029400080936C0181E090E00895089581E090E02B -:102950000895AC0120E030E00AC0FA01E20FF31F55 -:1029600080818EBD0DB407FEFDCF2F5F3F4F261730 -:1029700037079CF381E090E00895DC0120E030E02F -:1029800040E050E015C01EBC09C04F5F5F4F83E0C0 -:10299000493E58071CF088E090E008950DB407FE0A -:1029A000F4CFFD01E20FF31F8EB580832F5F3F4F01 -:1029B0002617370744F381E090E00895CF93DF9323 -:1029C000EC0120E030E0A0E0B0E018C0FE01E20F32 -:1029D000F31F80818EBD08C0119683E0A93EB80721 -:1029E0001CF088E090E00FC00DB407FEF5CFFB01AE -:1029F000E20FF31F8EB580832F5F3F4F24173507FB -:102A00002CF381E090E0DF91CF9108950F931F9315 -:102A10008B0123E420933203AB0164E373E00E9453 -:102A2000DE148093330310923403C80102960E948F -:102A30009C011F910F9108950F931F938C0184E4C3 -:102A400080933203B80184E393E00E94BD14809325 -:102A5000330310923403C80102960E949C011F9117 -:102A60000F91089523E4209332030E94A9148093C8 -:102A700033031092340383E090E00E949C01089598 -:102A800081E4809332030E94921480933303109266 -:102A9000340383E090E00E949C01089580E48093D9 -:102AA00032030E947314809333031092350383E042 -:102AB00090E00E949C010895CF93DF93EC01888100 -:102AC0008334A1F0843438F4813469F0823458F5C9 -:102AD0008034F1F405C0843481F08534C9F411C028 -:102AE0000E944E1520C00E9440151DC069817727A5 -:102AF000CE0102960E94321516C0898199270E9444 -:102B00001C1569817727CE0102960E9406150BC01D -:102B10008093320383E0809333031092340383E085 -:102B200090E00E949C01DF91CF910895209A219A14 -:102B3000229A2398249A259A2C982D9882E090E046 -:102B40009093850180938401909383018093820107 -:102B5000909381018093800181E090E090937F01C8 -:102B600080937E01089582E090E0909369018093C4 -:102B7000680190936B0180936A0190936D0180933B -:102B80006C0181E090E00895289829982A9880E2C5 -:102B90009EE40197F1F7289A8AE0982F9A95F1F729 -:102BA0002A9A299A8A95F1F70895282F299887FD5E -:102BB00002C02A9801C02A9A8AE0982F9A95F1F7C4 -:102BC000299A8A95F1F7299826FF02C02A9A01C00E -:102BD0002A988AE0982F9A95F1F7299A8A95F1F721 -:102BE0000895282F220F30E0299827FF02C02A9A43 -:102BF00001C02A988AE0982F9A95F1F7299A8A9528 -:102C0000F1F73F5F373011F0220FEECF0895282FF4 -:102C100030E0299827FF02C02A9A01C02A988AE04A -:102C2000982F9A95F1F7299A8A95F1F73F5F3830F6 -:102C300011F0220FEECF089529982A988AE0982F54 -:102C40009A95F1F7299A982F9A95F1F7299828984B -:102C5000982F9A95F1F7299A982F9A95F1F7299834 -:102C60008A95F1F7289A80E090E0089529982898AD -:102C70002A982B9A08950E94C41580E30E94D515C6 -:102C800080E60E94F11508950E94C41580E00E941C -:102C9000D51580E00E94F1150E94361608950F9315 -:102CA0001F93182F062F0E94C41580E40E94D5158B -:102CB000812F0E94F115802F0E94071681E090E07D -:102CC0001F910F9108951F93182F0E94C41580EC37 -:102CD0000E94D515812F0E94F1150E941C1699277C -:102CE0001F91089529988AE08A95F1F72A9830E093 -:102CF00090E0990F299A2AE0822F8A95F1F7299876 -:102D00001B999F5F822F8A95F1F73F5F383089F7D3 -:102D10002898299A822F8A95F1F7289A29982A9536 -:102D2000F1F7892F992708951F93182F0E94C41532 -:102D300080E80E94D515812F0E94F1150E9472161D -:102D400099271F910895DF92EF92FF920F931F939F -:102D5000CF93DF93D82E7B018A01C0E0D0E009C079 -:102D60008D2D8C0F0E949416F801EC0FFD1F8083AF -:102D70002196CE15DF05A1F781E090E0DF91CF919C -:102D80001F910F91FF90EF90DF9008950F931F9385 -:102D9000082F162F0E943B16612F802F0E944F167E -:102DA00081E090E01F910F910895DF92EF92FF92E2 -:102DB0000F931F93CF93DF93D82E7B018A01C0E03E -:102DC000D0E009C0F801EC0FFD1F60818D2D8C0F44 -:102DD0000E94C6162196CE15DF05A1F781E090E08E -:102DE000DF91CF911F910F91FF90EF90DF900895A9 -:102DF00094E0909332030E94D5168093330310928F -:102E0000340383E090E00E949C0108950F931F9388 -:102E10008B0193E09093320344E353E00E94A316A6 -:102E200080933303C80102960E949C011F910F9169 -:102E3000089582E08093320382E090E090936901EC -:102E40008093680190936B0180936A0190936D0168 -:102E500080936C0181E0809333031092340383E00C -:102E600090E00E949C01089581E0809332030E94CB -:102E70009615809333031092340383E090E00E9410 -:102E80009C010895FC018381823069F0833018F43D -:102E90008130F1F405C0833049F08430C9F40FC0AB -:102EA0000E94341708950E9419170895AF014A5FD0 -:102EB0005F4F6581772784810E9406170895AF01CF -:102EC0004A5F5F4F6581772784810E94F8160895D5 -:102ED00080818093320383E0809333031092340324 -:102EE00083E090E00E949C0108951F920F920FB61C -:102EF0000F9211240F900FBE0F901F9018959C01F8 -:102F00000897029718F084E090E00895F901EE0F19 -:102F1000FF1FE35AFE4F8DE090E0928381832830BB -:102F20003105B1F02930310519F087E090E00895BE -:102F3000259A81E090E0909389008093880081E851 -:102F40008093800089E08093810081E090E0089583 -:102F5000249A81E08093B30089E68093B00081E0F9 -:102F600090E008959C01FC01EE0FFF1FE35AFE4F15 -:102F7000818192810D9719F086E090E008952830C4 -:102F8000310539F12930310519F087E090E00895D5 -:102F900063307105B1F06430710544F4613071053E -:102FA00061F06230710509F040C009C064307105FC -:102FB00051F065307105C9F508C081E007C082E0B5 -:102FC00005C083E003C084E001C085E080938100F8 -:102FD00029C064307105E9F06530710554F4623040 -:102FE000710599F06330710594F461307105E9F46D -:102FF0000AC06630710589F06630710564F067308B -:10300000710599F40CC089E60BC08AE609C08BE60D -:1030100007C08CE605C08DE603C08EE601C08FE6D2 -:103020008093B00081E090E0089581E090E0089501 -:103030009C01FC01EE0FFF1FE35AFE4F818192813C -:103040000D9719F086E090E008952830310569F079 -:103050002930310519F087E090E0089570938900D8 -:103060006093880081E090E008956093B30081E070 -:1030700090E0089523E5209332030E94181880936E -:1030800033031092340383E090E00E949C01089582 -:1030900022E5209332030E94B217809333031092EB -:1030A000340383E090E00E949C01089520E5209382 -:1030B00032030E947F17809333031092340383E01E -:1030C00090E00E949C0108959C01FC01EE0FFF1FFF -:1030D000E35AFE4F82E090E09283818328303105ED -:1030E00031F02930310531F086E090E008951092FA -:1030F000B00004C01092810010928000822F0E94C4 -:103100007C0D81E090E0089521E5209332030E9438 -:103110006418809333031092340383E090E00E949C -:103120009C010895FC018081813579F0823518F485 -:103130008035F1F405C0823569F08335C9F411C0DA -:10314000828199270E9456180895828199270E94AA -:103150008418089563817727828199270E944818EF -:10316000089563817727828199270E943A180895EC -:103170008093320383E0809333031092340383E01F -:1031800090E00E949C010895CF93DF93AC010297D9 -:1031900010F442E050E0A091B704B091B804FD01F2 -:1031A000C0E0D0E020E030E020C080819181841731 -:1031B000950769F482819381209719F09B838A8314 -:1031C00004C09093B8048093B704CF0132C048176D -:1031D000590738F42115310519F08217930708F4BF -:1031E0009C01EF010280F381E02D3097F1F621156B -:1031F000310589F1C901841B950B049708F4A901D5 -:10320000E0E0F0E026C08D919C9111978217930722 -:10321000E9F44817590779F4ED018A819B813097C9 -:1032200019F09383828304C09093B8048093B70409 -:10323000CD01029649C0841B950BFD01E80FF91FD3 -:103240004193519302978D939C933AC0FD01A281C3 -:10325000B3811097C1F68091B5049091B604892B83 -:1032600041F480915001909151019093B604809364 -:10327000B50420915201309153012115310541F4DB -:103280002DB73EB780914E0190914F01281B390B0D -:10329000E091B504F091B6042E1B3F0B24173507BF -:1032A00088F0CA0102962817390760F0CF01840F11 -:1032B000951F02969093B6048093B5044193519361 -:1032C000CF0102C080E090E0DF91CF910895CF93CD -:1032D000DF93009709F44EC0EC0122971B821A82FB -:1032E000A091B704B091B804109711F140E050E0FC -:1032F00001C0DC01AC17BD0700F1BB83AA83FE014E -:1033000021913191E20FF31FEA17FB0771F42E5F51 -:103310003F4F8D919C911197820F931F99838883C2 -:10332000FD01828193819B838A834115510559F464 -:10333000D093B804C093B7041DC0FD01828193816E -:10334000AD010097B1F6FA01D383C2832191319187 -:10335000E20FF31FEC17FD0769F42E5F3F4F8881E2 -:103360009981820F931FFA01918380838A819B81C7 -:1033700093838283DF91CF91089597FB092E0726CF -:103380000AD077FD04D027D006D000201AF470951B -:1033900061957F4F0895F6F7909581959F4F089519 -:1033A00097FB092E05260ED057FD04D028D00AD051 -:1033B000001C38F450954095309521953F4F4F4F64 -:1033C0005F4F0895F6F790958095709561957F4FC2 -:1033D0008F4F9F4F0895AA1BBB1B51E107C0AA1F27 -:1033E000BB1FA617B70710F0A61BB70B881F991FA6 -:1033F0005A95A9F780959095BC01CD010895A1E259 -:103400001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F5E -:10341000FF1FA217B307E407F50720F0A21BB30BA9 -:10342000E40BF50B661F771F881F991F1A9469F725 -:1034300060957095809590959B01AC01BD01CF0181 -:023440000895ED -:10344200456D62656464656450726F6A6563747326 -:10345200004F63746F70757355534220496E7465E3 -:10346200726661636520436F6E7665727465722061 -:10347200616E6420492F4F20457874656E73696FC1 -:103482006E0032303038313130380009040020000B -:04349200B904000079 +:100000000C9470000C948F000C948F000C948F0053 +:100010000C948F000C9463050C948F000C948F004B +:100020000C948F000C948F000C948F000C948F0014 +:100030000C94DD190C948F000C948F000C948F009D +:100040000C948F000C9438050C94431F0C948F0073 +:100050000C948F000C9491000C948F000C948F00E2 +:100060000C948F000C948F000C948F000C948F00D4 +:100070000C948F000C948F000C948F000C948F00C4 +:100080000C948F000C948F000C948F000C948F00B4 +:100090000C948F004C22572262226D2278228322F8 +:1000A0008E229922A422AF22BD22CB22D922E7227E +:1000B000F222FD220B23162321232C233723422354 +:1000C0004D23582363236E23792384238F239A237C +:1000D000A523B023BF23CA23D523E023EB23F92391 +:1000E00011241FBECFEFD0E1DEBFCDBF13E0A0E0F3 +:1000F000B1E0E8E6F0E500E00BBF02C007900D922A +:10010000AE36B107D9F716E0AEE6B3E001C01D92F6 +:10011000A83BB107E1F70E94A9000C9432280C9487 +:1001200000001F920F920FB60F9211240F900FBE76 +:100130000F901F901895AC0120E030E002C02F5FB7 +:100140003F4FFA01E20FF31F80818823C1F7C901F5 +:1001500008956F927F928F929F92AF92BF92CF92AB +:10016000DF92EF92FF920F93DF93CF9300D00F9225 +:10017000CDB7DEB7F8940E94B30A0E942B108FEF20 +:1001800084B915B881E0809378032F980E94240BDE +:1001900081E897E10E946F0B85E69CE00E94740B5A +:1001A00081E090E00E94790BDE011196E3EEF2E02F +:1001B00083E001900D928150E1F7CE0101960E94FB +:1001C000620F80E091E00E94001081E191E00E94C6 +:1001D000F80F82E491E00E94F00F0E94380F4C016A +:1001E00068EC70E00E94870BC40160E070E00E9440 +:1001F000AE0E3C01C401B30140E050E00E94AD0BE3 +:10020000C401B30141E050E021E030E002E0A0E4AD +:10021000EA2EF12CCC24DD24F6EBAF2EF1E0BF2E3C +:100220000E94430EC401B30141E050E021E030E000 +:10023000E4E5AE2EE4E0BE2E0E947B0E1092CD03CC +:100240001092CC031092CF031092CE030E94741B25 +:100250008FE787B98AE288B90E948B0585E588B95E +:100260000E948B0518B80E94B1100E94B30A0E9428 +:1002700030107894FFCF0F931F93CF93DF938C01AF +:1002800081349105F0F18091D8039091D903892BA5 +:10029000C1F500D000D000D0EDB7FEB731968BE4A9 +:1002A00091E0ADB7BEB712969C938E93119783E5FC +:1002B00091E09383828381EC90E0958384830E9414 +:1002C0000D250F900F908AE591E0EDB7FEB7928370 +:1002D0008183148303830E940D251092D50310920D +:1002E000D4031093D7030093D60381E090E090935A +:1002F000D9038093D80300E410E00F900F900F9083 +:100300000F908BE268E00E94F50AC0E0D0E00DC0DB +:10031000E091D403F091D503EC0FFD1FE25EFA4F9C +:10032000608189E20E94F50A2196C017D10780F307 +:100330008091CC039091CD03019749F48BE267E063 +:100340000E94F50A1092CD031092CC030AC08BE2F2 +:1003500063E00E94F50A81E090E09093CD038093E2 +:10036000CC03DF91CF911F910F910895EF92FF92EF +:100370000F931F93CF93DF938091D8039091D9036C +:10038000019709F0B5C000D000D000D0EDB7FEB79E +:1003900031960BE411E0ADB7BEB712961C930E93E5 +:1003A0001197B3E5EB2EB1E0FB2EF382E2828FEDE5 +:1003B00090E0958384830E940D258DB79EB70696A5 +:1003C0000FB6F8949EBF0FBE8DBF87E891E00E94E4 +:1003D00022252091D4033091D5038091D6039091AA +:1003E000D7032817390708F083C000D000D000D009 +:1003F000EDB7FEB73196ADB7BEB712961C930E930C +:100400001197F382E28282EE90E0958384830E94CA +:100410000D258DB79EB706960FB6F8949EBF0FBEFA +:100420008DBF84EA91E00E942225C091D603D0912D +:10043000D7038091D4039091D503C81BD90B809129 +:10044000D4039091D503805C9F4F9093D503809304 +:10045000D403C134D1052CF100D000D000D0EDB7C9 +:10046000FEB73196ADB7BEB712961C930E93119797 +:10047000F382E28288EE90E0958384830E940D25CA +:100480008DB79EB706960FB6F8949EBF0FBE8DBF70 +:100490008CEC91E00E94222580E490E00E943B01D8 +:1004A00027C000D000D000D0EDB7FEB73196ADB771 +:1004B000BEB712961C930E931197F382E2828DEED3 +:1004C00090E0958384830E940D258DB79EB7069694 +:1004D0000FB6F8949EBF0FBE8DBF87EE91E00E94CD +:1004E0002225CE010E943B011092D9031092D8031D +:1004F000DF91CF911F910F91FF90EF900895CF92D0 +:10050000DF92EF92FF921F93CF93DF93EC01109253 +:10051000D5031092D4031092D9031092D80380917E +:10052000780381112F9A188112951F7000D000D086 +:1005300000D0EDB7FEB731969BE4E92E91E0F92E9D +:10054000ADB7BEB71296FC92EE92119783E5C82E16 +:1005500081E0D82ED382C2828BE690E0958384839B +:100560000E940D25EDB7FEB7319683EF91E0ADB750 +:10057000BEB712969C938E93119712831382888133 +:10058000848315820E940D258DB79EB706960FB6FF +:10059000F8949EBF0FBE8DBF143009F495C015307E +:1005A00058F4113029F11130A0F0123009F444C090 +:1005B000133009F03DC164C0163009F4CDC01630C7 +:1005C00008F4A6C0173009F4EBC0183009F030C1A8 +:1005D0000BC18881863041F48A81813009F058C18D +:1005E000CE010E94AC1954C1CE010E94AA1050C184 +:1005F00000D000D000D0EDB7FEB73196ADB7BEB792 +:100600001296FC92EE921197D382C2828FE790E00D +:10061000958384830E940D258DB79EB706960FB6ED +:10062000F8949EBF0FBE8DBF83E192E00E94222509 +:10063000CE010E9455132CC100D000D000D0EDB7E0 +:10064000FEB73196ADB7BEB71296FC92EE921197F7 +:10065000D382C28283E890E0958384830E940D2533 +:100660008DB79EB706960FB6F8949EBF0FBE8DBF8E +:1006700085E292E00E942225CE010E94F51408C175 +:1006800000D000D000D0EDB7FEB73196ADB7BEB701 +:100690001296FC92EE921197D382C28287E890E084 +:1006A000958384830E940D258DB79EB706960FB65D +:1006B000F8949EBF0FBE8DBF88E392E00E94222572 +:1006C000CE010E942316E4C000D000D000D0EDB7C8 +:1006D000FEB73196ADB7BEB71296FC92EE92119767 +:1006E000D382C2828BE890E0958384830E940D259B +:1006F0008DB79EB706960FB6F8949EBF0FBE8DBFFE +:100700008BE492E00E942225CE010E94CE17C0C049 +:1007100000D000D000D0EDB7FEB73196ADB7BEB770 +:100720001296FC92EE921197D382C2828FE890E0EB +:10073000958384830E940D258DB79EB706960FB6CC +:10074000F8949EBF0FBE8DBF8EE592E00E942225D9 +:10075000CE010E94FF1A9CC000D000D000D0EDB79F +:10076000FEB73196ADB7BEB71296FC92EE921197D6 +:10077000D382C28283E990E0958384830E940D2511 +:100780008DB79EB706960FB6F8949EBF0FBE8DBF6D +:1007900085E292E00E942225CE010E94740778C073 +:1007A00000D000D000D0EDB7FEB73196ADB7BEB7E0 +:1007B0001296FC92EE921197D382C28288E990E061 +:1007C000958384830E940D258DB79EB706960FB63C +:1007D000F8949EBF0FBE8DBF81E792E00E94222554 +:1007E000CE010E945C2054C000D000D000D0EDB7F4 +:1007F000FEB73196ADB7BEB71296FC92EE92119746 +:10080000D382C2828FE990E0958384830E940D2574 +:100810008DB79EB706960FB6F8949EBF0FBE8DBFDC +:1008200084E892E00E942225CE010E94D02130C0AF +:1008300000D000D000D0EDB7FEB731968BE491E048 +:10084000ADB7BEB712969C938E93119783E591E056 +:100850009383828383EA90E0958384830E940D25AD +:100860008DB79EB706960FB6F8949EBF0FBE8DBF8C +:100870008AE992E00E942225888180931E0583E008 +:1008800080931F051092200583E090E00E943B01B9 +:100890008091780381112F98DF91CF911F91FF9064 +:1008A000EF90DF90CF900895EF92FF920F931F93F8 +:1008B000CF93DF93EC0100D000D000D0EDB7FEB7AE +:1008C00031960BE411E0ADB7BEB712961C930E93B0 +:1008D000119723E5E22E21E0F22EF382E28287E3F4 +:1008E00090E0958384830E940D250F900F90EDB7C3 +:1008F000FEB7319686EA92E0ADB7BEB712969C93EA +:100900008E9311978981828313820E940D25809195 +:10091000CE039091CF030F900F900F900F900197FF +:1009200009F04BC000D000D000D0EDB7FEB7319633 +:10093000ADB7BEB712961C930E931197F382E28265 +:100940008CE390E0958384830E940D258DB79EB73C +:1009500006960FB6F8949EBF0FBE8DBF8AEC92E04C +:100960000E94222520E030E0E091D003F091D103F5 +:10097000E20FF31FDE01A20FB31F8C91E252FC4F76 +:1009800080832F5F3F4F2034310571F78091D00372 +:100990009091D103805C9F4F9093D1038093D003BB +:1009A0002091D0033091D1038091D2039091D30351 +:1009B0002817390708F455C03FC000D000D000D038 +:1009C000EDB7FEB73196ADB7BEB712961C930E9336 +:1009D0001197F382E2828BE490E0958384830E94F6 +:1009E0000D258DB79EB706960FB6F8949EBF0FBE25 +:1009F0008DBF83ED92E00E9422251092D1031092C8 +:100A0000D00320E030E0E091D003F091D103E20F79 +:100A1000F31FDE01A20FB31F8C91E252FC4F8083C3 +:100A20002F5F3F4F2034310571F73093D10320936E +:100A3000D0038981803448F41092CF031092CE0302 +:100A40008EED93E00E947F020CC081E090E09093D5 +:100A5000CF038093CE03898190E09093D30380935A +:100A6000D203DF91CF911F910F91FF90EF900895E6 +:100A70001F920F920FB60F920BB60F9211242F9365 +:100A80003F934F935F936F937F938F939F93AF9316 +:100A9000BF93EF93FF930E947C108091770386BDF4 +:100AA000FF91EF91BF91AF919F918F917F916F9146 +:100AB0005F914F913F912F910F900BBE0F900FBE02 +:100AC0000F901F9018951F920F920FB60F920BB6B2 +:100AD0000F9211242F933F934F935F936F937F93C4 +:100AE0008F939F93AF93BF93EF93FF930E94081050 +:100AF000FF91EF91BF91AF919F918F917F916F91F6 +:100B00005F914F913F912F910F900BBE0F900FBEB1 +:100B10000F901F90189520E040E45CE9CA0101970E +:100B2000F1F72F5F2931D1F70895882321F0813023 +:100B300061F084E008958EE08093A2038093A30384 +:100B400088E18093C10081E008958EE0809387035F +:100B50008093880388E18093C90081E00895882309 +:100B600021F0813081F084E008951092A203109268 +:100B7000A3031092C5001092C4001092C1001092FD +:100B8000C20081E0089510928703109288031092AA +:100B9000CD001092CC001092C9001092CA0081E0E2 +:100BA0000895882321F0813041F084E00895209356 +:100BB000C5006093C40081E008952093CD00609348 +:100BC000CC0081E00895623011F492E001C090E021 +:100BD000882321F0813061F084E008958091C20083 +:100BE000990F990F990F982B9093C20081E0089567 +:100BF0008091CA00990F990F990F982B9093CA0072 +:100C000081E00895663029F0673039F0653041F4AD +:100C100002C020E006C020E001C021E090E002C058 +:100C200021E091E0882321F0813069F084E008958B +:100C30008091C200220F220F990F922B982B909334 +:100C4000C20081E008958091CA00220F220F990FFF +:100C5000922B982B9093CA0081E00895653419F087 +:100C60006F3419F405C021E001C020E090E002C01B +:100C700021E091E0882321F0813079F084E008952B +:100C80008091C2002295220F207E9295907F922B18 +:100C9000982B9093C20081E008958091CA0022951C +:100CA000220F207E9295907F922B982B9093CA00D2 +:100CB00081E00895982FFA018230B8F084E0089519 +:100CC0002191992319F0913071F407C08091C000EF +:100CD00085FFFCCF2093C60006C08091C80085FF29 +:100CE000FCCF2093CE00615070406115710541F733 +:100CF00081E00895882321F0813051F084E0089547 +:100D00008091C00085FFFCCF6093C60081E008950C +:100D10008091C80085FFFCCF6093CE0081E00895EC +:100D2000E82FDB01823010F084E008959A0116C0AC +:100D3000EE2321F0E13049F084E00DC08091C00045 +:100D400087FFFCCF8091C60006C08091C80087FF56 +:100D5000FCCF8091CE008D932150304012161306A7 +:100D60003CF381E00895882321F0813049F084E04C +:100D700008958091C00087FFFCCF8091C600089540 +:100D80008091C80087FFFCCF8091CE00089570E06D +:100D90000E945A0680931F051092200583E090E080 +:100DA0000E943B0108950E94020680931F05109245 +:100DB000200583E090E00E943B0108950E94020616 +:100DC00080931F051092200583E090E00E943B0174 +:100DD00008950E94E30580931F051092200583E08B +:100DE00090E00E943B0108950F930E94D1058093EB +:100DF0001F051092200583E090E00E943B010F91B7 +:100E000008950E94AF0580931F051092200583E08E +:100E100090E00E943B010895882321F0813059F031 +:100E200084E012C08EE08093A2038093A30388E144 +:100E30008093C10008C08EE080938703809388036D +:100E400088E18093C90081E080931F0510922005FE +:100E500083E090E00E943B010895CF92DF92EF92F1 +:100E6000FF920F931F93DF93CF93CDB7DEB78B0124 +:100E7000CDB6DEB62DB73EB7261B370B0FB6F894AE +:100E80003EBF0FBE2DBFEDB6FEB60894E11CF11CAF +:100E9000B701A8010E94900680931F0520E030E072 +:100EA0000AC0F701E20FF31F8081F901E05EFA4FFB +:100EB00080832F5F3F4F201731079CF3F801E05EDE +:100EC000FA4F1082C80103960E943B010FB6F894B6 +:100ED000DEBE0FBECDBECF91DF911F910F91FF906F +:100EE000EF90DF90CF9008950F93FC018081809365 +:100EF0001E058081843611F1853648F48236B1F0C2 +:100F00008336E0F4803651F0813679F50BC08736B0 +:100F100031F18836E9F0853641F515C082810E94AD +:100F20000C072CC082810E94010728C08281638146 +:100F30004481258106810E94F40620C0828163815C +:100F40000E94E9061BC0828163810E94D30616C0FD +:100F5000828163813496AF010E94C7060FC063810E +:100F6000828170E00E942D0709C083E080931F05F5 +:100F70001092200583E090E00E943B010F910895BC +:100F800087E28093860685E28093850690E29093BF +:100F900087061092880628E030E030938A06209376 +:100FA000890683E28093920681E280939106909372 +:100FB0009306109294063093960620939506089512 +:100FC0000895089581E260919E060E94F50A0895B1 +:100FD0008BE268E00E94F50A88E261E10E94F50A6E +:100FE0008FE268E00E94F50A8CE261E10E94F50A56 +:100FF0008FE261E00E94F50A83E265E00E94F50A53 +:1010000008950F931F938C0180E260E40E94F50A1B +:10101000F8016281605884E00E94F50AF80182813B +:1010200080939D061F910F9108950F931F93CF9367 +:10103000DF93EC0128853985121613060CF03FC0AA +:101040008E819F81821793073CF583E268E00E94BE +:10105000F50A00E010E012C0EA85FB85E20FF31FFD +:1010600081E260810E94F50A8E819F8101969F83B3 +:101070008E830F5F1F4F0830110539F02E813F819D +:1010800088859985281739073CF3288539858E810D +:101090009F818217930724F087E261E00E94F50A9E +:1010A0008B81813031F4898165E00E94F50A1B82D1 +:1010B00006C0898161E00E94F50A81E08B83DF919F +:1010C000CF911F910F910895DF93CF9300D000D05F +:1010D000CDB7DEB7FC0132812381109298061092C1 +:1010E000970681E080939406223031F12330B9F1E4 +:1010F000213009F05FC080917106809399061092AB +:101100009A0681E796E090939C0680939B068681E1 +:101110009781089721F480E490E097838683868105 +:1011200097818034910509F045C088E090E0909364 +:101130009A06809399063EC08681978190939A067D +:1011400080939906832F90E0880F991FE091830682 +:10115000F0918406E80FF91F8081918127C0332325 +:10116000B9F0832F90E0880F991FE091DC03F09194 +:10117000DD03E80FF91F0190F081E02DF0939C064C +:10118000E0939B0680818093990610929A0612C084 +:1011900094E099832A8389E08B839C8384E090E0A8 +:1011A00090939A0680939906CE01019690939C069F +:1011B00080939B0681E996E00E9415080F900F909E +:1011C0000F900F90CF91DF910895CF93DF9382E23C +:1011D0000E94C10AC82F85FF1AC083E268E00E94FE +:1011E000F50AC6FF10C020919706309198068091AD +:1011F000990690919A06281739072CF481E996E010 +:101200000E94150804C087E261E00E94F50ADF91A0 +:10121000CF9108950F931F9388E00E94C10A082F71 +:10122000182F86FF18C085E060E00E94F50A84E070 +:1012300060E80E94F50A80E260E00E94F50A83E21D +:1012400068E00E94F50A87E261E00E94F50A85E005 +:1012500062E00E94F50A14FF04C089E060EC0E947D +:10126000F50A07FF04C089E060ED0E94F50A1F91AE +:101270000F9108958AE00E94C10A80FF03C00E9476 +:10128000E508089581FF0DC08AE20E94C10A80919D +:101290005E06813061F4E0916106F0916206099585 +:1012A000089582E30E94C10A8AE30E94C10A089558 +:1012B0008EE00E94C10A0895EF92FF920F931F9350 +:1012C000DF93CF93CDB7DEB728970FB6F894DEBF84 +:1012D0000FBECDBF86E20E94C10A86FF7FC08E018D +:1012E0000F5F1F4F49E0E42EF12CEC0EFD1E8091A4 +:1012F00085060E94C10AF80181938F01EE15FF0552 +:10130000B1F78E010F5F1F4F87E268E00E94F50A78 +:1013100083E268E00E94F50A80E20E94C10A682F19 +:101320006F7780E20E94F50A898190E08076907064 +:101330008032910509F440C080349105D1F1892BA8 +:10134000F1F5F80181818630D9F0873048F4813099 +:10135000F1F18130C8F0833079F1853081F521C019 +:10136000893019F18A3018F4883049F505C08A307F +:1013700071F18B3021F520C081E260919E0625C07D +:10138000C8010E94640823C083E268E00E94F50A55 +:1013900081E261E00E94F50A81E260E00E94F50AC4 +:1013A0000BC0C8010E94010812C0C8010E94E807D2 +:1013B0000EC0C8010E94B10A83E265E006C080E267 +:1013C0000E94C10A682F605880E20E94F50AF80165 +:1013D00080818823D1F483E265E015C020919906CD +:1013E00030919A0680919506909196068217930700 +:1013F00064F410929A061092990683E268E00E94C3 +:10140000F50A87E261E00E94F50A28960FB6F89483 +:10141000DEBF0FBECDBFCF91DF911F910F91FF9027 +:10142000EF900895EF92FF920F931F93DF93CF9366 +:10143000CDB7DEB7C054D0400FB6F894DEBF0FBEB4 +:10144000CDBF8CE00E94C10A80FF03C00E945C09EE +:101450007AC081FF29C08EE20E94C10A8DE20E94FB +:10146000C10A89838E010F5F1F4F70E4E72EF12CB4 +:10147000EC0EFD1E0F5F1F4F0E94E40AF8018083EF +:101480000E151F05B9F780916E03813039F4E09194 +:101490007103F0917203CE01019609958FE268E025 +:1014A0000E94F50A8FE22AC082FF2CC086E30E94C8 +:1014B000C10A85E30E94C10A89838E010F5F1F4F15 +:1014C00060E4E62EF12CEC0EFD1E0F5F1F4F0E9414 +:1014D000E40AF80180830E151F05B9F780916F03A8 +:1014E000813039F4E0917303F0917403CE010196D9 +:1014F000099587E368E00E94F50A87E361E00E94AE +:10150000F50A21C083FF1FC08EE30E94C10A8E012D +:101510000F5F1F4F51E4E52EF12CEC0EFD1E8DE305 +:101520000E94C10AF80181938F01EE15FF05B9F7FA +:1015300080917003813039F4E0917103F09172036E +:10154000CE0101960995C05CDF4F0FB6F894DEBF5F +:101550000FBECDBFCF91DF911F910F91FF90EF9004 +:1015600008950895089581E080936A0080E18DBB1D +:1015700083B3876083BB84B3836084BB3F9A479AFD +:1015800008959FEF91B982B988B1805888B984B322 +:1015900095E0892784BB88B1805888B984B38927AE +:1015A00084BB000011B888B1805888B984B322E0A8 +:1015B000822784BB0000000080B198B1905898B990 +:1015C00094B3922794BB089588B1805888B984B3A6 +:1015D00022E0822784BB0000000080B198B19058BF +:1015E00098B994B3922794BB089582B98FEF81B9CB +:1015F00088B1805888B984B395E0892784BB88B1C5 +:10160000805888B984B3892784BB62B988B180586F +:1016100088B984B391E0892784BB88B1805888B9A0 +:1016200084B3892784BB089582B988B1805888B96A +:1016300084B391E0892784BB88B1805888B984B38A +:10164000892784BB0895089582E18093710681E023 +:101650008093720680E191E0909374068093730604 +:1016600010927506109276061092770688E08093A5 +:10167000780610927A061092790610927C061092E3 +:101680007B0610927E0610927D0610927F061092C5 +:101690008006109281061092820610926E031092BC +:1016A0006F031092700310925E0610925F06109204 +:1016B000600610926806109267061092DB03109283 +:1016C000DA03089590937A068093790670937C06E6 +:1016D00060937B0650937E0640937D060895909319 +:1016E0007A0680937906089590937C0680937B0612 +:1016F000089590937E0680937D06089580937506E5 +:1017000008958093760608958093770608950F9341 +:101710001F93CF93DF938C01CB01C0916706D091CB +:10172000680662E070E00E94D42710C09881298189 +:101730008A81823041F4E92FF22F858190E0801771 +:10174000910709F460870F80D885C02D209771F725 +:10175000DF91CF911F910F9108959C01E091670651 +:10176000F091680614C0A081B1818281843061F457 +:10177000848190E08217930739F4868190E0861780 +:10178000970711F413964C930780F085E02D30975E +:1017900051F708950895BF92CF92DF92EF92FF9292 +:1017A0000F931F93CF93DF93EC01F62ED42EC22E0E +:1017B000B02EE0916706F0916806309799F489E0C1 +:1017C00090E00E940B24FC019093680680936706CA +:1017D000D183C083F38210861782D282C4820583AC +:1017E000E6821AC0CF010780F085E02D3097D1F74F +:1017F0008C0189E090E00E940B24FC01D80118962E +:101800009C938E931797D183C083F382D282C48234 +:10181000B582E68210861782DF91CF911F910F91DA +:10182000FF90EF90DF90CF90BF900895EF92FF92DE +:101830001F93CF93DF937C01C091DA03D091DB0338 +:10184000209711F011E012C085E090E00E940B2477 +:10185000FC019093DB038093DA03F182E082128231 +:101860001482138210E012C01F5FEC018B819C81F7 +:101870000097D1F785E090E00E940B24FC019C8347 +:101880008B83F182E082128314821382812FDF9195 +:10189000CF911F91FF90EF900895EF92FF920F93D9 +:1018A0001F93CF93DF93E091DA03F091DB0380E0A5 +:1018B00090E00380F481E02D01963097D1F7880FF6 +:1018C000991F0E940B248093DC039093DD03C09149 +:1018D000DA03D091DB0301C0EC01E880F9808A8152 +:1018E00090E0880F991F0091DC031091DD03080F31 +:1018F000191FF701808190E00E940B24F80180837A +:10190000918320E030E016C08A8190E0880F991F13 +:10191000E091DC03F091DD03E80FF91F0190F08105 +:10192000E02DE20FF31FD701A20FB31F8C9180832C +:101930002F5F3F4FF701808190E02817390724F38C +:101940008B819C81009741F6DF91CF911F910F9180 +:10195000FF90EF9008956F927F928F929F92AF9237 +:10196000BF92CF92DF92EF92FF920F931F93CF938C +:10197000DF93E0916706F0916806CC24DD2409C06E +:101980008281823019F40894C11CD11C0780F08533 +:10199000E02D3097A9F7C601880F991F0E940B24EC +:1019A00080938306909384060894C108D108560159 +:1019B000AA0CBB1C0894C11CD11CC1E0D0E0882437 +:1019C00099244FC0E0916706F0916806A9E0EA2EDD +:1019D000F12C16C0A081B181848190E08C179D0705 +:1019E00019F48381E80EF11C15968C9115978C17CC +:1019F00021F48281823009F44D010780F085E02DC9 +:101A0000309741F700918306109184060A0D1B1D43 +:101A1000C7010E940B24D8018C9311969C9320E05F +:101A200030E0E0918306F0918406EA0DFB1D019001 +:101A3000F081E02DE20FF31FD401A20FB31F8C91B0 +:101A400080832F5F3F4F2930310559F7E09183069E +:101A5000F0918406EA0DFB1D0190F081E02DE282F9 +:101A60002196CC16DD060CF0ADCFE1E0EE2EF12C88 +:101A700079E0A72EB12C6624772488249924A5C068 +:101A8000A0916706B091680613C0ED91FC91119783 +:101A90008181823049F4858190E08E159F0521F483 +:101AA0008481682E772406C017960D90BC91A02DD6 +:101AB000109759F701E010E07DC040916706509102 +:101AC000680672C0DA01ED91FC9111978181843032 +:101AD00009F065C016968C91169790E080179107D3 +:101AE00009F05DC014968C9190E08E159F0509F069 +:101AF00056C0DF019501BF01675F7F4FE09183060C +:101B0000F0918406E80DF91D0190F081E02DE20FBF +:101B1000F31F8D9180832F5F3F4FA617B70771F793 +:101B2000E9E0F0E0AE0EBF1EA0916706B091680636 +:101B300034C012968C911297853059F514968C9179 +:101B4000149790E08E159F0521F515968C911597A9 +:101B500090E080179107E9F4CD91DC911197950100 +:101B6000BE01695F7F4FE0918306F0918406E80D26 +:101B7000F91D0190F081E02DE20FF31F8991808320 +:101B80002F5F3F4FC617D70771F787E090E0A80E89 +:101B9000B91E17960D90BC91A02D109751F6DA0141 +:101BA00017964D915C9118974115510509F08ACF10 +:101BB0000F5F1F4F601671060CF07FCF0894E11C79 +:101BC000F11CE2E0F0E08E0E9F1ECE14DF040CF05C +:101BD00057CFDF91CF911F910F91FF90EF90DF9042 +:101BE000CF90BF90AF909F908F907F906F9008950F +:101BF000AF92BF92CF92EF92FF920F931F93CF932A +:101C0000DF93EC015B01122FE0916706F09168060B +:101C100018C0A081B181848190E0C817D90771F400 +:101C2000868190E08A159B0549F48281843031F4E5 +:101C300014968C9114978F5F14968C930780F0857F +:101C4000E02D309731F787E090E00E940B24FC01F3 +:101C500087E0808385E0818312830383F582E482B9 +:101C6000C682CF0167E045E02C2F0A2DEE240E94AA +:101C7000CB0BDF91CF911F910F91FF90EF90CF9001 +:101C8000BF90AF900895AF92BF92CF92DF92EF9244 +:101C9000FF920F93FC01A114B10401F142305105F0 +:101CA00071F04330510599F041305105B9F481E0AC +:101CB00080935E06B0926206A09261060FC081E03A +:101CC00080935F06B0926406A092630607C081E02D +:101CD00080936006B0926606A092650620583F4F3A +:101CE000CF010E94F80D0F91FF90EF90DF90CF9001 +:101CF000BF90AF900895AF92BF92CF92DF92EF92D4 +:101D0000FF920F93FC014230510571F043305105B1 +:101D100099F041305105B9F481E080936E03B0929F +:101D20007203A09271030FC081E080936F03B092A1 +:101D30007403A092730307C081E080937003B09294 +:101D40007603A0927503CF010E94F80D0F91FF90CA +:101D5000EF90DF90CF90BF90AF900895EF920F93E8 +:101D6000CF93DF93082FE62EA0916706B091680607 +:101D7000C0E0D0E014C0ED91FC91119785818017EF +:101D800051F412968C911297823029F484818F5FDE +:101D90008483C82FD0E017960D90BC91A02D10978A +:101DA00051F789E090E00E940B24FC0189E08083D8 +:101DB00084E08183E2821382148215821682178264 +:101DC0001086CF0169E044E0202F00E0EC2E0E9455 +:101DD000CB0BCE01DF91CF910F91EF900895DF9261 +:101DE000EF92FF920F931F93CF93DF93E82E162F5E +:101DF000F42ED22EA0916706B0916806C0E0D0E024 +:101E000014C0ED91FC91119785818E1551F41296B5 +:101E10008C911297823029F484818F5F8483C82F3C +:101E2000D0E017960D90BC91A02D109751F789E046 +:101E300090E00E940B24FC0189E0808384E0818390 +:101E4000128313821482F582D68207831086CF0113 +:101E500069E044E02E2D00E0EC2E0E94CB0BCE0179 +:101E6000DF91CF911F910F91FF90EF90DF90089538 +:101E7000EF920F931F93109182061F5F10938206BB +:101E800089E090E00E940B24FC0189E0808389E0D6 +:101E900090E09383828382E081831482158316828B +:101EA00080E887838AE18087CF0169E042E020E013 +:101EB00000E0EE240E94CB0B812F90E01F910F9148 +:101EC000EF9008950F931F93CF93DF938C01FC0144 +:101ED00001900020E9F7E81BF90BCF01880F991F4B +:101EE0000E940B24EC01F80101900020E9F7E01BAF +:101EF000F10BEE0FFF1FE88323E02983AC0120E004 +:101F000030E009C0F801E20FF31F8081FA018083FD +:101F100011822F5F3F4FF80101900020E9F73197C0 +:101F2000E01BF10B4E5F5F4F2E173F0758F3CE01BA +:101F30000E94160C90E0DF91CF911F910F910895B0 +:101F40000F931F93CF93DF938C01EB01CA010E9483 +:101F5000620F282FE0916706F091680614C0A081F7 +:101F6000B1818281843061F4848190E0801791078F +:101F700039F4868190E08C179D0711F418962C9304 +:101F80000780F085E02D309751F7DF91CF911F91B9 +:101F90000F910895CF93DF93EC01CB010E94620F64 +:101FA000382FA0916706B091680615C09C911196D4 +:101FB0002C91119712968C911297823041F4E92F4F +:101FC000F22F858190E08C179D0709F436831796D0 +:101FD0000D90BC91A02D109749F7DF91CF910895F6 +:101FE0000E94620F1816190614F480938106089552 +:101FF0000E94620F1816190614F480938006089543 +:102000000E94620F1816190614F480937F06089533 +:102010001F93CF93DF9386E00E94C10AC82F86FFEB +:1020200002C00E94120AC2FF02C00E943A09C1FF08 +:1020300002C00E940A0987E00E94C10A182F87E0A7 +:1020400060E00E94F50A87E0612F0E94F50ADF91A7 +:10205000CF911F91089581E062E00E94F50A0895F2 +:102060000E94AB0C0E944D0C0E94C00780E061E012 +:102070000E94F50A80E00E94C10A80FDFBCF81E04A +:1020800062E00E94F50A84E060E80E94F50A80E2BE +:1020900060E40E94F50A83E268E00E94F50A87E2A4 +:1020A00069E00E94F50A8DE06FE00E94F50A8BE07E +:1020B0006FE00E94F50A89E068ED0E94F50A8FE062 +:1020C00063E30E94F50A87E066ED0E94F50A85E069 +:1020D00062E00E94F50A80E06CEC0E94F50A089527 +:1020E0008EEC8093770381E080936E00809177037C +:1020F00086BD83E084BD08950895089583E08093AC +:102100001E0581E080931F058BE0809320052FE65C +:102110002093210593E69093220584E7809323057D +:10212000209324059093250581E6809326058EE66D +:10213000809327058FE58093280580E38093290508 +:1021400081E380932A0510922B058EE090E00E9497 +:102150003B010895FC018081833011F40E947E10C0 +:1021600008951F9311E0812F0E944413812F60E096 +:102170000E9447121F5F1431B1F718E1812F0E94AE +:102180004413812F60E00E9447121F5F1B32B1F79A +:102190001F910895FC0110827583648373836283A9 +:1021A0004183478346830895FC019081818198177C +:1021B00010F080E00895A481B5816D9387818150EE +:1021C00019F48181A81BB1098783B583A4839FB7C4 +:1021D000F89480818F5F80839FBF81E00895FC0128 +:1021E00080818823E9F3A281B3812D91868181507A +:1021F00019F48181A81BB109B383A28386839FB799 +:10220000F8948081815080839FBF822F0895FC01C4 +:102210008081882319F42FEF3FEF13C0A281B3818F +:102220002D918681815019F48181A81BB109B38356 +:10223000A28386839FB7F8948081815080839FBF5B +:1022400030E0C901089581E0089581E0089581E0BA +:10225000089581E00895FB011082833089F0843075 +:1022600028F4813049F0823029F408C0843051F0DC +:10227000853051F085E0089583B107C086B105C06F +:1022800089B103C08CB101C08FB1808381E0089512 +:10229000833089F0843028F4813049F0823029F489 +:1022A00008C0843051F0853059F084E0089565B954 +:1022B00005C068B903C06BB901C06EB981E008956B +:1022C00061BB81E00895882321F081E08093780349 +:1022D0000895109278030895982F882321F081E0C3 +:1022E0008093780302C0109278038BE180931E05DF +:1022F00090931F051092200583E090E00E943B011F +:10230000089598E190931E050E94481180931F053F +:102310001092200583E090E00E943B010895982FE1 +:1023200089E180931E05933091F0943028F4913028 +:1023300051F0923029F409C0943059F0953059F099 +:1023400085E090E00AC093B107C096B105C099B18D +:1023500003C09CB101C09FB181E080931F059093A1 +:1023600020051092210584E090E00E943B01089531 +:1023700084E180931E0581E080931F051092200563 +:1023800083E090E00E943B01089582E180931E0566 +:1023900081E080931F051092200583E090E00E9469 +:1023A0003B01089583E180931E0581E080931F0522 +:1023B0001092200583E090E00E943B01089580E1A7 +:1023C00080931E0581E080931F051092200583E015 +:1023D00090E00E943B010895EF92FF921F93DF93DC +:1023E000CF93CDB7DEB727970FB6F894DEBF0FBEF9 +:1023F000CDBF182F7B01BE016F5F7F4F0E94392236 +:10240000882311F484E01BC0E12FF0E0E958FC4F71 +:102410003281313011F086E012C0EB81FC81808185 +:102420002F8190E002C0959587952A95E2F780FF6D +:1024300003C0F701308302C0F701108281E02796C4 +:102440000FB6F894DEBF0FBECDBFCF91DF911F91C5 +:10245000FF90EF900895DF93CF930F92CDB7DEB743 +:102460009BE190931E05BE016F5F7F4F0E94EC11B0 +:1024700080931F058981809320051092210584E0B7 +:1024800090E00E943B010F90CF91DF9108950F9350 +:102490001F93DF93CF93CDB7DEB727970FB6F8948E +:1024A000DEBF0FBECDBF182F062FBE016F5F7F4F5F +:1024B0000E943922882311F484E025C0E12FF0E046 +:1024C000E958FC4F8281823011F086E01CC0E9811E +:1024D000FA81002359F080819F8121E030E002C021 +:1024E000220F331F9A95E2F7822B0BC030812F8188 +:1024F00081E090E002C0880F991F2A95E2F780954D +:102500008323808381E027960FB6F894DEBF0FBE49 +:10251000CDBFCF91DF911F910F9108959AE19093D4 +:102520001E050E94471280931F051092200583E02C +:1025300090E00E943B0108951F93DF93CF93CDB7A6 +:10254000DEB727970FB6F894DEBF0FBECDBF182FAA +:10255000BE016F5F7F4F0E943922882311F484E00F +:1025600015C0E12FF0E0E958FC4F81E08283ED8156 +:10257000FE8130812F8181E090E002C0880F991F99 +:102580002A95E2F780958323808381E027960FB612 +:10259000F894DEBF0FBECDBFCF91DF911F9108959C +:1025A00095E190931E050E949C1280931F05109246 +:1025B000200583E090E00E943B0108951F93DF9384 +:1025C000CF93CDB7DEB727970FB6F894DEBF0FBE17 +:1025D000CDBF182FBE016F5F7F4F0E943922882325 +:1025E00011F484E014C0E12FF0E0E958FC4F82E0E0 +:1025F0008283ED81FE8120813F8181E090E002C0F5 +:10260000880F991F3A95E2F7282B208381E02796BF +:102610000FB6F894DEBF0FBECDBFCF91DF911F91F3 +:10262000089596E190931E050E94DE1280931F0587 +:102630001092200583E090E00E943B0108951F93D3 +:10264000182F0E94DE12813071F4812F61E00E9408 +:102650004712813041F4E12FF0E0E958FC4F83E06C +:10266000828381E001C084E01F91089597E19093F7 +:102670001E050E941F1380931F051092200583E002 +:1026800090E00E943B0108950E94DE12089591E1BE +:1026900090931E050E94DE1280931F051092200564 +:1026A00083E090E00E943B010895FC018081863127 +:1026B000E9F1873178F4823131F1833130F48031BE +:1026C000D1F0813109F050C01AC0843131F1853127 +:1026D00048F51EC08931B9F18A3130F4873151F1A2 +:1026E000883109F041C02AC08B31B1F18B3178F1CA +:1026F0008C31D1F535C082810E94DF11089582812D +:102700000E9447130895828163810E94C511089534 +:10271000828163810E94D2110895828163810E9427 +:10272000B811089582810E94D012089582810E947A +:102730001113089582810E94361308958281638166 +:102740000E948111089582810E948F1108958281D3 +:1027500063810E948E12089582810E942B12089537 +:1027600082810E946C11089580931E0583E08093FE +:102770001F051092200583E090E00E943B01089520 +:10278000E82F8A50883018F024E030E00CC0F0E0E8 +:10279000E958FC4F84E0828380917C00806C8093B8 +:1027A0007C0021E030E0C9010895E82FF0E0E9580D +:1027B000FC4F8281843019F024E030E003C01282A3 +:1027C00021E030E0C901089510927C00823039F098 +:1027D000833049F0813061F022E030E00BC080911D +:1027E0007C00806403C080917C00806C80937C00BE +:1027F00021E030E0C901089593E890937A00909128 +:102800007C00907F982B90937C0080917A0080646C +:1028100080937A0080917A0086FDFCCF80917800C9 +:102820009091790040E050E020E030E080917A0023 +:10283000806480937A0080917A0086FDFCCF80913D +:10284000780090917900280F391F4F5F5F4F443017 +:10285000510561F780917A008F7780937A003695E1 +:10286000279536952795C9010895982F83E280937F +:102870001E0510927C00923039F0933049F091306F +:1028800061F082E090E00BC080917C00806403C026 +:1028900080917C00806C80937C0081E090E080934C +:1028A0001F051092200583E090E00E943B010895EF +:1028B00091E290931E05E82FF0E0E958FC4F8281E9 +:1028C000843019F084E090E003C0128281E090E04F +:1028D00080931F051092200583E090E00E943B0149 +:1028E0000895E82F80E280931E058E2F8A5088304D +:1028F00018F084E090E00CC0F0E0E958FC4F84E070 +:10290000828380917C00806C80937C0081E090E0E9 +:1029100080931F051092200583E090E00E943B0108 +:102920000895CF93DF93982FEB0119821882E82F37 +:10293000F0E0E958FC4F8281843019F026E030E065 +:1029400032C081E1891B0E94FC139983888300D0E7 +:1029500000D000D0EDB7FEB7319686EE92E0ADB76D +:10296000BEB712969C938E9311978EEE92E093834E +:1029700082838BE890E0958384830E940D250F90DD +:102980000F9084EF92E0EDB7FEB792838183888148 +:102990009981948383830E940D2521E030E00F907C +:1029A0000F900F900F90C901DF91CF910895DF93A1 +:1029B000CF9300D0CDB7DEB792E290931E05BE0153 +:1029C0006F5F7F4F0E94911480931F0599818A81C8 +:1029D000809320059093210584E090E00E943B01C4 +:1029E0000F900F90CF91DF910895FC01808181328B +:1029F00071F0823218F48032B1F405C0823259F09D +:102A0000833289F40CC082810E94711408958281FE +:102A10000E945814089582810E94D71408958281DB +:102A20000E943514089580931E0583E080931F054E +:102A30001092200583E090E00E943B010895ECEBAA +:102A4000F0E08081846080838BE0809385038CE05C +:102A50008093860381E090E00895ECEBF0E08081C4 +:102A60008B7F8083109285031092860381E090E033 +:102A700008958093B800E9EBF0E080818C7F80833B +:102A80008081808381E090E008958091B900887F03 +:102A900008958091B90084EA8093BC008091BC00C5 +:102AA00087FFFCCF81E090E0089584E98093BC002B +:102AB0008091BC0084FDFCCF81E090E00895AC01E2 +:102AC00020E030E094E80EC0FA01E20FF31F8081AD +:102AD0008093BB009093BC008091BC0087FFFCCF2B +:102AE0002F5F3F4F261737077CF3089584E88093C4 +:102AF000BC008091BC0087FFFCCF8091BB00089593 +:102B000085E380931E0581E080931F0520E030E07F +:102B100094E80EC09093BC008091BC0087FFFCCF6E +:102B20008091BB00F901E05EFA4F80832F5F3F4F39 +:102B3000261737077CF3FB01E05EFA4F1082CB01CA +:102B400003960E943B010895AC0120E030E094E838 +:102B50000EC0FB01E20FF31F80818093BB009093B6 +:102B6000BC008091BC0087FFFCCF2F5F3F4F241734 +:102B700035077CF381E080931F051092200583E0E8 +:102B800090E00E943B01089584E98093BC0080910D +:102B9000BC0084FDFCCF81E080931F0510922005CE +:102BA00083E090E00E943B0108958091B90084EA9F +:102BB0008093BC008091BC0087FFFCCF81E08093B4 +:102BC0001F051092200583E090E00E943B010895CC +:102BD0008093B800E9EBF0E080818C7F8083808176 +:102BE000808381E080931F051092200583E090E0B0 +:102BF0000E943B010895ECEBF0E080818B7F8083A5 +:102C0000109285031092860381E080931F05109235 +:102C1000200583E090E00E943B010895ECEBF0E09A +:102C20008081846080838BE0809385038CE0809337 +:102C3000860381E080931F051092200583E090E0D9 +:102C40000E943B010895FC01808180931E058081D4 +:102C50008433D1F0853338F4813379F0823381F0D5 +:102C6000803331F507C08633E9F08633A0F087332F +:102C7000F9F41BC00E940E1608950E94FB150895DA +:102C800082810E94E8150895828190E03396BF0109 +:102C90000E94A41508956381828190E070E00E94F3 +:102CA000801508950E94D51508950E94C4150895B1 +:102CB00083E080931F051092200583E090E00E943E +:102CC0003B010895782F613041F0613040F062306F +:102CD00041F0633009F059C007C060E006C060E011 +:102CE00001C061E050E002C061E051E04330B9F062 +:102CF000443028F4413059F0423078F40AC045306D +:102D000099F0453070F0463009F03FC010C021E026 +:102D10000CC021E041E030E00DC021E009C020E01E +:102D2000F9CF20E041E005C020E040E0F4CF20E012 +:102D300040E031E0239884B1866084B985B1817F19 +:102D400085B980E090E0772311F081E090E075E0B4 +:102D5000880F991F7A95E1F78065660F660F660FF9 +:102D6000682B550F550F562B542B220F252B2CBD9E +:102D70003DBD88E080937E038AE080937F0389E0F5 +:102D80008093800321E030E002C022E030E0C901FE +:102D900008951CBC1DBC10927E0310927F031092FC +:102DA000800381E090E00895AC0120E008C0E60FC8 +:102DB000F71F80818EBD0DB407FEFDCF2F5FE22F80 +:102DC000F0E0E417F5079CF381E090E00895DC0162 +:102DD00020E030E040E050E014C01EBC08C083E0BA +:102DE000493E580714F088E008954F5F5F4F0DB4D7 +:102DF00007FEF5CF8EB5FB01E20FF31F80832F5F37 +:102E00003F4F2A173B074CF381E00895CF93DF93A0 +:102E1000EC0120E030E0A0E0B0E018C0FE01E20FDD +:102E2000F31F80818EBD08C0119683E0A93EB807CC +:102E30001CF028E030E00FC00DB407FEF5CF8EB5D2 +:102E4000FB01E20FF31F80832F5F3F4F24173507ED +:102E50002CF321E030E0C901DF91CF910895DC012E +:102E600083E480931E0540E050E020E030E019C08C +:102E7000FD01E20FF31F80818EBD09C04F5F5F4FE0 +:102E800083E0493E58071CF028E030E00FC00DB445 +:102E900007FEF4CF8EB5F901E25EFA4F82832F5F11 +:102EA0003F4F2617370724F321E030E020931F051A +:102EB000FB01E05EFA4F1082CB0103960E943B01BA +:102EC0000895BC0184E480931E0540E050E020E0BA +:102ED00030E014C01EBC08C083E0493E580714F01F +:102EE00088E010C04F5F5F4F0DB407FEF5CF8EB581 +:102EF000F901E25EFA4F82832F5F3F4F26173707B3 +:102F00004CF381E080931F05FB01E05EFA4F1082D5 +:102F1000CB0103960E943B01089593E490931E0514 +:102F2000282F30E090E008C0E60FF71F80818EBDAB +:102F30000DB407FEFDCF9F5FE92FF0E0E217F30726 +:102F40009CF381E080931F051092200583E090E0C0 +:102F50000E943B01089581E480931E051CBC1DBCAA +:102F600010927E0310927F031092800381E0809381 +:102F70001F051092200583E090E00E943B01089518 +:102F800090E490931E050E94621680931F05109294 +:102F9000200583E090E00E943B010895CF93DF93EA +:102FA000EC0188818334A9F0843428F4803441F022 +:102FB000813401F50BC0843491F08534D9F413C009 +:102FC0008A816B814C810E94C0171FC00E94AB1781 +:102FD0001CC08A812396BE010E948D1716C08A816B +:102FE00090E00E9461176A81CE01039670E00E9412 +:102FF0002F170BC080931E0583E080931F0510924E +:10300000200583E090E00E943B01DF91CF9108957D +:10301000209A219A229A2398249A259A2C982D98BE +:1030200081E08093890382E080938A0380938B03FD +:1030300080938C0381E090E00895109289031092B0 +:103040008A0310928B0310928C0381E090E0089524 +:10305000289829982A9880E29EE40197F1F7289A07 +:103060008AE0982F9A95F1F72A9A299A8A95F1F78A +:103070000895282F299887FD02C02A9801C02A9A0E +:103080008AE0982F9A95F1F7299A8A95F1F729986D +:1030900026FF02C02A9A01C02A988AE0982F9A95A2 +:1030A000F1F7299A8A95F1F70895880F20E03AE020 +:1030B000299887FF02C02A9A01C02A98932F9A95CF +:1030C000F1F7299A932F9A95F1F72F5F273011F096 +:1030D000880FEECF089520E03AE0299887FF02C0DC +:1030E0002A9A01C02A98932F9A95F1F7299A932F3B +:1030F0009A95F1F72F5F283011F0880FEECF0895E1 +:1031000029982A988AE0982F9A95F1F7299A982F6A +:103110009A95F1F729982898982F9A95F1F7299A76 +:10312000982F9A95F1F729988A95F1F7289A80E0D7 +:103130000895299828982A982B9A08950E9428186B +:1031400080E30E94391880E60E94551808950E9475 +:10315000281880E00E94391880E00E9455182998AC +:1031600028982A982B9A08950F931F93182F062FAB +:103170000E94281880E40E943918812F0E94551857 +:10318000802F0E946B1881E01F910F9108951F936B +:10319000182F0E94281880EC0E943918812F0E9455 +:1031A00055180E9480181F91089529988AE08A95E1 +:1031B000F1F72A9820E080E04AE0880F299A942FBE +:1031C0009A95F1F729981B998F5F3AE0942F9A9579 +:1031D000F1F72F5F283089F72898299A932F9A952D +:1031E000F1F7289A2998932F9A95F1F708951F934C +:1031F000182F0E94281880E80E943918812F0E94F9 +:1032000055180E94D5181F910895DF92EF92FF92F2 +:103210000F931F93CF93DF93D82E7B018A01C0E0D9 +:10322000D0E009C08D2D8C0F0E94F718F801EC0F2B +:10323000FD1F80832196CE15DF05A0F381E090E08D +:10324000DF91CF911F910F91FF90EF90DF90089544 +:103250000F931F93182F062F0E949E18812F602F07 +:103260000E94B41881E01F910F910895DF92EF92B0 +:10327000FF920F931F93CF93DF93D82E7B018A0188 +:10328000C0E0D0E009C0F801EC0FFD1F8D2D8C0FC0 +:1032900060810E9428192196CE15DF05A0F381E0F8 +:1032A00090E0DF91CF911F910F91FF90EF90DF9011 +:1032B000089594E090931E050E94361980931F058F +:1032C0001092200583E090E00E943B010895EF9268 +:1032D000FF920F931F938B019EE1E92E95E0F92E4B +:1032E00093E090931E05A7014E5F5F4F0E94051962 +:1032F00080931F050E5F1F4FE00EF11EF701108235 +:10330000C80101960E943B011F910F91FF90EF9021 +:10331000089582E080931E051092890310928A031B +:1033200010928B0310928C0381E080931F05109202 +:10333000200583E090E00E943B01089581E08093A6 +:103340001E050E94081880931F051092200583E037 +:1033500090E00E943B010895FC018381823069F076 +:10336000833018F48130E1F405C0833049F08430B3 +:10337000B9F40EC00E949E1908950E9489190895FB +:103380006581848170E03696AF010E9467190895C7 +:103390006581848170E03696AF010E9459190895C5 +:1033A000808180931E0583E080931F051092200585 +:1033B00083E090E00E943B0108951F920F920FB6A8 +:1033C0000F9211240F900FBE0F901F9018959C0123 +:1033D0000897029718F024E030E025C0F901E95879 +:1033E000FC4F8DE0828328303105A1F02930310572 +:1033F00019F027E030E017C0259A81E090E0909323 +:1034000089008093880081E88093800089E0809320 +:10341000810007C0249A81E08093B30089E68093FD +:10342000B00021E030E0C90108959C01FC01E95899 +:10343000FC4F82818D3019F026E030E054C02830F6 +:10344000310531F12930310519F027E030E04BC06A +:1034500063307105A9F0643071053CF46130710589 +:1034600059F062307105E9F509C06430710551F019 +:1034700065307105B1F508C081E007C082E005C084 +:1034800083E003C084E001C085E08093810029C00F +:1034900064307105E9F06530710554F462307105EE +:1034A00099F06330710594F461307105D1F40AC06C +:1034B0006630710589F06630710564F0673071051A +:1034C00081F40CC089E60BC08AE609C08BE607C010 +:1034D0008CE605C08DE603C08EE601C08FE68093C2 +:1034E000B00021E030E0C90108959C01FC01E958D9 +:1034F000FC4F82818D3019F026E030E012C0283078 +:10350000310559F02930310519F027E030E009C0C4 +:10351000709389006093880002C06093B30021E03B +:1035200030E0C90108959C0183E580931E05F901EF +:10353000E958FC4F82818D3019F086E090E012C08E +:103540002830310559F02930310519F087E090E035 +:1035500009C0709389006093880002C06093B30033 +:1035600081E090E080931F051092200583E090E0B9 +:103570000E943B01089522E520931E050E94151A22 +:1035800080931F051092200583E090E00E943B018C +:10359000089520E520931E050E94E71980931F05DA +:1035A0001092200583E090E00E943B010895FC0109 +:1035B000E958FC4F12828830910531F0893091052D +:1035C00031F026E030E00BC01092B00004C0109241 +:1035D0008100109280000E94DE1221E030E0C901DB +:1035E000089521E520931E050E94D71A80931F0598 +:1035F0001092200583E090E00E943B010895FC01B9 +:103600008081813579F0823518F48035F1F405C078 +:10361000823569F08335C9F411C0828190E00E943F +:10362000C91A0895828190E00E94F11A0895638179 +:10363000828190E070E00E94BB1A089563818281CC +:1036400090E070E00E94931A089580931E0583E035 +:1036500080931F051092200583E090E00E943B01BB +:103660000895DF93CF93CDB7DEB7CF91DF91089563 +:103670008A3310F4805301C087556A3310F46053C5 +:1036800001C067556F708295807F862B08951F93C8 +:10369000682F62956F70182F1F706A3010F4605D8C +:1036A00001C0695A80E00E947A061A3010F4105D59 +:1036B00001C0195A80E0612F0E947A061F91089577 +:1036C0001F93182F8A3021F480E06DE00E947A0663 +:1036D00080E0612F0E947A0681E090E01F910895BA +:1036E00080E00E94AF0508950F9380E00E94950549 +:1036F00080E069E140E020E000E00E94D10580E048 +:1037000061E00E94E30580E068E00E94020680E03C +:103710006EE40E942E068EEF92E09093B5068093A1 +:10372000B4060F9108958230A1F0833028F48823E5 +:1037300061F0813039F40BC0843079F0843058F076 +:10374000853079F020E030E016C082E107C08EE0DD +:1037500005C088E003C086E001C082E08093E200FB +:1037600002C01092E2008CE08093E30087E3809334 +:10377000E40021E030E0C9010895813091F081300A +:1037800038F08230B9F0833019F120E030E031C0F8 +:103790008091DB008F778093DB008091DB008F7D51 +:1037A00011C08091DB0080688093DB008091DB009A +:1037B0008F7D16C08091DB0080688093DB00809154 +:1037C000DB0080628093DB008091DB008F7E0DC088 +:1037D0008091DB0080688093DB008091DB00806259 +:1037E0008093DB008091DB0080618093DB0021E02F +:1037F00030E0C90108951F93282F162F8FE0809382 +:103800008A0380938B031092AD06442319F081E064 +:103810008093AD061092A1061092A2061092A30604 +:103820001092A406E5EAF6E0119286E0ED3AF80778 +:10383000D9F790E0892F8295807F8093ED001092D8 +:10384000EE001092EF009F5F9F30A1F7822F0E9441 +:10385000931B892B89F0812F0E94BD1B892B61F05E +:103860008091D80082608093D8008091D90082FF37 +:10387000FCCF21E030E002C022E030E0C9011F911E +:1038800008958295807F8093ED0008959B01AC019F +:103890008091AD06882381F4822F8295880F807EE7 +:1038A0008093F60063E056954795379527956A957E +:1038B000D1F72093F7000895DA01C90153E0880F8A +:1038C000991FAA1FBB1F5A95D1F787608093F400F8 +:1038D000292F3A2F4B2F55272093F5009D01442780 +:1038E00055272093F6008B2F9927AA27BB27809373 +:1038F000F7000895EF92FF920F931F938091AD060A +:103900008823C1F42091F20022952695277030E09B +:1039100040E050E08091F30090E003E0880F991FB1 +:103920000A95E1F77C0100E010E0E22AF32A042B7B +:10393000152B33C02091F3008091F200E090F1004C +:103940006091F00090E0A0E0B0E0DC0199278827CA +:1039500030E040E050E0522F442733272227822BCB +:10396000932BA42BB52BFF2400E010E0102F0F2D7C +:10397000FE2CEE248E299F29A02BB12BE62EFF24AE +:1039800000E010E0E82AF92A0A2B1B2B73E01695B9 +:103990000795F794E7947A95D1F7B701C8011F917D +:1039A0000F91FF90EF9008959B01AC018091AD06BF +:1039B000882371F4822F8295880F807E8093F20095 +:1039C000E3E05695479537952795EA95D1F725C0B9 +:1039D00073E0220F331F441F551F7A95D1F7809152 +:1039E000F00090E0A0E0B0E087709070A070B07040 +:1039F000282B392B4A2B5B2B2093F000BB27A52FBC +:103A0000942F832F8093F100CA01AA27BB278093AC +:103A1000F200252F3327442755272093F3000895DC +:103A2000982F8091AD06882321F08091EF0080616E +:103A300003C08091EF008F7E8093EF00923091F170 +:103A4000933028F4992359F0913031F422C0933007 +:103A5000B9F1943009F447C020E030E05AC08091B9 +:103A6000EF008F7B8093EF008091EF008F77809342 +:103A7000EF008091EF008F7D8093EF008091F00048 +:103A80008B7F8093F0008091F4008B7F8093F40013 +:103A90003EC08091EF008E7F8093EF008091EF0019 +:103AA00081601BC08091EF008F778093EF00809141 +:103AB000EF0080648093EF008091EF008F7D20C045 +:103AC0008091EF008F7B8093EF008091EF00806802 +:103AD0008093EF008091EF008F7D8093EF008091C5 +:103AE000F0008B7F12C08091EF008F7B8093EF00FE +:103AF0008091EF0080688093EF008091EF008062FA +:103B00008093EF008091F00084608093F00021E0CA +:103B100030E0C9010895FF920F931F93162F042FD1 +:103B2000F52E8295807F8093ED0084E00E94101D29 +:103B3000193008F018E08091EF00807F812B80938E +:103B4000EF00202F3F2DC901FC0190E004C08191BE +:103B50008093FA009F5F9117D0F31F910F91FF9010 +:103B600008959F92AF92BF92CF92DF92EF92FF9211 +:103B70000F931F93962E59016A01982F9295907F6B +:103B80009093ED00E82FF0E0883080F42091DE0083 +:103B9000E45FFC4F81E090E0008002C0880F991F35 +:103BA0000A94E2F7282B2093DE000FC02091DF005B +:103BB000E45FFC4F81E090E0008002C0880F991F15 +:103BC0000A94E2F7282B2093DF00C801B7010E9476 +:103BD000461CC601B5010E94D41C892D0E94101DEF +:103BE000892B19F021E030E002C022E030E0C90169 +:103BF0001F910F91FF90EF90DF90CF90BF90AF900B +:103C00009F9008958091EF0087FD04C08091EF00A0 +:103C100086FF3CC08091EF0087FD0AC08091EF00D5 +:103C200086FF06C08091F00082FD02C081E0089509 +:103C30008091EF0087FD0AC08091EF0086FF06C0EB +:103C40008091F00082FF02C082E008958091EF0031 +:103C500087FF0AC08091EF0086FD06C08091F000CA +:103C600082FD02C083E008958091EF0087FF0EC0BF +:103C70008091EF0086FD0AC08091EF0085FF06C0AD +:103C80008091F00082FF02C084E0089580E00895F2 +:103C9000EF92FF920F931F93162F042FF52E82950C +:103CA000807F8093ED000E94021EE82E193008F0FC +:103CB00018E08091EF00807F812B8093EF00202F10 +:103CC0003F2DC901FC0190E004C081918093FA006E +:103CD0009F5F9117D0F381E00E94101D8091EE004C +:103CE00086FFFCCF8091EE008F7B8093EE008E2DBF +:103CF0000E94101D81E090E01F910F91FF90EF90C6 +:103D00000895482F893008F048E08091EF00807FC7 +:103D1000842B8093EF00FB0190E004C0819180939D +:103D2000FA009F5F9417D0F30895AC0120E030E0D3 +:103D30008091FA00FA01E20FF31F80832F5F3F4F5B +:103D400028303105A9F70895E82FF0E0883080F495 +:103D50002091DE00E45FFC4F81E090E0008002C033 +:103D6000880F991F0A94E2F7282B2093DE0008950C +:103D70002091DF00E45FFC4F81E090E0008002C012 +:103D8000880F991F0A94E2F7282B2093DF000895EB +:103D9000AEEDB0E02C91ECE0F3E0E80FF11D81E036 +:103DA00090E0008002C0880F991F0A94E2F7809586 +:103DB00082238C9308953091E0002091E100922FAE +:103DC00080E0232F30E0282B392B2115310521F4F9 +:103DD00007C0369527958F5F20FFFBCF8F3008F007 +:103DE0008FEF0895982F9295907F9093ED00AEED10 +:103DF000B0E02C91ECE0F3E0E80FF11D81E090E001 +:103E0000008002C0880F991F0A94E2F780958223F0 +:103E10008C9380E00E94101D81E090E008951F9334 +:103E200010928A0310928B0310E0812F0E94F21EE1 +:103E30001F5F1F30D1F78091D8008D7F8093D8000D +:103E40008091D90082FDFCCF81E090E01F91089520 +:103E50001F938295807F8093ED000E94021E182F91 +:103E600082E00E94101D8091EE0086FFFCCF8091C1 +:103E7000EE008F7B8093EE00812F0E94101D81E069 +:103E800090E01F9108951F920F920FB60F920BB6FC +:103E90000F9211241F932F933F934F935F936F9330 +:103EA0007F938F939F93AF93BF93EF93FF93109163 +:103EB000ED003091E0002091E100922F80E0232F6F +:103EC00030E0282B392B21153105A9F103C0369597 +:103ED00027958F5F20FFFBCF8F3068F58F3F59F11B +:103EE0008295807F8093ED000E947A1C6093A106EA +:103EF0007093A2068093A3069093A406E5EAF6E0E9 +:103F00008091FA00819386E0ED3AF807C9F70E94A4 +:103F10007A1C6093A1067093A2068093A3069093E7 +:103F2000A4068091EE008F7D8093EE0083E00E94D6 +:103F3000101D1093ED00FF91EF91BF91AF919F91F4 +:103F40008F917F916F915F914F913F912F911F9131 +:103F50000F900BBE0F900FBE0F901F90189586E725 +:103F600080931E0581E080931F058091A1069091AA +:103F7000A206A091A306B091A40680932005292F44 +:103F80003A2F4B2F5527209321059D014427552774 +:103F9000209322058B2F9927AA27BB2780932305DF +:103FA0001092A1061092A2061092A3061092A406E7 +:103FB000A5EAB6E026E030E08C91F901E25EFA4F26 +:103FC00080831D922F5F3F4F86E0AD3AB807A1F77F +:103FD00010922C058FE090E00E943B01089595E738 +:103FE00090931E050E94281F80931F0510922005A4 +:103FF00083E090E00E943B01089594E790931E05B2 +:104000000E94F21E80931F051092200583E090E02D +:104010000E943B01089592E790931E050E94481E5E +:1040200080931F051092200583E090E00E943B01E1 +:104030000895EF92FF920F931F9393E790931E05BD +:104040000E94B11D80931F051092200583E090E02F +:104050000E943B011F910F91FF90EF9008950E94E5 +:104060008B1D87E780931E0581E080931F051092CA +:10407000200583E090E00E943B01089581E7809352 +:104080001E050E940F1F80931F051092200583E0DC +:1040900090E00E943B010895462F90E790931E0503 +:1040A00062E00E94FB1B80931F051092200583E0B5 +:1040B00090E00E943B010895EF92FF920F931F93AF +:1040C000FC018081833701F1843748F48137C9F0DE +:1040D000823708F06BC0803709F07FC00DC085378C +:1040E00009F46BC0853708F45DC0863709F469C0F0 +:1040F000873709F072C06AC0828163810E944C20B8 +:1041000077C00E943E2074C00000258130E040E06E +:1041100050E0542F432F322F2227868190E0A0E0D9 +:10412000B0E0DC0199278827280F391F4A1F5B1F41 +:104130008481280F311D411D511D878190E0A0E031 +:10414000B0E0B82FAA2799278827280F391F4A1FC0 +:104150005B1FE184FF2400E010E0102F0F2DFE2CE8 +:10416000EE24828590E0A0E0B0E0DC01992788276A +:10417000E80EF91E0A1F1B1F8085E80EF11C011DA9 +:10418000111D838590E0A0E0B0E0B82FAA27992701 +:104190008827E80EF91E0A1F1B1F828163810E9477 +:1041A000192026C082810E94FD1F22C08281638166 +:1041B0003496AF010E940B201BC082810E94EF1F2A +:1041C00017C0828190E00E94AF1F12C0828163817C +:1041D0003496AF010E942F200BC080931E0583E010 +:1041E00080931F051092200583E090E00E943B0120 +:1041F0001F910F91FF90EF900895DC0180E1A030B6 +:10420000B80710F082E00895F999FECF9D010BC028 +:10421000F999FECF32BD21BDF89A80B5E60FF71FA0 +:1042200080832F5F3F4F822F8A1BE82FF0E0E41737 +:10423000F50770F381E00895DC0180E1A030B80754 +:1042400010F082E00895F999FECF9D0110C0E60FAD +:10425000F71FE081F999FECFC901019632BD21BD5A +:10426000E0BD0FB6F894FA9AF99A0FBE9C01822F1E +:104270008A1BE82FF0E0E417F50748F3C9010E9414 +:10428000FD2081E008950F931F938B0121E8209377 +:104290001E050E941C2180931F051092200500D04E +:1042A00000D000D0EDB7FEB731968BE193E0ADB70B +:1042B000BEB712969C938E93119783E293E09383FB +:1042C00082838AE590E0958384830E940D250F9078 +:1042D0000F908CE293E0EDB7FEB792838183148355 +:1042E00003830E940D250F900F900F900F9083E095 +:1042F00090E00E943B011F910F910895CF92DF92B1 +:10430000EF92FF920F931F937B010EE115E020E8DF +:1043100020931E0522E0C22ED12CC00ED11EB60164 +:10432000A7010E94FD2080931F0582E090E0E80E27 +:10433000F91E0E0D1F1DD8011C9200D000D000D018 +:10434000EDB7FEB731968BE193E0ADB7BEB71296ED +:104350009C938E93119783E293E09383828385E30A +:1043600090E0958384830E940D250F900F9089E340 +:1043700093E0EDB7FEB792838183D482C3820E941B +:104380000D250F900F900F900F90C70101960E947E +:104390003B011F910F91FF90EF90DF90CF90089518 +:1043A000EF92FF920F931F93CF93DF93EC019B81CA +:1043B00080E02A817C01E20EF11C9D8180E02C814D +:1043C0008C01020F111D00D000D000D0EDB7FEB758 +:1043D00031968BE193E0ADB7BEB712969C938E9366 +:1043E000119783E293E0938382838AE190E095833F +:1043F00084830E940D25EDB7FEB7319683E493E0E8 +:10440000ADB7BEB712969C938E9311971383028318 +:10441000F582E4820E940D2588812DB73EB72A5F80 +:104420003F4F0FB6F8943EBF0FBE2DBF803819F036 +:10443000813869F405C0C701B8010E947E2112C00D +:104440002696C701BE01A8010E9443210BC080939C +:104450001E0583E080931F051092200583E090E005 +:104460000E943B01DF91CF911F910F91FF90EF9040 +:104470000895CF93DF93EB0190E003978632910587 +:1044800048F4865B9F4FFC01EE0FFF1F0590F491EF +:10449000E02D099480E0BCC188E290E09983888394 +:1044A00086E290E09B838A8387E290E0B0C088E256 +:1044B00090E09983888386E290E09B838A8387E2F9 +:1044C00090E058C188E290E09983888386E290E08A +:1044D0009B838A8387E290E076C088E290E09983AC +:1044E000888386E290E09B838A8387E290E05DC0C8 +:1044F00088E290E09983888386E290E09B838A83B8 +:1045000087E290E044C088E290E09983888386E265 +:1045100090E09B838A8387E290E02BC088E290E062 +:104520009983888386E290E09B838A8387E290E088 +:104530005CC181E390E0998388838FE290E09B8364 +:104540008A8380E390E05FC181E390E09983888370 +:104550008FE290E09B838A8380E390E046C181E311 +:1045600090E0998388838FE290E09B838A8380E345 +:1045700090E09D838C8385E049C181E390E099833D +:1045800088838FE290E09B838A8380E390E09D8321 +:104590008C8384E03BC181E390E0998388838FE240 +:1045A00090E09B838A8380E390E09D838C8383E00B +:1045B0002DC181E390E0998388838FE290E09B8313 +:1045C0008A8380E390E09D838C8382E01FC181E336 +:1045D00090E0998388838FE290E09B838A8380E3D5 +:1045E00090E0C8C081E390E0998388838FE290E0F7 +:1045F0009B838A8380E390E00AC08EE290E09983F7 +:1046000088838CE290E09B838A838DE290E09D8397 +:104610008C831E82FCC08EE290E0998388838CE2BA +:1046200090E09B838A838DE290E0A4C08EE290E0CC +:10463000998388838CE290E09B838A838DE290E06B +:10464000C2CF8EE290E0998388838CE290E09B83D6 +:104650008A838DE290E0A9CF8EE290E099838883EF +:104660008CE290E09B838A838DE290E082CF8EE2A1 +:1046700090E0998388838CE290E09B838A838DE22B +:1046800090E0B3C08EE290E0998388838CE290E062 +:104690009B838A838DE290E0B6C085E290E09983A7 +:1046A000888383E290E09B838A8384E290E0AFCFAB +:1046B00085E290E09983888383E290E09B838A83FC +:1046C00084E290E057C085E290E09983888383E29A +:1046D00090E09B838A8384E290E075CF85E290E04E +:1046E0009983888383E290E09B838A8384E290E0CD +:1046F0005CCF85E290E09983888383E290E09B839E +:104700008A8384E290E043CF85E290E099838883B6 +:1047100083E290E09B838A8384E290E02ACF85E263 +:1047200090E09983888383E290E09B838A8384E28C +:1047300090E05BC085E290E09983888383E290E01B +:104740009B838A8384E290E05EC08BE290E0998351 +:10475000888389E290E09B838A838AE290E057CF46 +:104760008BE290E09983888389E290E09B838A833F +:104770008AE290E09D838C8381E08E8349C08BE246 +:1047800090E09983888389E290E09B838A838AE220 +:1047900090E019CF8BE290E09983888389E290E0E2 +:1047A0009B838A838AE290E000CF8BE290E099833A +:1047B000888389E290E09B838A838AE290E0E7CE57 +:1047C0008BE290E09983888389E290E09B838A83DF +:1047D0008AE290E0CECE8BE290E09983888389E2F2 +:1047E00090E09B838A838AE290E09D838C8386E0BD +:1047F0000DC08BE290E09983888389E290E09B83EF +:104800008A838AE290E09D838C8387E08E8381E0B7 +:10481000DF91CF910895CF93DF93BC018230910552 +:1048200010F462E070E0A091B006B091B106ED0125 +:10483000E0E0F0E040E050E021C0888199818617F7 +:10484000970769F48A819B81309719F0938382835B +:1048500004C09093B1068093B006FE0134C068177F +:10486000790738F44115510519F08417950708F4B4 +:10487000AC01FE018A819B819C01E9012097E9F648 +:1048800041155105A9F1CA01861B970B049708F43D +:10489000BA01E0E0F0E02AC08D919C911197841755 +:1048A0009507F9F46417750781F412968D919C9120 +:1048B0001397309719F09383828304C09093B106C5 +:1048C0008093B006FD0132964CC0CA01861B970B3F +:1048D000FD01E80FF91F6193719302978D939C93EB +:1048E00040C0FD01828193819C01D9011097A1F6FE +:1048F0008091AE069091AF06892B41F480916A03B6 +:1049000090916B039093AF068093AE0640916C0339 +:1049100050916D034115510541F44DB75EB780913B +:10492000680390916903481B590B2091AE063091A2 +:10493000AF06CA01821B930B8617970780F0AB0165 +:104940004E5F5F4F8417950750F0420F531F5093EF +:10495000AF064093AE06F9016193719302C0E0E0A7 +:10496000F0E0CF01DF91CF910895CF93DF930097CF +:1049700009F450C0EC0122971B821A82A091B00664 +:10498000B091B106109709F140E050E0AC17BD07B7 +:1049900008F1BB83AA83FE0121913191E20FF31F3D +:1049A000AE17BF0779F48D919C911197280F391F8D +:1049B0002E5F3F4F3983288312968D919C911397D8 +:1049C0009B838A834115510571F4D093B106C0933E +:1049D000B00620C012968D919C911397AD0100975F +:1049E00011F0DC01D3CFFA01D383C283219131913D +:1049F000E20FF31FCE17DF0769F488819981280F32 +:104A0000391F2E5F3F4FFA01318320838A819B81BA +:104A100093838283DF91CF910895A0E0B0E0E3E13A +:104A2000F5E20C940B28FE0135966191719180910D +:104A3000B4069091B506AF010E9457252096E2E09A +:104A40000C9427280F931F93CF93DF938C01E09151 +:104A5000B406F091B506838181FF21C0C0E0D0E0AB +:104A60000DC0E091B406F091B50620853185BF01F7 +:104A7000F9010995892B11F0CFEFDFEFF801819152 +:104A80008F01882371F7E091B406F091B506208577 +:104A900031858AE0BF01F9010995892B11F0CFEF2B +:104AA000DFEFCE01DF91CF911F910F910895ABE021 +:104AB000B0E0EDE5F5E20C94FB273C012B015A0137 +:104AC000FC0117821682838181FD03C06FEF7FEFA7 +:104AD000C6C19AE0892E1E010894211C311CF301E5 +:104AE0002381F20123FD859123FF81912F018823EA +:104AF00009F4B2C1853239F423FD859123FF8191F8 +:104B00002F01853229F490E0B3010E944A27E7CFB4 +:104B1000982FFF24EE249924FFE1FF15D0F09B325B +:104B200069F09C3228F4903259F0933291F40EC01F +:104B30009D3249F0903369F441E024C052E0F52AF7 +:104B400084E0F82A28C098E0F92A25C0E0E1FE2A8E +:104B500022C0F7FC29C0892F80538A3070F4F6FEFA +:104B600005C0989C902C1124980E15C0E89CE02C50 +:104B70001124E80EF0E2FF2A0EC09E3229F4F6FC62 +:104B80006BC140E4F42A07C09C3619F450E8F52ABA +:104B900002C0983649F4F20123FD959123FF9191CB +:104BA0002F01992309F0B8CF892F8554833018F04D +:104BB0008052833038F444E050E0A40EB51E5FE329 +:104BC00059830FC0933631F0933779F0933509F05C +:104BD00056C020C0F5018081898342E050E0A40ED8 +:104BE000B51E610101E010E012C0F501C080D18066 +:104BF000F6FC03C06FEF7FEF02C0692D70E042E06A +:104C000050E0A40EB51EC6010E943F278C015FE74D +:104C1000F52214C0F501C080D180F6FC03C06FEF0F +:104C20007FEF02C0692D70E042E050E0A40EB51E97 +:104C3000C6010E9434278C0150E8F52AF3FE07C014 +:104C40001AC080E290E0B3010E944A27EA948E2DB8 +:104C500090E008171907A8F30EC0F601F7FC85913C +:104C6000F7FE81916F0190E0B3010E944A27E110A5 +:104C7000EA94015010400115110579F7EAC0943605 +:104C800011F0993669F5F7FE08C0F50120813181F0 +:104C90004281538184E090E00AC0F50180819181D6 +:104CA0009C01442737FD4095542F82E090E0A80EE8 +:104CB000B91E9FE6F92257FF09C0509540953095DF +:104CC00021953F4F4F4F5F4FE0E8FE2ACA01B901DF +:104CD000A1012AE030E00E947627D82ED21840C0E9 +:104CE000953729F41F2D1F7E2AE030E01DC01F2DAF +:104CF000197F9F3661F0903720F4983509F0ACC0E9 +:104D00000FC0903739F0983709F0A6C004C028E0EA +:104D100030E00AC0106114FD146020E130E004C0EE +:104D200014FD166020E132E017FF08C0F501608134 +:104D300071818281938144E050E008C0F501808157 +:104D40009181BC0180E090E042E050E0A40EB51EED +:104D5000A1010E947627D82ED2188FE7F82EF122D3 +:104D6000F6FE0BC05EEFF522D91438F4F4FE07C04E +:104D7000F2FC05C08FEEF82202C01D2D01C0192DD6 +:104D8000F4FE0DC0FE01ED0DF11D8081803319F49C +:104D900099EEF92208C01F5FF2FE05C003C08F2DF7 +:104DA000867809F01F5F0F2DF3FC14C0F0FE0FC0D2 +:104DB0001E1510F09D2C0BC09D2C9E0C911A1E2DC3 +:104DC00006C080E290E0B3010E944A271F5F1E15D3 +:104DD000C0F304C01E1510F4E11A01C0EE2404FF54 +:104DE0000FC080E390E0B3010E944A2702FF1DC07C +:104DF00001FD03C088E790E00EC088E590E00BC09D +:104E0000802F867891F001FF02C08BE201C080E222 +:104E1000F7FC8DE290E0B3010E944A2706C080E3D0 +:104E200090E0B3010E944A279A94D914C0F3DA940F +:104E3000F101ED0DF11D808190E0B3010E944A2740 +:104E4000DD20A9F706C080E290E0B3010E944A2766 +:104E5000EA94EE20C1F743CEF30166817781CB015E +:104E60002B96E2E10C941728FC01059061507040EC +:104E70000110D8F7809590958E0F9F1F0895FC0123 +:104E80006150704001900110D8F7809590958E0F79 +:104E90009F1F08950F931F93CF93DF938C01EB0116 +:104EA0008B8181FF1BC082FF0DC02E813F818C81D1 +:104EB0009D812817390764F4E881F9810193F9830A +:104EC000E88306C0E885F985802F0995892B31F4A0 +:104ED0008E819F8101969F838E8302C00FEF1FEF0B +:104EE000C801DF91CF911F910F910895FA01AA2770 +:104EF000283051F1203181F1E8946F936E7F6E5F1D +:104F00007F4F8F4F9F4FAF4FB1E03ED0B4E03CD0CA +:104F1000670F781F891F9A1FA11D680F791F8A1FAD +:104F2000911DA11D6A0F711D811D911DA11D20D014 +:104F300009F468943F912AE0269F11243019305DCE +:104F40003193DEF6CF010895462F4770405D4193BF +:104F5000B3E00FD0C9F7F6CF462F4F70405D4A330C +:104F600018F0495D31FD4052419302D0A9F7EACFD4 +:104F7000B4E0A6959795879577956795BA95C9F703 +:104F800000976105710508959B01AC010A2E0694F6 +:104F90005795479537952795BA95C9F7620F731FAF +:104FA000841F951FA01D089597FB092E07260AD080 +:104FB00077FD04D00CD006D000201AF470956195CE +:104FC0007F4F0895F6F7909581959F4F0895AA1BFE +:104FD000BB1B51E107C0AA1FBB1FA617B70710F0E4 +:104FE000A61BB70B881F991F5A95A9F78095909516 +:104FF000BC01CD0108952F923F924F925F926F9224 +:105000007F928F929F92AF92BF92CF92DF92EF9258 +:10501000FF920F931F93CF93DF93CDB7DEB7CA1BD9 +:10502000DB0B0FB6F894DEBF0FBECDBF09942A8804 +:10503000398848885F846E847D848C849B84AA84AC +:10504000B984C884DF80EE80FD800C811B81AA8139 +:10505000B981CE0FD11D0FB6F894DEBF0FBECDBF04 +:08506000ED010895F894FFCF63 +:10506800456D62656464656450726F6A65637473E4 +:10507800004F63746F70757355534220496E7465A1 +:10508800726661636520436F6E766572746572201F +:10509800616E6420492F4F20457874656E73696F7F +:1050A8006E0032303039303731380025732C2564A2 +:1050B8003A20006D61696E2E630066697273742010 +:1050C8007061636B6574206F662061206C6F6E671A +:1050D800206D65737361676520286C656E677468F9 +:1050E8003A202564290A006F63746F707573206C09 +:1050F8006F6E672072756E6E696E67206D6573736B +:10510800616765006F63746F7075732E6C6F6E677F +:105118005F696E646578203C206F63746F70757387 +:105128002E6C6F6E675F6279746573006E6F7420A2 +:105138006C617374207061636B65743A206469668E +:1051480066203E203634006C617374207061636B96 +:105158006574007061727365722C20636865636B97 +:105168003A2025582C20636F6D6D616E643A2025B6 +:10517800580A0063616C6C696E6720696F5F7061C3 +:10518800727365720063616C6C696E672061646339 +:105198005F7061727365720063616C6C696E672021 +:1051A8006932635F7061727365720063616C6C6908 +:1051B8006E67207370695F706172736572006361F6 +:1051C8006C6C696E672070776D5F70617273657261 +:1051D8000063616C6C696E672063616E5F706172F9 +:1051E8007365720063616C6C696E672065657072C7 +:1051F8006F6D5F70617273657200756E6B6E6F773D +:105208006E20636D6400726563656976696E6720F8 +:10521800636F6D6D616E643A20255820286C656E49 +:105228006774683A202575290A00676574206E65D9 +:1052380078740067657420616E64206578656375AD +:1052480074650009040025732C25643A2000616404 +:10525800632E6300576572742025690D0A000000EB +:10526800000200000000601B0000000000010203B3 +:10527800040506070001020304050625732C2564AE +:105288003A2000656570726F6D2E630077726974DD +:1052980074656E3A2025730A00726561643A2025A8 +:1052A800730A00656570726F6D5F70617273657205 +:1052B8003A206C656E6774683A2025752C20616405 +:0E52C80064723A2025750A002000B806000026 :00000001FF diff --git a/firmware/octopus_can_stable_1_1.hex b/firmware/octopus_can_stable_1_1.hex new file mode 100644 index 0000000..cf06536 --- /dev/null +++ b/firmware/octopus_can_stable_1_1.hex @@ -0,0 +1,1133 @@ +:100000000C94FA000C9419010C9419010C94190128 +:100010000C9419010C94EB030C9419010C94190124 +:100020000C9419010C9419010C9419010C941901E8 +:100030000C94BF190C9419010C9419010C9419011A +:100040000C9419010C94C4030C94E61F0C94190130 +:100050000C9419010C941B010C9419010C941901B6 +:100060000C9419010C9419010C9419010C941901A8 +:100070000C9419010C9419010C9419010C94190198 +:100080000C9419010C9419010C9419010C94190188 +:100090000C941901061008100A100C100E10101004 +:1000A00012101410161018101A101C101E10201008 +:1000B00022102410261028102A1054105410541006 +:1000C0005410541054102C102E10301032103410C4 +:1000D0003A103810361038103A103C103E104010CC +:1000E00042104410461048104A104E109D109F10A8 +:1000F000A110A310A510A710A910AB10AD10AF1040 +:10010000B110B310B510B710B910BB10BD10BF10AF +:10011000C110EB10EB10EB10EB10EB10EB10C31059 +:10012000C510C710C910CB10D110CF10CD10CF10F3 +:10013000D110D310D510D710D910DB10DD10DF107F +:10014000E110E51056115C11621168116E11741105 +:100150007A11801186118C11921198119E11A4119F +:10016000AA11B011B611BC11C21153115311531180 +:10017000531153115311C811CE11D411DA11E011DA +:10018000F211EC11E611EC11F211F811FE1104124A +:1001900010120A120A12101216121C12651268129C +:1001A0006B126E127112741277127A127D12801213 +:1001B0008312861289128C128F1292129512981243 +:1001C0009B126212621262126212621262129E121A +:1001D000A112A412A712AA12B312B012AD12B01239 +:1001E000B312B612B912BC12C212BF12BF12C2129F +:1001F000C512C81211241FBECFEFD0E1DEBFCDBFA4 +:1002000013E0A0E0B1E0E8E7F4E400E00BBF02C0D7 +:1002100007900D92A633B107D9F716E0A6E3B3E035 +:1002200001C01D92A937B107E1F70E9430010C947B +:100230003B220C9400001F920F920FB60F921124D4 +:100240000F900FBE0F901F901895FC0120E030E03A +:1002500002C02F5F3F4F81918823D9F7C9010895CC +:10026000CCEFD0E1DEBFCDBFF8940E9464090E94BC +:10027000D20E8FEF84B985B92F980E94BE0981E80C +:1002800097E10E94090A85E69CE00E940E0A81E03F +:1002900090E00E94130ADE011196E2EEF2E083E0A4 +:1002A00001900D928150E1F7CE0101960E94080E57 +:1002B00080E091E00E94A40E81E191E00E949C0EFA +:1002C00082E491E00E94940E0E94DE0D4C0164E6EF +:1002D00070E00E94210A60E070E0C4010E944A0DB3 +:1002E0003C0140E050E0BC01C4010E94420A22E10E +:1002F000A22E22E0B22ECC24DD2490E4E92EF12CB3 +:1003000002E021E030E041E050E0B301C4010E948E +:10031000DF0C84E3A82E83E0B82E21E030E041E03A +:1003200050E0B301C4010E94170D10929403109283 +:10033000930310929603109295030E94041B8FE77B +:1003400087B98AE288B90E940F0485E588B90E94BE +:100350000F0418B80E94580F0E9464090E94D70E1B +:100360007894FFCF0F931F93CF93DF93EC018134E9 +:10037000910510F180919F039091A003892BE1F4E6 +:10038000DF93CF938BE491E09F938F930E94FD1AAC +:1003900010929C0310929B03D0939E03C0939D03E5 +:1003A00081E090E09093A00380939F03C0E4D0E0AD +:1003B0000F900F900F900F9068E08BE20E94A909B8 +:1003C00000E010E00EC0E0919B03F0919C03E00F71 +:1003D000F11FEB51FB4F608189E20E94A9090F5F79 +:1003E0001F4F0C171D0779F7809193039091940389 +:1003F000019749F467E08BE20E94A90910929403E7 +:10040000109293030AC063E08BE20E94A90981E085 +:1004100090E09093940380939303DF91CF911F9189 +:100420000F910895CF93DF9380919F039091A00344 +:10043000019709F04CC088E791E09F938F930E9449 +:10044000FD1A20919B0330919C0380919D03909114 +:100450009E030F900F9028173907C8F586E991E0A1 +:100460009F938F930E94FD1AC0919D03D0919E038C +:1004700080919B0390919C03C81BD90B80919B0397 +:1004800090919C03805C9F4F90939C0380939B036F +:100490000F900F90C134D1055CF08FEB91E09F93EA +:1004A0008F930E94FD1A80E490E00E94B2010DC07B +:1004B0008BED91E09F938F930E94FD1ACE010E94D5 +:1004C000B2011092A00310929F030F900F90DF9142 +:1004D000CF9108950F931F93CF93DF938C011092C8 +:1004E0009C0310929B031092A00310929F032F9ADB +:1004F000FC018081282F22952F70C22FDD2799279C +:100500009F938F93DF93CF9388EE91E09F938F9388 +:100510000E94FD1A8DB79EB706960FB6F8949EBF3F +:100520000FBE8DBFC430D10509F451C0C530D1050F +:1005300084F4C130D10569F1C230D1051CF4CD2B52 +:10054000C1F077C0C230D10571F1239709F071C0B5 +:1005500034C0C630D10509F44EC0C630D1050CF404 +:1005600040C0C730D10509F450C0289709F061C0D8 +:1005700056C0F8018081863041F48281813009F0D3 +:100580006DC0C8010E948C1969C0C8010E94510F3A +:1005900065C088E092E09F938F930E94FD1AC80186 +:1005A0000E94AA1359C08BE192E09F938F930E94FF +:1005B000FD1AC8010E940C154FC08FE292E09F9374 +:1005C0008F930E94FD1AC8010E942C1645C083E437 +:1005D00092E09F938F930E94FD1AC8010E94AA1770 +:1005E0003BC087E592E09F938F930E94FD1AC8015C +:1005F0000E94CB1A31C08BE192E09F938F930E94AF +:10060000FD1AC8010E94F60527C08BE692E09F9371 +:100610008F930E94FD1AC8010E94431F1DC08FE7DF +:1006200092E09F938F930E94FD1AC8010E94CA20F6 +:1006300013C086E992E09F938F930E94FD1AF80100 +:1006400080818093E50483E08093E6041092E704C0 +:1006500083E090E00E94B2010F900F902F98DF91FD +:10066000CF911F910F9108950F931F93CF93DF9315 +:10067000EC018C010F5F1F4F898199279F938F9306 +:1006800083EA92E09F938F930E94FD1A80919503D5 +:10069000909196030F900F900F900F90019791F506 +:1006A00087EC92E09F938F930E94FD1A20E030E048 +:1006B0000F900F90E0919703F0919803E20FF31FD2 +:1006C000DE01A20FB31F8C91EB55FC4F80832F5F8F +:1006D0003F4F2034310571F7809197039091980333 +:1006E000805C9F4F9093980380939703209197038A +:1006F000309198038091990390919A0328173907B4 +:10070000F0F128C081ED92E09F938F930E94FD1A33 +:10071000109298031092970320E030E00F900F9012 +:10072000E0919703F0919803E20FF31FDE01A20F0F +:10073000B31F8C91EB55FC4F80832F5F3F4F2034CC +:10074000310571F73093980320939703F8012081C6 +:10075000203448F4109296031092950385EA93E0B2 +:100760000E946A020CC081E090E09093960380930F +:100770009503822F992790939A0380939903DF9191 +:10078000CF911F910F9108951F920F920FB60F9264 +:1007900011242F933F934F935F936F937F938F9386 +:1007A0009F93AF93BF93EF93FF930E94230F80918A +:1007B0003F0386BDFF91EF91BF91AF919F918F91C4 +:1007C0007F916F915F914F913F912F910F900FBE4D +:1007D0000F901F9018951F920F920FB60F92112431 +:1007E0002F933F934F935F936F937F938F939F9339 +:1007F000AF93BF93EF93FF930E94AC0EFF91EF91E5 +:10080000BF91AF919F918F917F916F915F914F9128 +:100810003F912F910F900FBE0F901F90189520E0E1 +:1008200080E49CE90197F1F72F5F2931C9F708951A +:10083000882329F0813071F084E090E008958EE003 +:100840008093690380936A0388E18093C10081E00B +:1008500090E008958EE080934E0380934F0388E1EB +:100860008093C90081E090E00895882329F08130C9 +:1008700091F084E090E008951092690310926A0369 +:100880001092C5001092C4001092C1001092C200D4 +:1008900081E090E0089510924E0310924F03109261 +:1008A000CD001092CC001092C9001092CA0081E0D5 +:1008B00090E008950F93882329F0813041F084E07F +:1008C00090E00BC02093C5006093C40004C0209347 +:1008D000CD006093CC0081E090E00F9108956230EC +:1008E00011F492E001C090E0882329F0813071F08A +:1008F00084E090E008958091C200990F990F990FBC +:10090000982B9093C20081E090E008958091CA00F6 +:10091000990F990F990F982B9093CA0081E090E05E +:100920000895663061F0673019F0653019F404C03D +:1009300021E003C021E004C020E090E002C020E0FC +:1009400091E0882329F0813079F084E090E00895E7 +:100950008091C200220F220F990F922B982B909317 +:10096000C20081E090E008958091CA00220F220F1A +:10097000990F922B982B9093CA0081E090E00895F4 +:10098000653439F06F3419F421E091E004C020E0BF +:1009900001C021E090E0882329F0813089F084E0D3 +:1009A00090E008958091C2002295220F207E9295BA +:1009B000907F922B982B9093C20081E090E0089555 +:1009C0008091CA002295220F207E9295907F922BD3 +:1009D000982B9093CA0081E090E00895882329F035 +:1009E000813061F084E090E008958091C00085FF3F +:1009F000FCCF6093C60081E090E008958091C8002C +:100A000085FFFCCF6093CE0081E090E00895FF92D7 +:100A10000F931F93CF93DF93F82EEB018A0181E0B0 +:100A20008F1548F484E090E00DC0F80161918F01CA +:100A30008F2D0E94EE042197FFEFCF3FDF07A9F72C +:100A400081E090E0DF91CF911F910F91FF90089589 +:100A5000882329F0813051F084E090E0089580915E +:100A6000C00087FFFCCF8091C60006C08091C800FF +:100A700087FFFCCF8091CE0099270895FF920F93B6 +:100A80001F93CF93DF93F82E8B0181E08F1518F41D +:100A900084E090E00EC0EA0107C08F2D0E94280577 +:100AA000F80181938F0121971C161D06B4F381E094 +:100AB00090E0DF91CF911F910F91FF9008957727DC +:100AC0000E9407058093E6041092E70483E090E01B +:100AD0000E94B20108950E9491048093E60410924E +:100AE000E70483E090E00E94B20108950E9491041F +:100AF0008093E6041092E70483E090E00E94B20144 +:100B000008950E946F048093E6041092E70483E046 +:100B100090E00E94B20108950F930E945A048093BE +:100B2000E6041092E70483E090E00E94B2010F9186 +:100B300008950E9435048093E6041092E70483E050 +:100B400090E00E94B20108950E9418048093E60488 +:100B50001092E70483E090E00E94B2010895CF92E2 +:100B6000DF92EF92FF920F931F93CF93DF93CDB756 +:100B7000DEB78B01CDB6DEB62DB73EB7261B370BE1 +:100B80000FB6F8943EBF0FBE2DBFEDB6FEB608946B +:100B9000E11CF11CAB01B7010E943E058093E60405 +:100BA00020E030E00AC0F701E20FF31F8081F90175 +:100BB000E951FB4F80832F5F3F4F201731079CF394 +:100BC000F801E951FB4F1082C80103960E94B2015F +:100BD0000FB6F894DEBE0FBECDBEDF91CF911F9150 +:100BE0000F91FF90EF90DF90CF9008950F93FC014D +:100BF00080818093E504843611F1853648F482368D +:100C0000B1F08336E0F4803651F0813681F50BC0C7 +:100C1000873639F18836E9F0853649F515C0828185 +:100C20000E94A4052DC082810E94990529C00681D9 +:100C300025814481638182810E948C0521C063816A +:100C400082810E9481051CC0638182810E946B05A4 +:100C500017C0AF014C5F5F4F638182810E945F05C7 +:100C60000FC06381772782810E94AF0509C083E0AE +:100C70008093E6041092E70483E090E00E94B201C2 +:100C80000F91089587E280934D0685E280934C068C +:100C900090E290934E0610924F0628E030E0309399 +:100CA00051062093500683E28093590681E2809397 +:100CB000580690935A0610925B0630935D06209377 +:100CC0005C06089508956091650681E20E94A90975 +:100CD000089568E08BE20E94A90961E188E20E9420 +:100CE000A90968E08FE20E94A90961E18CE20E94F3 +:100CF000A90961E08FE20E94A90910929403109261 +:100D0000930365E083E20E94A90908950F931F935E +:100D10008C0160E480E20E94A909F80162816058B8 +:100D200084E00E94A909F8018281809364061F91E2 +:100D30000F9108950F931F93CF93DF93EC012885B4 +:100D4000398512161306DCF58E819F818217930771 +:100D50001CF568E083E20E94A90900E010E00FC0E2 +:100D60008A859B85E80FF91F608181E20E94A909AD +:100D70008E819F8101969F838E830F5F1F4FEE812F +:100D8000FF8188859985083011051CF4E817F9075B +:100D90003CF3E817F90724F061E087E20E94A90913 +:100DA0008B81813031F465E089810E94A9091B8221 +:100DB00006C061E089810E94A90981E08B83DF91EF +:100DC000CF911F910F910895CF93DF93CDB7DEB7E9 +:100DD00024970FB6F894DEBF0FBECDBFDC01FC0137 +:100DE0002281338110925F0610925E0681E080932B +:100DF0005B06832F99278230D9F0833069F18130E7 +:100E000009F057C080913806992790936106809326 +:100E1000600688E396E0909363068093620686817D +:100E200097818034910509F044C088E090E029C0A2 +:100E3000FD01868197819093610680936006E22F81 +:100E4000FF27EE0FFF1F80914A0690914B06E80F97 +:100E5000F91F8081918129C02223C1F0E22FFF2751 +:100E6000EE0FFF1F8091A3039091A403E80FF91FD9 +:100E70000190F081E02DF0936306E093620680819B +:100E80009927909361068093600613C094E099833C +:100E900083E08A8389E08B839C8384E090E0909355 +:100EA000610680936006CE0101969093630680935D +:100EB000620688E596E00E949A0624960FB6F8949A +:100EC000DEBF0FBECDBFDF91CF910895CF93DF93EB +:100ED00082E20E948409C82FDD27C5FF1AC068E09E +:100EE00083E20E94A909C6FF10C020915E063091DE +:100EF0005F068091600690916106281739072CF4EF +:100F000088E596E00E949A0604C061E087E20E94AC +:100F1000A909DF91CF9108951F93CF93DF9388E0C4 +:100F20000E948409182FC82FDD27C6FF18C060E073 +:100F300085E00E94A90960E884E00E94A90960E0B8 +:100F400080E20E94A90968E083E20E94A90961E0A9 +:100F500087E20E94A90962E085E00E94A909C4FF16 +:100F600004C060EC89E00E94A90917FF04C060ED8D +:100F700089E00E94A909DF91CF911F9108958AE02D +:100F80000E948409992780FF03C00E946607089584 +:100F900081FF0DC08AE20E9484098091250681307C +:100FA00061F4E0912806F09129060995089582E3FD +:100FB0000E9484098AE30E94840908958EE00E94B9 +:100FC000840968E08FE20E94A90961E08FE20E9433 +:100FD000A909209160063091610680915C0690918C +:100FE0005D06821793075CF468E083E20E94A9091A +:100FF00061E087E20E94A90981E080935B06089581 +:10100000AF92BF92CF92DF92EF92FF920F931F9316 +:10101000CF93DF93CDB7DEB728970FB6F894DEBF36 +:101020000FBECDBF86E20E94840986FF7EC08E017E +:101030000F5F1F4F580169E0C62ED12CCC0EDD1E6C +:1010400080914C060E948409F80181938F017501FB +:10105000EC15FD05A9F768E087E20E94A90968E0A0 +:1010600083E20E94A90980E20E9484098F77682F99 +:1010700080E20E94A9098981992780769070803248 +:10108000910509F440C080349105D1F1892BF1F527 +:10109000F50181818630D9F0873048F48130F1F153 +:1010A0008130C8F08330D1F1853081F521C089309D +:1010B00019F18A3018F4883049F505C08A3071F189 +:1010C0008B3021F520C0C5010E94630627C0C501F1 +:1010D0000E94E40623C068E083E20E94A90961E05F +:1010E00081E20E94A90960E081E20E94A9090BC087 +:1010F000C5010E94860612C0C5010E9469060EC085 +:10110000C5010E94620965E083E206C080E20E9498 +:1011100084098058682F80E20E94A909F701808124 +:101120008823D1F465E083E215C0209160063091F8 +:10113000610680915C0690915D068217930764F4C6 +:10114000109261061092600668E083E20E94A9098D +:1011500061E087E20E94A90928960FB6F894DEBFE5 +:101160000FBECDBFDF91CF911F910F91FF90EF90F8 +:10117000DF90CF90BF90AF900895CF92DF92EF9223 +:10118000FF920F931F93CF93DF93CDB7DEB7C05479 +:10119000D0400FB6F894DEBF0FBECDBF8CE00E94EA +:1011A0008409992780FF03C00E9400087BC081FF4B +:1011B0002AC08EE20E9484098DE20E9484098983FC +:1011C0008E010F5F1F4F6801FFE3EF2EF12CE00E41 +:1011D000F11E0F5F1F4F0E947209F80180830E15E8 +:1011E0001F05B9F780913603813031F4E09139035E +:1011F000F0913A03C601099568E08FE20E94A909BF +:1012000061E08FE22BC082FF2CC086E30E9484093C +:1012100085E30E94840989838E010F5F1F4F680157 +:10122000EFE3EE2EF12CE00EF11E0F5F1F4F0E9438 +:101230007209F80180830E151F05B9F780913703F5 +:10124000813031F4E0913B03F0913C03C6010995F4 +:1012500068E087E30E94A90961E087E30E94A90989 +:1012600021C083FF1FC08EE30E9484098E010F5F9F +:101270001F4F680171E4E72EF12CEC0EFD1E8DE38B +:101280000E948409F80181938F01EE15FF05B9F7DB +:1012900080913803813031F4E0913903F0913A03C1 +:1012A000C6010995C05CDF4F0FB6F894DEBF0FBED4 +:1012B000CDBFDF91CF911F910F91FF90EF90DF9005 +:1012C000CF9008950895089581E080936A0080E1A9 +:1012D0008DBB83B3876083BB84B3836084BB3F9A39 +:1012E000479A089588B1805888B984B322E082274C +:1012F00084BB0000000080B198B1905898B994B3B5 +:10130000922794BB992708959FEF91B982B988B12C +:10131000805888B984B395E0892784BB88B1805808 +:1013200088B984B3892784BB000011B80E94720970 +:101330009927089582B988B1805888B984B391E01B +:10134000892784BB88B1805888B984B3892784BB36 +:10135000089582B98FEF81B988B1805888B984B374 +:1013600095E0892784BB88B1805888B984B38927E0 +:1013700084BB862F0E949A090895089582E1809384 +:10138000380681E08093390680E191E090933B0636 +:1013900080933A0610923C0610923D0610923E064B +:1013A00088E080933F06109241061092400610920A +:1013B000430610924206109245061092440610927F +:1013C000460610924706109248061092490610925F +:1013D00036031092370310923803109225061092AC +:1013E00026061092270610922F0610922E061092B3 +:1013F000A2031092A10308959093410680934006A2 +:10140000709343066093420650934506409344060A +:101410000895909341068093400608959093430663 +:10142000809342060895909345068093440608955C +:1014300080933C06089580933D06089580933E0670 +:101440000895CF93DF939C01CB01E0912E06F0919C +:101450002F0662E070E00E9414220FC0A081B181CB +:101460008281823039F4ED018D81992782179307AB +:1014700009F468870780F085E02D309779F7DF91D0 +:10148000CF910895CF93DF939C01E0912E06F091C8 +:101490002F0614C0A081B1818281843061F48481DF +:1014A00099278217930739F486819927861797071A +:1014B00011F4ED014B830780F085E02D309751F753 +:1014C000DF91CF910895BF92CF92DF92EF92FF927A +:1014D0000F931F93CF93DF936C01162FF42EB22E30 +:1014E000C0912E06D0912F062097A1F489E090E0BC +:1014F0000E941621FC0190932F0680932E06D18224 +:10150000C082138310861782F282B4820583E6823A +:1015100015C0EC018F8198850097D9F789E090E09C +:101520000E941621FC0198878F83D182C082138389 +:10153000F282B4820583E68210861782DF91CF9112 +:101540001F910F91FF90EF90DF90CF90BF90089583 +:10155000EF92FF921F93CF93DF937C01C091A10381 +:10156000D091A203209711F011E012C085E090E025 +:101570000E941621FC019093A2038093A103F182A3 +:10158000E08212821482138210E012C01F5FEC010D +:101590008B819C810097D1F785E090E00E94162115 +:1015A000FC019C838B83F182E0821283148213827C +:1015B000812F9927DF91CF911F91FF90EF90089590 +:1015C000EF92FF920F931F93CF93DF93E091A103CC +:1015D000F091A20380E090E00380F481E02D019679 +:1015E0003097D1F7880F991F0E9416219093A4037A +:1015F0008093A3030091A1031091A203E801E88066 +:10160000F9808A81C82FDD27CC0FDD1F8091A303CD +:101610009091A403C80FD91FF701808199270E94D8 +:1016200016219983888320E030E017C0E801EA8121 +:10163000FF27EE0FFF1F8091A3039091A403E80FF3 +:10164000F91F0190F081E02DE20FF31FD701A20FE7 +:10165000B31F8C9180832F5F3F4FF70180819927C3 +:10166000281739071CF3E8018B819C81009711F042 +:101670008C01C4CFDF91CF911F910F91FF90EF901C +:1016800008954F925F926F927F928F929F92AF9246 +:10169000BF92CF92DF92EF92FF920F931F93CF935F +:1016A000DF93E0912E06F0912F066624772409C07F +:1016B0008281823019F40894611C711C0780F085C6 +:1016C000E02D3097A9F74301880C991CC4010E94B2 +:1016D000162190934B0680934A06E1E0EE2EF12C02 +:1016E000AA24BB2455C0E0912E06F0912F0679E084 +:1016F000C72ED12C15C0A081B181848199278E1568 +:101700009F0519F48381C80ED11CED018D818E15C2 +:1017100021F48281823009F45D010780F085E02D9B +:10172000309749F700914A0610914B06025010403D +:10173000080D191DC6010E941621F80191838083AE +:1017400020E030E0E0914A06F0914B06E80DF91DEB +:1017500032970190F081E02DE20FF31FD501A20F27 +:10176000B31F8C9180832F5F3F4F2930310551F794 +:10177000E0914A06F0914B06E80DF91D3297019071 +:10178000F081E02D8C2D875F82830894E11CF11C91 +:101790006E147F040CF0A7CF61E0C62ED12C59E067 +:1017A000A52EB12C4424552442E0842E912CA1C0B6 +:1017B000A0912E06B0912F0612C0ED91FC911197C9 +:1017C0008181823049F4858199278C159D0521F40A +:1017D0008481482E552405C0ED01AF81B88510974E +:1017E00061F731E0E32EF12C79C060912E06709103 +:1017F0002F066DC0FB01C081D1818981843009F041 +:1018000063C0868199278E159F0509F05DC084818C +:1018100099278C159D0509F057C0950140E050E0CF +:10182000E0914A06F0914B06E80DF91D32970190C0 +:10183000F081E02DE20FF31FDE01A40FB51F8C91A4 +:1018400080832F5F3F4F4F5F5F4F4930510541F716 +:1018500089E090E0A80EB91EC0912E06D0912F0607 +:1018600031C08A81853059F58C8199278C159D0569 +:1018700031F58D8199278E159F0509F5088119810C +:10188000950140E050E0E0914A06F0914B06E80DEA +:10189000F91D32970190F081E02DE20FF31FD8017E +:1018A000A40FB51F8C9180832F5F3F4F4F5F5F4F19 +:1018B0004730510541F7E7E0F0E0AE0EBF1E0F8064 +:1018C000D885C02D209769F6EB016F817885611569 +:1018D000710509F08FCF0894E11CF11C4E145F04D0 +:1018E0000CF083CF0894C11CD11CE2E0F0E08E0E16 +:1018F0009F1E6C147D040CF05BCFDF91CF911F9184 +:101900000F91FF90EF90DF90CF90BF90AF909F909E +:101910008F907F906F905F904F9008956F927F921D +:101920008F929F92AF92BF92CF92DF92EF92FF92EF +:101930000F93CF93DF935C013B014901E0912E06A9 +:10194000F0912F0616C0A081B18184819927A81635 +:10195000B90661F4868199278615970539F4828145 +:10196000843021F4ED018C818F5F8C830780F085BA +:10197000E02D309741F787E090E00E941621FC01AE +:1019800087E0808385E0818382820383F582E4821D +:10199000C682EE24062D2A2D45E067E0CF010E9485 +:1019A000630ADF91CF910F91FF90EF90DF90CF907E +:1019B000BF90AF909F908F907F906F900895AF925F +:1019C000BF92CF92DF92EF92FF920F93FC01A1148E +:1019D000B10401F14230510571F04330510599F0E5 +:1019E00041305105B9F481E080932506B092290673 +:1019F000A09228060FC081E080932606B0922B06A5 +:101A0000A0922A0607C081E080932706B0922D0697 +:101A1000A0922C0620583F4FCF010E948E0C0F91B0 +:101A2000FF90EF90DF90CF90BF90AF900895AF926E +:101A3000BF92CF92DF92EF92FF920F93FC01423060 +:101A4000510571F04330510599F041305105B9F419 +:101A500081E080933603B0923A03A09239030FC01D +:101A600081E080933703B0923C03A0923B0307C010 +:101A700081E080933803B0923E03A0923D03CF01F2 +:101A80000E948E0C0F91FF90EF90DF90CF90BF904F +:101A9000AF900895CF92DF92EF920F931F93CF9361 +:101AA000DF936C018B01A0912E06B0912F06C0E050 +:101AB000D0E014C02D913C911197F90185818C15CE +:101AC00051F4FD018281823031F4F90184818F5F0C +:101AD0008483C82FDD27FD01A781B085109751F7BA +:101AE00089E090E00E941621FC0189E0808384E077 +:101AF00081830283138214821582168217821086D4 +:101B0000EC2E00E02C2D44E069E0CF010E94630A36 +:101B1000CE01DF91CF911F910F91EF90DF90CF9089 +:101B20000895BF92CF92DF92EF92FF920F931F938F +:101B3000CF93DF936C017B01142FB22EA0912E0660 +:101B4000B0912F06C0E0D0E014C02D913C911197C8 +:101B5000F90185818C1551F4FD018281823031F4C7 +:101B6000F90184818F5F8483C82FDD27FD01A78160 +:101B7000B085109751F789E090E00E941621FC0192 +:101B800089E0808384E08183E2821382148215835A +:101B9000B68207831086EC2E00E02C2D44E069E02D +:101BA000CF010E94630ACE01DF91CF911F910F9167 +:101BB000FF90EF90DF90CF90BF900895EF920F933A +:101BC0001F93109149061F5F1093490689E090E02A +:101BD0000E941621FC0189E0808389E090E09383D4 +:101BE000828382E0818314821583168280EA878350 +:101BF0008AE18087EE2400E020E042E069E0CF0146 +:101C00000E94630A812F99271F910F91EF900895E9 +:101C1000CF93DF93EC01FC0101900020E9F7E81B72 +:101C2000F90BCF01880F991F0E9416219C01FE011C +:101C300001900020E9F7EC1BFD0BEE0FFF1FDC010C +:101C4000EC9383E0F901818340E050E009C0FE019C +:101C5000E40FF51F80818C93FD0111824F5F5F4F70 +:101C60001296FE0101900020E9F73197EC1BFD0B65 +:101C70004E175F0760F3C9010E94A80A9927DF91F8 +:101C8000CF910895EF92FF920F931F93CF93DF931D +:101C90008C017B01CA010E94080E9C01E0912E0676 +:101CA000F0912F0614C0A081B1818281843061F44B +:101CB000848199278017910739F4868199278E1599 +:101CC0009F0511F4ED0128870780F085E02D3097FE +:101CD00051F7DF91CF911F910F91FF90EF900895F1 +:101CE0000F931F93CF93DF938C01CB010E94080EBB +:101CF0009C01E0912E06F0912F060FC0A081B181CA +:101D00008281823039F4ED018D8199278017910706 +:101D100009F42E830780F085E02D309779F7DF9165 +:101D2000CF911F910F9108950E94080E1816190661 +:101D300014F48093480608950E94080E1816190698 +:101D400014F48093470608950E94080E1816190689 +:101D500014F48093460608951F9386E00E94840938 +:101D6000992786FF03C00E94BD080EC082FF03C0F2 +:101D70000E94BF0709C081FF03C00E948C0704C0F6 +:101D800084FF02C00E94DE0787E00E948409182FAA +:101D900060E087E00E94A909612F87E00E94A909FD +:101DA0001F91089562E081E00E94A90908950E94B0 +:101DB000410B0E94E00A0E94420661E080E00E941E +:101DC000A90980E00E94840980FDFBCF62E081E0E8 +:101DD0000E94A90960E884E00E94A90960E480E209 +:101DE0000E94A90968E083E20E94A90969E087E2EC +:101DF0000E94A9096FE08DE00E94A9096FE08BE0C5 +:101E00000E94A90968ED89E00E94A90963E38FE0B7 +:101E10000E94A90966ED87E00E94A90962E085E0B9 +:101E20000E94A9096CEC80E00E94A90908958EEC3B +:101E300080933F0381E080936E0080913F0386BDD5 +:101E400083E084BD08950895089583E08093E504B8 +:101E500081E08093E6048BE08093E7042FE62093F3 +:101E6000E80493E69093E90484E78093EA042093DE +:101E7000EB049093EC0481E68093ED048EE680936E +:101E8000EE048FE58093EF0480E38093F00481E318 +:101E90008093F1041092F2048EE090E00E94B2016F +:101EA0000895FC018081833011F40E94250F08956C +:101EB0001F9311E0812F0E94631060E0812F0E9428 +:101EC00037111F5F1431B1F718E1812F0E946310A1 +:101ED00060E0812F0E9437111F5F1B32B1F71F9105 +:101EE0000895CF93DF93DC01EC01EA81FB8121911E +:101EF0008E81815019F48981E81BF109ED01FB8382 +:101F0000EA838E839FB7F8948C9181508C939FBF06 +:101F1000822F9927DF91CF910895FC01108275835C +:101F20006483738362834183478346830895CF9399 +:101F3000DF93DC019C91ED018981981718F080E016 +:101F400090E016C0ED01EC81FD8161938F8181509D +:101F500019F48981E81BF109ED018F83FD83EC837E +:101F60009FB7F8948C918F5F8C939FBF81E090E036 +:101F7000DF91CF910895FC0180818823E9F3CF019F +:101F80000E94710F99270895FC018081882319F41C +:101F90008FEF9FEF0895CF010E94710F9927089549 +:101FA00081E090E0089581E090E0089581E090E084 +:101FB000089581E090E00895CF93DF93CDB7DEB729 +:101FC00022970FB6F894DEBF0FBECDBF982F815079 +:101FD000833120F08751833108F066C0E92FFF2755 +:101FE000E15CFC4F82E08183892F9927AA27BB27D8 +:101FF000FC013197EC32F10508F056C0E65BFF4F6B +:10200000EE0FFF1F0590F491E02D09946D9A43C0E7 +:102010006E9A45C06F9A3FC0209A41C0219A3BC03A +:10202000229A3DC0239A37C0249A39C0259A33C0DA +:10203000269A35C0279A2FC0509A31C0519A2BC08A +:10204000529A2DC0539A27C0549A29C0559A23C03A +:10205000569A25C0579A1FC0389A21C0399A1BC07A +:102060003A9A1DC03B9A17C03C9A19C0879A13C070 +:10207000869A15C0859A0FC0849A11C0839A0BC0A6 +:10208000829A0DC0699A07C0689A09C0689A03C00D +:10209000699A05C06A9A81E090E008C06B9AE1E015 +:1020A000F0E0FA83E98304C084E090E09A838983B6 +:1020B00089819A8122960FB6F894DEBF0FBECDBFFC +:1020C000DF91CF910895982F8150833130F087515F +:1020D000833118F084E090E00895892F0E94DC0F8E +:1020E00081E090E00895CF93DF93CDB7DEB72297DC +:1020F0000FB6F894DEBF0FBECDBF982F815083314D +:1021000020F08751833108F066C0E92FFF27E15C9A +:10211000FC4F81E08183892F9927AA27BB27FC01E7 +:102120003197EC32F10508F056C0EA58FF4FEE0F38 +:10213000FF1F0590F491E02D09946D9843C06E98AF +:1021400045C06F983FC0209841C021983BC022985D +:102150003DC0239837C0249839C0259833C02698AD +:1021600035C027982FC0509831C051982BC0529835 +:102170002DC0539827C0549829C0559823C056980D +:1021800025C057981FC0389821C039981BC03A986D +:102190001DC03B9817C03C9819C0879813C08698FB +:1021A00015C085980FC0849811C083980BC0829881 +:1021B0000DC0699807C0689809C0689803C06998FD +:1021C00005C06A9881E090E008C06B98E1E0F0E01B +:1021D000FA83E98304C084E090E09A83898389814B +:1021E0009A8122960FB6F894DEBF0FBECDBFDF9165 +:1021F000CF910895FB011082833091F0843028F450 +:10220000813051F0823029F409C0843059F0853092 +:1022100059F085E090E0089583B107C086B105C00C +:1022200089B103C08CB101C08FB1808381E090E09F +:102230000895833091F0843028F4813051F0823059 +:1022400029F409C0843059F0853069F084E090E0C9 +:10225000089565B905C068B903C06BB901C06EB90E +:1022600081E090E0089561BB81E090E00895982FAF +:10227000E82FFF27E15CFC4F8181823019F086E076 +:1022800090E00895892F9927AA27BB27FC01319751 +:10229000EC32F10540F4EE55FF4FEE0FFF1F0590B5 +:1022A000F491E02D099484E090E00895662311F004 +:1022B000759AC5C07598C3C0662311F0769ABFC0E1 +:1022C0007698BDC0662311F0779AB9C07798B7C0E9 +:1022D000662311F0289AB3C02898B1C0662311F084 +:1022E000299AADC02998ABC0662311F02A9AA7C0DD +:1022F0002A98A5C0662311F02B9AA1C02B989FC0E5 +:10230000662311F02C9A9BC02C9899C0662311F07B +:102310002D9A95C02D9893C0662311F02E9A8FC0E8 +:102320002E988DC0662311F02F9A89C02F9887C0F0 +:10233000662311F0589A83C0589881C0662311F023 +:10234000599A7DC059987BC0662311F05A9A77C07C +:102350005A9875C0662311F05B9A71C05B986FC084 +:10236000662311F05C9A6BC05C9869C0662311F01B +:102370005D9A65C05D9863C0662311F05E9A5FC088 +:102380005E985DC0662311F05F9A59C05F9857C090 +:10239000662311F0409A53C0409851C0662311F053 +:1023A000419A4DC041984BC0662311F0429A47C0F4 +:1023B000429845C0662311F0439A41C043983FC0FC +:1023C000662311F0449A3BC0449839C0662311F04B +:1023D0008F9A35C08F9833C0662311F08E9A2FC024 +:1023E0008E982DC0662311F08D9A29C08D9827C034 +:1023F000662311F08C9A23C08C9821C0662311F0BB +:102400008B9A1DC08B981BC0662311F08A9A17C047 +:102410008A9815C0662311F0709A11C070980FC089 +:10242000662311F0719A0BC0719809C0662311F0F0 +:10243000729A05C0729803C0662321F0739A81E0F6 +:1024400090E00895739881E090E008951F93182F0D +:102450008150833130F08751833118F084E090E06F +:102460000FC0E12FFF27E15CFC4F83E08183812FC8 +:102470000E94DC0F61E0812F0E94371181E090E023 +:102480001F910895CF93DF93982FEB011882E82FC7 +:10249000FF27E15CFC4F8181813019F086E090E0FC +:1024A0007DC0892F9927AA27BB27FC013197EC32E1 +:1024B000F10540F4E253FF4FEE0FFF1F0590F4913A +:1024C000E02D099484E090E069C0659B65C062C01E +:1024D000669B62C05FC0679B5FC05CC0189B5CC0AE +:1024E00059C0199B59C056C01A9B56C053C01B9B5C +:1024F00053C050C01C9B50C04DC01D9B4DC04AC016 +:102500001E9B4AC047C01F9B47C044C0489B44C055 +:1025100041C0499B41C03EC04A9B3EC03BC04B9B13 +:102520003BC038C04C9B38C035C04D9B35C032C015 +:102530004E9B32C02FC04F9B2FC02CC0309B2CC055 +:1025400029C0319B29C026C0329B26C023C0339BA3 +:1025500023C020C0349B20C01DC07F9B1DC01AC05B +:102560007E9B1AC017C07D9B17C014C07C9B14C0F3 +:1025700011C07B9B11C00EC07A9B0EC00BC0609B2C +:102580000BC008C0619B08C005C0629B05C002C0AB +:10259000639B02C081E0888381E090E0DF91CF916E +:1025A0000895CF93DF93CDB7DEB721970FB6F89498 +:1025B000DEBF0FBECDBF9BE19093E504BE016F5F10 +:1025C0007F4F0E9442128093E60489818093E70442 +:1025D0001092E80484E090E00E94B20121960FB6C8 +:1025E000F894DEBF0FBECDBFDF91CF9108959AE181 +:1025F0009093E5040E9437118093E6041092E7045B +:1026000083E090E00E94B201089598E19093E50480 +:102610000E9419118093E6041092E70483E090E091 +:102620000E94B2010895982F89E18093E5049330C8 +:1026300099F0943028F4913059F0923029F40AC07E +:10264000943061F0953061F085E090E020E00BC0BF +:1026500023B107C026B105C029B103C02CB101C008 +:102660002FB181E090E08093E6042093E70410927C +:10267000E80484E090E00E94B201089597E190930D +:10268000E5040E9426128093E6041092E70483E09A +:1026900090E00E94B201089595E19093E5040E94B4 +:1026A00073108093E6041092E70483E090E00E94A8 +:1026B000B201089596E19093E5040E94DC0F8093A7 +:1026C000E6041092E70483E090E00E94B2010895CE +:1026D00084E18093E50481E08093E6041092E704AE +:1026E00083E090E00E94B201089582E18093E504C6 +:1026F00081E08093E6041092E70483E090E00E947A +:10270000B201089583E18093E50481E08093E604BB +:102710001092E70483E090E00E94B201089580E106 +:102720008093E50481E08093E6041092E70483E05F +:1027300090E00E94B201089591E19093E5040E9417 +:1027400063108093E6041092E70483E090E00E9417 +:10275000B2010895FC0180818531C9F1863180F490 +:10276000823131F1833130F48031D1F0813109F09F +:102770004CC01AC0833109F1843109F046C022C02F +:10278000883189F1893128F4863129F18731E9F5D9 +:1027900026C08A3189F18A3158F18B31B1F531C0C7 +:1027A00082810E948F13089582810E949C13089554 +:1027B000638182810E9475130895638182810E94E2 +:1027C00082130895638182810E9468130895828133 +:1027D0000E944C13089582810E945A1308958281A9 +:1027E0000E943E130895638182810E94051308951B +:1027F00082810E9413130895638182810E94F712DF +:10280000089582810E94D11208958093E50483E0A7 +:102810008093E6041092E70483E090E00E94B20106 +:102820000895E82F8152883018F084E090E00895F0 +:10283000FF27E15CFC4F84E0818381E090E0089514 +:10284000E82FFF27E15CFC4F8181843019F084E0A0 +:1028500090E00895118281E090E0089510927C004C +:10286000823039F0833069F0813041F082E090E0CD +:10287000089580917C00806480937C0081E090E0EA +:10288000089580917C00806C80937C0081E090E0D2 +:10289000089593E890937A0090917C00907F982B14 +:1028A00090937C0080917A00806480937A0080917C +:1028B0007A0086FDFCCF809178009091790020E02D +:1028C00030E040E050E080917A00806480937A00AC +:1028D00080917A0086FDFCCF8091780090917900FC +:1028E000480F591F2F5F3F4F2430310561F780910A +:1028F0007A008F7780937A00CA019695879596958E +:1029000087950895CF93DF93EB0119821882282FC2 +:102910003327F901E15CFC4F8181843019F086E0B6 +:1029200090E00AC088E290E0821B930B0E94491459 +:102930009983888381E090E0DF91CF91089593E2BD +:102940009093E5040E942E148093E6041092E7040D +:1029500083E090E00E94B2010895CF93DF93CDB75A +:10296000DEB722970FB6F894DEBF0FBECDBF92E25E +:102970009093E504BE016F5F7F4F0E9482148093A5 +:10298000E60429813A81832F99278093E7042093D5 +:10299000E8041092E90485E090E00E94B2012296DA +:1029A0000FB6F894DEBF0FBECDBFDF91CF91089573 +:1029B00091E29093E504E82FFF27E15CFC4F8181D1 +:1029C000843019F084E090E003C0118281E090E04F +:1029D0008093E6041092E70483E090E00E94B20145 +:1029E0000895E82F80E28093E5048E2F815288308D +:1029F00018F084E090E007C0FF27E15CFC4F84E022 +:102A0000818381E090E08093E6041092E70483E004 +:102A100090E00E94B2010895FC018081813271F042 +:102A2000823218F48032B1F405C0823259F0833218 +:102A300089F40CC082810E94F114089582810E9461 +:102A4000D814089582810E94AD14089582810E9455 +:102A50009F1408958093E50483E08093E604109228 +:102A6000E70483E090E00E94B2010895ECEBF0E00F +:102A70008081846080838BE080934C038CE0809322 +:102A80004D0381E090E00895ECEBF0E080818B7FD6 +:102A9000808310924C0310924D0381E090E00895E2 +:102AA0008093B800E9EBF0E080818C7F80838081A7 +:102AB000808381E090E008958091B9009927887F14 +:102AC000907008958091B90084EA8093BC00809151 +:102AD000BC0087FFFCCF81E090E0089584E98093FB +:102AE000BC008091BC0084FDFCCF81E090E00895A3 +:102AF000AC0120E030E00FC0FA01E20FF31F80814B +:102B00008093BB0084E88093BC008091BC0087FF69 +:102B1000FCCF2F5F3F4F2617370774F3089584E8E3 +:102B20008093BC008091BC0087FFFCCF8091BB00EC +:102B30009927089585E38093E50481E08093E60476 +:102B400020E030E00FC084E88093BC008091BC009E +:102B500087FFFCCF8091BB00F901E951FB4F8083D7 +:102B60002F5F3F4F2617370774F3FB01E951FB4FE7 +:102B70001082CB0103960E94B20108959B01BC0113 +:102B8000C9010E94781581E08093E6041092E70461 +:102B900083E090E00E94B201089584E98093BC0034 +:102BA0008091BC0084FDFCCF81E08093E60410920C +:102BB000E70483E090E00E94B20108958091B9009B +:102BC00084EA8093BC008091BC0087FFFCCF81E049 +:102BD0008093E6041092E70483E090E00E94B20143 +:102BE00008958093B800E9EBF0E080818C7F8083CA +:102BF0008081808381E08093E6041092E70483E083 +:102C000090E00E94B2010895ECEBF0E080818B7FB0 +:102C1000808310924C0310924D0381E08093E60470 +:102C20001092E70483E090E00E94B2010895ECEB7B +:102C3000F0E08081846080838BE080934C038CE0A3 +:102C400080934D0381E08093E6041092E70483E0D3 +:102C500090E00E94B2010895FC0180818093E50418 +:102C60008433D1F0853338F4813379F0823381F0C5 +:102C7000803331F507C08633E9F08633A0F087331F +:102C8000F9F41BC00E94171608950E9404160895B7 +:102C900082810E94F115089582813396BF019927A0 +:102CA0000E94BE15089563817727828199270E942B +:102CB0009A1508950E94DE1508950E94CD15089575 +:102CC00083E08093E6041092E70483E090E00E94A2 +:102CD000B2010895782F613079F0613050F06230A0 +:102CE00021F0633009F059C002C061E003C061E027 +:102CF00004C060E030E002C060E031E04330D9F071 +:102D0000443028F4413089F0423090F40CC0453012 +:102D100031F04530A0F0463009F03FC002C040E03D +:102D200005C040E006C041E007C041E050E005C0FA +:102D300041E050E006C040E051E020E003C040E048 +:102D400051E021E0239884B1866084B985B1817F08 +:102D500085B980E090E0772311F081E090E075E0A4 +:102D6000880F991F7A95E1F78065660F660F660FE9 +:102D7000682B330F330F362B352B440F432B4CBDB1 +:102D80002DBD88E0809345038AE08093460389E067 +:102D90008093470381E090E0089582E090E00895F9 +:102DA0001CBC1DBC109245031092460310924703B1 +:102DB00081E090E00895AC0120E030E009C0E60F2A +:102DC000F71F80818EBD0DB407FEFDCF2F5F3F4FF3 +:102DD000E22FFF27E417F50794F381E090E00895D0 +:102DE000DC0120E030E040E050E015C01EBC09C02E +:102DF00083E0493E58071CF088E090E008954F5F5B +:102E00005F4F0DB407FEF4CFFB01E20FF31F8EB549 +:102E100080832F5F3F4F2A173B0744F381E090E008 +:102E20000895CF93DF93EC01A0E0B0E020E030E024 +:102E300018C0FE01E20FF31F80818EBD08C01196FD +:102E400083E0A93EB8071CF088E090E00FC00DB405 +:102E500007FEF5CFFB01E20FF31F8EB580832F5FD6 +:102E60003F4F241735072CF381E090E0DF91CF919D +:102E70000895EF92FF920F931F938B01E5EEEE2ED4 +:102E8000E4E0FE2E23E42093E504B7016E5F7F4F5C +:102E9000A8010E9411178093E6040E5F1F4FE00EF9 +:102EA000F11EF7011082C80101960E94B2011F9124 +:102EB0000F91FF90EF900895EF92FF920F931F9361 +:102EC0008C01F5EEEF2EF4E0FF2E84E48093E50410 +:102ED000B7016E5F7F4FC8010E94F0168093E60431 +:102EE0000E5F1F4FE00EF11EF7011082C801019620 +:102EF0000E94B2011F910F91FF90EF90089593E40B +:102F00009093E50499270E94DB168093E6041092C3 +:102F1000E70483E090E00E94B201089581E4809389 +:102F2000E5040E94D0168093E6041092E70483E043 +:102F300090E00E94B201089590E49093E5040E940D +:102F40006A168093E6041092E70483E090E00E9402 +:102F5000B2010895CF93DF93EC0188818334A9F007 +:102F6000843428F4803441F0813409F50BC0843472 +:102F700099F08534E1F414C04C816B818A810E9400 +:102F80009C1720C00E948E171DC0BE016D5F7F4F31 +:102F90008A810E947F1716C08A8199270E945C1738 +:102FA0006A817727CE0103960E9439170BC0809360 +:102FB000E50483E08093E6041092E70483E090E068 +:102FC0000E94B201DF91CF910895209A219A229A0E +:102FD0002398249A259A2C982D9881E08093500369 +:102FE00082E080935103809352038093530381E0E6 +:102FF00090E00895109250031092510310925203E2 +:103000001092530381E090E00895289829982A9817 +:1030100080E29EE40197F1F7289A8AE0982F9A952A +:10302000F1F72A9A299A8A95F1F70895282F299875 +:1030300087FD02C02A9801C02A9A8AE0982F9A95A3 +:10304000F1F7299A8A95F1F7299826FF02C02A9A62 +:1030500001C02A988AE0982F9A95F1F7299A8A95C3 +:10306000F1F70895282F220F30E0299827FF02C09A +:103070002A9A01C02A988AE0982F9A95F1F7299AFE +:103080008A95F1F73F5F373011F0220FEECF0895A8 +:10309000282F30E0299827FF02C02A9A01C02A98D9 +:1030A0008AE0982F9A95F1F7299A8A95F1F73F5F70 +:1030B000383011F0220FEECF089529982A988AE02F +:1030C000982F9A95F1F7299A982F9A95F1F72998C0 +:1030D0002898982F9A95F1F7299A982F9A95F1F7B1 +:1030E00029988A95F1F7289A80E090E00895299828 +:1030F00028982A982B9A08950E94051880E30E9428 +:10310000161880E60E94321808950E94051880E083 +:103110000E94161880E00E9432180E9477180895C5 +:103120000F931F93182F062F0E94051880E40E940A +:103130001618812F0E943218802F0E94481881E0B3 +:1031400090E01F910F9108951F93182F0E9405186A +:1031500080EC0E941618812F0E9432180E945D1880 +:1031600099271F91089529988AE08A95F1F72A985E +:1031700090E030E0990F299A2AE0822F8A95F1F7A2 +:1031800029981B999F5F822F8A95F1F73F5F38300E +:1031900089F72898299A822F8A95F1F7289A2998F1 +:1031A0002A95F1F7892F992708951F93182F0E94C8 +:1031B000051880E80E941618812F0E9432180E947C +:1031C000B31899271F910895DF92EF92FF920F9302 +:1031D0001F93CF93DF93D82E7B018A01C0E0D0E00C +:1031E00009C08D2D8C0F0E94D518F801EC0FFD1F22 +:1031F00080832196CE15DF05A1F781E090E0DF9175 +:10320000CF911F910F91FF90EF90DF9008950F9352 +:103210001F93082F162F0E947C18612F802F0E9469 +:10322000901881E090E01F910F910895DF92EF9246 +:10323000FF920F931F93CF93DF93D82E7B018A01C8 +:10324000C0E0D0E009C0F801EC0FFD1F60818D2DBA +:103250008C0F0E9407192196CE15DF05A1F781E09A +:1032600090E0DF91CF911F910F91FF90EF90DF9051 +:10327000089594E09093E5040E9416198093E60463 +:103280001092E70483E090E00E94B2010895EF926B +:10329000FF920F931F938B0195EEE92E94E0F92E88 +:1032A00093E09093E504A7014E5F5F4F0E94E418FE +:1032B0008093E6040E5F1F4FE00EF11EF7011082AF +:1032C000C80101960E94B2011F910F91FF90EF90EB +:1032D000089582E08093E504109250031092510308 +:1032E000109252031092530381E08093E6041092EF +:1032F000E70483E090E00E94B201089581E08093AA +:10330000E5040E94E5178093E6041092E70483E049 +:1033100090E00E94B2010895FC018381823069F03F +:10332000833018F48130F1F405C0833049F08430E3 +:10333000C9F40FC00E947E1908950E94691908956A +:10334000AF014A5F5F4F6581772784810E944719EB +:103350000895AF014A5F5F4F6581772784810E949E +:103360003919089580818093E50483E08093E60411 +:103370001092E70483E090E00E94B20108951F924A +:103380000F920FB60F9211240F900FBE0F901F9047 +:1033900018959C010897029718F084E090E0089532 +:1033A000F901E15CFC4F8DE0818328303105B1F0FB +:1033B0002930310519F087E090E00895259A81E0E1 +:1033C00090E0909389008093880081E8809380004A +:1033D00089E08093810081E090E00895249A81E063 +:1033E0008093B30089E68093B00081E090E0089577 +:1033F0009C01FC01E15CFC4F81818D3019F086E07D +:1034000090E008952830310539F12930310519F05F +:1034100087E090E0089563307105B1F06430710584 +:1034200044F46130710561F06230710509F040C00B +:1034300009C06430710551F065307105C9F508C0E7 +:1034400081E007C082E005C083E003C084E001C0E2 +:1034500085E08093810029C064307105E9F0653012 +:10346000710554F46230710599F06330710594F47C +:1034700061307105E9F40AC06630710589F0663083 +:10348000710564F06730710599F40CC089E60BC0D2 +:103490008AE609C08BE607C08CE605C08DE603C04E +:1034A0008EE601C08FE68093B00081E090E0089541 +:1034B00081E090E008959C01FC01E15CFC4F81817A +:1034C0008D3019F086E090E008952830310569F0DC +:1034D0002930310519F087E090E008957093890054 +:1034E0006093880081E090E008956093B30081E0EC +:1034F00090E0089523E52093E5040E945B1A8093F1 +:10350000E6041092E70483E090E00E94B20108957F +:1035100022E52093E5040E94F8198093E6041092B6 +:10352000E70483E090E00E94B201089520E5209333 +:10353000E5040E94C9198093E6041092E70483E031 +:1035400090E00E94B2010895FC01E15CFC4F118201 +:103550008830910531F08930910531F086E090E0B6 +:1035600008951092B00004C0109281001092800063 +:103570000E94DC0F81E090E0089521E52093E504AE +:103580000E94A41A8093E6041092E70483E090E07E +:103590000E94B2010895FC018081813579F0823565 +:1035A00018F48035F1F405C0823569F08335C9F42B +:1035B00011C0828199270E94961A089582819927C5 +:1035C0000E94BD1A089563817727828199270E94FE +:1035D000881A089563817727828199270E947A1A31 +:1035E00008958093E50483E08093E6041092E70455 +:1035F00083E090E00E94B2010895CF93DF93CDB7AE +:10360000DEB7DF91CF910895089581E090E00895AD +:1036100008958A3310F4805301C087556A3310F43B +:10362000605301C067556F708295807F682B862F2D +:103630009927089508958230A1F0833028F48823D3 +:1036400061F0813039F40BC0843079F0843058F067 +:103650008530B9F080E090E0089582E107C08EE007 +:1036600005C088E003C086E001C082E08093E200EC +:103670008CE08093E30087E38093E40081E090E0B6 +:1036800008951092E2008CE08093E30087E380933A +:10369000E40081E090E00895813091F0813038F0CD +:1036A0008230E1F0833061F180E090E00895809114 +:1036B000DB008F778093DB008091DB008F7D16C06D +:1036C0008091DB0080688093DB008091DB008F7D40 +:1036D0008093DB008091DB0080610DC08091DB0076 +:1036E00080688093DB008091DB0080628093DB0048 +:1036F0008091DB008F7E8093DB0081E090E0089575 +:103700008091DB0080688093DB008091DB00806229 +:103710008093DB008091DB0080618093DB0081E09F +:1037200090E008951F93982F162F8FE080935103F8 +:103730008093520310927406442319F081E0809321 +:103740007406109268061092690610926A0610922A +:103750006B06ECE6F6E0119286E0E437F807D9F75D +:1037600020E030E0822F8295807F8093ED001092E0 +:10377000EE001092EF002F5F3F4F2F30310591F791 +:10378000892F0E941B1B892B89F0812F0E944C1BC3 +:10379000892B61F08091D80082608093D80080915D +:1037A000D90082FFFCCF81E090E002C082E090E08F +:1037B0001F9108958295807F8093ED0008959B016D +:1037C000AC0180917406882381F4822F8295880F42 +:1037D000807E8093F60063E0569547953795279550 +:1037E0006A95D1F72093F7000895DA01C90153E0F3 +:1037F000880F991FAA1FBB1F5A95D1F78760809326 +:10380000F400292F3A2F4B2F55272093F5009D01C7 +:10381000442755272093F6008B2F9927AA27BB27EB +:103820008093F7000895EF92FF920F931F9380917A +:1038300074068823C1F42091F20022952695277002 +:103840003327442755278091F300992703E0880FF9 +:10385000991F0A95E1F77C0100271127E22AF32A34 +:10386000042B152B33C02091F3008091F200E090DF +:10387000F1006091F0009927AA27BB27DC01992766 +:103880008827332744275527522F442733272227B9 +:10389000822B932BA42BB52BFF2400271127102F4D +:1038A0000F2DFE2CEE248E299F29A02BB12BE62E66 +:1038B000FF2400271127E82AF92A0A2B1B2B73E083 +:1038C00016950795F794E7947A95D1F7C801B70153 +:1038D0001F910F91FF90EF9008959B01AC01809193 +:1038E0007406882371F4822F8295880F807E8093DE +:1038F000F200E3E05695479537952795EA95D1F77D +:1039000025C073E0220F331F441F551F7A95D1F74E +:103910008091F0009927AA27BB2787709070A0702C +:10392000B070282B392B4A2B5B2B2093F000BB2740 +:10393000A52F942F832F8093F100CA01AA27BB27BC +:103940008093F200252F3327442755272093F30037 +:103950000895982F80917406882321F08091EF00BC +:10396000806103C08091EF008F7E8093EF009230E2 +:1039700091F1933028F4992359F0913031F422C019 +:103980009330E1F1943009F450C080E090E0089564 +:103990008091EF008F7B8093EF008091EF008F7715 +:1039A0008093EF008091EF008F7D8093EF008091F6 +:1039B000F0008B7F8093F0008091F4008B7F8093E8 +:1039C000F40030C08091EF0080648093EF0080911C +:1039D000EF008F771BC08091EF008F778093EF000F +:1039E0008091EF0080648093EF008091EF008F7DE5 +:1039F0008093EF008091F000846012C08091EF000E +:103A00008F7B8093EF008091EF0080688093EF00C0 +:103A10008091EF008F7D8093EF008091F0008B7F8D +:103A20008093F00081E090E008958091EF008F7B1B +:103A30008093EF008091EF0080688093EF00809189 +:103A4000EF0080628093EF008091F00084608093AB +:103A5000F00081E090E008959F92AF92BF92CF92E4 +:103A6000DF92EF92FF920F931F93E82F962E59014A +:103A70006A01C801B7012E2F2295207F2093ED0007 +:103A80004091DE00FF27EB51FD4F21E030E0008048 +:103A900002C0220F331F0A94E2F7422B4093DE004C +:103AA0000E94DF1BC601B5010E946D1C892D0E947A +:103AB000A91C892B19F482E090E002C081E090E01B +:103AC0001F910F91FF90EF90DF90CF90BF90AF903C +:103AD0009F9008958091EF0087FD04C08091EF00D2 +:103AE00086FF3CC08091EF0087FD0AC08091EF0007 +:103AF00086FF06C08091F00082FD02C081E02FC0E9 +:103B00008091EF0087FD0AC08091EF0086FF06C01C +:103B10008091F00082FF02C082E021C08091EF001E +:103B200087FF0AC08091EF0086FD06C08091F000FB +:103B300082FD02C083E013C08091EF0087FF0EC0BA +:103B40008091EF0086FD0AC08091EF0085FF06C0DE +:103B50008091F00082FF02C084E001C080E09927DC +:103B60000895982F893008F098E08091EF00807FC9 +:103B7000892B8093EF00FB0120E004C081918093AA +:103B8000FA002F5F2917D1F70895EF92FF920F9354 +:103B90001F93F62E8A018295807F8093ED000E940C +:103BA0006A1DE82EB8018F2D0E94B11D81E00E9490 +:103BB000A91C8091EE0086FFFCCF8091EE008F7BE8 +:103BC0008093EE008E2D0E94A91C81E090E01F9151 +:103BD0000F91FF90EF900895FF920F931F93F62E91 +:103BE0008A018295807F8093ED0084E00E94A91C69 +:103BF000B8018F2D0E94B11D1F910F91FF90089564 +:103C0000AC0120E030E0FA01E20FF31F8091FA00EE +:103C100080832F5F3F4F28303105A9F70895AEED1F +:103C2000B0E02C91E5EEF2E0E80FF11D81E090E0CC +:103C3000008002C0880F991F0A94E2F7282B2C936A +:103C40000895AEEDB0E02C91E5EEF2E0E80FF11D45 +:103C500081E090E0008002C0880F991F0A94E2F78B +:103C6000809582238C9308952091E0008091E1005B +:103C70009927982F88273327822B932B009779F049 +:103C800020E030E002C096958795422F2F5F3F4F8E +:103C900080FFF9CF4F3018F4842F992708958FEFC4 +:103CA00090E00895982F9295907F9093ED000E9458 +:103CB000211E80E00E94A91C81E090E00895CF932E +:103CC000DF931092510310925203C0E0D0E08C2F8A +:103CD0000E94521E2196CF30D105C9F78091D8009D +:103CE0008D7F8093D8008091D90082FDFCCF81E048 +:103CF00090E0DF91CF9108951F938295807F80930C +:103D0000ED000E946A1D182F82E00E94A91C80917C +:103D1000EE0086FFFCCF8091EE008F7B8093EE005B +:103D2000812F0E94A91C81E090E01F91089586E7F1 +:103D30008093E50481E08093E60480916806909189 +:103D40006906A0916A06B0916B068093E704292F5B +:103D50003A2F4B2F55272093E8049D0144275527E0 +:103D60002093E9048B2F9927AA27BB278093EA0485 +:103D7000109268061092690610926A0610926B06FD +:103D8000ACE6B6E026E030E08C91F901EB51FB4F58 +:103D900080831D922F5F3F4F2E303105A9F710927F +:103DA000F3048FE090E00E94B201089595E79093AC +:103DB000E5040E947C1E8093E6041092E70483E0F1 +:103DC00090E00E94B201089594E79093E5040E9468 +:103DD000521E8093E6041092E70483E090E00E9474 +:103DE000B201089592E79093E5040E94C51D809367 +:103DF000E6041092E70483E090E00E94B201089587 +:103E0000EF92FF920F931F9393E79093E5040E9424 +:103E10002C1D8093E6041092E70483E090E00E945A +:103E2000B2011F910F91FF90EF9008950E94EC1D39 +:103E300087E78093E50481E08093E6041092E7042D +:103E400083E090E00E94B201089581E78093E50449 +:103E50000E945F1E8093E6041092E70483E090E0E6 +:103E60000E94B2010895462F90E79093E50462E026 +:103E70000E94921B8093E6041092E70483E090E096 +:103E80000E94B2010895EF92FF920F931F93FC01DD +:103E90008081833701F1843748F48137C9F0823754 +:103EA00008F06BC0803709F081C00DC0853709F478 +:103EB0006CC0853708F45DC0863709F46AC087375F +:103EC00009F074C06BC0638182810E94331F79C086 +:103ED0000E94251F76C000002581332744275527DF +:103EE000542F432F322F222786819927AA27BB27B9 +:103EF000DC0199278827280F391F4A1F5B1F8481FF +:103F0000280F311D411D511D87819927AA27BB27E5 +:103F1000B82FAA2799278827280F391F4A1F5B1F08 +:103F2000E184FF2400271127102F0F2DFE2CEE24F3 +:103F300082859927AA27BB27DC0199278827E80EC5 +:103F4000F91E0A1F1B1F8085E80EF11C011D111DA3 +:103F500083859927AA27BB27B82FAA2799278827BF +:103F6000E80EF91E0A1F1B1F638182810E94001F39 +:103F700028C082810E94E41E24C0AF014C5F5F4FC5 +:103F8000638182810E94F21E1CC082810E94D61E23 +:103F900018C0828199270E94971E13C0AF014C5F01 +:103FA0005F4F638182810E94161F0BC08093E504DE +:103FB00083E08093E6041092E70483E090E00E949F +:103FC000B2011F910F91FF90EF9008951F920F92F1 +:103FD0000FB60F9211241F932F933F934F935F932C +:103FE0006F937F938F939F93AF93BF93EF93FF93C1 +:103FF0001091ED000E94341E8F3F31F18295807F39 +:104000008093ED000E94131C60936806709369060C +:1040100080936A0690936B068CE696E00E94001EE1 +:104020000E94131C609368067093690680936A0669 +:1040300090936B068091EE008F7D8093EE0083E07D +:104040000E94A91C1093ED00FF91EF91BF91AF91D9 +:104050009F918F917F916F915F914F913F912F91A0 +:104060001F910F900FBE0F901F901895DC0180E1FB +:10407000A030B80718F082E090E00895F999FECFDB +:104080009D0109C032BD21BD2F5F3F4FF89AE60F59 +:10409000F71F80B58083822F8A1BE82FFF27E41744 +:1040A000F50780F381E090E00895DC0180E1A03025 +:1040B000B80718F082E090E00895F999FECF9D01CD +:1040C0000AC032BD21BD2F5F3F4FE60FF71F808131 +:1040D00080BDFA9AF99A822F8A1BE82FFF27E417EE +:1040E000F50778F381E090E008950F931F938B011B +:1040F00021E82093E5040E9455208093E604109265 +:10410000E7041F930F9384EF92E09F938F930E9495 +:10411000FD1A83E090E00E94B2010F900F900F9083 +:104120000F901F910F910895CF92DF92EF92FF921F +:104130000F931F937B0105EE14E020E82093E50424 +:1041400022E0C22ED12CC00ED11EAB01B6010E94BE +:1041500036208093E60482E090E0E80EF91E0E0D12 +:104160001F1DF8011082DF92CF9281E093E09F93B0 +:104170008F930E94FD1AC70101960E94B2010F9011 +:104180000F900F900F901F910F91FF90EF90DF9085 +:10419000CF900895EF92FF920F931F93CF93DF93E9 +:1041A000EC018B819927F82EEE248A81E80EF11C10 +:1041B0008D819927182F00278C81080F111DFF92E0 +:1041C000EF921F930F938BE093E09F938F930E9446 +:1041D000FD1A88812DB73EB72A5F3F4F0FB6F8947E +:1041E0003EBF0FBE2DBF803819F0813869F405C07D +:1041F000B801C7010E94942012C02696A801BE01F2 +:10420000C7010E9475200BC08093E50483E0809372 +:10421000E6041092E70483E090E00E94B201DF918F +:10422000CF911F910F91FF90EF900895CF93DF935F +:10423000AC01029710F442E050E0A0917706B091F3 +:104240007806FD01C0E0D0E020E030E020C08081B1 +:1042500091818417950769F482819381209719F0E1 +:104260009B838A8304C090937806809377069F018E +:1042700032C04817590738F42115310519F0821753 +:10428000930708F49C01EF010280F381E02D309741 +:10429000F1F62115310599F1C901841B950B04979D +:1042A00008F4A901E0E0F0E028C08D919C911197FD +:1042B00082179307F9F44817590781F4ED018A81B1 +:1042C0009B81309719F09383828304C09093780682 +:1042D000809377069D012E5F3F4F4CC0841B950B4A +:1042E000FD01E80FF91F4193519302978D939C9321 +:1042F0009F0140C0FD01A281B3811097B1F680916A +:10430000750690917606892B41F480913203909145 +:104310003303909376068093750620913403309191 +:1043200035032115310549F48DB7282F33278091A6 +:10433000300390913103281B390BA0917506B09181 +:1043400076062A1B3B0B2417350790F0CA0102960C +:104350002817390768F09D012E5F3F4FC901840F70 +:10436000951F90937606809375064D935C9302C0DB +:1043700020E030E0C901DF91CF910895CF93DF9322 +:10438000009709F44EC0EC0122971B821A82A0917B +:104390007706B0917806109711F140E050E001C027 +:1043A000DC01AC17BD0700F1BB83AA83FE0121919C +:1043B0003191E20FF31FEA17FB0771F48D919C9185 +:1043C0001197280F391F2E5F3F4F39832883FD0136 +:1043D000828193819B838A834115510559F4D0933F +:1043E0007806C09377061DC0FD0182819381AD01DF +:1043F0000097B1F6FA01D383C28321913191E20F84 +:10440000F31FEC17FD0769F488819981280F391F84 +:104410002E5F3F4FFA01318320838A819B819383F2 +:104420008283DF91CF91089597FB092E07260AD04A +:1044300077FD04D00CD006D000201AF47095619559 +:104440007F4F0895F6F7909581959F4F0895AA1B89 +:10445000BB1B51E107C0AA1FBB1FA617B70710F06F +:10446000A61BB70B881F991F5A95A9F780959095A1 +:08447000BC01CD010895FFCF4E +:10447800456D62656464656450726F6A65637473E0 +:10448800004F63746F70757355534220496E74659D +:10449800726661636520436F6E766572746572201B +:1044A800616E6420492F4F20457874656E73696F7B +:1044B8006E003230303831313038006669727374CA +:1044C800207061636B6574206F662061206C6F6E6D +:1044D80067206D65737361676520286C656E677406 +:1044E800683A202564290A006F63746F7075732019 +:1044F8006C6F6E672072756E6E696E67206D65737E +:10450800736167650A006F63746F7075732E6C6FE3 +:104518006E675F696E646578203C206F63746F70A6 +:1045280075732E6C6F6E675F62797465730A006EBF +:104538006F74206C617374207061636B65743A20CA +:1045480064696666203E2036340A006C6173742004 +:104558007061636B65740A007061727365722C20F8 +:10456800636865636B3A2025582C20636F6D6D6115 +:104578006E643A2025580A0063616C6C696E672086 +:10458800696F5F7061727365720A0063616C6C6950 +:104598006E67206164635F7061727365720A00639D +:1045A800616C6C696E67206932635F7061727365F4 +:1045B800720A0063616C6C696E67207370695F7062 +:1045C80061727365720A0063616C6C696E67207052 +:1045D800776D5F7061727365720A0063616C6C69F4 +:1045E8006E672063616E5F7061727365720A006343 +:1045F800616C6C696E6720656570726F6D5F706164 +:10460800727365720A00756E6B6E6F776E20636DDC +:10461800640A00726563656976696E6720636F6D09 +:104628006D616E643A20255820286C656E67746841 +:104638003A202575290A00676574206E6578740A22 +:104648000067657420616E642065786563757465BC +:104658000A0009040000010203040506070001021C +:10466800030405067772697474656E3A2025730A27 +:1046780000726561643A2025730A00656570726F7F +:104688006D5F7061727365723A206C656E677468ED +:104698003A2025752C20616464723A2025750A0039 +:0646A8002000790600006D +:00000001FF diff --git a/firmware/octopus_relais.hex b/firmware/octopus_relais.hex new file mode 100644 index 0000000..68d0cd1 --- /dev/null +++ b/firmware/octopus_relais.hex @@ -0,0 +1,959 @@ +:100000000C94F6000C9415010C9415010C94150138 +:100010000C9415010C94C1030C9415010C9415015A +:100020000C9415010C9415010C9415010C941501F8 +:100030000C94A5190C9415010C9415010C94150140 +:100040000C94B0030C9415010C9417010C94150139 +:100050000C9415010C9415010C9415010C941501C8 +:100060000C9415010C9415010C9415010C941501B8 +:100070000C9415010C9415010C9415010C941501A8 +:100080000C9415010C9415010C9415019D0F9F0FF4 +:10009000A10FA30FA50FA70FA90FAB0FAD0FAF0FA8 +:1000A000B10FB30FB50FB70FB90FBB0FBD0FBF0F18 +:1000B000C10FFC0FFC0FFC0FFC0FFC0FFC0FC30F5C +:1000C000C50FC70FC90FCB0FCD0FCF0FD10FD50F56 +:1000D000DB0FDF0FE30FE70FEB0FEF0FF30FF50F62 +:1000E000F70FF90F2A102C102E1030103210341088 +:1000F000361038103A103C103E1040104210441098 +:10010000461048104A104C104E1089108910891062 +:100110008910891089105010521054105610581020 +:100120005A105C105E10621068106C107010741021 +:1001300078107C108010821084108610DF10E5107B +:10014000EB10F110F710FD10031109110F1115112B +:100150001B11211127112D11331139113F11451197 +:100160004B11DD10DD10DD10DD10DD10DD10511143 +:1001700057115D11631169116F1175117B11851193 +:100180008F119911A311AD11B711C111CD11D31157 +:10019000D911DF1120122312261229122C122F122C +:1001A0003212351238123B123E12411244124712DB +:1001B0004A124D125012531256121E121E121E12C5 +:1001C0001E121E121E1259125C125F12621265126A +:1001D0006E126B1268126B126E1271127412771219 +:1001E0007D127A127A127D128012831211241FBEA0 +:1001F000CFEFD0E1DEBFCDBF13E0A0E0B1E0E6E994 +:10020000F9E300E00BBF02C007900D92AC33B107D9 +:10021000D9F716E0ACE3B3E001C01D92A237B107F5 +:10022000E1F70E942F010C94C91C0C9400001F924E +:100230000F920FB60F9211240F900FBE0F901F90C8 +:100240001895AC0120E030E002C02F5F3F4FFA016B +:10025000E20FF31F80818823C1F7C90108956F92CF +:100260007F928F929F92AF92BF92CF92DF92EF9246 +:10027000FF920F93DF93CF9300D00F92CDB7DEB7ED +:10028000F8940E94FA080E947F0E8FEF87BB18BA7D +:100290000E94760981E897E10E94C10985E69CE009 +:1002A0000E94C60981E090E00E94CB09DE01119610 +:1002B000E6EFF2E083E001900D928150E1F7CE018C +:1002C00001960E94B40D80E091E00E94520E81E1FF +:1002D00091E00E944A0E82E491E00E94420E0E9448 +:1002E0008A0D4C0164EF71E00E94D90960E070E072 +:1002F000C4010E94FE0C3C0140E050E0BC01C4017E +:100300000E94FF092CE1A22E22E0B22ECC24DD2493 +:1003100090E4E92EF12C02E021E030E041E050E0F1 +:10032000B301C4010E94930C88E2A82E83E0B82E8A +:1003300021E030E041E050E0B301C4010E94CB0C69 +:1003400010929A031092990310929C0310929B03AF +:100350000E94AD1A8FE784BB8AE285BB0E94CD0361 +:1003600085E585BB0E94CD0315BA0E94050F0E944A +:10037000FA080E94840E7894FFCF0F931F93CF93B7 +:10038000DF938C018134910510F18091A503909148 +:10039000A603892BE1F41F930F938BE491E09F93C5 +:1003A0008F930E94A61A1092A2031092A103109399 +:1003B000A4030093A30381E090E09093A6038093AD +:1003C000A50300E410E00F900F900F900F9068E0ED +:1003D0008BE20E944309C0E0D0E00DC0E091A10390 +:1003E000F091A203EC0FFD1FE551FB4F608189E204 +:1003F0000E9443092196C017D10780F38091990389 +:1004000090919A03019749F467E08BE20E944309B7 +:1004100010929A03109299030AC063E08BE20E9443 +:10042000430981E090E090939A0380939903DF91D0 +:10043000CF911F910F910895CF93DF938091A503E2 +:100440009091A603019709F04CC088E791E09F9333 +:100450008F930E94A61A2091A1033091A20380914C +:10046000A3039091A4030F900F9028173907C8F5A4 +:1004700086E991E09F938F930E94A61AC091A303EF +:10048000D091A4038091A1039091A203C81BD90B22 +:100490008091A1039091A203805C9F4F9093A2034F +:1004A0008093A1030F900F90C134D1055CF08FEBC6 +:1004B00091E09F938F930E94A61A80E490E00E949F +:1004C000BD010DC08BED91E09F938F930E94A61A02 +:1004D000CE010E94BD011092A6031092A5030F90B9 +:1004E0000F90DF91CF9108951F93CF93DF93EC018D +:1004F0001092A2031092A1031092A6031092A503DA +:100500008881182F12951F7090E09F938F93812FF1 +:1005100090E09F938F9388EE91E09F938F930E943A +:10052000A61A8DB79EB706960FB6F8949EBF0FBE5B +:100530008DBF143009F445C0153050F4113019F155 +:10054000113090F0123049F1133009F069C02FC01A +:10055000163009F44AC01630F0F1173009F44FC0D4 +:10056000183009F05DC052C08881863041F48A811C +:10057000813009F069C0CE010E94721965C0CE01B8 +:100580000E94FE0E61C088E092E09F938F930E94CC +:10059000A61ACE010E94591355C08BE192E09F9399 +:1005A0008F930E94A61ACE010E94A4144BC08FE222 +:1005B00092E09F938F930E94A61ACE010E94EC15A1 +:1005C00041C083E492E09F938F930E94A61ACE01CC +:1005D0000E94931737C087E592E09F938F930E9404 +:1005E000A61ACE010E94741A2DC08BE192E09F934F +:1005F0008F930E94A61ACE010E94A50523C08BE608 +:1006000092E09F938F930E94A61A1CC083E992E008 +:100610009F938F930E94A61ACE010E94591B12C06D +:100620008AEA92E09F938F930E94A61A8881809312 +:10063000EB0483E08093EC041092ED0483E090E0FF +:100640000E94BD010F900F90DF91CF911F910895EF +:10065000CF93DF93EC01898190E09F938F9387EB99 +:1006600092E09F938F930E94A61A80919B03909192 +:100670009C030F900F900F900F90019791F58BEDC9 +:1006800092E09F938F930E94A61A20E030E00F9093 +:100690000F90E0919D03F0919E03E20FF31FDE01A6 +:1006A000A20FB31F8C91E555FC4F80832F5F3F4F06 +:1006B0002034310571F780919D0390919E03805CF9 +:1006C0009F4F90939E0380939D0320919D033091B3 +:1006D0009E0380919F039091A00328173907E8F1AA +:1006E00027C085EE92E09F938F930E94A61A1092E6 +:1006F0009E0310929D0320E030E00F900F90E09158 +:100700009D03F0919E03E20FF31FDE01A20FB31FC2 +:100710008C91E555FC4F80832F5F3F4F203431058E +:1007200071F730939E0320939D038981803448F4B0 +:1007300010929C0310929B038BEA93E00E94740238 +:100740000CC081E090E090939C0380939B0389818F +:1007500090E09093A00380939F03DF91CF91089541 +:100760001F920F920FB60F9211248F930E94CF0EFB +:100770008091450382BF8F910F900FBE0F901F9005 +:1007800018951F920F920FB60F9211240E945A0EC5 +:100790000F900FBE0F901F90189520E040E45CE989 +:1007A000CA010197F1F72F5F2931D1F70895882306 +:1007B00021F0813059F084E008958EE080936F033A +:1007C0008093700388E18AB981E008958EE0809378 +:1007D00054038093550388E180939A0081E0089543 +:1007E000882321F0813071F084E0089510926F0326 +:1007F000109270031092900019B81AB810929500D8 +:1008000081E00895109254031092550310929800BD +:100810001092990010929A0010929D0081E0089524 +:10082000882321F0813039F084E0089520939000EE +:1008300069B981E00895209398006093990081E060 +:100840000895623011F492E001C090E0882321F015 +:10085000813061F084E0089580919500990F990F9F +:10086000990F982B9093950081E0089580919D00B9 +:10087000990F990F990F982B90939D0081E00895FF +:10088000663029F0673039F0653041F402C020E06D +:1008900006C020E001C021E090E002C021E091E02C +:1008A000882321F0813069F084E0089580919500DB +:1008B000220F220F990F922B982B9093950081E095 +:1008C000089580919D00220F220F990F922B982B53 +:1008D00090939D0081E00895653419F06F3419F408 +:1008E00005C021E001C020E090E002C021E091E0DD +:1008F000882321F0813079F084E00895809195007B +:100900002295220F207E9295907F922B982B909388 +:10091000950081E0089580919D002295220F207E10 +:100920009295907F922B982B90939D0081E0089553 +:10093000982FFA018230A0F084E008952191992344 +:1009400019F0913059F404C05D9BFECF2CB906C05C +:1009500080919B0085FFFCCF20939C0061507040EC +:100960006115710559F781E00895882321F08130E0 +:1009700039F084E008955D9BFECF6CB981E0089565 +:1009800080919B0085FFFCCF60939C0081E00895DF +:10099000E82FDB01823010F084E008959A0113C043 +:1009A000EE2321F0E13031F084E00AC05F9BFECFFE +:1009B0008CB106C080919B0087FFFCCF80919C008A +:1009C0008D93215030401216130654F381E00895A0 +:1009D000882321F0813031F084E008955F9BFECFC1 +:1009E0008CB1089580919B0087FFFCCF80919C0083 +:1009F000089570E00E9498048093EC041092ED0436 +:100A000083E090E00E94BD0108950E94400480931D +:100A1000EC041092ED0483E090E00E94BD01089583 +:100A20000E9440048093EC041092ED0483E090E077 +:100A30000E94BD0108950E9421048093EC0410924D +:100A4000ED0483E090E00E94BD0108950F930E94A1 +:100A500010048093EC041092ED0483E090E00E9477 +:100A6000BD010F9108950E94F0038093EC04109251 +:100A7000ED0483E090E00E94BD010895882321F0F9 +:100A8000813051F084E011C08EE080936F03809339 +:100A9000700388E18AB908C08EE080935403809384 +:100AA000550388E180939A0081E08093EC041092D2 +:100AB000ED0483E090E00E94BD010895CF92DF92A3 +:100AC000EF92FF920F931F93DF93CF93CDB7DEB7D3 +:100AD0008B01CDB6DEB62DB73EB7261B370B0FB652 +:100AE000F8943EBF0FBE2DBFEDB6FEB60894E11CD4 +:100AF000F11CAB01B7010E94C8048093EC0420E014 +:100B000030E00AC0F701E20FF31F8081F901E351E1 +:100B1000FB4F80832F5F3F4F201731079CF3F80175 +:100B2000E351FB4F1082C80103960E94BD010FB62E +:100B3000F894DEBE0FBECDBECF91DF911F910F9115 +:100B4000FF90EF90DF90CF9008950F93FC0180818C +:100B50008093EB048081843611F1853648F4823627 +:100B6000B1F08336E0F4803651F0813681F50BC068 +:100B7000873639F18836E9F0853649F515C0828126 +:100B80000E943E052DC082810E94330529C0068146 +:100B900025814481638182810E94260521C0638171 +:100BA00082810E941B051CC0638182810E94050511 +:100BB00017C0AF014C5F5F4F638182810E94F904CF +:100BC0000FC0638170E082810E945E0509C083E0EE +:100BD0008093EC041092ED0483E090E00E94BD014C +:100BE0000F91089587E28093530685E28093520621 +:100BF00090E2909354061092550628E030E030932E +:100C000057062093560683E280935F0681E2809325 +:100C10005E069093600610926106309363062093FF +:100C200062060895089560916B0681E20E9443096F +:100C3000089568E08BE20E94430961E188E20E9426 +:100C4000430968E08FE20E94430961E18CE20E945F +:100C5000430961E08FE20E94430910929A031092C7 +:100C6000990365E083E20E94430908950F931F935F +:100C70008C0160E480E20E944309F80162816058BF +:100C800084E00E944309F801828180936A061F91E3 +:100C90000F9108950F931F93CF93DF93EC01288555 +:100CA000398512161306DCF58E819F818217930712 +:100CB0001CF568E083E20E94430900E010E00FC0E9 +:100CC000EA85FB85E80FF91F608181E20E944309F4 +:100CD0008E819F8101969F838E830F5F1F4F8E8130 +:100CE0009F8128853985083011051CF482179307E8 +:100CF0003CF38217930724F061E087E20E944309E6 +:100D00008B81813031F465E089810E9443091B8227 +:100D100006C061E089810E94430981E08B83DF91F5 +:100D2000CF911F910F910895DF93CF9300D000D002 +:100D3000CDB7DEB7FC013281238110926506109297 +:100D4000640681E0809361062230F1F0233079F16E +:100D5000213009F057C080913E06809366061092BC +:100D600067068EE396E09093690680936806868115 +:100D700097818034910509F045C088E090E0909318 +:100D80006706809366063EC08681978190936706CA +:100D900080936606832F90E0880F991FE09150069C +:100DA000F0915106E80FF91F8081918127C033230C +:100DB000B9F0832F90E0880F991FE091A903F0917B +:100DC000AA03E80FF91F0190F081E02DF093690666 +:100DD000E09368068081809366061092670612C0D1 +:100DE00094E099832A8389E08B839C8384E090E05C +:100DF0009093670680936606CE01019690936906EC +:100E0000809368068EE596E00E944A060F900F9048 +:100E10000F900F90CF91DF910895CF93DF9382E2EF +:100E20000E940B09C82F85FF1AC068E083E20E9468 +:100E30004309C6FF10C02091640630916506809179 +:100E4000660690916706281739072CF48EE596E020 +:100E50000E944A0604C061E087E20E944309DF91D4 +:100E6000CF9108950F931F9388E00E940B09082FDC +:100E7000182F86FF18C060E085E00E94430960E8F3 +:100E800084E00E94430960E080E20E94430968E038 +:100E900083E20E94430961E087E20E94430962E025 +:100EA00085E00E94430914FF04C060EC89E00E94C1 +:100EB000430907FF04C060ED89E00E9443091F91C8 +:100EC0000F9108958AE00E940B0980FF03C00E94E1 +:100ED0000D07089581FF0DC08AE20E940B098091E1 +:100EE0002B06813061F4E0912E06F0912F060995D2 +:100EF000089582E30E940B098AE30E940B0908957A +:100F00008EE00E940B0968E08FE20E94430961E0D5 +:100F10008FE20E9443092091660630916706809116 +:100F2000620690916306821793075CF468E083E29F +:100F30000E94430961E087E20E94430981E08093B7 +:100F400061060895EF92FF920F931F93DF93CF9363 +:100F5000CDB7DEB728970FB6F894DEBF0FBECDBF72 +:100F600086E20E940B0986FF7FC08E010F5F1F4F34 +:100F700049E0E42EF12CEC0EFD1E809152060E94F9 +:100F80000B09F80181938F01EE15FF05B1F78E0172 +:100F90000F5F1F4F68E087E20E94430968E083E229 +:100FA0000E94430980E20E940B098F77682F80E23C +:100FB0000E944309898190E080769070803291058B +:100FC00009F440C080349105D1F1892BF1F5F80185 +:100FD00081818630D9F0873048F48130F1F1813059 +:100FE000C8F08330D1F1853081F521C0893019F105 +:100FF0008A3018F4883049F505C08A3071F18B3099 +:1010000021F520C060916B0681E225C0C8010E94D5 +:10101000940623C068E083E20E94430961E081E214 +:101020000E94430960E081E20E9443090BC0C801AD +:101030000E94360612C0C8010E9419060EC0C801DF +:101040000E94F80865E083E206C080E20E940B0976 +:101050008058682F80E20E944309F801808188232C +:10106000D1F465E083E215C02091660630916706F1 +:1010700080916206909163068217930764F4109240 +:1010800067061092660668E083E20E94430961E009 +:1010900087E20E94430928960FB6F894DEBF0FBE80 +:1010A000CDBFCF91DF911F910F91FF90EF900895E9 +:1010B000EF92FF920F931F93DF93CF93CDB7DEB7DD +:1010C000C054D0400FB6F894DEBF0FBECDBF8CE049 +:1010D0000E940B0980FF03C00E94A2077BC081FF12 +:1010E0002AC08EE20E940B098DE20E940B098983BF +:1010F0008E010F5F1F4F70E4E72EF12CEC0EFD1EEA +:101100000F5F1F4F0E943009F80180830E151F05E5 +:10111000B9F780913C03813039F4E0913F03F091BD +:101120004003CE010196099568E08FE20E944309D1 +:1011300061E08FE22BC082FF2CC086E30E940B0986 +:1011400085E30E940B0989838E010F5F1F4F60E4C6 +:10115000E62EF12CEC0EFD1E0F5F1F4F0E94300992 +:10116000F80180830E151F05B9F780913D0381308A +:1011700039F4E0914103F0914203CE0101960995C3 +:1011800068E087E30E94430961E087E30E94430926 +:1011900021C083FF1FC08EE30E940B098E010F5FE9 +:1011A0001F4F51E4E52EF12CEC0EFD1E8DE30E9445 +:1011B0000B09F80181938F01EE15FF05B9F78091B6 +:1011C0003E03813039F4E0913F03F0914003CE01BA +:1011D00001960995C05CDF4F0FB6F894DEBF0FBED5 +:1011E000CDBFCF91DF911F910F91FF90EF900895A8 +:1011F0000895089581E08ABF80E189BFE4E6F0E0C8 +:10120000808187608083E5E6F0E080818360808371 +:10121000A79AAF9A08959FEF9ABB8BBB85B380586E +:1012200085BBE5E6F0E0808195E08927808385B382 +:10123000805885BB80818927808300001ABA85B3D6 +:10124000805885BB808122E08227808300000000D7 +:1012500089B395B3905895BB908192279083089558 +:1012600085B3805885BBE5E6F0E0808122E08227E7 +:1012700080830000000089B395B3905895BB90819E +:101280009227908308958BBB8FEF8ABB85B38058DC +:1012900085BBE5E6F0E0808195E08927808385B312 +:1012A000805885BB8081892780836BBB85B380583C +:1012B00085BB808191E08927808385B3805885BB79 +:1012C00080818927808308958BBB85B3805885BB37 +:1012D000E5E6F0E0808191E08927808385B380583E +:1012E00085BB8081892780830895089582E180935A +:1012F0003E0681E080933F0680E191E090934106B5 +:1013000080934006109242061092430610924406C3 +:1013100088E0809345061092470610924606109288 +:1013200049061092480610924B0610924A061092F7 +:101330004C0610924D0610924E0610924F061092D7 +:101340003C0310923D0310923E0310922B06109224 +:101350002C0610922D06109235061092340610922B +:10136000A8031092A703089590934706809346061A +:10137000709349066093480650934B0640934A0683 +:1013800008959093470680934606089590934906E2 +:1013900080934806089590934B0680934A060895DB +:1013A00080934206089580934306089580934406EF +:1013B00008950F931F93CF93DF938C01CB01C091BE +:1013C0003406D091350662E070E00E94A21C10C085 +:1013D000988129818A81823041F4E92FF22F858119 +:1013E00090E08017910709F460870F80D885C02DA1 +:1013F000209771F7DF91CF911F910F910895CF93AF +:10140000DF939C01E0913406F091350614C0A08171 +:10141000B1818281843061F4848190E082179307E6 +:1014200039F4868190E08617970711F4ED014B831C +:101430000780F085E02D309751F7DF91CF91089527 +:101440008F929F92BF92CF92DF92EF92FF920F9373 +:101450001F93CF93DF934C01F62ED42EC22EB02EC5 +:10146000E0913406F0913506309799F489E090E0E8 +:101470000E94A31BFC019093350680933406918251 +:101480008082F38210861782D282C4820583E6822C +:1014900018C0CF010780F085E02D3097D1F78C017F +:1014A00089E090E00E94A31BFC01E80198878F83EC +:1014B00091828082F382D282C482B582E6821086D3 +:1014C0001782DF91CF911F910F91FF90EF90DF90E6 +:1014D000CF90BF909F908F900895EF92FF921F93AF +:1014E000CF93DF937C01C091A703D091A8032097ED +:1014F00011F011E012C085E090E00E94A31BFC01F6 +:101500009093A8038093A703F182E0821282148251 +:10151000138210E012C01F5FEC018B819C81009749 +:10152000D1F785E090E00E94A31BFC019C838B8394 +:10153000F182E082128314821382812FDF91CF9196 +:101540001F91FF90EF900895EF92FF920F931F93DA +:10155000CF93DF93E091A703F091A80380E090E0A0 +:101560000380F481E02D01963097D1F7880F991F01 +:101570000E94A31B8093A9039093AA03C091A70381 +:10158000D091A80301C0EC01E880F9808A8190E045 +:10159000880F991F0091A9031091AA03080F191F22 +:1015A000F701808190E00E94A31BF8018083918362 +:1015B00020E030E016C08A8190E0880F991FE0910A +:1015C000A903F091AA03E80FF91F0190F081E02D23 +:1015D000E20FF31FD701A20FB31F8C9180832F5FFF +:1015E0003F4FF701808190E02817390724F38B8162 +:1015F0009C81009741F6DF91CF911F910F91FF9051 +:10160000EF9008956F927F928F929F92AF92BF92C8 +:10161000CF92DF92EF92FF920F931F93CF93DF93BE +:10162000E0913406F0913506CC24DD2409C0828196 +:10163000823019F40894C11CD11C0780F085E02D7C +:101640003097A9F7C601880F991F0E94A31B8093AA +:101650005006909351060894C108D1085601AA0C6F +:10166000BB1C0894C11CD11CB1E06B2E712C8824CA +:10167000992451C0E0913406F0913506A9E0EA2E94 +:10168000F12C15C0A081B181848190E08615970569 +:1016900019F48381E80EF11CED018D81861521F48A +:1016A0008281823009F44D010780F085E02D30976A +:1016B00049F700915006109151060A0D1B1DC701F4 +:1016C0000E94A31BF8018083918320E030E0E09129 +:1016D0005006F0915106EA0DFB1D0190F081E02DBE +:1016E000E20FF31FD401A20FB31F8C9180832F5FF1 +:1016F0003F4F2930310559F7E0915006F0915106DE +:10170000EA0DFB1D0190F081E02D8E2D875F828315 +:101710000894611C711CC614D7040CF0ABCFE1E037 +:10172000EE2EF12C79E0A72EB12C662477248824A4 +:10173000992499C0A0913406B091350612C0ED915C +:10174000FC9111978181823049F4858190E08E155A +:101750009F0521F48481682E772405C0ED01AF81B7 +:10176000B885109761F701E010E072C0409134062F +:101770005091350667C0DA01ED91FC91818184308A +:1017800009F05DC0EA018E8190E08017910709F0B1 +:1017900056C08C8190E08E159F0509F050C0DF0186 +:1017A0009501BF01675F7F4FE0915006F0915106B0 +:1017B000E80DF91D0190F081E02DE20FF31F8D91EE +:1017C00080832F5F3F4FA617B70771F7E9E0F0E07E +:1017D000AE0EBF1EA0913406B09135062EC0ED01AD +:1017E0008A81853039F58C8190E08E159F0511F541 +:1017F0008D8190E080179107E9F4CD91DC911197EC +:101800009501BE01695F7F4FE0915006F09151064E +:10181000E80DF91D0190F081E02DE20FF31F899191 +:1018200080832F5F3F4FC617D70771F7E7E0F0E0DF +:10183000AE0EBF1EED01AF81B885109781F6FA019B +:10184000478150854115510509F095CF0F5F1F4F16 +:10185000601671060CF08ACF0894E11CF11C82E03E +:1018600090E0880E991ECE14DF040CF063CFDF9158 +:10187000CF911F910F91FF90EF90DF90CF90BF908D +:10188000AF909F908F907F906F9008958F929F92CE +:10189000AF92BF92CF92EF92FF920F931F93CF938D +:1018A000DF935C014B01122FE0913406F091350675 +:1018B00016C0A081B181848190E0A816B90661F4B8 +:1018C000868190E08815990539F48281843021F46D +:1018D000ED018C818F5F8C830780F085E02D309740 +:1018E00041F787E090E00E94A31BFC0187E0808322 +:1018F00085E0818312830383F582E482C682EE242D +:10190000082D2A2D45E067E0CF010E94200ADF91D3 +:10191000CF911F910F91FF90EF90CF90BF90AF901C +:101920009F908F900895AF92BF92CF92DF92EF92E7 +:10193000FF920F93FC01A114B10401F14230510553 +:1019400071F04330510599F041305105B9F481E00F +:1019500080932B06B0922F06A0922E060FC081E036 +:1019600080932C06B0923106A092300607C081E029 +:1019700080932D06B0923306A092320620583F4F36 +:10198000CF010E94460C0F91FF90EF90DF90CF9017 +:10199000BF90AF900895AF92BF92CF92DF92EF9237 +:1019A000FF920F93FC014230510571F04330510515 +:1019B00099F041305105B9F481E080933C03B09235 +:1019C0004003A0923F030FC081E080933D03B0929B +:1019D0004203A092410307C081E080933E03B0928E +:1019E0004403A0924303CF010E94460C0F91FF9045 +:1019F000EF90DF90CF90BF90AF900895EF920F934C +:101A00001F93CF93DF93182F062FA0913406B09128 +:101A10003506C0E0D0E014C02D913C911197F9013A +:101A20008581811751F4FD018281823031F4F90101 +:101A300084818F5F8483C82FD0E0FD01A781B085AA +:101A4000109751F789E090E00E94A31BFC0189E008 +:101A5000808384E08183028313821482158216823C +:101A600017821086EC2E00E0212F44E069E0CF01C0 +:101A70000E94200ACE01DF91CF911F910F91EF902C +:101A80000895DF92EF92FF920F931F93CF93DF930E +:101A9000182FE62EF42ED22EA0913406B0913506E2 +:101AA000C0E0D0E014C02D913C911197F9018581DF +:101AB000811751F4FD018281823031F4F901848172 +:101AC0008F5F8483C82FD0E0FD01A781B085109778 +:101AD00051F789E090E00E94A31BFC0189E080831C +:101AE00084E08183E28213821482F582D6820783A6 +:101AF0001086EC2E00E0212F44E069E0CF010E9427 +:101B0000200ACE01DF91CF911F910F91FF90EF90AE +:101B1000DF900895EF920F931F9310914F061F5F70 +:101B200010934F0689E090E00E94A31BFC0189E01E +:101B3000808389E090E09383828382E081831482B2 +:101B40001583168280EA87838AE18087EE2400E08D +:101B500020E042E069E0CF010E94200A812F90E05E +:101B60001F910F91EF9008950F931F93CF93DF93E1 +:101B70008C01FC0101900020E9F7E81BF90BCF0173 +:101B8000880F991F0E94A31BEC01F801019000200F +:101B9000E9F7E01BF10BEE0FFF1FE88323E0298339 +:101BA000AC0120E030E009C0F801E20FF31F8081B2 +:101BB000FA01808311822F5F3F4FF80101900020CE +:101BC000E9F73197E01BF10B4E5F5F4F2E173F0790 +:101BD00058F3CE010E946D0A90E0DF91CF911F91E2 +:101BE0000F910895EF92FF920F931F93CF93DF937E +:101BF0008C017B01CA010E94B40D282FE0913406AC +:101C0000F091350614C0A081B1818281843061F4E5 +:101C1000848190E08017910739F4868190E08E15D9 +:101C20009F0511F4ED0128870780F085E02D30979E +:101C300051F7DF91CF911F910F91FF90EF90089591 +:101C4000CF93DF93EC01CB010E94B40D382FA0910C +:101C50003406B091350611C09C91FD01218182812D +:101C6000823041F4E92FF22F858190E08C179D0797 +:101C700009F43683FD01A781B085109769F7DF91DC +:101C8000CF9108950E94B40D1816190614F480938C +:101C90004E0608950E94B40D1816190614F4809388 +:101CA0004D0608950E94B40D1816190614F4809379 +:101CB0004C0608951F9386E00E940B0986FF03C01F +:101CC0000E9458080EC082FF03C00E94620709C02C +:101CD00081FF03C00E94320704C084FF02C00E943B +:101CE000800787E00E940B09182F60E087E00E94C0 +:101CF0004309612F87E00E9443091F91089562E024 +:101D000081E00E94430908950E94020B0E94A40AE8 +:101D10000E94F20561E080E00E94430980E00E9499 +:101D20000B0980FDFBCF62E081E00E94430960E87F +:101D300084E00E94430960E480E20E94430968E075 +:101D400083E20E94430969E087E20E9443096FE051 +:101D50008DE00E9443096FE08BE00E94430968ED2B +:101D600089E00E94430963E38FE00E94430966ED26 +:101D700087E00E94430962E085E00E9443096CEC21 +:101D800080E00E94430908958EEC8093450381E032 +:101D900087BF8091450382BF83E083BF0895089584 +:101DA000089583E08093EB0481E08093EC048BE062 +:101DB0008093ED049FE69093EE0483E68093EF0416 +:101DC00084E78093F0049093F10480E78093F20419 +:101DD00085E78093F30483E78093F4048FE5809391 +:101DE000F50480E38093F60481E38093F704109276 +:101DF000F8048EE090E00E94BD010895FC0180810E +:101E0000833011F40E94D10E08951F9311E0812FA9 +:101E10000E94FE0F60E0812F0E94C4101F5F1431EA +:101E2000B1F718E1812F0E94FE0F60E0812F0E9420 +:101E3000C4101F5F1B32B1F71F910895FC0110827F +:101E400075836483738362834183478346830895E4 +:101E5000FC0190818181981710F080E00895A481A1 +:101E6000B5816D938781815019F48181A81BB109D7 +:101E70008783B583A4839FB7F89480818F5F808325 +:101E80009FBF81E00895FC0180818823E9F3A2814E +:101E9000B3812D918681815019F48181A81BB109EC +:101EA000B383A28386839FB7F89480818150808317 +:101EB0009FBF822F0895FC018081882319F42FEFA2 +:101EC0003FEF13C0A281B3812D918681815019F417 +:101ED0008181A81BB109B383A28386839FB7F8943D +:101EE0008081815080839FBF30E0C901089581E0E7 +:101EF000089581E0089581E0089581E00895982F84 +:101F00008150833120F08751833108F075C0E92F6B +:101F1000F0E0EB5BFC4F82E08183892F90E0FC01D5 +:101F20003197EC32F10508F067C0EA5BFF4FEE0F26 +:101F3000FF1F0590F491E02D0994159A5BC0169A45 +:101F400059C0179A57C0B89A55C0B99A53C0BA9A8F +:101F500051C0BB9A4FC0BC9A4DC0BD9A4BC0BE9AEF +:101F600049C0BF9A47C0889A45C0899A43C08A9A97 +:101F700041C08B9A3FC08C9A3DC08D9A3BC08E9ACF +:101F800039C08F9A37C0A09A35C0A19A33C0A29A9F +:101F900031C0A39A2FC0A49A2DC0A59A2BC0A69A8F +:101FA00029C080916100806803C0809161008064D5 +:101FB000809361001FC0809161008062F9CF8091A1 +:101FC00061008061F5CF809161008860F1CF8091E0 +:101FD00061008460EDCF809161008260E9CF8091E3 +:101FE00061008160E5CF109A05C0119A03C0129A72 +:101FF00001C0139A81E0089584E00895982F8150DC +:10200000833128F08751833110F084E00895892FBF +:102010000E947F0F81E00895982F8150833120F036 +:102020008751833108F075C0E92FF0E0EB5BFC4F7E +:1020300081E08183892F90E0FC013197EC32F1053A +:1020400008F067C0EE58FF4FEE0FFF1F0590F491A8 +:10205000E02D099415985BC0169859C0179857C081 +:10206000B89855C0B99853C0BA9851C0BB984FC0E2 +:10207000BC984DC0BD984BC0BE9849C0BF9847C0E2 +:10208000889845C0899843C08A9841C08B983FC0C2 +:102090008C983DC08D983BC08E9839C08F9837C0C2 +:1020A000A09835C0A19833C0A29831C0A3982FC082 +:1020B000A4982DC0A5982BC0A69829C08091610036 +:1020C0008F7703C0809161008F7B809361001FC078 +:1020D000809161008F7DF9CF809161008F7EF5CF77 +:1020E00080916100877FF1CF809161008B7FEDCF80 +:1020F000809161008D7FE9CF809161008E7FE5CF77 +:10210000109805C0119803C0129801C0139881E07F +:10211000089584E00895FB011082833089F08430B3 +:1021200028F4813049F0823029F408C0843051F01D +:10213000853051F085E0089586B307C083B305C0AC +:1021400080B303C081B101C080B1808381E0089574 +:10215000833089F0843028F4813049F0823029F4CA +:1021600008C0843051F0853059F084E0089568BB90 +:1021700005C065BB03C062BB01C063B981E00895BF +:102180006093620081E00895982FE82FF0E0EB5B08 +:10219000FC4F8181823011F086E00895892F90E014 +:1021A000FC013197EC32F10540F4E256FF4FEE0F9F +:1021B000FF1F0590F491E02D099484E008956623B3 +:1021C00011F01D9AFFC01D98FDC0662311F01E9AE4 +:1021D000F9C01E98F7C0662311F01F9AF3C01F982C +:1021E000F1C0662311F0C09AEDC0C098EBC0662321 +:1021F00011F0C19AE7C0C198E5C0662311F0C29AF8 +:10220000E1C0C298DFC0662311F0C39ADBC0C39857 +:10221000D9C0662311F0C49AD5C0C498D3C0662330 +:1022200011F0C59ACFC0C598CDC0662311F0C69AEB +:10223000C9C0C698C7C0662311F0C79AC3C0C79863 +:10224000C1C0662311F0909ABDC09098BBC06623B0 +:1022500011F0919AB7C09198B5C0662311F0929A87 +:10226000B1C09298AFC0662311F0939AABC0939817 +:10227000A9C0662311F0949AA5C09498A3C06623C0 +:1022800011F0959A9FC095989DC0662311F0969A7B +:1022900099C0969897C0662311F0979A93C0979823 +:1022A00091C0662311F0A89A8DC0A8988BC06623B0 +:1022B00011F0A99A87C0A99885C0662311F0AA9A3F +:1022C00081C0AA987FC0662311F0AB9A7BC0AB98FF +:1022D00079C0662311F0AC9A75C0AC9873C06623C0 +:1022E00011F0AD9A6FC0AD986DC0662311F0AE9A33 +:1022F00069C0AE9867C0662321F080916200806853 +:1023000049C0809162008F7745C0662321F080919B +:10231000620080643FC0809162008F7B3BC0662377 +:1023200021F080916200806235C0809162008F7DD3 +:1023300031C0662321F08091620080612BC08091C2 +:1023400062008F7E27C0662321F080916200886042 +:1023500021C080916200877F1DC0662321F080919B +:102360006200846017C0809162008B7F13C0662377 +:1023700021F08091620082600DC0809162008D7FAB +:1023800009C0662321F080916200816003C08091C2 +:1023900062008E7F8093620015C0662311F0189A48 +:1023A00011C018980FC0662311F0199A0BC0199824 +:1023B00009C0662311F01A9A05C01A9803C0662353 +:1023C00019F01B9A81E008951B9881E008951F93EE +:1023D000182F8150833128F08751833110F084E029 +:1023E0000EC0E12FF0E0EB5BFC4F83E08183812F97 +:1023F0000E947F0F61E0812F0E94C41081E01F9135 +:102400000895CF93DF93982FEB011882E82FF0E027 +:10241000EB5BFC4F8181813011F086E07AC0892F1F +:1024200090E0FC013197EC32F10540F4E653FF4FA8 +:10243000EE0FFF1F0590F491E02D099484E069C030 +:102440000D9B66C062C00E9B63C05FC00F9B60C0E7 +:102450005CC0B09B5DC059C0B19B5AC056C0B29B16 +:1024600057C053C0B39B54C050C0B49B51C04DC063 +:10247000B59B4EC04AC0B69B4BC047C0B79B48C037 +:1024800044C0809B45C041C0819B42C03EC0829BEE +:102490003FC03BC0839B3CC038C0849B39C035C023 +:1024A000859B36C032C0869B33C02FC0879B30C00F +:1024B0002CC0989B2DC029C0999B2AC026C09A9BEE +:1024C00027C023C09B9B24C020C09C9B21C01DC053 +:1024D000079B1EC01AC0069B1BC017C0059B18C0D7 +:1024E00014C0049B15C011C0039B12C00EC0029BF8 +:1024F0000FC00BC0089B0CC008C0099B09C005C0D9 +:102500000A9B06C002C00B9B03C081E0888301C008 +:1025100081E0DF91CF910895DF93CF930F92CDB7F4 +:10252000DEB79BE19093EB04BE016F5F7F4F0E948B +:1025300001128093EC0489818093ED041092EE04E3 +:1025400084E090E00E94BD010F90CF91DF9108954B +:102550009AE19093EB040E94C4108093EC041092D3 +:10256000ED0483E090E00E94BD01089598E190930E +:10257000EB040E94A8108093EC041092ED0483E019 +:1025800090E00E94BD010895982F89E18093EB04AB +:10259000933091F0943028F4913051F0923029F436 +:1025A00009C0943059F0953059F085E090E00AC0A8 +:1025B00096B307C093B305C090B303C091B101C0F7 +:1025C00090B181E08093EC049093ED041092EE04BE +:1025D00084E090E00E94BD01089597E19093EB04A0 +:1025E0000E94E7118093EC041092ED0483E090E0E8 +:1025F0000E94BD01089595E19093EB040E940C1098 +:102600008093EC041092ED0483E090E00E94BD0101 +:10261000089596E19093EB040E947F0F8093EC0461 +:102620001092ED0483E090E00E94BD01089584E1E2 +:102630008093EB0481E08093EC041092ED0483E03E +:1026400090E00E94BD01089582E18093EB0481E057 +:102650008093EC041092ED0483E090E00E94BD01B1 +:10266000089583E18093EB0481E08093EC04109261 +:10267000ED0483E090E00E94BD01089580E1809325 +:10268000EB0481E08093EC041092ED0483E090E091 +:102690000E94BD01089591E19093EB040E94FE0F0A +:1026A0008093EC041092ED0483E090E00E94BD0161 +:1026B0000895FC0180818531C9F1863180F4823131 +:1026C00031F1833130F48031D1F0813109F04CC0E7 +:1026D0001AC0833109F1843109F046C022C0883123 +:1026E00089F1893128F4863129F18731E9F526C04D +:1026F0008A3189F18A3158F18B31B1F531C082814B +:102700000E943E13089582810E944B1308956381B5 +:1027100082810E9424130895638182810E94311373 +:102720000895638182810E941713089582810E9417 +:10273000FB12089582810E940913089582810E94EC +:10274000ED120895638182810E94B61208958281FC +:102750000E94C4120895638182810E94A812089584 +:1027600082810E948C1208958093EB0483E0809311 +:10277000EC041092ED0483E090E00E94BD01089506 +:10278000E82F8152883018F024E030E007C0F0E0F4 +:10279000EB5BFC4F84E0818321E030E0C9010895C8 +:1027A000E82FF0E0EB5BFC4F8181843019F024E0EE +:1027B00030E003C0118221E030E0C901089517B86C +:1027C000823039F0833039F0813041F022E030E05E +:1027D00007C03E9A03C087B1806C87B921E030E022 +:1027E000C901089593E896B997B1907F982B97B94E +:1027F000369A3699FECF84B195B140E050E020E0A2 +:1028000030E0369A3699FECF84B195B1280F391F42 +:102810004F5F5F4F44305105A1F7379836952795A4 +:1028200036952795C9010895CF93DF93EB0119825F +:102830001882282F30E0F901EB5BFC4F8181843056 +:1028400019F026E030E00AC088E290E0821B930B8A +:102850000E94F2139983888321E030E0C901DF915F +:10286000CF910895982F83E28093EB0417B89230AC +:1028700039F0933039F0913041F082E090E007C0B8 +:102880003E9A03C087B1806C87B981E090E0809365 +:10289000EC041092ED0483E090E00E94BD010895E5 +:1028A000DF93CF9300D0CDB7DEB792E29093EB04E5 +:1028B000BE016F5F7F4F0E9414148093EC049981D6 +:1028C0008A818093ED049093EE041092EF0485E0EA +:1028D00090E00E94BD010F900F90CF91DF9108957D +:1028E00091E29093EB04E82FF0E0EB5BFC4F8181E9 +:1028F000843019F084E090E003C0118281E090E020 +:102900008093EC041092ED0483E090E00E94BD01FE +:102910000895E82F80E28093EB048E2F8152883057 +:1029200018F084E090E007C0F0E0EB5BFC4F84E03F +:10293000818381E090E08093EC041092ED0483E0C9 +:1029400090E00E94BD010895FC018081813271F008 +:10295000823218F48032B1F405C0823259F08332E9 +:1029600089F40CC082810E948914089582810E949A +:102970007014089582810E945014089582810E94EB +:10298000321408958093EB0483E08093EC0410925A +:10299000ED0483E090E00E94BD01089584E08093FF +:1029A0007400109271008BE0809352038CE080934E +:1029B000530381E090E00895E4E7F0E080818B7FAD +:1029C0008083109252031092530381E090E00895A7 +:1029D00080937000E1E7F0E080818C7F808381E06C +:1029E00090E0089580917100887F0895982F84EA7F +:1029F000809374008091740087FFFCCF80917100F8 +:102A0000887F883011F0803181F49093730084E8DE +:102A1000809374008091740087FFFCCF80917100D7 +:102A2000887F883129F0803419F022E030E002C03C +:102A300021E030E0C901089584E980937400809119 +:102A4000740084FDFCCF81E090E00895AC0120E0AB +:102A500030E094E812C0FA01E20FF31F8081809306 +:102A600073009093740080917100887F883219F010 +:102A700022E030E007C02F5F3F4F261737075CF397 +:102A800021E030E0C901089584EC809374008091C6 +:102A9000740087FFFCCF80917300089585E38093D5 +:102AA000EB0481E08093EC0420E030E094EC0EC075 +:102AB000909374008091740087FFFCCF8091730025 +:102AC000F901E351FB4F80832F5F3F4F26173707F4 +:102AD0007CF3FB01E351FB4F1082CB0103960E9474 +:102AE000BD010895AC0120E030E094E812C0FB0184 +:102AF000E20FF31F808180937300909374008091A4 +:102B00007100887F883219F082E090E007C02F5F63 +:102B10003F4F241735075CF381E090E08093EC048D +:102B20001092ED0483E090E00E94BD01089584E9D5 +:102B3000809374008091740084FDFCCF81E08093C9 +:102B4000EC041092ED0483E090E00E94BD01089532 +:102B50000E94F6148093EC041092ED0483E090E060 +:102B60000E94BD01089580937000E1E7F0E080814C +:102B70008C7F808381E08093EC041092ED0483E0ED +:102B800090E00E94BD010895E4E7F0E080818B7F32 +:102B90008083109252031092530381E08093EC04DF +:102BA0001092ED0483E090E00E94BD01089584E05E +:102BB00080937400109271008BE0809352038CE03C +:102BC0008093530381E08093EC041092ED0483E042 +:102BD00090E00E94BD010895FC0180818093EB0488 +:102BE00080818433D1F0853338F4813379F08233B6 +:102BF00081F0803341F507C08633F1F08633A8F0C9 +:102C0000873309F51DC00E94D71508950E94C41589 +:102C1000089582810E94B3150895BF016D5F7F4FB3 +:102C2000828190E00E9472150895638170E0828134 +:102C300090E00E944E15089582810E94A815089583 +:102C40000E949715089583E08093EC041092ED04A0 +:102C500083E090E00E94BD010895782F613041F03B +:102C6000613040F0623041F0633009F059C007C074 +:102C700060E006C060E001C061E050E002C061E0D9 +:102C800051E04330B9F0443028F4413059F042303B +:102C900078F40AC0453099F0453070F0463009F0BC +:102CA0003FC010C021E00CC021E041E030E00DC089 +:102CB00021E009C020E0F9CF20E041E005C020E09C +:102CC00040E0F4CF20E040E031E0BB9887B386607D +:102CD00087BB88B3817F88BB80E090E0772311F0C9 +:102CE00081E090E075E0880F991F7A95E1F78065A3 +:102CF000660F660F660F682B550F550F562B542B1A +:102D0000220F252B2DB93EB988E080934B038AE032 +:102D100080934C0389E080934D0321E030E002C0B2 +:102D200022E030E0C90108951DB81EB810924B038F +:102D300010924C0310924D0381E090E00895AC0195 +:102D400020E007C0E60FF71F80818FB9779BFECF89 +:102D50002F5FE22FF0E0E417F507A4F381E090E0A5 +:102D60000895DC0120E030E040E050E013C01FB8DF +:102D700008C083E0493E580714F088E008954F5F8B +:102D80005F4F779BF6CF8FB1FB01E20FF31F80837C +:102D90002F5F3F4F2A173B0754F381E00895CF93ED +:102DA000DF93EC0120E030E0A0E0B0E017C0FE01CE +:102DB000E20FF31F80818FB908C0119683E0A93E0E +:102DC000B8071CF028E030E00EC0779BF6CF8FB13B +:102DD000FB01E20FF31F80832F5F3F4F241735075E +:102DE00034F321E030E0C901DF91CF910895DC0197 +:102DF00083E48093EB0440E050E020E030E018C032 +:102E0000FD01E20FF31F80818FB909C04F5F5F4F53 +:102E100083E0493E58071CF028E030E00EC0779B65 +:102E2000F5CF8FB1F901E551FB4F82832F5F3F4F03 +:102E3000261737072CF321E030E02093EC04FB0148 +:102E4000E351FB4F1082CB0103960E94BD01089510 +:102E5000BC0184E48093EB0440E050E020E030E0EB +:102E600013C01FB808C083E0493E580714F088E03B +:102E70000FC04F5F5F4F779BF6CF8FB1F901E551E0 +:102E8000FB4F82832F5F3F4F2617370754F381E0B4 +:102E90008093EC04FB01E351FB4F1082CB010396BE +:102EA0000E94BD01089593E49093EB04282F30E035 +:102EB00090E007C0E60FF71F80818FB9779BFECFA8 +:102EC0009F5FE92FF0E0E217F307A4F381E080931E +:102ED000EC041092ED0483E090E00E94BD0108959F +:102EE00081E48093EB041DB81EB810924B0310923E +:102EF0004C0310924D0381E08093EC041092ED049A +:102F000083E090E00E94BD01089590E49093EB046B +:102F10000E942D168093EC041092ED0483E090E063 +:102F20000E94BD010895CF93DF93EC018881833423 +:102F3000A9F0843428F4803441F0813409F50BC0C1 +:102F4000843499F08534E1F414C04C816B818A811A +:102F50000E94851720C00E9470171DC0BE016D5FC2 +:102F60007F4F8A810E94531716C08A8190E00E9489 +:102F700028176A8170E0CE0103960E94F7160BC0F5 +:102F80008093EB0483E08093EC041092ED0483E0E3 +:102F900090E00E94BD01DF91CF910895B89AB99A4F +:102FA000BA9ABB98BC9ABD9AC498C59881E08093A0 +:102FB000560382E08093570380935803809359030C +:102FC00081E090E0089510925603109257031092FA +:102FD00058031092590381E090E00895C098C19879 +:102FE000C29880E29EE40197F1F7C09A8AE0982F98 +:102FF0009A95F1F7C29AC19A8A95F1F70895282F08 +:10300000C19887FD02C0C29801C0C29A8AE0982F79 +:103010009A95F1F7C19A8A95F1F7C19826FF02C0F7 +:10302000C29A01C0C2988AE0982F9A95F1F7C19A86 +:103030008A95F1F70895880F20E03AE0C19887FF5C +:1030400002C0C29A01C0C298932F9A95F1F7C19A13 +:10305000932F9A95F1F72F5F273011F0880FEECF5D +:10306000089520E03AE0C19887FF02C0C29A01C0EB +:10307000C298932F9A95F1F7C19A932F9A95F1F7E9 +:103080002F5F283011F0880FEECF0895C198C298B5 +:103090008AE0982F9A95F1F7C19A982F9A95F1F7AF +:1030A000C198C098982F9A95F1F7C19A982F9A9540 +:1030B000F1F7C1988A95F1F7C09A80E00895C19818 +:1030C000C098C298C39A08950E94EE1780E30E94A8 +:1030D000FF1780E60E941B1808950E94EE1780E0FB +:1030E0000E94FF1780E00E941B18C198C098C298E8 +:1030F000C39A08950F931F93182F062F0E94EE175F +:1031000080E40E94FF17812F0E941B18802F0E94CD +:10311000311881E01F910F9108951F93182F0E947D +:10312000EE1780EC0E94FF17812F0E941B180E944F +:1031300046181F910895C1988AE08A95F1F7C298C0 +:1031400020E080E04AE0880FC19A942F9A95F1F729 +:10315000C198B3998F5F3AE0942F9A95F1F72F5F5A +:10316000283089F7C098C19A932F9A95F1F7C09AA1 +:10317000C198932F9A95F1F708951F93182F0E94E5 +:10318000EE1780E80E94FF17812F0E941B180E94F3 +:103190009B181F910895DF92EF92FF920F931F9358 +:1031A000CF93DF93D82E7B018A01C0E0D0E009C025 +:1031B0008D2D8C0F0E94BD18F801EC0FFD1F808330 +:1031C0002196CE15DF05A0F381E090E0DF91CF914D +:1031D0001F910F91FF90EF90DF9008950F931F9331 +:1031E000082F162F0E946418612F802F0E947A18D2 +:1031F00081E01F910F910895DF92EF92FF920F935C +:103200001F93CF93DF93D82E7B018A01C0E0D0E0DB +:1032100009C0F801EC0FFD1F60818D2D8C0F0E94FD +:10322000EE182196CE15DF05A0F381E090E0DF9146 +:10323000CF911F910F91FF90EF90DF90089594E050 +:103240009093EB040E94FC188093EC041092ED0420 +:1032500083E090E00E94BD010895EF92FF920F93EA +:103260001F938B019BEEE92E94E0F92E93E090934F +:10327000EB04A7014E5F5F4F0E94CB188093EC04D4 +:103280000E5F1F4FE00EF11EF7011082C80101967C +:103290000E94BD011F910F91FF90EF90089582E071 +:1032A0008093EB0410925603109257031092580328 +:1032B0001092590381E08093EC041092ED0483E0B6 +:1032C00090E00E94BD01089581E08093EB040E948C +:1032D000CE178093EC041092ED0483E090E00E94FE +:1032E000BD010895FC018381823069F0833018F4B8 +:1032F0008130F1F405C0833049F08430C9F40FC047 +:103300000E94641908950E944F190895AF014A5F01 +:103310005F4F658170E084810E942D190895AF018F +:103320004A5F5F4F658170E084810E941F19089594 +:1033300080818093EB0483E08093EC041092ED0491 +:1033400083E090E00E94BD0108951F920F920FB696 +:103350000F9211240F900FBE0F901F9018959C0193 +:103360000897029718F024E030E017C0F901EB5BF2 +:10337000FC4F8DE081832830310561F02930310523 +:1033800019F027E030E009C0BD9A81E090E09BBDD4 +:103390008ABD01C0BC9A21E030E0C9010895FC015A +:1033A000EB5BFC4F118281E090E008959C01FC01F1 +:1033B000EB5BFC4F81818D3019F026E030E029C0B5 +:1033C0002830310521F12930310519F027E030E0AE +:1033D00020C063307105A9F0643071053CF46130A0 +:1033E000710559F06230710591F409C064307105BE +:1033F00051F06530710559F408C081E007C082E0E2 +:1034000005C083E003C084E001C085E08EBD21E0FB +:1034100030E0C90108959C01FC01EB5BFC4F818108 +:103420008D3019F026E030E00DC02830310541F034 +:103430002930310519F027E030E004C07BBD6ABDBA +:1034400021E030E0C90108959C0183E58093EB04FD +:10345000F901EB5BFC4F81818D3019F086E090E043 +:103460000DC02830310541F02930310519F087E0D1 +:1034700090E004C07BBD6ABD81E090E08093EC04E5 +:103480001092ED0483E090E00E94BD01089522E5D2 +:103490002093EB040E94D6198093EC041092ED0463 +:1034A00083E090E00E94BD01089521E52093EB04A4 +:1034B000FC01EB5BFC4F118281E08093EC041092E5 +:1034C000ED0483E090E00E94BD01089520E5209383 +:1034D000EB040E94AF198093EC041092ED0483E09A +:1034E00090E00E94BD010895FC018081813579F052 +:1034F000823518F48035F1F405C0823569F08335E2 +:10350000C9F411C0828190E00E94661A08958281F8 +:1035100090E00E94551A0895638170E0828190E0E6 +:103520000E94471A0895638170E0828190E00E94B2 +:10353000241A08958093EB0483E08093EC041092A6 +:10354000ED0483E090E00E94BD010895DF93CF93E6 +:10355000CDB7DEB7CF91DF910895089581E090E077 +:10356000089508958A3310F4805301C087556A3353 +:1035700010F4605301C067556F708295807F862B71 +:1035800008950895DC0180E1A030B80710F082E0D2 +:103590000895E199FECF9D0109C03FBB2EBB2F5F6F +:1035A0003F4FE09A8DB3E60FF71F8083822F8A1B6F +:1035B000E82FF0E0E417F50780F381E00895DC01DF +:1035C00080E1A030B80710F082E00895E199FECFC5 +:1035D0009D010AC03FBB2EBB2F5F3F4FE60FF71F79 +:1035E00080818DBBE29AE19A822F8A1BE82FF0E05E +:1035F000E417F50778F381E008950F931F938B018B +:1036000021E82093EB040E94DF1A8093EC041092CF +:10361000ED041F930F9389EF92E09F938F930E9485 +:10362000A61A83E090E00E94BD010F900F900F90CA +:103630000F901F910F910895CF93DF93AC01EB0191 +:1036400080E88093EB0480E14030580710F082E07E +:1036500015C0E199FECF9A0109C03FBB2EBB2F5F79 +:103660003F4FE09A8DB3E351FB4F8083822F841B41 +:10367000E82FF0E0EC17FD0780F381E08093EC0485 +:10368000FE01E351FB4F10828DEE94E09F938F93E8 +:1036900086E093E09F938F930E94A61ACE01039633 +:1036A0000E94BD010F900F900F900F90DF91CF916E +:1036B0000895EF92FF920F931F93CF93DF93EC0146 +:1036C0009B8180E02A817C01E20EF11C9D8180E0DB +:1036D0002C818C01020F111DFF92EF921F930F930B +:1036E00080E193E09F938F930E94A61A88812DB763 +:1036F0003EB72A5F3F4F0FB6F8943EBF0FBE2DBFB7 +:10370000803819F0813869F405C0B801C7010E94FA +:103710001C1B12C02696A801BE01C7010E94FD1AFB +:103720000BC08093EB0483E08093EC041092ED04D3 +:1037300083E090E00E94BD01DF91CF911F910F9136 +:10374000FF90EF900895CF93DF93BC0182309105F5 +:1037500010F462E070E0A0917006B0917106ED0186 +:10376000E0E0F0E040E050E021C0888199818617D8 +:10377000970769F48A819B81309719F0938382833C +:1037800004C09093710680937006FE0133C06817E1 +:10379000790738F44115510519F08417950708F495 +:1037A000AC01FE018A819B819C01E9012097E9F629 +:1037B00041155105A1F1CA01861B970B049708F426 +:1037C000BA01E0E0F0E029C08D919C911197841737 +:1037D0009507F1F46417750779F4ED018A819B81EF +:1037E000309719F09383828304C09093710680937D +:1037F0007006FD0132964CC0CA01861B970BFD0175 +:10380000E80FF91F6193719302978D939C9340C0C9 +:10381000FD01828193819C01D9011097A9F68091C5 +:103820006E0690916F06892B41F480913703909139 +:10383000380390936F0680936E0640913903509140 +:103840003A034115510541F44DB75EB780913503F8 +:1038500090913603481B590B20916E0630916F06EC +:10386000CA01821B930B8617970780F0AB014E5F4E +:103870005F4F8417950750F0420F531F50936F0608 +:1038800040936E06F9016193719302C0E0E0F0E0AD +:10389000CF01DF91CF910895CF93DF93009709F483 +:1038A0004EC0EC0122971B821A82A0917006B09143 +:1038B0007106109701F140E050E0AC17BD0700F130 +:1038C000BB83AA83FE0121913191E20FF31FAE1752 +:1038D000BF0771F48D919C911197280F391F2E5FAE +:1038E0003F4F39832883FD01828193819B838A83A3 +:1038F0004115510569F4D0937106C09370061FC03D +:10390000FD0182819381AD01009711F0DC01D5CFDB +:10391000FA01D383C28321913191E20FF31FCE17B5 +:10392000DF0769F488819981280F391F2E5F3F4F87 +:10393000FA01318320838A819B8193838283DF9183 +:10394000CF91089597FB092E07260AD077FD04D062 +:103950000CD006D000201AF4709561957F4F089521 +:10396000F6F7909581959F4F0895AA1BBB1B51E1D7 +:1039700007C0AA1FBB1FA617B70710F0A61BB70BDF +:10398000881F991F5A95A9F780959095BC01CD0184 +:063990000895F894FFCF3A +:10399600456D62656464656450726F6A65637473CD +:1039A600004F63746F70757355534220496E74658A +:1039B600726661636520436F6E7665727465722008 +:1039C600616E6420492F4F20457874656E73696F68 +:1039D6006E003230303831313038006669727374B7 +:1039E600207061636B6574206F662061206C6F6E5A +:1039F60067206D65737361676520286C656E6774F3 +:103A0600683A202564290A006F63746F7075732005 +:103A16006C6F6E672072756E6E696E67206D65736A +:103A2600736167650A006F63746F7075732E6C6FD0 +:103A36006E675F696E646578203C206F63746F7093 +:103A460075732E6C6F6E675F62797465730A006EAC +:103A56006F74206C617374207061636B65743A20B7 +:103A660064696666203E2036340A006C61737420F1 +:103A76007061636B65740A007061727365722C20E5 +:103A8600636865636B3A2025582C20636F6D6D6102 +:103A96006E643A2025580A0063616C6C696E672073 +:103AA600696F5F7061727365720A0063616C6C693D +:103AB6006E67206164635F7061727365720A00638A +:103AC600616C6C696E67206932635F7061727365E1 +:103AD600720A0063616C6C696E67207370695F704F +:103AE60061727365720A0063616C6C696E6720703F +:103AF600776D5F7061727365720A0063616E277419 +:103B06002063616C6C2063616E5F706172736572B5 +:103B1600202D206E6F2043414E2D737570706F728D +:103B2600740A0063616C6C696E6720656570726FFC +:103B36006D5F7061727365720A00756E6B6E6F777A +:103B46006E20636D640A00726563656976696E67E7 +:103B560020636F6D6D616E643A20255820286C6570 +:103B66006E6774683A202575290A00676574206EA9 +:103B76006578740A0067657420616E6420657865EF +:103B8600637574650A000904007772697474656E5A +:103B96003A2025730A00726561643A2025730A008B +:103BA600656570726F6D5F7061727365723A206CD5 +:103BB600656E6774683A2025752C20616464723AD4 +:0C3BC6002025750A002000720600000097 +:00000001FF diff --git a/firmware/octopus_stable_1_1.hex b/firmware/octopus_stable_1_1.hex new file mode 100644 index 0000000..5fa412b --- /dev/null +++ b/firmware/octopus_stable_1_1.hex @@ -0,0 +1,971 @@ +:100000000C94F6000C9415010C9415010C94150138 +:100010000C9415010C94E4030C9415010C94150137 +:100020000C9415010C9415010C9415010C941501F8 +:100030000C94031A0C9415010C9415010C941501E1 +:100040000C94BD030C9415010C9417010C9415012C +:100050000C9415010C9415010C9415010C941501C8 +:100060000C9415010C9415010C9415010C941501B8 +:100070000C9415010C9415010C9415010C941501A8 +:100080000C9415010C9415010C941501001002102C +:100090000410061008100A100C100E101010121088 +:1000A0001410161018101A101C101E1020102210F8 +:1000B0002410661066106610661066106610261012 +:1000C00028102A102C102E10301032103410381036 +:1000D0003C10421046104A104E10521058105A1040 +:1000E0005C106010AF10B110B310B510B710B9109C +:1000F000BB10BD10BF10C110C310C510C710C91070 +:10010000CB10CD10CF10D110D31015111511151122 +:10011000151115111511D510D710D910DB10DD10E0 +:10012000DF10E110E310E710EB10F110F510F910FB +:10013000FD100111071109110B110F118111871108 +:100140008D11931199119F11A511AB11B111B71117 +:10015000BD11C311C911CF11D511DB11E111E71187 +:10016000ED117E117E117E117E117E117E11F31133 +:10017000F911FF1105120B12111217121D1227127D +:1001800033123D12471251125B1265126F12751233 +:100190007B128112CA12CD12D012D312D612D912EA +:1001A000DC12DF12E212E512E812EB12EE12F1128B +:1001B000F412F712FA12FD120013C712C712C71277 +:1001C000C712C712C7120313061309130C130F1318 +:1001D000181315131213151318131B131E132113C1 +:1001E00027132413241327132A132D1311241FBE9E +:1001F000CFEFD0E1DEBFCDBF13E0A0E0B1E0E6E598 +:10020000FAE300E00BBF02C007900D92AC33B107D8 +:10021000D9F716E0ACE3B3E001C01D92A237B107F5 +:10022000E1F70E942C010C942A1D0C9400001F92EF +:100230000F920FB60F9211240F900FBE0F901F90C8 +:100240001895FC0120E030E002C02F5F3F4F819104 +:100250008823D9F7C9010895CCEFD0E1DEBFCDBF27 +:10026000F8940E9453090E94CC0E8FEF87BB88BB85 +:10027000C7980E94B80981E897E10E94030A85E6C1 +:100280009CE00E94080A81E090E00E940D0ADE01D5 +:100290001196E6EFF2E083E001900D928150E1F7D4 +:1002A000CE0101960E94020E80E091E00E949E0E17 +:1002B00081E191E00E94960E82E491E00E948E0E10 +:1002C0000E94D80D4C0164E670E00E941B0A60E0B9 +:1002D00070E0C4010E94440D3C0140E050E0BC01CC +:1002E000C4010E943C0A2EE0A22E22E0B22ECC24B1 +:1002F000DD2490E4E92EF12C02E021E030E041E041 +:1003000050E0B301C4010E94D90C8DE2A82E83E015 +:10031000B82E21E030E041E050E0B301C4010E947A +:10032000110D10929A031092990310929C0310924F +:100330009B030E940E1B8FE784BB8AE285BB0E9451 +:10034000080485E585BB0E94080415BA0E94520F77 +:100350000E9453090E94D10E7894FFCF0F931F93F0 +:10036000CF93DF93EC018134910510F18091A503C7 +:100370009091A603892BE1F4DF93CF938BE491E076 +:100380009F938F930E94071B1092A2031092A103C8 +:10039000D093A403C093A30381E090E09093A603BD +:1003A0008093A503C0E4D0E00F900F900F900F90C2 +:1003B00068E08BE20E94A10900E010E00EC0E0912D +:1003C000A103F091A203E00FF11FE551FB4F608103 +:1003D00089E20E94A1090F5F1F4F0C171D0779F7D3 +:1003E0008091990390919A03019749F467E08BE219 +:1003F0000E94A10910929A03109299030AC063E027 +:100400008BE20E94A10981E090E090939A0380938F +:100410009903DF91CF911F910F910895CF93DF93AF +:100420008091A5039091A603019709F04CC088E73D +:1004300091E09F938F930E94071B2091A10330911D +:10044000A2038091A3039091A4030F900F9028170B +:100450003907C8F586E991E09F938F930E94071BA7 +:10046000C091A303D091A4038091A1039091A20312 +:10047000C81BD90B8091A1039091A203805C9F4F70 +:100480009093A2038093A1030F900F90C134D105E4 +:100490005CF08FEB91E09F938F930E94071B80E4A9 +:1004A00090E00E94AE010DC08BED91E09F938F9381 +:1004B0000E94071BCE010E94AE011092A60310926B +:1004C000A5030F900F90DF91CF9108950F931F9385 +:1004D000CF93DF938C011092A2031092A10310928C +:1004E000A6031092A503C79AFC018081282F2295AC +:1004F0002F70C22FDD2799279F938F93DF93CF9380 +:1005000088EE91E09F938F930E94071B8DB79EB753 +:1005100006960FB6F8949EBF0FBE8DBFC430D105AE +:1005200009F451C0C530D10584F4C130D10569F159 +:10053000C230D1051CF4CD2BC1F074C0C230D1053E +:1005400071F1239709F06EC034C0C630D10509F4AB +:100550004EC0C630D1050CF440C0C730D10509F4F7 +:1005600050C0289709F05EC053C0F80180818630E2 +:1005700041F48281813009F06AC0C8010E94D0191B +:1005800066C0C8010E944B0F62C088E092E09F9352 +:100590008F930E94071BC8010E940F1456C08BE165 +:1005A00092E09F938F930E94071BC8010E945315EE +:1005B0004CC08FE292E09F938F930E94071BC8016B +:1005C0000E94731642C083E492E09F938F930E942F +:1005D000071BC8010E94EE1738C087E592E09F9381 +:1005E0008F930E94071BC8010E94D51A2EC08BE171 +:1005F00092E09F938F930E94071BC8010E94E5051C +:1006000024C08BE692E09F938F930E94071B1DC02E +:1006100083E992E09F938F930E94071BC8010E9479 +:10062000B91B13C08AEA92E09F938F930E94071B25 +:10063000F80180818093EB0483E08093EC041092B6 +:10064000ED0483E090E00E94AE010F900F90C798F8 +:10065000DF91CF911F910F9108950F931F93CF9327 +:10066000DF93EC018C010F5F1F4F898199279F93C6 +:100670008F9387EB92E09F938F930E94071B80914B +:100680009B0390919C030F900F900F900F900197F8 +:1006900091F58BED92E09F938F930E94071B20E0D2 +:1006A00030E00F900F90E0919D03F0919E03E20FD8 +:1006B000F31FDE01A20FB31F8C91E555FC4F808321 +:1006C0002F5F3F4F2034310571F780919D0390914A +:1006D0009E03805C9F4F90939E0380939D03209187 +:1006E0009D0330919E0380919F039091A003281752 +:1006F0003907F0F128C085EE92E09F938F930E9416 +:10070000071B10929E0310929D0320E030E00F9093 +:100710000F90E0919D03F0919E03E20FF31FDE0125 +:10072000A20FB31F8C91E555FC4F80832F5F3F4F85 +:100730002034310571F730939E0320939D03F80117 +:100740002081203448F410929C0310929B038BEA82 +:1007500093E00E9466020CC081E090E090939C03BD +:1007600080939B03822F99279093A00380939F03EC +:10077000DF91CF911F910F9108951F920F920FB6A5 +:100780000F9211242F933F934F935F936F937F9317 +:100790008F939F93AF93BF93EF93FF930E941C0F90 +:1007A0008091450382BFFF91EF91BF91AF919F91DF +:1007B0008F917F916F915F914F913F912F910F900A +:1007C0000FBE0F901F9018951F920F920FB60F92A9 +:1007D00011242F933F934F935F936F937F938F9346 +:1007E0009F93AF93BF93EF93FF930E94A60EFF9149 +:1007F000EF91BF91AF919F918F917F916F915F9199 +:100800004F913F912F910F900FBE0F901F90189511 +:1008100020E080E49CE90197F1F72F5F2931C9F7C7 +:100820000895882329F0813069F084E090E00895EC +:100830008EE080936F038093700388E18AB981E032 +:1008400090E008958EE0809354038093550388E1EF +:1008500080939A0081E090E00895882329F0813008 +:1008600081F084E090E0089510926F03109270037D +:100870001092900019B81AB81092950081E090E09B +:1008800008951092540310925503109298001092FC +:10089000990010929A0010929D0081E090E00895D6 +:1008A0000F93882329F0813039F084E090E00AC06A +:1008B0002093900069B904C0209398006093990038 +:1008C00081E090E00F910895623011F492E001C050 +:1008D00090E0882329F0813071F084E090E0089561 +:1008E00080919500990F990F990F982B90939500EF +:1008F00081E090E0089580919D00990F990F990FE4 +:10090000982B90939D0081E090E00895663061F00F +:10091000673019F0653019F404C021E003C021E00C +:1009200004C020E090E002C020E091E0882329F09C +:10093000813079F084E090E0089580919500220F55 +:10094000220F990F922B982B9093950081E090E0C5 +:10095000089580919D00220F220F990F922B982BC2 +:1009600090939D0081E090E00895653439F06F34F4 +:1009700019F421E091E004C020E001C021E090E002 +:10098000882329F0813089F084E090E008958091F7 +:1009900095002295220F207E9295907F922B982B86 +:1009A0009093950081E090E0089580919D002295BC +:1009B000220F207E9295907F922B982B90939D00F2 +:1009C00081E090E00895882329F0813049F084E0A7 +:1009D00090E008955D9BFECF6CB981E090E00895B2 +:1009E00080919B0085FFFCCF60939C0081E090E0AC +:1009F0000895FF920F931F93CF93DF93F82EEB018F +:100A00008A0181E08F1548F484E090E00DC0F80180 +:100A100061918F018F2D0E94E3042197FFEFCF3F5B +:100A2000DF07A9F781E090E0DF91CF911F910F914F +:100A3000FF900895882329F0813039F084E090E018 +:100A400008955F9BFECF8CB106C080919B0087FF0D +:100A5000FCCF80919C0099270895FF920F931F93DC +:100A6000CF93DF93F82E8B0181E08F1518F484E08B +:100A700090E00EC0EA0107C08F2D0E941A05F80110 +:100A800081938F0121971C161D06B4F381E090E03D +:100A9000DF91CF911F910F91FF90089577270E94CA +:100AA000F9048093EC041092ED0483E090E00E943E +:100AB000AE0108950E9486048093EC041092ED0428 +:100AC00083E090E00E94AE0108950E948604809326 +:100AD000EC041092ED0483E090E00E94AE010895D2 +:100AE0000E9464048093EC041092ED0483E090E093 +:100AF0000E94AE0108950F930E9450048093EC046D +:100B00001092ED0483E090E00E94AE010F910895F1 +:100B10000E942D048093EC041092ED0483E090E099 +:100B20000E94AE0108950E9411048093EC0410927B +:100B3000ED0483E090E00E94AE010895CF92DF9231 +:100B4000EF92FF920F931F93CF93DF93CDB7DEB752 +:100B50008B01CDB6DEB62DB73EB7261B370B0FB6D1 +:100B6000F8943EBF0FBE2DBFEDB6FEB60894E11C53 +:100B7000F11CAB01B7010E942D058093EC0420E02D +:100B800030E00AC0F701E20FF31F8081F901E35161 +:100B9000FB4F80832F5F3F4F201731079CF3F801F5 +:100BA000E351FB4F1082C80103960E94AE010FB6BD +:100BB000F894DEBE0FBECDBEDF91CF911F910F9195 +:100BC000FF90EF90DF90CF9008950F93FC0180810C +:100BD0008093EB04843611F1853648F48236B1F007 +:100BE0008336E0F4803651F0813681F50BC08736CC +:100BF00039F18836E9F0853649F515C082810E94C1 +:100C000093052DC082810E94880529C00681258117 +:100C10004481638182810E947B0521C0638182813E +:100C20000E9470051CC0638182810E945A0517C012 +:100C3000AF014C5F5F4F638182810E944E050FC000 +:100C40006381772782810E949E0509C083E080939B +:100C5000EC041092ED0483E090E00E94AE010F914D +:100C6000089587E28093530685E28093520690E2CE +:100C7000909354061092550628E030E030935706C2 +:100C80002093560683E280935F0681E280935E069E +:100C9000909360061092610630936306209362067B +:100CA0000895089560916B0681E20E94A10908955C +:100CB00068E08BE20E94A10961E188E20E94A1093B +:100CC00068E08FE20E94A10961E18CE20E94A10923 +:100CD00061E08FE20E94A10910929A031092990399 +:100CE00065E083E20E94A10908950F931F938C0190 +:100CF00060E480E20E94A109F8016281605884E00A +:100D00000E94A109F801828180936A061F910F91C8 +:100D100008950F931F93CF93DF93EC0128853985B6 +:100D200012161306DCF58E819F81821793071CF53E +:100D300068E083E20E94A10900E010E00FC08A850C +:100D40009B85E80FF91F608181E20E94A1098E81D5 +:100D50009F8101969F838E830F5F1F4FEE81FF81DE +:100D600088859985083011051CF4E817F9073CF3CC +:100D7000E817F90724F061E087E20E94A1098B815E +:100D8000813031F465E089810E94A1091B8206C08F +:100D900061E089810E94A10981E08B83DF91CF917D +:100DA0001F910F910895CF93DF93CDB7DEB72497AE +:100DB0000FB6F894DEBF0FBECDBFDC01FC0122816F +:100DC0003381109265061092640681E0809361067B +:100DD000832F99278230D9F0833069F1813009F06F +:100DE00057C080913E0699279093670680936606C8 +:100DF0008EE396E0909369068093680686819781DA +:100E00008034910509F044C088E090E029C0FD01DC +:100E1000868197819093670680936606E22FFF276D +:100E2000EE0FFF1F8091500690915106E80FF91FB9 +:100E30008081918129C02223C1F0E22FFF27EE0F8C +:100E4000FF1F8091A9039091AA03E80FF91F019059 +:100E5000F081E02DF0936906E09368068081992780 +:100E6000909367068093660613C094E0998383E0AD +:100E70008A8389E08B839C8384E090E0909367066B +:100E800080936606CE01019690936906809368066A +:100E90008EE596E00E94890624960FB6F894DEBF90 +:100EA0000FBECDBFDF91CF910895CF93DF9382E244 +:100EB0000E947809C82FDD27C5FF1AC068E083E2C9 +:100EC0000E94A109C6FF10C02091640630916506FA +:100ED0008091660690916706281739072CF48EE5F5 +:100EE00096E00E94890604C061E087E20E94A109A1 +:100EF000DF91CF9108951F93CF93DF9388E00E94F5 +:100F00007809182FC82FDD27C6FF18C060E085E0DC +:100F10000E94A10960E884E00E94A10960E080E2EB +:100F20000E94A10968E083E20E94A10961E087E2D2 +:100F30000E94A10962E085E00E94A109C4FF04C0EB +:100F400060EC89E00E94A10917FF04C060ED89E010 +:100F50000E94A109DF91CF911F9108958AE00E941C +:100F60007809992780FF03C00E945507089581FFE3 +:100F70000DC08AE20E94780980912B06813061F4CD +:100F8000E0912E06F0912F060995089582E30E94C4 +:100F900078098AE30E94780908958EE00E94780912 +:100FA00068E08FE20E94A10961E08FE20E94A1093E +:100FB00020916606309167068091620690916306E3 +:100FC000821793075CF468E083E20E94A10961E064 +:100FD00087E20E94A10981E0809361060895AF92A3 +:100FE000BF92CF92DF92EF92FF920F931F93CF9316 +:100FF000DF93CDB7DEB728970FB6F894DEBF0FBEEC +:10100000CDBF86E20E94780986FF7EC08E010F5F09 +:101010001F4F580169E0C62ED12CCC0EDD1E8091E9 +:1010200052060E947809F80181938F017501EC1531 +:10103000FD05A9F768E087E20E94A10968E083E264 +:101040000E94A10980E20E9478098F77682F80E2D0 +:101050000E94A1098981992780769070803291053C +:1010600009F440C080349105D1F1892BF1F5F501E7 +:1010700081818630D9F0873048F48130F1F18130B8 +:10108000C8F08330D1F1853081F521C0893019F164 +:101090008A3018F4883049F505C08A3071F18B30F8 +:1010A00021F520C0C5010E94520627C0C5010E943B +:1010B000D30623C068E083E20E94A10961E081E2D7 +:1010C0000E94A10960E081E20E94A1090BC0C50154 +:1010D0000E94750612C0C5010E9458060EC0C501C7 +:1010E0000E94510965E083E206C080E20E9478090F +:1010F0008058682F80E20E94A109F701808188232F +:10110000D1F465E083E215C0209166063091670650 +:1011100080916206909163068217930764F410929F +:1011200067061092660668E083E20E94A10961E00A +:1011300087E20E94A10928960FB6F894DEBF0FBE81 +:10114000CDBFDF91CF911F910F91FF90EF90DF9076 +:10115000CF90BF90AF900895CF92DF92EF92FF9221 +:101160000F931F93CF93DF93CDB7DEB7C054D0401A +:101170000FB6F894DEBF0FBECDBF8CE00E94780999 +:10118000992780FF03C00E94EF077BC081FF2AC020 +:101190008EE20E9478098DE20E94780989838E018F +:1011A0000F5F1F4F6801FFE3EF2EF12CE00EF11EE1 +:1011B0000F5F1F4F0E946409F80180830E151F0501 +:1011C000B9F780913C03813031F4E0913F03F09115 +:1011D0004003C601099568E08FE20E94A10961E021 +:1011E0008FE22BC082FF2CC086E30E94780985E342 +:1011F0000E94780989838E010F5F1F4F6801EFE31A +:10120000EE2EF12CE00EF11E0F5F1F4F0E946409BD +:10121000F80180830E151F05B9F780913D038130D9 +:1012200031F4E0914103F0914203C601099568E071 +:1012300087E30E94A10961E087E30E94A10921C020 +:1012400083FF1FC08EE30E9478098E010F5F1F4F3E +:10125000680171E4E72EF12CEC0EFD1E8DE30E9477 +:101260007809F80181938F01EE15FF05B9F7809198 +:101270003E03813031F4E0913F03F0914003C60119 +:101280000995C05CDF4F0FB6F894DEBF0FBECDBF2F +:10129000DF91CF911F910F91FF90EF90DF90CF9052 +:1012A00008950895089581E08ABF80E189BFE4E64A +:1012B000F0E0808187608083E5E6F0E080818360F4 +:1012C0008083A79AAF9A089585B3805885BBE5E6D9 +:1012D000F0E0808122E0822780830000000089B353 +:1012E00095B3905895BB9081922790839927089544 +:1012F0009FEF9ABB8BBB85B3805885BBE5E6F0E0DA +:10130000808195E08927808385B3805885BB808163 +:101310008927808300001ABA0E94640999270895DA +:101320008BBB85B3805885BBE5E6F0E0808191E01A +:101330008927808385B3805885BB808189278083F6 +:1013400008958BBB8FEF8ABB85B3805885BBE5E6DC +:10135000F0E0808195E08927808385B3805885BB44 +:10136000808189278083862F0E949009089508959F +:1013700082E180933E0681E080933F0680E191E028 +:1013800090934106809340061092420610924306C5 +:101390001092440688E0809345061092470610920A +:1013A0004606109249061092480610924B0610927B +:1013B0004A0610924C0610924D0610924E0610925C +:1013C0004F0610923C0310923D0310923E03109280 +:1013D0002B0610922C0610922D06109235061092B4 +:1013E00034061092A8031092A7030895909347061D +:1013F00080934606709349066093480650934B06C7 +:1014000040934A06089590934706809346060895B0 +:101410009093490680934806089590934B068093D5 +:101420004A060895809342060895809343060895DE +:10143000809344060895CF93DF939C01CB01E09104 +:101440003406F091350662E070E00E94031D0FC083 +:10145000A081B1818281823039F4ED018D8199279B +:101460008217930709F468870780F085E02D30978D +:1014700079F7DF91CF910895CF93DF939C01E091AD +:101480003406F091350614C0A081B1818281843088 +:1014900061F4848199278217930739F4868199270B +:1014A0008617970711F4ED014B830780F085E02D37 +:1014B000309751F7DF91CF910895BF92CF92DF928D +:1014C000EF92FF920F931F93CF93DF936C01162F30 +:1014D000F42EB22EC0913406D09135062097A1F497 +:1014E00089E090E00E94051CFC01909335068093F2 +:1014F0003406D182C082138310861782F282B482AE +:101500000583E68215C0EC018F8198850097D9F795 +:1015100089E090E00E94051CFC0198878F83D182AE +:10152000C0821383F282B4820583E682108617821A +:10153000DF91CF911F910F91FF90EF90DF90CF90AF +:10154000BF900895EF92FF921F93CF93DF937C019A +:10155000C091A703D091A803209711F011E012C009 +:1015600085E090E00E94051CFC019093A803809305 +:10157000A703F182E08212821482138210E012C06B +:101580001F5FEC018B819C810097D1F785E090E093 +:101590000E94051CFC019C838B83F182E0821283F4 +:1015A00014821382812F9927DF91CF911F91FF9091 +:1015B000EF900895EF92FF920F931F93CF93DF93D5 +:1015C000E091A703F091A80380E090E00380F4810C +:1015D000E02D01963097D1F7880F991F0E94051CC6 +:1015E0009093AA038093A9030091A7031091A803E5 +:1015F000E801E880F9808A81C82FDD27CC0FDD1F44 +:101600008091A9039091AA03C80FD91FF701808187 +:1016100099270E94051C9983888320E030E017C039 +:10162000E801EA81FF27EE0FFF1F8091A903909147 +:10163000AA03E80FF91F0190F081E02DE20FF31FDC +:10164000D701A20FB31F8C9180832F5F3F4FF7010B +:1016500080819927281739071CF3E8018B819C8129 +:10166000009711F08C01C4CFDF91CF911F910F91A2 +:10167000FF90EF9008954F925F926F927F928F92BA +:101680009F92AF92BF92CF92DF92EF92FF920F9311 +:101690001F93CF93DF93E0913406F09135066624D3 +:1016A000772409C08281823019F40894611C711C6E +:1016B0000780F085E02D3097A9F74301880C991C2D +:1016C000C4010E94051C9093510680935006E1E0EE +:1016D000EE2EF12CAA24BB2455C0E0913406F091E3 +:1016E000350679E0C72ED12C15C0A081B181848147 +:1016F00099278E159F0519F48381C80ED11CED0121 +:101700008D818E1521F48281823009F45D0107807C +:10171000F085E02D309749F7009150061091510661 +:1017200002501040080D191DC6010E94051CF80149 +:101730009183808320E030E0E0915006F0915106E3 +:10174000E80DF91D32970190F081E02DE20FF31FB3 +:10175000D501A20FB31F8C9180832F5F3F4F29309B +:10176000310551F7E0915006F0915106E80DF91D51 +:1017700032970190F081E02D8C2D875F8283089451 +:10178000E11CF11C6E147F040CF0A7CF61E0C62EA3 +:10179000D12C59E0A52EB12C4424552442E0842EAE +:1017A000912CA1C0A0913406B091350612C0ED91E4 +:1017B000FC9111978181823049F4858199278C159C +:1017C0009D0521F48481482E552405C0ED01AF818B +:1017D000B885109761F731E0E32EF12C79C0609164 +:1017E0003406709135066DC0FB01C081D1818981BD +:1017F000843009F063C0868199278E159F0509F012 +:101800005DC0848199278C159D0509F057C095010D +:1018100040E050E0E0915006F0915106E80DF91DCE +:1018200032970190F081E02DE20FF31FDE01A40F4B +:10183000B51F8C9180832F5F3F4F4F5F5F4F4930C3 +:10184000510541F789E090E0A80EB91EC091340619 +:10185000D091350631C08A81853059F58C81992720 +:101860008C159D0531F58D8199278E159F0509F5FC +:1018700008811981950140E050E0E0915006F09117 +:101880005106E80DF91D32970190F081E02DE20F2D +:10189000F31FD801A40FB51F8C9180832F5F3F4F9A +:1018A0004F5F5F4F4730510541F7E7E0F0E0AE0E84 +:1018B000BF1E0F80D885C02D209769F6EB016F8180 +:1018C00078856115710509F08FCF0894E11CF11C32 +:1018D0004E145F040CF083CF0894C11CD11CE2E0CD +:1018E000F0E08E0E9F1E6C147D040CF05BCFDF9138 +:1018F000CF911F910F91FF90EF90DF90CF90BF900D +:10190000AF909F908F907F906F905F904F900895D1 +:101910006F927F928F929F92AF92BF92CF92DF92FF +:10192000EF92FF920F93CF93DF935C013B0149014C +:10193000E0913406F091350616C0A081B181848112 +:101940009927A816B90661F4868199278615970507 +:1019500039F48281843021F4ED018C818F5F8C8396 +:101960000780F085E02D309741F787E090E00E94F6 +:10197000051CFC0187E0808385E0818382820383EC +:10198000F582E482C682EE24062D2A2D45E067E02A +:10199000CF010E945D0ADF91CF910F91FF90EF90F0 +:1019A000DF90CF90BF90AF909F908F907F906F907F +:1019B0000895AF92BF92CF92DF92EF92FF920F9372 +:1019C000FC01A114B10401F14230510571F0433022 +:1019D000510599F041305105B9F481E080932B060F +:1019E000B0922F06A0922E060FC081E080932C06A5 +:1019F000B0923106A092300607C081E080932D0698 +:101A0000B0923306A092320620583F4FCF010E9479 +:101A1000880C0F91FF90EF90DF90CF90BF90AF9028 +:101A20000895AF92BF92CF92DF92EF92FF920F9301 +:101A3000FC014230510571F04330510599F04130BD +:101A40005105B9F481E080933C03B0924003A09229 +:101A50003F030FC081E080933D03B0924203A09208 +:101A6000410307C081E080933E03B0924403A092FB +:101A70004303CF010E94880C0F91FF90EF90DF90FD +:101A8000CF90BF90AF900895CF92DF92EF920F93D7 +:101A90001F93CF93DF936C018B01A0913406B0911B +:101AA0003506C0E0D0E014C02D913C911197F901AA +:101AB00085818C1551F4FD018281823031F4F90168 +:101AC00084818F5F8483C82FDD27FD01A781B085C6 +:101AD000109751F789E090E00E94051CFC0189E015 +:101AE000808384E0818302831382148215821682AC +:101AF00017821086EC2E00E02C2D44E069E0CF0127 +:101B00000E945D0ACE01DF91CF911F910F91EF905E +:101B1000DF90CF900895BF92CF92DF92EF92FF9225 +:101B20000F931F93CF93DF936C017B01142FB22E81 +:101B3000A0913406B0913506C0E0D0E014C02D91DC +:101B40003C911197F90185818C1551F4FD01828139 +:101B5000823031F4F90184818F5F8483C82FDD27BF +:101B6000FD01A781B085109751F789E090E00E94B0 +:101B7000051CFC0189E0808384E08183E28213827A +:101B800014821583B68207831086EC2E00E02C2D7C +:101B900044E069E0CF010E945D0ACE01DF91CF9160 +:101BA0001F910F91FF90EF90DF90CF90BF9008951D +:101BB000EF920F931F9310914F061F5F10934F06E4 +:101BC00089E090E00E94051CFC0189E0808389E0A7 +:101BD00090E09383828382E081831482158316824E +:101BE00080EA87838AE18087EE2400E020E042E0FB +:101BF00069E0CF010E945D0A812F99271F910F9103 +:101C0000EF900895CF93DF93EC01FC010190002049 +:101C1000E9F7E81BF90BCF01880F991F0E94051CFB +:101C20009C01FE0101900020E9F7EC1BFD0BEE0F7B +:101C3000FF1FDC01EC9383E0F901818340E050E079 +:101C400009C0FE01E40FF51F80818C93FD01118214 +:101C50004F5F5F4F1296FE0101900020E9F7319728 +:101C6000EC1BFD0B4E175F0760F3C9010E94A20A2F +:101C70009927DF91CF910895EF92FF920F931F93D1 +:101C8000CF93DF938C017B01CA010E94020E9C015D +:101C9000E0913406F091350614C0A081B1818281B3 +:101CA000843061F4848199278017910739F4868103 +:101CB00099278E159F0511F4ED0128870780F0857F +:101CC000E02D309751F7DF91CF911F910F91FF9049 +:101CD000EF9008950F931F93CF93DF938C01CB0167 +:101CE0000E94020E9C01E0913406F09135060FC06F +:101CF000A081B1818281823039F4ED018D819927F3 +:101D00008017910709F42E830780F085E02D309726 +:101D100079F7DF91CF911F910F9108950E94020EE4 +:101D20001816190614F480934E0608950E94020EA8 +:101D30001816190614F480934D0608950E94020E99 +:101D40001816190614F480934C0608951F9386E024 +:101D50000E947809992786FF03C00E94AC080EC034 +:101D600082FF03C00E94AE0709C081FF03C00E942A +:101D70007B0704C084FF02C00E94CD0787E00E9459 +:101D80007809182F60E087E00E94A109612F87E0A1 +:101D90000E94A1091F91089562E081E00E94A109BB +:101DA00008950E943B0B0E94DA0A0E94310661E00E +:101DB00080E00E94A10980E00E94780980FDFBCFAD +:101DC00062E081E00E94A10960E884E00E94A1092C +:101DD00060E480E20E94A10968E083E20E94A10918 +:101DE00069E087E20E94A1096FE08DE00E94A109ED +:101DF0006FE08BE00E94A10968ED89E00E94A109D3 +:101E000063E38FE00E94A10966ED87E00E94A109CB +:101E100062E085E00E94A1096CEC80E00E94A109CB +:101E200008958EEC8093450381E087BF8091450340 +:101E300082BF83E083BF08950895089583E080936F +:101E4000EB0481E08093EC048BE08093ED049FE64B +:101E50009093EE0483E68093EF0484E78093F0048C +:101E60009093F10480E78093F20485E78093F30474 +:101E700083E78093F4048FE58093F50480E38093F7 +:101E8000F60481E38093F7041092F8048EE090E06A +:101E90000E94AE010895FC018081833011F40E94FC +:101EA0001E0F08951F9311E0812F0E94751060E0AE +:101EB000812F0E9462111F5F1431B1F718E1812F49 +:101EC0000E94751060E0812F0E9462111F5F1B321B +:101ED000B1F71F910895CF93DF93DC01EC01EA8104 +:101EE000FB8121918E81815019F48981E81BF109D0 +:101EF000ED01FB83EA838E839FB7F8948C91815028 +:101F00008C939FBF822F9927DF91CF910895FC0179 +:101F1000108275836483738362834183478346831E +:101F20000895CF93DF93DC019C91ED01898198178F +:101F300018F080E090E016C0ED01EC81FD81619326 +:101F40008F81815019F48981E81BF109ED018F839C +:101F5000FD83EC839FB7F8948C918F5F8C939FBF28 +:101F600081E090E0DF91CF910895FC01808188238A +:101F7000E9F3CF010E946B0F99270895FC0180813E +:101F8000882319F48FEF9FEF0895CF010E946B0F04 +:101F90009927089581E090E0089581E090E0089508 +:101FA00081E090E0089581E090E00895CF93DF9381 +:101FB000CDB7DEB722970FB6F894DEBF0FBECDBF08 +:101FC000982F8150833120F08751833108F07EC0F3 +:101FD000E92FFF27EB5BFC4F82E08183892F992754 +:101FE000AA27BB27FC013197EC32F10508F06EC03F +:101FF000EA5BFF4FEE0FFF1F0590F491E02D09946F +:10200000159A5BC0169A5DC0179A57C0B89A59C006 +:10201000B99A53C0BA9A55C0BB9A4FC0BC9A51C026 +:10202000BD9A4BC0BE9A4DC0BF9A47C0889A49C05E +:10203000899A43C08A9A45C08B9A3FC08C9A41C006 +:102040008D9A3BC08E9A3DC08F9A37C0A09A39C0F6 +:10205000A19A33C0A29A35C0A39A2FC0A49A31C0C6 +:10206000A59A2BC0A69A2DC080916100806807C0F8 +:1020700080916100806419C08091610080628093CA +:1020800061001BC08091610080610FC08091610080 +:102090008860F5CF80916100846007C08091610005 +:1020A0008260EDCF8091610081608093610009C002 +:1020B000109A03C0119A05C0129A81E090E008C0FE +:1020C000139AE1E0F0E0FA83E98304C084E090E051 +:1020D0009A83898389819A8122960FB6F894DEBF0C +:1020E0000FBECDBFDF91CF910895982F81508331DE +:1020F00030F08751833118F084E090E00895892F03 +:102100000E94D60F81E090E00895CF93DF93CDB782 +:10211000DEB722970FB6F894DEBF0FBECDBF982F63 +:102120008150833120F08751833108F07EC0E92F40 +:10213000FF27EB5BFC4F81E08183892F9927AA273A +:10214000BB27FC013197EC32F10508F06EC0EE5868 +:10215000FF4FEE0FFF1F0590F491E02D09941598A5 +:102160005BC016985DC0179857C0B89859C0B99809 +:1021700053C0BA9855C0BB984FC0BC9851C0BD98C9 +:102180004BC0BE984DC0BF9847C0889849C0899839 +:1021900043C08A9845C08B983FC08C9841C08D98A9 +:1021A0003BC08E983DC08F9837C0A09839C0A19889 +:1021B00033C0A29835C0A3982FC0A49831C0A59869 +:1021C0002BC0A6982DC0809161008F7707C08091A9 +:1021D00061008F7B19C0809161008F7D80936100C9 +:1021E0001BC0809161008F7E0FC080916100877F4E +:1021F000F5CF809161008B7F07C0809161008D7F5A +:10220000EDCF809161008E7F8093610009C01098AE +:1022100003C0119805C0129881E090E008C013989F +:10222000E1E0F0E0FA83E98304C084E090E09A837F +:10223000898389819A8122960FB6F894DEBF0FBEFA +:10224000CDBFDF91CF910895FB011082833091F0D3 +:10225000843028F4813051F0823029F409C0843070 +:1022600059F0853059F085E090E0089586B307C0B5 +:1022700083B305C080B303C081B101C080B1808346 +:1022800081E090E00895833091F0843028F481302B +:1022900051F0823029F409C0843059F0853069F05A +:1022A00084E090E0089568BB05C065BB03C062BBD5 +:1022B00001C063B981E090E008956093620081E01D +:1022C00090E00895982FE82FFF27EB5BFC4F81816A +:1022D000823019F086E090E00895892F9927AA2787 +:1022E000BB27FC013197EC32F10540F4E256FF4F79 +:1022F000EE0FFF1F0590F491E02D099484E090E02B +:102300000895662311F01D9AFFC01D98FDC0662335 +:1023100011F01E9AF9C01E98F7C0662311F01F9A9B +:10232000F3C01F98F1C0662311F0C09AEDC0C098A9 +:10233000EBC0662311F0C19AE7C0C198E5C06623DF +:1023400011F0C29AE1C0C298DFC0662311F0C39AAF +:10235000DBC0C398D9C0662311F0C49AD5C0C49815 +:10236000D3C0662311F0C59ACFC0C598CDC06623EF +:1023700011F0C69AC9C0C698C7C0662311F0C79AA3 +:10238000C3C0C798C1C0662311F0909ABDC0909891 +:10239000BBC0662311F0919AB7C09198B5C066236F +:1023A00011F0929AB1C09298AFC0662311F0939A3F +:1023B000ABC09398A9C0662311F0949AA5C09498D5 +:1023C000A3C0662311F0959A9FC095989DC066237F +:1023D00011F0969A99C0969897C0662311F0979A33 +:1023E00093C0979891C0662311F0A89A8DC0A898C1 +:1023F0008BC0662311F0A99A87C0A99885C066236F +:1024000011F0AA9A81C0AA987FC0662311F0AB9AF6 +:102410007BC0AB9879C0662311F0AC9A75C0AC98BC +:1024200073C0662311F0AD9A6FC0AD986DC066237E +:1024300011F0AE9A69C0AE9867C0662321F0809112 +:10244000620080680DC0809162008F7709C06623AA +:1024500021F080916200806403C0809162008F7BD4 +:102460008093620051C0662321F0809162008062F7 +:10247000F7CF809162008F7DF3CF662321F08091AA +:1024800062008061EDCF809162008F7EE9CF66238C +:1024900021F0809162008860E3CF80916200877FA5 +:1024A000DFCF662321F0809162008460D9CF8091D4 +:1024B00062008B7FD5CF662321F08091620082601D +:1024C000CFCF809162008D7FCBCF662321F08091AA +:1024D00062008160C5CF809162008E7FC1CF66238C +:1024E00011F0189A11C018980FC0662311F0199AAC +:1024F0000BC0199809C0662311F01A9A05C01A98E2 +:1025000003C0662321F01B9A81E090E008951B9898 +:1025100081E090E008951F93182F8150833130F0AF +:102520008751833118F084E090E00FC0E12FFF273E +:10253000EB5BFC4F83E08183812F0E94D60F61E02B +:10254000812F0E94621181E090E01F910895CF9346 +:10255000DF93982FEB011882E82FFF27EB5BFC4FEE +:102560008181813019F086E090E07DC0892F992724 +:10257000AA27BB27FC013197EC32F10540F4E65362 +:10258000FF4FEE0FFF1F0590F491E02D099484E0BA +:1025900090E069C00D9B65C062C00E9B62C05FC0C9 +:1025A0000F9B5FC05CC0B09B5CC059C0B19B59C061 +:1025B00056C0B29B56C053C0B39B53C050C0B49BCF +:1025C00050C04DC0B59B4DC04AC0B69B4AC047C025 +:1025D000B79B47C044C0809B44C041C0819B41C061 +:1025E0003EC0829B3EC03BC0839B3BC038C0849BA7 +:1025F00038C035C0859B35C032C0869B32C02FC0E5 +:10260000879B2FC02CC0989B2CC029C0999B29C0A8 +:1026100026C09A9B26C023C09B9B23C020C09C9BA6 +:1026200020C01DC0079B1DC01AC0069B1AC017C042 +:10263000059B17C014C0049B14C011C0039B11C09C +:102640000EC0029B0EC00BC0089B0BC008C0099BAC +:1026500008C005C00A9B05C002C00B9B02C081E0F8 +:10266000888381E090E0DF91CF910895CF93DF934D +:10267000CDB7DEB721970FB6F894DEBF0FBECDBF42 +:102680009BE19093EB04BE016F5F7F4F0E94A71206 +:102690008093EC0489818093ED041092EE0484E031 +:1026A00090E00E94AE0121960FB6F894DEBF0FBEF7 +:1026B000CDBFDF91CF9108959AE19093EB040E94F2 +:1026C00062118093EC041092ED0483E090E00E948C +:1026D000AE01089598E19093EB040E94431180931A +:1026E000EC041092ED0483E090E00E94AE010895A6 +:1026F000982F89E18093EB04933099F0943028F47B +:10270000913059F0923029F40AC0943061F095303C +:1027100061F085E090E020E00BC026B307C023B352 +:1027200005C020B303C021B101C020B181E090E019 +:102730008093EC042093ED041092EE0484E090E08A +:102740000E94AE01089597E19093EB040E948B12D2 +:102750008093EC041092ED0483E090E00E94AE01BF +:10276000089595E19093EB040E9485108093EC040A +:102770001092ED0483E090E00E94AE01089596E18E +:102780009093EB040E94D60F8093EC041092ED041A +:1027900083E090E00E94AE01089584E18093EB0411 +:1027A00081E08093EC041092ED0483E090E00E94BD +:1027B000AE01089582E18093EB0481E08093EC0404 +:1027C0001092ED0483E090E00E94AE01089583E151 +:1027D0008093EB0481E08093EC041092ED0483E09D +:1027E00090E00E94AE01089580E18093EB0481E0C7 +:1027F0008093EC041092ED0483E090E00E94AE011F +:10280000089591E19093EB040E9475108093EC047D +:102810001092ED0483E090E00E94AE010895FC0167 +:1028200080818531C9F1863180F4823131F1833183 +:1028300030F48031D1F0813109F04CC01AC08331BD +:1028400009F1843109F046C022C0883189F189310B +:1028500028F4863129F18731E9F526C08A3189F1DA +:102860008A3158F18B31B1F531C082810E94F41365 +:10287000089582810E9401140895638182810E94DB +:10288000DA130895638182810E94E71308956381BA +:1028900082810E94CD13089582810E94B113089510 +:1028A00082810E94BF13089582810E94A31308951C +:1028B000638182810E946A13089582810E94781345 +:1028C0000895638182810E945C13089582810E9431 +:1028D000361308958093EB0483E08093EC04109208 +:1028E000ED0483E090E00E94AE010895E82F81524C +:1028F000883018F084E090E00895FF27EB5BFC4FF0 +:1029000084E0818381E090E00895E82FFF27EB5B6E +:10291000FC4F8181843019F084E090E008951182A9 +:1029200081E090E0089517B8823039F0833049F0A3 +:10293000813021F082E090E008953E9A81E090E0BD +:10294000089587B1806C87B981E090E0089593E89D +:1029500096B997B1907F982B97B9369A3699FECF52 +:1029600084B195B120E030E040E050E0369A3699ED +:10297000FECF84B195B1480F591F2F5F3F4F2430D0 +:102980003105A1F73798CA01969587959695879551 +:102990000895CF93DF93EB0119821882282F3327F4 +:1029A000F901EB5BFC4F8181843019F086E090E007 +:1029B0000AC088E290E0821B930B0E94A7149983BF +:1029C000888381E090E0DF91CF91089593E2909326 +:1029D000EB040E9493148093EC041092ED0483E0C6 +:1029E00090E00E94AE010895CF93DF93CDB7DEB79C +:1029F00022970FB6F894DEBF0FBECDBF92E2909340 +:102A0000EB04BE016F5F7F4F0E94C9148093EC04FA +:102A100029813A81832F99278093ED042093EE0436 +:102A20001092EF0485E090E00E94AE0122960FB66E +:102A3000F894DEBF0FBECDBFDF91CF91089591E234 +:102A40009093EB04E82FFF27EB5BFC4F81818430F0 +:102A500019F084E090E003C0118281E090E080935F +:102A6000EC041092ED0483E090E00E94AE01089522 +:102A7000E82F80E28093EB048E2F8152883018F08B +:102A800084E090E007C0FF27EB5BFC4F84E081838C +:102A900081E090E08093EC041092ED0483E090E0FC +:102AA0000E94AE010895FC018081813271F0823272 +:102AB00018F48032B1F405C0823259F0833289F4BF +:102AC0000CC082810E943815089582810E941F15D2 +:102AD000089582810E94F414089582810E94E61470 +:102AE00008958093EB0483E08093EC041092ED044E +:102AF00083E090E00E94AE010895E4E7F0E0808179 +:102B0000846080838BE0809352038CE08093530336 +:102B100081E090E00895E4E7F0E080818B7F80839E +:102B2000109252031092530381E090E00895809335 +:102B30007000E1E7F0E080818C7F8083808180837A +:102B400081E090E00895809171009927887F9070CE +:102B500008958091710084EA8093740080917400DC +:102B600087FFFCCF81E090E0089584E980937400B2 +:102B70008091740084FDFCCF81E090E00895AC0169 +:102B800020E030E00FC0FA01E20FF31F8081809354 +:102B9000730084E8809374008091740087FFFCCFF9 +:102BA0002F5F3F4F2617370774F3089584E880930B +:102BB00074008091740087FFFCCF80917300992787 +:102BC000089585E38093EB0481E08093EC0420E09A +:102BD00030E00FC084E8809374008091740087FF18 +:102BE000FCCF80917300F901E351FB4F80832F5F8D +:102BF0003F4F2617370774F3FB01E351FB4F108259 +:102C0000CB0103960E94AE0108959B01BC01C9014E +:102C10000E94BF1581E08093EC041092ED0483E0E4 +:102C200090E00E94AE01089584E980937400809141 +:102C3000740084FDFCCF81E08093EC041092ED04DD +:102C400083E090E00E94AE0108958091710084EAD3 +:102C5000809374008091740087FFFCCF81E08093A3 +:102C6000EC041092ED0483E090E00E94AE01089520 +:102C700080937000E1E7F0E080818C7F8083808129 +:102C8000808381E08093EC041092ED0483E090E077 +:102C90000E94AE010895E4E7F0E080818B7F80839D +:102CA000109252031092530381E08093EC0410922F +:102CB000ED0483E090E00E94AE010895E4E7F0E0C7 +:102CC0008081846080838BE0809352038CE08093CA +:102CD000530381E08093EC041092ED0483E090E0D4 +:102CE0000E94AE010895FC0180818093EB0484333F +:102CF000D1F0853338F4813379F0823381F0803339 +:102D000031F507C08633E9F08633A0F08733F9F454 +:102D10001BC00E945E1608950E944B160895828182 +:102D20000E943816089582813396BF0199270E9428 +:102D30000516089563817727828199270E94E115FE +:102D400008950E94251608950E941416089583E0A0 +:102D50008093EC041092ED0483E090E00E94AE01B9 +:102D60000895782F613079F0613050F0623021F0B1 +:102D7000633009F059C002C061E003C061E004C0E3 +:102D800060E030E002C060E031E04330D9F0443030 +:102D900028F4413089F0423090F40CC0453031F0D5 +:102DA0004530A0F0463009F03FC002C040E005C009 +:102DB00040E006C041E007C041E050E005C041E00E +:102DC00050E006C040E051E020E003C040E051E0A8 +:102DD00021E0BB9887B3866087BB88B3817F88BBBF +:102DE00080E090E0772311F081E090E075E0880FBB +:102DF000991F7A95E1F78065660F660F660F682B5D +:102E0000330F330F362B352B440F432B4DB92EB9CF +:102E100088E080934B038AE080934C0389E08093A1 +:102E20004D0381E090E0089582E090E008951DB8A0 +:102E30001EB810924B0310924C0310924D0381E088 +:102E400090E00895AC0120E030E008C0E60FF71FE5 +:102E500080818FB9779BFECF2F5F3F4FE22FFF27F7 +:102E6000E417F5079CF381E090E00895DC0120E091 +:102E700030E040E050E014C01FB809C083E0493E94 +:102E800058071CF088E090E008954F5F5F4F779BF4 +:102E9000F5CFFB01E20FF31F8FB180832F5F3F4F10 +:102EA0002A173B074CF381E090E00895CF93DF931E +:102EB000EC0120E030E0A0E0B0E017C0FE01E20F3E +:102EC000F31F80818FB908C0119683E0A93EB8072F +:102ED0001CF088E090E00EC0779BF6CFFB01E20F7C +:102EE000F31F8FB180832F5F3F4F2417350734F3D3 +:102EF00081E090E0DF91CF910895EF92FF920F93E0 +:102F00001F938B01EBEEEE2EE4E0FE2E23E42093E4 +:102F1000EB04B7016E5F7F4FA8010E9456178093A4 +:102F2000EC040E5F1F4FE00EF11EF7011082C80186 +:102F300001960E94AE011F910F91FF90EF900895AE +:102F4000EF92FF920F931F938C01FBEEEF2EF4E0B4 +:102F5000FF2E84E48093EB04B7016E5F7F4FC801BE +:102F60000E9436178093EC040E5F1F4FE00EF11E97 +:102F7000F7011082C80101960E94AE011F910F91C6 +:102F8000FF90EF90089593E49093EB0499270E94AB +:102F900022178093EC041092ED0483E090E00E94ED +:102FA000AE01089581E48093EB040E94171780938B +:102FB000EC041092ED0483E090E00E94AE010895CD +:102FC00090E49093EB040E94B1168093EC0410926D +:102FD000ED0483E090E00E94AE010895CF93DF936B +:102FE000EC0188818334A9F0843428F4803441F0E2 +:102FF000813409F50BC0843499F08534E1F414C0B0 +:103000004C816B818A810E94E01720C00E94D217F8 +:103010001DC0BE016D5F7F4F8A810E94C31716C01D +:103020008A8199270E94A0176A817727CE0103968B +:103030000E947D170BC08093EB0483E08093EC0427 +:103040001092ED0483E090E00E94AE01DF91CF91F9 +:103050000895B89AB99ABA9ABB98BC9ABD9AC4987E +:10306000C59881E08093560382E080935703809354 +:1030700058038093590381E090E00895109256031D +:1030800010925703109258031092590381E090E078 +:103090000895C098C198C29880E29EE40197F1F724 +:1030A000C09A8AE0982F9A95F1F7C29AC19A8A95A8 +:1030B000F1F70895282FC19887FD02C0C29801C07A +:1030C000C29A8AE0982F9A95F1F7C19A8A95F1F7FA +:1030D000C19826FF02C0C29A01C0C2988AE0982F08 +:1030E0009A95F1F7C19A8A95F1F70895282F220F42 +:1030F00030E0C19827FF02C0C29A01C0C2988AE09E +:10310000982F9A95F1F7C19A8A95F1F73F5F37307A +:1031100011F0220FEECF0895282F30E0C19827FF3D +:1031200002C0C29A01C0C2988AE0982F9A95F1F71E +:10313000C19A8A95F1F73F5F383011F0220FEECF38 +:103140000895C198C2988AE0982F9A95F1F7C19A8C +:10315000982F9A95F1F7C198C098982F9A95F1F702 +:10316000C19A982F9A95F1F7C1988A95F1F7C09A6C +:1031700080E090E00895C198C098C298C39A0895DD +:103180000E94491880E30E945A1880E60E9476182F +:1031900008950E94491880E00E945A1880E00E9419 +:1031A00076180E94BB1808950F931F93182F062FAF +:1031B0000E94491880E40E945A18812F0E947618B4 +:1031C000802F0E948C1881E090E01F910F9108954C +:1031D0001F93182F0E94491880EC0E945A18812FC3 +:1031E0000E9476180E94A11899271F910895C198EE +:1031F0008AE08A95F1F7C29830E090E0990FC19A81 +:103200002AE0822F8A95F1F7C198B3999F5F822FA8 +:103210008A95F1F73F5F383089F7C098C19A822FBD +:103220008A95F1F7C09AC1982A95F1F7892F9927C5 +:1032300008951F93182F0E94491880E80E945A1879 +:10324000812F0E9476180E94F71899271F910895E0 +:10325000DF92EF92FF920F931F93CF93DF93D82EBD +:103260007B018A01C0E0D0E009C08D2D8C0F0E9447 +:103270001919F801EC0FFD1F80832196CE15DF058B +:10328000A1F781E090E0DF91CF911F910F91FF9026 +:10329000EF90DF9008950F931F93082F162F0E9431 +:1032A000C018612F802F0E94D41881E090E01F91F8 +:1032B0000F910895DF92EF92FF920F931F93CF9398 +:1032C000DF93D82E7B018A01C0E0D0E009C0F8016D +:1032D000EC0FFD1F60818D2D8C0F0E944B192196E4 +:1032E000CE15DF05A1F781E090E0DF91CF911F912E +:1032F0000F91FF90EF90DF90089594E09093EB048E +:103300000E945A198093EC041092ED0483E090E03F +:103310000E94AE010895EF92FF920F931F938B01CD +:103320009BEEE92E94E0F92E93E09093EB04A70135 +:103330004E5F5F4F0E9428198093EC040E5F1F4F71 +:10334000E00EF11EF7011082C80101960E94AE0145 +:103350001F910F91FF90EF90089582E08093EB040E +:10336000109256031092570310925803109259036B +:1033700081E08093EC041092ED0483E090E00E94E1 +:10338000AE01089581E08093EB040E942918809398 +:10339000EC041092ED0483E090E00E94AE010895E9 +:1033A000FC018381823069F0833018F48130F1F4BC +:1033B00005C0833049F08430C9F40FC00E94C2199F +:1033C00008950E94AD190895AF014A5F5F4F65816E +:1033D000772784810E948B190895AF014A5F5F4F60 +:1033E0006581772784810E947D190895808180936B +:1033F000EB0483E08093EC041092ED0483E090E012 +:103400000E94AE0108951F920F920FB60F921124E1 +:103410000F900FBE0F901F9018959C010897029770 +:1034200018F084E090E00895F901EB5BFC4F8DE02B +:1034300081832830310561F02930310519F087E0AA +:1034400090E00895BD9A81E090E09BBD8ABD08950B +:10345000BC9A81E090E00895FC01EB5BFC4F118287 +:1034600081E090E008959C01FC01EB5BFC4F8181C1 +:103470008D3019F086E090E008952830310539F15B +:103480002930310519F087E090E008956330710527 +:10349000A9F0643071053CF46130710559F0623077 +:1034A0007105A9F409C06430710551F065307105EA +:1034B00071F408C081E007C082E005C083E003C06A +:1034C00084E001C085E08EBD81E090E0089581E058 +:1034D00090E008959C01FC01EB5BFC4F81818D30F5 +:1034E00019F086E090E008952830310531F0293058 +:1034F000310531F087E090E0089581E090E0089593 +:103500007BBD6ABD81E090E008959C0183E58093D6 +:10351000EB04F901EB5BFC4F81818D3019F086E003 +:1035200090E00DC02830310541F02930310519F007 +:1035300087E090E004C07BBD6ABD81E090E08093AD +:10354000EC041092ED0483E090E00E94AE01089537 +:1035500022E52093EB040E94331A8093EC0410922E +:10356000ED0483E090E00E94AE01089521E52093F0 +:10357000EB04FC01EB5BFC4F118281E08093EC04D7 +:103580001092ED0483E090E00E94AE01089520E5E2 +:103590002093EB040E940D1A8093EC041092ED042A +:1035A00083E090E00E94AE010895FC0180818135A6 +:1035B00079F0823518F48035F1F405C0823569F070 +:1035C0008335C9F411C0828199270E94C71A0895D2 +:1035D000828199270E94B61A089563817727828194 +:1035E00099270E94A81A08956381772782819927D5 +:1035F0000E94851A08958093EB0483E08093EC0485 +:103600001092ED0483E090E00E94AE010895CF9304 +:10361000DF93CDB7DEB7DF91CF910895089581E0B4 +:1036200090E0089508958A3310F4805301C08755BF +:103630006A3310F4605301C067556F708295807FC4 +:10364000682B862F992708950895DC0180E1A0302A +:10365000B80718F082E090E00895E199FECF9D014F +:1036600009C03FBB2EBB2F5F3F4FE09AE60FF71F0D +:103670008DB38083822F8A1BE82FFF27E417F5077D +:1036800080F381E090E00895DC0180E1A030B8078C +:1036900018F082E090E00895E199FECF9D010AC004 +:1036A0003FBB2EBB2F5F3F4FE60FF71F80818DBBC7 +:1036B000E29AE19A822F8A1BE82FFF27E417F50789 +:1036C00078F381E090E008950F931F938B0121E838 +:1036D0002093EB040E94441B8093EC041092ED04B1 +:1036E0001F930F9389EF92E09F938F930E94071B84 +:1036F00083E090E00E94AE010F900F900F900F902A +:103700001F910F910895CF92DF92EF92FF920F9346 +:103710001F937B010BEE14E020E82093EB0422E0E2 +:10372000C22ED12CC00ED11EAB01B6010E94251BAA +:103730008093EC0482E090E0E80EF91E0E0D1F1D50 +:10374000F8011082DF92CF9286E093E09F938F93EF +:103750000E94071BC70101960E94AE010F900F90B7 +:103760000F900F901F910F91FF90EF90DF90CF90EF +:103770000895EF92FF920F931F93CF93DF93EC0185 +:103780008B819927F82EEE248A81E80EF11C8D8119 +:103790009927182F00278C81080F111DFF92EF9297 +:1037A0001F930F9380E193E09F938F930E94071BD9 +:1037B00088812DB73EB72A5F3F4F0FB6F8943EBFC2 +:1037C0000FBE2DBF803819F0813869F405C0B801EB +:1037D000C7010E94831B12C02696A801BE01C70123 +:1037E0000E94641B0BC08093EB0483E08093EC0485 +:1037F0001092ED0483E090E00E94AE01DF91CF9142 +:103800001F910F91FF90EF900895CF93DF93AC013C +:10381000029710F442E050E0A0917006B09171065A +:10382000FD01C0E0D0E020E030E020C08081918147 +:103830008417950769F482819381209719F09B83FF +:103840008A8304C090937106809370069F0132C0F2 +:103850004817590738F42115310519F082179307D5 +:1038600008F49C01EF010280F381E02D3097F1F61E +:103870002115310599F1C901841B950B049708F4B2 +:10388000A901E0E0F0E028C08D919C91119782178A +:103890009307F9F44817590781F4ED018A819B8158 +:1038A000309719F09383828304C0909371068093BC +:1038B00070069D012E5F3F4F4CC0841B950BFD0190 +:1038C000E80FF91F4193519302978D939C939F01A9 +:1038D00040C0FD01A281B3811097B1F680916E06C0 +:1038E00090916F06892B41F48091370390913803B2 +:1038F00090936F0680936E062091390330913A03BE +:103900002115310549F48DB7282F332780913503D0 +:1039100090913603281B390BA0916E06B0916F066B +:103920002A1B3B0B2417350790F0CA010296281773 +:10393000390768F09D012E5F3F4FC901840F951F25 +:1039400090936F0680936E064D935C9302C020E0C7 +:1039500030E0C901DF91CF910895CF93DF930097B5 +:1039600009F44EC0EC0122971B821A82A0917006C6 +:10397000B0917106109711F140E050E001C0DC01F8 +:10398000AC17BD0700F1BB83AA83FE0121913191E1 +:10399000E20FF31FEA17FB0771F48D919C911197C9 +:1039A000280F391F2E5F3F4F39832883FD01828105 +:1039B00093819B838A834115510559F4D0937106F5 +:1039C000C09370061DC0FD0182819381AD010097F7 +:1039D000B1F6FA01D383C28321913191E20FF31F33 +:1039E000EC17FD0769F488819981280F391F2E5F34 +:1039F0003F4FFA01318320838A819B8193838283A5 +:103A0000DF91CF91089597FB092E07260AD077FD05 +:103A100004D00CD006D000201AF4709561957F4F29 +:103A20000895F6F7909581959F4F0895AA1BBB1BAB +:103A300051E107C0AA1FBB1FA617B70710F0A61BAE +:103A4000B70B881F991F5A95A9F780959095BC01CF +:063A5000CD010895FFCF37 +:103A5600456D62656464656450726F6A656374730C +:103A6600004F63746F70757355534220496E7465C9 +:103A7600726661636520436F6E7665727465722047 +:103A8600616E6420492F4F20457874656E73696FA7 +:103A96006E003230303831313038006669727374F6 +:103AA600207061636B6574206F662061206C6F6E99 +:103AB60067206D65737361676520286C656E677432 +:103AC600683A202564290A006F63746F7075732045 +:103AD6006C6F6E672072756E6E696E67206D6573AA +:103AE600736167650A006F63746F7075732E6C6F10 +:103AF6006E675F696E646578203C206F63746F70D3 +:103B060075732E6C6F6E675F62797465730A006EEB +:103B16006F74206C617374207061636B65743A20F6 +:103B260064696666203E2036340A006C6173742030 +:103B36007061636B65740A007061727365722C2024 +:103B4600636865636B3A2025582C20636F6D6D6141 +:103B56006E643A2025580A0063616C6C696E6720B2 +:103B6600696F5F7061727365720A0063616C6C697C +:103B76006E67206164635F7061727365720A0063C9 +:103B8600616C6C696E67206932635F706172736520 +:103B9600720A0063616C6C696E67207370695F708E +:103BA60061727365720A0063616C6C696E6720707E +:103BB600776D5F7061727365720A0063616E277458 +:103BC6002063616C6C2063616E5F706172736572F5 +:103BD600202D206E6F2043414E2D737570706F72CD +:103BE600740A0063616C6C696E6720656570726F3C +:103BF6006D5F7061727365720A00756E6B6E6F77BA +:103C06006E20636D640A00726563656976696E6726 +:103C160020636F6D6D616E643A20255820286C65AF +:103C26006E6774683A202575290A00676574206EE8 +:103C36006578740A0067657420616E64206578652E +:103C4600637574650A000904007772697474656E99 +:103C56003A2025730A00726561643A2025730A00CA +:103C6600656570726F6D5F7061727365723A206C14 +:103C7600656E6774683A2025752C20616464723A13 +:0C3C86002025750A0020007206000000D6 +:00000001FF diff --git a/firmware/pin.c b/firmware/pin.c new file mode 100644 index 0000000..97218b7 --- /dev/null +++ b/firmware/pin.c @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2009 Embedded Projects (http://www.embedded-projects.net) + * Author: Benedikt Sauter + * All rights reserved. + * + * Short descripton of file: + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the FH Augsburg nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES{} LOSS OF USE, + * DATA, OR PROFITS{} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +#include "pin.h" + + +char pin_get_conf(uint8_t i, pin_conf *p) +{ + switch(i) + { + case 3: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC0; break; + case 4: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC1; break; + case 5: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC2; break; + case 6: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC3; break; + case 7: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC4; break; + case 8: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC5; break; + case 9: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC6; break; + + case 10: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF7; break; + case 11: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF6; break; + case 12: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF5; break; + case 13: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF4; break; + case 14: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF3; break; + case 15: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF2; break; + case 16: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF1; break; + case 17: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF0; break; + + case 18: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE0; break; + case 19: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE1; break; + case 20: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE2; break; + case 21: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE3; break; + case 22: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE5; break; + case 23: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE6; break; + case 24: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE7; break; + + case 25: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB0; break; + case 26: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB1; break; + case 27: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB2; break; + case 28: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB3; break; + case 29: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB4; break; + case 30: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB5; break; + case 31: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB6; break; + case 32: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB7; break; + + case 33: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD0; break; + case 34: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD1; break; + case 35: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD2; break; + case 36: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD3; break; + case 37: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD4; break; + case 38: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD5; break; + case 39: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD6; break; + case 40: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD7; break; + + default: return 0; + } + + return 1; +} diff --git a/firmware/pin.h b/firmware/pin.h new file mode 100644 index 0000000..f0deda7 --- /dev/null +++ b/firmware/pin.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2009 Embedded Projects (http://www.embedded-projecs.net) + * Author: Michael Hartmann + * All rights reserved. + * + * Short descripton of file: + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the FH Augsburg nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef PIN_H +#define PIN_H + +#include + +#define OX_AD7 10 +#define OX_AD6 11 +#define OX_AD5 12 +#define OX_AD4 13 +#define OX_AD3 14 +#define OX_AD2 15 +#define OX_AD1 16 +#define OX_AD0 17 + +#define OX_RX0 18 +#define OX_TX0 19 +#define OX_RX1 35 +#define OX_TX1 36 + +#define OX_SS 25 +#define OX_SCK 26 +#define OX_MOSI 27 +#define OX_MISO 28 + +#define OX_PWM1 30 +#define OX_PWM2 29 + +#define OX_SCL 33 +#define OX_SDA 34 + +#define OX_LED1 3 +#define OX_LED2 4 +#define OX_LED3 5 +#define OX_LED4 6 +#define OX_LED5 7 +#define OX_LED6 8 +#define OX_LED7 9 +#define OX_LED_STATUS 32 + +typedef struct pin_conf { + volatile unsigned char *ox_port; + volatile unsigned char *ox_pin; + volatile unsigned char *ox_ddr; + volatile unsigned char ox_p; +} pin_conf; + +char pin_get_conf(uint8_t i, pin_conf *p); + +#endif /* PIN_H */ diff --git a/firmware/protocol.h b/firmware/protocol.h index fce8eda..af2c6fb 100644 --- a/firmware/protocol.h +++ b/firmware/protocol.h @@ -42,18 +42,20 @@ #define CMD_IO_PORT_GET 0x19 #define CMD_IO_PIN_SET 0x1A #define CMD_IO_PIN_GET 0x1B +#define CMD_IO_SET_STATUS_LED 0x1C #define CMD_ADC_INIT_PIN 0x20 -#define CMD_ADC_GET 0x21 -#define CMD_ADC_REF 0x22 - +#define CMD_ADC_DEINIT_PIN 0x21 +#define CMD_ADC_GET 0x22 +#define CMD_ADC_REF 0x23 + #define CMD_I2C_INIT 0x30 #define CMD_I2C_DEINIT 0x31 #define CMD_I2C_SET_BITRATE 0x32 -#define CMD_I2C_SEND_BYTE 0x34 -#define CMD_I2C_RECV_BYTES 0x35 -#define CMD_I2C_SEND_START 0x36 -#define CMD_I2C_SEND_STOP 0x37 +#define CMD_I2C_SEND 0x34 +#define CMD_I2C_RECV 0x35 +#define CMD_I2C_SEND_START 0x36 +#define CMD_I2C_SEND_STOP 0x37 #define CMD_SPI_INIT 0x40 #define CMD_SPI_DEINIT 0x41 @@ -78,6 +80,17 @@ #define CMD_UART_RECV 0x67 #define CMD_UART_SEND 0x68 +#define CMD_CAN_INIT 0x70 +#define CMD_CAN_DEINIT 0x71 +#define CMD_CAN_SEND_DATA 0x72 +#define CMD_CAN_ENABLE_MOB 0x73 +#define CMD_CAN_DISABLE_MOB 0x74 +#define CMD_CAN_SEND_REMOTE 0x75 +#define CMD_CAN_RECEIVE_DATA 0x76 +#define CMD_CAN_SET_AUTOREPLY 0x77 + +#define CMD_EEPROM_READ_BYTES 0x80 +#define CMD_EEPROM_WRITE_BYTES 0x81 #define PARAM_ADC_AREF 0x01 #define PARAM_ADC_AVCC 0x02 diff --git a/firmware/pwm.c b/firmware/pwm.c index 9e3666d..b8b6231 100644 --- a/firmware/pwm.c +++ b/firmware/pwm.c @@ -84,7 +84,7 @@ int pwm_init(int pin) { case 9: /* set pin as output */ - OX_DDR9 |=(1< 1000) return RSP_TIMEOUT; } - buf[i]=SPDR; + while(!(SPSR & (1 << SPIF))) + { + if(timeout++ > 1000) + return RSP_TIMEOUT; + } + buf[i] = SPDR; } + return RSP_OK; } @@ -164,8 +236,8 @@ void spi_send_and_receive_usb(char * txbuf, int length) { answer[0]=CMD_SPI_SEND; answer[1]=(unsigned char)spi_send_and_receive(txbuf,(char *)&answer[2],length); - answer[2]=0; - CommandAnswer(2+length); + answer[2+length]=0; + CommandAnswer(3+length); } @@ -180,9 +252,3 @@ int spi_send_and_receive(char * txbuf, char * rxbuf, int length){ } return RSP_OK; } - - - - - - diff --git a/firmware/spi.h b/firmware/spi.h index d7cfbf1..8a8a1fe 100644 --- a/firmware/spi.h +++ b/firmware/spi.h @@ -41,24 +41,25 @@ #define MISO PB3 #define SCK PB1 -void spi_parser(char *buf); - -int spi_init(void); -int spi_deinit(void); +enum { SPI_SPEED_125kHz, SPI_SPEED_250kHz, SPI_SPEED_500kHz, SPI_SPEED_1MHz, + SPI_SPEED_2MHz, SPI_SPEED_4MHz, SPI_SPEED_8MHz }; -int spi_set_speed(int speed); -int spi_send(char * buf, int length); -unsigned char spi_receive( char * buf, int length); -int spi_send_and_receive(char * txbuf, char * rxbuf, int length); +void spi_parser(char *buf); +void spi_init_usb(uint8_t dord, uint8_t mode, uint8_t speed); +int spi_init(uint8_t dord, uint8_t mode, uint8_t speed); -void spi_init_usb(void); void spi_deinit_usb(void); +int spi_deinit(void); + +void spi_send_usb(uint8_t length, char * buf); +int spi_send(int length, char * buf); -void spi_set_speed_usb(int speed); -void spi_send_usb(char * buf, int length); void spi_receive_usb(int length); +unsigned char spi_receive(int length, char * buf); + void spi_send_and_receive_usb(char * txbuf, int length); +int spi_send_and_receive(char * txbuf, char * rxbuf, int length); #endif /* SPI_H */ diff --git a/firmware/uart.c b/firmware/uart.c index 02b4a87..9ae00c9 100644 --- a/firmware/uart.c +++ b/firmware/uart.c @@ -39,7 +39,7 @@ void uart_parser(char *buf) break; default: answer[1] = RSP_UNKOWN_CMD; - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } } @@ -47,7 +47,7 @@ void uart_parser(char *buf) void uart_init_usb(char uartport) { answer[1] = (unsigned char)uart_init(uartport); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } @@ -78,7 +78,7 @@ char uart_init(char uartport) void uart_deinit_usb(char uartport) { answer[1] = (unsigned char)uart_deinit(uartport); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } @@ -113,7 +113,7 @@ char uart_deinit(char uartport) void uart_baudrate_usb(char uartport, char ubrrll, char ubrrlh, char ubrrhl, char ubrrhh) { answer[1] = (unsigned char)uart_baudrate(uartport, ubrrll, ubrrlh, ubrrhl, ubrrhh); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } @@ -140,7 +140,7 @@ char uart_baudrate(char uartport, char ubrrll, char ubrrlh, char ubrrhl, char ub void uart_stopbits_usb(char uartport, char stopbits) { answer[1] = (unsigned char)uart_stopbits(uartport, stopbits); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } @@ -174,7 +174,7 @@ char uart_stopbits(char uartport, char stopbits) void uart_databits_usb(char uartport, char databits) { answer[1] = (unsigned char)uart_databits(uartport, databits); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } @@ -209,7 +209,7 @@ char uart_databits(char uartport, char databits) void uart_parity_usb(char uartport, char parity) { answer[1] = (unsigned char)uart_databits(uartport, parity); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } @@ -243,7 +243,7 @@ char uart_parity(char uartport, char parity) void uart_send_usb(char uartport, char length, char *buf) { answer[1] = (unsigned char)uart_send(uartport, length, buf); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } @@ -255,9 +255,7 @@ char uart_send(char uartport, unsigned int length, char *buf) return RSP_UNKOWN_PIN; while(length--) - { uart_putchar(uartport, *buf++); - } return RSP_OK; } @@ -295,6 +293,8 @@ void uart_recv_usb(char uartport, int length) for(i = 0; i < length; i++) answer[2+i] = data[i]; + answer[2+length] = 0; + CommandAnswer(3+length); } @@ -330,52 +330,4 @@ char uart_getchar(char uartport) return c; } -/* -unsigned char AsciiToHex(unsigned char high,unsigned char low) -{ - unsigned char new; - - // check if lower equal 9 ( ascii 57 ) - if(high <= 57) // high is a number - high = high -48; - else // high is a letter - high = high -87; - - high = high << 4; - high = high & 0xF0; - - // check if lower equal 9 ( ascii 57 ) - if(low <= 57) // high is a number - low = low -48; - else // high is a letter - low = low -87; - low = low & 0x0F; - - new = high | low; - - return new; -} -void SendHex(unsigned char hex) -{ - unsigned char high,low; - // get highnibble - high = hex & 0xF0; - high = high >> 4; - - // get lownibble - low = hex & 0x0F; - - if(high<=9) - UARTPutChar(high+48); - else - UARTPutChar(high+87); - - - if(low<=9) - UARTPutChar(low+48); - else - UARTPutChar(low+87); - -} -*/ diff --git a/firmware/uart_fifo.c b/firmware/uart_fifo.c new file mode 100644 index 0000000..d4da869 --- /dev/null +++ b/firmware/uart_fifo.c @@ -0,0 +1,368 @@ +#include +#include + +#include "uart.h" +#include "common.h" +#include "protocol.h" +#include "fifo.h" + +#define BUFSIZE_IN 5 +#define BUFSIZE_OUT 5 + +uint8_t inbuf0[BUFSIZE_IN]; +uint8_t inbuf1[BUFSIZE_IN]; +fifo_t infifo0; +fifo_t infifo1; + +uint8_t outbuf1[BUFSIZE_OUT]; +uint8_t outbuf0[BUFSIZE_OUT]; +fifo_t outfifo0; +fifo_t outfifo1; + + +void uart_parser(char *buf) +{ + answer[0] = buf[0]; + + switch(buf[0]) + { + case CMD_UART_INIT: + uart_init_usb((char)buf[2]); + break; + case CMD_UART_DEINIT: + uart_deinit_usb((char)buf[2]); + break; + + case CMD_UART_BAUDRATE: + uart_baudrate_usb((char)buf[2], (char)buf[3], (char)buf[4], (char)buf[5], (char)buf[6]); + break; + case CMD_UART_STOPBITS: + uart_stopbits_usb((char)buf[2], (char)buf[3]); + break; + case CMD_UART_DATABITS: + uart_stopbits_usb((char)buf[2], (char)buf[3]); + break; + case CMD_UART_PARITY: + uart_parity_usb((char)buf[2], (char)buf[3]); + break; + + case CMD_UART_SEND: + uart_send_usb((char)buf[2], (char)buf[3], &buf[4]); + break; + case CMD_UART_RECV: + uart_recv_usb((char)buf[2], (char)buf[3]); + break; + default: + answer[1] = RSP_UNKOWN_CMD; + answer[2] = 0; + CommandAnswer(3); + } +} + +void uart_init_usb(char uartport) +{ + answer[1] = (unsigned char)uart_init(uartport); + answer[2] = 0; + + CommandAnswer(3); +} + +char uart_init(char uartport) +{ + switch(uartport) + { + case 0: + octopus.ports[41] = PIN_UART; + octopus.ports[42] = PIN_UART; + /* enable transmitter receiver */ + UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0); + break; + case 1: + octopus.ports[14] = PIN_UART; + octopus.ports[15] = PIN_UART; + /* enable transmitter receiver */ + UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1); + break; + default: + return RSP_UNKOWN_PIN; + } + + return RSP_OK; +} + +void uart_deinit_usb(char uartport) +{ + answer[1] = (unsigned char)uart_deinit(uartport); + answer[2] = 0; + + CommandAnswer(3); +} + +char uart_deinit(char uartport) +{ + switch(uartport) + { + case 0: + octopus.ports[41] = PIN_NONE; + octopus.ports[42] = PIN_NONE; + UBRR0H = 0; + UBRR0L = 0; + UCSR0B = 0; + UCSR0C = 0; + break; + case 1: + octopus.ports[14] = PIN_NONE; + octopus.ports[15] = PIN_NONE; + UBRR1H = 0; + UBRR1L = 0; + UCSR1B = 0; + UCSR1C = 0; + break; + default: + return RSP_UNKOWN_PIN; + } + + return RSP_OK; +} + +void uart_baudrate_usb(char uartport, char ubrrll, char ubrrlh, char ubrrhl, char ubrrhh) +{ + answer[1] = (unsigned char)uart_baudrate(uartport, ubrrll, ubrrlh, ubrrhl, ubrrhh); + answer[2] = 0; + + CommandAnswer(3); +} + +char uart_baudrate(char uartport, char ubrrll, char ubrrlh, char ubrrhl, char ubrrhh) +{ + switch(uartport) + { + case 0: + UBRR0H = (ubrrhh << 8) | ubrrhl; + UBRR0L = (ubrrhl << 8) | ubrrll; + break; + case 1: + UBRR1H = (ubrrhh << 8) | ubrrhl; + UBRR1L = (ubrrhl << 8) | ubrrll; + break; + default: + return RSP_UNKOWN_PIN; + } + + return RSP_OK; +} + +void uart_stopbits_usb(char uartport, char stopbits) +{ + answer[1] = (unsigned char)uart_stopbits(uartport, stopbits); + answer[2] = 0; + + CommandAnswer(3); +} + +char uart_stopbits(char uartport, char stopbits) +{ + char usbs; + + switch(stopbits) + { + case 1: usbs = 0; break; + case 2: usbs = 2; break; + default: usbs = 0; break; + } + + switch(uartport) + { + case 0: + UCSR0C |= (usbs << USBS0); + break; + case 1: + UCSR1C |= (usbs << USBS1); + break; + default: + return RSP_UNKOWN_PIN; + } + + return RSP_OK; +} + +void uart_databits_usb(char uartport, char databits) +{ + answer[1] = (unsigned char)uart_databits(uartport, databits); + answer[2] = 0; + + CommandAnswer(3); +} + +char uart_databits(char uartport, char databits) +{ + char ucsz1,ucsz0; + + switch(databits) { + case 5: ucsz1 = 0; ucsz0 = 0; break; + case 6: ucsz1 = 0; ucsz0 = 1; break; + case 7: ucsz1 = 1; ucsz0 = 0; break; + case 8: ucsz1 = 1; ucsz0 = 1; break; + default: ucsz1 = 1; ucsz0 = 1; break; + } + + switch(uartport) + { + case 0: + UCSR0C |= (ucsz1 << UCSZ01) | (ucsz0 << UCSZ00); + break; + case 1: + UCSR1C |= (ucsz1 << UCSZ11) | (ucsz0 << UCSZ10); + break; + default: + return RSP_UNKOWN_PIN; + } + + return RSP_OK; +} + +void uart_parity_usb(char uartport, char parity) +{ + answer[1] = (unsigned char)uart_databits(uartport, parity); + answer[2] = 0; + + CommandAnswer(3); +} + +char uart_parity(char uartport, char parity) +{ + char upm1, upm0; + switch(parity) + { + case 'N': upm1 = 0; upm0 = 0; break; + case 'E': upm1 = 1; upm0 = 0; break; + case 'O': upm1 = 1; upm0 = 1; break; + default: upm1 = 0; upm0 = 0; break; + } + + switch(uartport) + { + case 0: + UCSR0C |= (upm1 << UPM01) | (upm0 << UPM00); + break; + case 1: + UCSR1C |= (upm1 << UPM11) | (upm0 << UPM10); + break; + default: + return RSP_UNKOWN_PIN; + } + + return RSP_OK; +} + +void uart_send_usb(char uartport, char length, char *buf) +{ + answer[1] = (unsigned char)uart_send(uartport, length, buf); + answer[2] = 0; + + CommandAnswer(3); +} + + +char uart_send(char uartport, unsigned int length, char *buf) +{ + if(uartport != 0 && uartport != 1) + return RSP_UNKOWN_PIN; + + while(length--) + uart_putchar(uartport, *buf++); + + return RSP_OK; +} + +char uart_putchar(char uartport, char data) +{ + switch(uartport) + { + case 0: + fifo_put (&outfifo0, data); + UCSR0B |= (1 << UDRIE0); + break; + case 1: + fifo_put (&outfifo1, data); + UCSR1B |= (1 << UDRIE1); + break; + default: + return RSP_UNKOWN_PIN; + } + + return RSP_OK; +} + + +void uart_recv_usb(char uartport, int length) +{ + char data[length]; + int i; + + answer[1] = (char)uart_recv(uartport, data, length); + + for(i = 0; i < length; i++) + answer[2+i] = data[i]; + + answer[2+length] = 0; + + CommandAnswer(3+length); +} + +char uart_recv(char uartport, char * buf, int length) +{ + if(uartport != 0 && uartport != 1) + return RSP_UNKOWN_PIN; + + while(length-- > 0) + *buf++ = uart_getchar(uartport); + + return RSP_OK; +} + +char uart_getchar(char uartport) +{ + char c; + + switch(uartport) + { + case 0: + while (!(UCSR0A & (1 << RXC0))); + c = UDR0; + break; + case 1: + while (!(UCSR1A & (1 << RXC1))); + c = UDR1; + break; + default: + return RSP_UNKOWN_PIN; + } + + return c; +} + +// Empfangene Zeichen werden in die Eingabgs-FIFO gespeichert und warten dort +//SIGNAL (SIG_UART0_RECV) +//{ +// _inline_fifo_put (&infifo0, UDR0); +//} + +// Ein Zeichen aus der Ausgabe-FIFO lesen und ausgeben +// Ist das Zeichen fertig ausgegeben, wird ein neuer SIG_UART_DATA-IRQ getriggert +// Ist die FIFO leer, deaktiviert die ISR ihren eigenen IRQ. +SIGNAL (SIG_UART0_DATA) +{ + PORTC ^= 5; + if (outfifo0.count > 0) + { + PORTC ^= 2; + UDR0 = _inline_fifo_get (&outfifo0); + } + else + { + PORTC ^= 3; + UCSR0B &= ~(1 << UDRIE0); + } +} + diff --git a/firmware/usbn2mc.c b/firmware/usbn2mc.c index d9b0fdd..413009c 100644 --- a/firmware/usbn2mc.c +++ b/firmware/usbn2mc.c @@ -81,7 +81,7 @@ USBNInitMC (void) USB_CS_DDR |= (1 << PF_CS); USB_CS_PORT |= (1 << PF_CS); - sei (); + //sei (); } -- cgit v1.2.1