create_tarball.pl0000750000076400007640000000043311102646336015203 0ustar polonatorpolonator#!/usr/bin/perl @d = (localtime)[3..5]; $datestamp = sprintf("%02d-%02d-%04d", $d[1]+1, $d[0], $d[2] + 1900); $tarfilename = "polonator_fluidics_$datestamp"; @args = ("tar", "-chvf", $tarfilename, "create_tarball.pl", "src"); system(@args)==0 or die "system @args failed: $?" src/0000755000076400007640000000000011263354645012502 5ustar polonatorpolonatorsrc/logs/0000750000076400007640000000000011102654376013435 5ustar polonatorpolonatorsrc/logs/utilities.py0000740000076400007640000000511510770541743016031 0ustar polonatorpolonator#!/usr/local/bin/python """ -------------------------------------------------------------------------------- Author: Mirko Palla. Date: March 18, 2008. For: G.007 polony sequencer design [fluidics software] at the Church Lab - Genetics Department, Harvard Medical School. Purpose: contains utility functions for log-data post-processing. This software may be used, modified, and distributed freely, but this header may not be modified and must appear at the top of this file. ------------------------------------------------------------------------------- """ import os import re import sys import glob #--------------------------------------------------------------------------------------- # GREP FUNCTION DEFINITION #--------------------------------------------------------------------------------------- def grep(pattern, f): """Given a list of files or standard input to read, grep searches for lines of text that match one or many regular expressions, and outputs only the matching lines.""" search = re.compile(pattern).search for line in open(f): if search(line): print line[:-1] #--------------------------------------------------------------------------------------- # PARSER FUNCTION DEFINITION #--------------------------------------------------------------------------------------- def parser(pattern, f=None): """Retrieves the last log-file modified or opens a specified file, then parses it for given pattern, and finally generates an archive of pattren containing line-logs.""" print '\n--> Pattern-log file generation started' # pattern log parsing start. if f: mod_last = f else: files = glob.glob("biochemistry_*.log") mod_date = 0 for f in files: # find last modified file if mod_date < os.stat(f).st_mtime: mod_last = f mod_date = os.stat(f).st_mtime line_list = [] search = re.compile(pattern).search # set pattern search parameter for line in open(mod_last): # loop through all lines in the file if search(line): line_list.append(line[:-1].strip() + '\n') # store lines with patterns in container if not len(line_list) == 0: pattern_log = open(pattern + '_' + mod_last, 'a') # open up log file to be written for i in range(len(line_list)): pattern_log.write(line_list.pop(0)) # write line into file where pattern found from container pattern_log.close() # close log-file print '--> Finished: parsed file [%s] for pattern [%s]\n' % (str(mod_last), pattern) else: print '--> Finished: no match found in file [%s] for pattern [%s]\n' % (mod_last, pattern) src/logs/pattern_log.py0000740000076400007640000000374611001457377016341 0ustar polonatorpolonator#!/usr/local/bin/python """ -------------------------------------------------------------------------------- Author: Mirko Palla. Date: March 18, 2008. For: G.007 polony sequencer design [fluidics software] at the Church Lab - Genetics Department, Harvard Medical School. Purpose: retrieves the last log-file modified and parses it for given pattern, and finally generates an archive of pattern containing line-logs. This software may be used, modified, and distributed freely, but this header may not be modified and must appear at the top of this file. ------------------------------------------------------------------------------- """ import os import re import sys import glob #-------------------------------- pattern parsing --------------------------------- print '\n--> Pattern-log file generation started - pattern_log.py' # pattern log parsing start. if len(sys.argv) < 2: print '--> Error: not correct input!\n--> Usage: python parse_log.py pattern [parse_file]\n' sys.exit() if len(sys.argv) == 3: mod_last = sys.argv[2] else: files = glob.glob("biochemistry_*.log") mod_date = 0 for f in files: # find last modified file if mod_date < os.stat(f).st_mtime: mod_last = f mod_date = os.stat(f).st_mtime line_list = [] search = re.compile(sys.argv[1]).search # set pattern search parameter for line in open(mod_last): # loop through all lines in the file if search(line): line_list.append(line[:-1].strip() + '\n') # store lines with patterns in container if not len(line_list) == 0: pattern_log = open(sys.argv[1] + '_' + mod_last, 'a') # open up log file to be written for i in range(len(line_list)): pattern_log.write(line_list.pop(0)) # write line into file where pattern found from container pattern_log.close() # close log-file print '--> Finished: parsed file [%s] for pattern [%s]\n' % (str(mod_last), sys.argv[1]) else: print '--> Finished: no match found in file [%s] for pattern [%s]\n' % (mod_last, sys.argv[1]) src/logger.py0000740000076400007640000000417511104064430014317 0ustar polonatorpolonator""" -------------------------------------------------------------------------------- Author: Mirko Palla. Date: March 14, 2008. For: G.007 polony sequencer design [fluidics software] at the Church Lab - Genetics Department, Harvard Medical School. Purpose: This program contains the complete code for class Logger, containing device operation logging facility in Python. This software may be used, modified, and distributed freely, but this header may not be modified and must appear at the top of this file. ------------------------------------------------------------------------------- """ import os import time import logging import sys class Logger: def __init__(self, config): """Initialize logging facility with default parameters""" if os.access(config.get("communication","log_dir"), os.F_OK) is False: os.mkdir(config.get("communication","log_dir")) logging.basicConfig(level=logging.DEBUG, # set logger format configuration parameters format='%(asctime)s.%(msecs)03d %(name)-12s %(levelname)-8s %(message)s', datefmt='%m-%d %H:%M:%S', filename = config.get("communication","log_dir") + 'biochemistry.log', filemode='a') formatter = logging.Formatter('%(levelname)-8s %(message)s') # set a format which is simpler for console use console = logging.StreamHandler(sys.stdout) # define a Handler which writes INFO messages or higher to the sys.stdout console.setLevel(logging.INFO) console.setFormatter(formatter) # tell the handler to use this format logging.getLogger('').addHandler(console) # add the handler to the root logger loglevel = 1 def log(self, level,message): "Forwards log messages to the logging module instance." logging.log(level,message) def warn(self, message): "Diplays a warning message via logging facility." logging.warn(message) def info(self, message): "Diplays an informative message via logging facility." logging.info(message) def error(self, message): "Diplays an error message via logging facility." logging.error(message) def debug(self, message): "Diplays a debugging message via logging facility." logging.debug(message) src/rotary_valve.py0000740000076400007640000000663711142367166015600 0ustar polonatorpolonator""" -------------------------------------------------------------------------------- Author: Rich Terry. Date: February 12, 2008. Modified by: Mirko Palla Date: March 5, 2008. For: G.007 polony sequencer design [fluidics software] at the Church Lab - Genetics Department, Harvard Medical School. Purpose: This program contains the complete code for class Rotary_valve, containing rotary valve communication subroutines in Python. This software may be used, modified, and distributed freely, but this header may not be modified and must appear at the top of this file. ------------------------------------------------------------------------------- """ import time import logging log=logging.getLogger("r_valve") class Rotary_valve: global serport; def __init__(self, config, serial_port, mux, logger=None): "Initialize Rheodyne rotary valve object with default parameters." self._baud_rate = int(config.get("communication","rotary_valve_baud")) self._read_length = int(config.get("communication","read_length")) self._sleep_time = float(config.get("communication","sleep_time")) self.serport = serial_port self.mux = mux self.state = 'rotary valve initialized' log.debug("---\t-\t--> rotary valve object constructed") def usePort(self, valve_name, valve_port): log.debug("---\t-\t--> use rotary valve %s position %d" % (valve_name, valve_port)) log.debug("---\t-\t--> set valve %s to position %d" % (valve_name, valve_port)) self.mux.setToDevice(valve_name) self.set_valve_position(valve_port) if(valve_name != 'V4'): log.debug("---\t-\t--> set valve %s to position %d" %('V4', int(valve_name[1]))) self.mux.setToDevice('V4') self.set_valve_position(int(valve_name[1])) #--------------------------------------------------------------------------------------# # Rheodyne rotary valve FUNCTIONS # #--------------------------------------------------------------------------------------# # # Performs low-level functional commands (e.g. set rotary valve position). Each command # implemented here must know the command set of the hardware being controlled, but does # not need to know how to communicate with the device (how to poll it, etc). Each # functional command will block until execution is complete. # #--------------------------------------------------------------------------------------# # BASIC SETTINGS # #--------------------------------------------------------------------------------------# def set_valve_position(self, valve_position): "Switch valve to given port on rotary valve, an integer." valve_position = '0' + (str(hex(valve_position)[2:])).capitalize() valve_position_string = 'P' + valve_position + '\r' log.debug("---\t-\t--> set rotary valve to position %s" % valve_position_string) self.serport.set_baud(self._baud_rate) # set baud rate of rotary valve self.serport.write_serial(valve_position_string) read_chars = '*' i = 1 time.sleep(0.01) valve_position = valve_position + '\r' while (read_chars != valve_position): self.serport.write_serial('S\r') time.sleep(0.1) read_chars = self.serport.read_serial_r(3) i = i + 1 if (i >= 10): i = 0 self.serport.write_serial(valve_position_string) time.sleep(0.1) find_string = valve_position response_string_size = 3 self.serport.parse_read_string('S\r', find_string, response_string_size) src/serial_port.py0000740000076400007640000001010311136423311015351 0ustar polonatorpolonator""" -------------------------------------------------------------------------------- Author: Richard Terry. Date: February 12, 2008. Modified by: Mirko Palla Date: March 5, 2008. For: G.007 polony sequencer design [fluidics software] at the Church Lab - Genetics Department, Harvard Medical School. Purpose: This program contains the complete code for class Serial_port, containing a set of serial port device communication subroutines in Python. This software may be used, modified, and distributed freely, but this header may not be modified and must appear at the top of this file. ------------------------------------------------------------------------------- """ import time import serial import logging log=logging.getLogger("ser_port") class Serial_port: global ser def __init__(self, config, logger=None): "Initialize serial port object with default parameters." self.ser = serial.Serial(port = config.get("communication","serial_port"), bytesize = serial.EIGHTBITS, parity = serial.PARITY_NONE, stopbits = serial.STOPBITS_ONE, timeout = float(config.get("communication","timeout"))) self.device_bauds = {int(config.get("communication","temperature_control_baud")) : "temperature controller", int(config.get("communication","syringe_pump_baud")) : "syringe pump", int(config.get("communication","rotary_valve_baud")) : "rotary valve"} log.debug("---\t-\t--> SR: serial port object constructed") #--------------------------------------------------------------------------------------# # SERIAL FUNCTIONS # #--------------------------------------------------------------------------------------# # # Serial command interface protocols in Linux for handling G.007 device regulation. # Only one port can be read from, written to at a time. That is, ser.close() must # be called before talking to a different piece of hardware with the ser.open() command. # def set_baud(self, baudrate): "Sets serial port's baud rate as defined in configuration file." self.ser.setBaudrate(baudrate) #log.debug("---\t-\t--> Set serial port baud rate to %i for %s" % (baudrate, self.device_bauds[baudrate])) def flush_input(self): "Flush the input buffer of the serial port." log.debug("---\t-\t--> SR: flush serial port input buffer") self.ser.flushInput() def write_serial(self, data): "Flush input buffer, then write string data to serial port." self.ser.flushInput() #log.debug("---\t-\t--> Flush Input") self.ser.write(data) #log.debug("---\t-\t--> Write data") def parse_read_string(self, write_string, find_string, find_string_size): "Will read and parse string responses which return program code from the device." self.ser.flushInput() read_string_char = '-1' while read_string_char == '-1': self.write_serial(write_string) read_chars = self.read_serial(find_string_size) read_string = read_chars.find(find_string) read_string_char = str(read_string) time.sleep(0.001) #log.debug("---\t-\t--> Read Chars %s" % (read_chars)) return read_chars def read_serial(self, num_expected): """Return the number of chars in the receive buffer and compare it to expected character number passed as an argument.""" total_received = 0 read_chars = "" while total_received < num_expected: iw = self.ser.inWaiting() if iw > num_expected: iw = num_expected read_chars = read_chars + self.ser.read(iw) total_received += iw time.sleep(0.01) #log.debug("---\t-\t--> READCHAR %s" % (read_chars)) #log.debug("---\t-\t--> Num expected %s" % (num_expected)) return read_chars def read_serial_r(self, num_expected): """Return the number of chars in the receive buffer and compare it to expected character number passed as an argument.""" read_chars = "" iw = self.ser.inWaiting() read_chars = read_chars + self.ser.read(iw) # log.debug("---\t-\t--> READCHAR %s" % (read_chars)) # log.debug("---\t-\t--> Num expected %s" % (iw)) return read_chars def __del__(self): "Destructs serial port object - it closes any open session." self.ser.close() src/config_cl_production.txt0000640000076400007640000001672611046066025017433 0ustar polonatorpolonator#--------------------------------------------------------------------------------------# # DEVICE COMMUNICATION # #--------------------------------------------------------------------------------------# [communication] serial_port = /dev/ttyS0 timeout = 0.05 read_length = 1024 sleep_time = 0.005 temperature_control_baud = 115200 syringe_pump_baud = 9600 rotary_valve_baud = 19200 home_dir = /home/polonator/G.007/G.007_fluidics/src/ log_dir = /home/polonator/G.007/G.007_fluidics/logs/ #--------------------------------------------------------------------------------------# # TUBING CONFIGURATION # #--------------------------------------------------------------------------------------# [tube_constants] syringe_dead_volume = 48 multi_dead_volume = 25 discrete_dead_volume = 0 rotary_dead_volume = 0 channel_volume = 120 flowcell_volume = 185 dH2O_to_V4 = 356 wash1_to_V = 424 V_to_V4 = 33 V4_to_T = 31 V5_to_T = 18 ligase_to_V5 = 24 T_to_Y = 258 Y_to_FC = 13 FC_to_syringe = 192 well_to_V = 26 NaOH_to_V4 = 162 guadinine_to_V4 = 162 #--------------------------------------------------------------------------------------# # REAGENT BLOCK CONFIGURATION # #--------------------------------------------------------------------------------------# [block_constants] primer_chamber_volume = 500 nonamer_chamber_volume = 500 spare_chamber_volume = 500 ligase_chamber_volume = 500 buffer_chamber_volume = 500 A5_chamber_volume = 500 A6_chamber_volume = 500 #--------------------------------------------------------------------------------------# # SYRINGE CONFIGURATION # #--------------------------------------------------------------------------------------# [syringe_constants] full_stroke = 1000 pull_speed = 27 slow_speed = 27 fast_speed = 27 critical_speed = 27 final_pull_speed = 27 empty_speed = 0 mixer_empty_speed = 27 #--------------------------------------------------------------------------------------# # COMMON BIOCHEM. PARAMETER(S) # #--------------------------------------------------------------------------------------# [biochem_parameters] stage_temp = 4 room_temp = 28 temp_tolerance = 10 air_gap = 0 front_gap = 0 middle_gap = 0 back_gap = 0 time_limit = 1 mixer_iter = 1 syringe_iter = 1 slow_push_volume = 0 #--------------------------------------------------------------------------------------# # ENZYMATIC REACTION PARAMETER(S) # #--------------------------------------------------------------------------------------# [exo_parameters] exo_volume = 278 exo_temp = 37 exo_set_temp = 44 exo_poll_temp = 36 exo_time = 1 exo_extra = 0 #--------------------------------------------------------------------------------------# # CHEMICAL STRIPPING PARAMETER(S) # #--------------------------------------------------------------------------------------# [stripping_parameters] guadinine_volume = 1000 NaOH_volume = 1000 dH2O_volume = 278 guadinine_time = 1 NaOH_time = 1 guadinine_extra = 1 NaOH_extra = 1 #--------------------------------------------------------------------------------------# # HYBRIDIZATION PARAMETER(S) # #--------------------------------------------------------------------------------------# [hyb_parameters] primer_volume = 278 hyb_temp1 = 52 hyb_set_temp1 = 59 hyb_poll_temp1 = 51 hyb_time1 = 1 hyb_temp2 = 42 hyb_set_temp2 = 35 hyb_poll_temp2 = 43 hyb_time2 = 0 hyb_extra = 0 #--------------------------------------------------------------------------------------# # STEPUP PEG LIGATION PARAMETER(S) # #--------------------------------------------------------------------------------------# [lig_parameters] buffer_volume = 278 ligase_volume = 11 nonamer_volume = 267 lig_step1 = 23 lig_set_step1 = 8 lig_poll_step1 = 18 lig_time1 = 1 lig_step2 = 25 lig_set_step2 = 15 lig_poll_step2 = 24 lig_time2 = 0 lig_step3 = 30 lig_set_step3 = 40 lig_poll_step3 = 29 lig_time3 = 0 lig_step4 = 37 lig_set_step4 = 45 lig_poll_step4 = 34 lig_time4 = 0 mix_time = 1 lig_extra = 0 #--------------------------------------------------------------------------------------# # CHASER STEPUP PEG LIGATION PARAMETER(S) # #--------------------------------------------------------------------------------------# [chaser_lig_parameters] chaser_buffer_volume = 267 chaser_nonamer_volume = 267 chaser_lig_step1 = 23 chaser_lig_set_step1 = 8 chaser_lig_poll_step1 = 18 chaser_lig_time1 = 1 chaser_lig_step2 = 25 chaser_lig_set_step2 = 15 chaser_lig_poll_step2 = 24 chaser_lig_time2 = 0 chaser_lig_step3 = 30 chaser_lig_set_step3 = 40 chaser_lig_poll_step3 = 29 chaser_lig_time3 = 0 chaser_lig_step4 = 37 chaser_lig_set_step4 = 45 chaser_lig_poll_step4 = 34 chaser_lig_time4 = 0 mix_time = 1 chaser_lig_extra = 0 #--------------------------------------------------------------------------------------# # POLYMERASE PARAMETER(S) # #--------------------------------------------------------------------------------------# [polymerase_parameters] poly_buffer_volume = 278 poly_volume = 278 poly_step1 = 50 poly_set_step1 = 58 poly_poll_step1 = 50 poly_time1 = 5 poly_extra = 0 #--------------------------------------------------------------------------------------# # CLEAVAGE PARAMETER(S) # #--------------------------------------------------------------------------------------# [cleavage_parameters] cleavage_buffer_volume = 3000 cleavage_volume = 278 cleavage_step1 = 50 cleavage_set_step1 = 58 cleavage_poll_step1 = 50 cleavage_time1 = 15 cleavage_extra = 0 #--------------------------------------------------------------------------------------# # DTT PARAMETER(S) # #--------------------------------------------------------------------------------------# [DTT_parameters] DTT_volume = 278 DTT_step1 = 25 DTT_set_step1 = 15 DTT_poll_step1 = 24 DTT_time1 = 1 DTT_extra = 0 #--------------------------------------------------------------------------------------# # CIP PARAMETER(S) # #--------------------------------------------------------------------------------------# [CIP_parameters] CIP_buffer_volume = 278 CIP_volume = 278 CIP_step1 = 37 CIP_set_step1 = 45 CIP_poll_step1 = 34 CIP_time1 = 15 CIP_extra = 0 #--------------------------------------------------------------------------------------# # CYCLE CONSTANTS # #--------------------------------------------------------------------------------------# [cycle_constants] port_scheme = {"AM1" : ['V1',1,'V1',2,'V1',3,'V1',4,'V1',5,'V2',1,'V2',2], "HY1" : ['V1',1,'V1',2,'V1',3,'V1',4,'V1',5,'V2',1,'V2',2], "AM2" : ['V3', 4,'V3',1], "AM3" : [4,'V1',3], "AM4" : ['V1', 2,'V1',5], "AM5" : [4,'V1',5], "AM6" : [4,'V1',6], "AP1" : [6,'V1',8], "AP2" : [6,'V1',9], "AP3" : [6,'V2',4], "AP4" : [6,'V2',3], "AP5" : [6,'V2',2], "AP6" : [6,'V2',1], "BM1" : [7,'V1',1], "BM2" : [7,'V1',2], "BM3" : [7,'V1',3], "BM4" : [7,'V1',4], "BM5" : [7,'V1',5], "BM6" : [7,'V1',6], "BP1" : [10,'V1',8], "BP2" : [10,'V1',9], "BP3" : [10,'V2',4], "BP4" : [10,'V2',3], "BP5" : [10,'V2',2], "BP6" : [10,'V2',1], "AM7" : [3,'V1',6], "BM7" : [5,'V1',6]} src/polony_sequencing.py0000740000076400007640000000251110776476052016616 0ustar polonatorpolonator#!/usr/local/bin/python """ -------------------------------------------------------------------------------- Author: Mirko Palla. Date: March 19, 2008. For: G.007 polony sequencer design [fluidics software] at the Church Lab - Genetics Department, Harvard Medical School. Purpose: polony_sequencing.py performs a polony sequencing biochemistry consisting of given number of cycles of iteration (26) This software may be used, modified, and distributed freely, but this header may not be modified and must appear at the top of this file. ------------------------------------------------------------------------------- """ import sys from biochem import Biochem # Import biochecmistry class. #--------------------------- Configuration input handling ------------------------------ if len(sys.argv) < 3: print '\n--> Error: not correct input!\n--> Usage: python polony_sequencing.py cycle-name flowcell-number\n' sys.exit() #--------------------- G.007 fluidics sub-system initialization ------------------------ t0 = time.time() # Get current time. biochem = Biochem(sys.argv[1], int(sys.argv[2])) # Initialize biochemistry object - cycle-name and flowcell-number need to be passed. #-------------------------- Alternating cycle iterations ------------------------------- biochem.run() # Run polony sequencing cycle(s). src/polonator g007 fluidics volumes rev c.xls0000640000076400007640000041600011012042623022076 0ustar polonatorpolonatorࡱ;  X  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry  \pCalc Ba=@=@ 8X"1Arial1Arial1Arial1Arial1:Arial GENERAL 0.000 0.00                + ) , *   | "|::  |:  |  |::  |: *|::+ *|:+ *|:+ *|:: *|: *|: *|::*|::*|: *| *|  |:  |  |: (|:  |:  |:  |::  |:  |  |/ (|  |  |:  |  |: | |:/  |/  |: |"|: "|  |:.  |.  |: | |: | |  |/ (|  |  |:  |:  |: (|: (|: (|::+ (|:+ (|:+ (|::(|: (| #|: #|  | | "| 83ffff̙̙3f3fff3f3f3333f33333`Sheet1pSheet2cSheet3jb( 3  @@  4](Volume Calculations Internal to ManifoldFromTo,Tube Length From Reagent Block Into ManifoldTube Cross Sectional Area (mm) Tube Volume Manifold Layer Transition Length)Transition Hole Cross Sectional Area (mm)Transition VolumeManifold Path Length Path Area Path Volume"Tube Length from Manifold To ValveTotal Path Length (mm)Total Path Volume (mm^3/ul)Notes: Manifold 2V1 Pass ThroughM1 .063" TubeM2 Large PathM3 Small PathM4M5M6M7P1P2V7 Manifold 1V2P6P5P4P3Spare 1Spare 2Spare 3Spare 4Spare 5 Manifold 5V3 Manifold 6A5AMA6APBM Manifold 4BPV5LIGASEV4LIGATION BUFFER Manifold 7 Manifold 8V6 Manifold 9 Manifold 10 Manifold 3Air(Volume Calculations External to ManifoldTubing Run LengthNominal Tubing Diamater (in)Cross Sectional Area (mm)Tubing Path Volume (mm^3/ul)Syringe Pump 60.020"Syringe Pump 5Water0.062"NaOH GuanidineWashSyringe Pump 7Mixing Chamber UnionTo Flow Cell 1To Flow Cell 2Syringe Pump 1Mixing Chamber Inlet 1Syringe Pump 2From Flow Cell 1Syringe Pump 3From Flow Cell 2Syringe Pump 4WasteSyringe Pump 8Mixing Chamber Inlet 2Syringe Pump 9Mixing Chamber ]   dMbP?_%*+&?'?('}'}?)'}'}?" d,, ` `? ` `?U} } }  }  }  } }  }  } E,@@;@;@;@;@;@;@;@ ;@ ;@ ;@ ;@ ;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@ 6                     ! "#$$$$ %  & '~ ((U?!( DD(|?5^@(U?!(ca '@ DD)xQ@ *~jt?! )׹i3jO@ DD  ((\@@ (U?! +vVP@ D D .,GzN[@$$$$ B.,Baixa@$$$ $ B-.... .\(\@ & '.mD@.U?!.G \T@ DD.|?5^@.U?!.ca '@ DD~ .5 /#~j?! 0B N@ DD  .(\@@ .U?! 1vVP@ D D .243333\@$$$$ B.2cn~k@$$$ $ B-.... .J +@ & '.mD@.U?!.G \T@ DD.|?5^@.U?!.ca '@ DD.{/L ,@ /#~j?! 0?4fm.9@ DD  .(\@@ .U?! 1vVP@ D D .2-W@$$$$ B.2~ɇf@$$$ $ B-.... /#~j? & '.mD@.U?!.G \T@ DD.|?5^@.U?!.ca '@ DD.RI&6@ /#~j?! 0o*oD@ DD  .(\@@ .U?! 1vVP@ D D .2Ə1w-Y@$$$$ B.2 _h@$$$ $ B-.... 3~jt? & '.mD@.U?!.G \T@ DD.|?5^@.U?!.ca '@ DD.ho*@ /#~j?! 0&7@ DD  .(\@@ .U?! 1vVP@ D D .2J4QW@$$$$ B.2{19Zf@$$$ $ B-.... & '.mD@.U?!.G \T@ DD.|?5^@.U?!.ca '@ DD.RI&6@ /#~j?! 0o*oD@ DD  .(\@@ .U?! 1vVP@ D D .2Ə1w-Y@$$$$ B.2 _h@$$$ $ B-.... & '.mD@.U?!.G \T@ DD.|?5^@.U?!.ca '@ DD.&†,@ /#~j?! 0 :9@ DD  .(\@@ .U?! 1vVP@ D D .2BǘW@$$$$ B.2[K@$ $ $ $ B -.... 4 5!~ . .U?! . D D  .|?5^@ .U?! .ca '@ D D  .H.%c@ 3~jt?! 0Pg8{a@ D D  .(\@@ .U?! 1vVP@ D D . 2 Oh@$ $ $ $ B. 23+>j@$ $ $ $ B -.... 4" 5!.mD@.U?!.G \T@ DD.|?5^@.U?!.ca '@ DD~ .5 /#~j?! 0B N@ DD  .(\@@ .U?! 1vVP@ D D .243333\@$$$$ B.2cn~k@$$$ $ B-.... 4# 5!.mD@.U?!.G \T@ DD.|?5^@.U?!.ca '@ DD.{/L ,@ /#~j?! 0?4fm.9@ DD  .(\@@ .U?! 1vVP@ D D .2-W@$$$$ B.2~ɇf@$$$ $ B-.... 4$ 5!.mD@.U?!.G \T@ DD.|?5^@.U?!.ca '@ DD.RI&6@ /#~j?! 0o*oD@ DD  .(\@@ .U?! 1vVP@ D D .2Ə1w-Y@$$$$ B.2 _h@$$$ $ B-.... 4% 5!.mD@.U?!.G \T@ DD.|?5^@.U?!.ca '@ DD.ho*@ /#~j?! 0&7@ DD  .(\@@ .U?! 1vVP@ D D .2J4QW@$$$$ B.2{19Zf@$$$ $ B-.... 4& 5!.mD@.U?!.G \T@ DD.|?5^@.U?!.ca '@ DD.RI&6@ /#~j?! 0o*oD@ DD  .(\@@ .U?! 1vVP@ D D .2Ə1w-Y@$$$$ B.2 _h@$$$ $ B-.... 4' 5!.mD@.U?!.G \T@ DD.|?5^@.U?!.ca '@ DD.&†,@ /#~j?! 0 :9@ DD  .(\@@ .U?! 1vVP@ D D .2BǘW@$$$$ B.2yX5\@ /#~j?! 0gi@ DD  .(\@@ .U?! 1vVP@ D D .2|a2U02c@$$$$ B.2sFq@$$$ $ B-.... 6. 7,.EGryH@.U?!.vP8X@ DD.|?5^@.U?!.ca '@ DD.w-!L@ /#~j?! 0IαY@ DD  .(\@@ .U?! 1vVP@ D D .2 +!b@$$$$ B.2 CIq@$$$ $ B-.... 6/ 7,."uqMF@.U?!.-V@ DD.|?5^@.U?!.ca '@ DD.z6>,@ /#~j?! 0eJ5#]9@ DD  .(\@@ .U?! 1vVP@ D D .2R!eX@$$$$ B.2 P(g@$$$ $ B-.... 60 7,.EGryH@.U?!.vP8X@ DD.|?5^@.U?!.ca '@ DD.|?5NO@ /#~j?! 0?\@ DD  .(\@@ .U?! 1vVP@ D D .2Afb@$$$$ B.2Aq@$$$ $ B-.... 61 7,."uqMF@.U?!.-V@ DD.|?5^@.U?!.ca '@ DD.jM+@ /#~j?! 0 P8@ DD  .(\@@ .U?! 1vVP@ D D .20*@X@$$$$ B.2g@$$$ $ B-.... 62 7,."uqMF@.U?!.-V@ DD.|?5^@.U?!.ca '@ DD.jM+@ /#~j?! 0 P8@ DD  .(\@@ .U?! 1vVP@ D D .20*@X@$$$$ B.2g@$$$ $ B-.... 63 7,~ ..U?!. DD.|?5^@.U?!.ca '@ DD.) 0X@ /#~j?! 0;1Sf@ DD  .(\@@ .U?! 1vVP@ D D .2r -a@$$$$ B.2sɞo@$$$ $ B-.... ;@!;@";@#;@$;@%;@&;@';@(;@);@*;@+;@,,@-,@.@/,@0,@1,@2;@3;@4,@5,@6,@7,@8,@9,@:,@;,@<,@=,@>,@?,@ 64 7, ."uqMF@ .U?! .-V@ D D  .|?5^@ .U?! .ca '@ D D  . r,@ /#~j?! 05ڋ9@ D D  .(\@@ .U?! 1vVP@ D D . 2@߾lX@$ $ $ $ B. 2}#g@$ $ $ $ B -.... !65 !7,~ !.!.U?!!. D!D!!.|?5^'@!.U?!!.ca 7@ D!D!!.]mQ@! 3~jt?!! 0zwP@ D!D! ! .(\@@! .U?!! 1vVP@ D! D! .!2T(]@$!$!$!$! B.!2؛ c@$!$!$! $! B!-.... "6 "7,~ ".".U?!". D"D"".|?5^'@".U?!".ca 7@ D"D"".Bi@" 3~jt?!" 0>DXf@ D"D" " .(\@@" .U?!" 1vVP@ D" D" ."29m4n@$"$"$"$" B."2Bp@$"$"$" $" B"-.... #46 #57#.V}b?9@#.U?!#.%H@ D#D##.|?5^@#.U?!#.ca '@ D#D##.鷯+S@# /#~j?!# 0+ 67a@ D#D# ~ # .# .U?!# 1 D# D# .#2(~kZ@$#$#$#$# B.#25Eh@$#$#$# $# B#-.... $48 $57$.B>٬I@$.U?!$.kfY@ D$D$$.|?5^@$.U?!$.ca '@ D$D$$.Bi ]@$ /#~j?!$ 0;j@ D$D$ ~ $ .$ .U?!$ 1 D$ D$ .$2_Le@$$$$$$$$ B.$2oƂt@$$$$$$ $$ B$-.... %49 %57~ %.%.U?!%. D%D%%.|?5^@%.U?!%.ca '@ D%D%%.ec`@% 3~jt?!% 0z\@ D%D% ~ % .% .U?!% 1 D% D% .%2|a2U`@$%$%$%$% B.%2`? _@$%$%$% $% B%-.... &8: &95~ &.&.U?!&. D&D&&.|?5^@&.U?!&.ca '@ D&D&&.$d@& 3~jt?!& 0+)b@ D&D& ~ & .& .U?!& 1 D& D& .&2J +ve@$&$&$&$& B.&2Ec@$&$&$& $& B&-.... '8; '95~ '.'.U?!'. D'D''.|?5^'@'.U?!'.ca 7@ D'D''.Q=@' 3~jt?!' 0mIFΦ:@ D'D' ~ ' .' .U?!' 1 D' D' .'2ʡED@$'$'$'$' B.'2H@$'$'$' $' B':;;;; (<< (=;~ (.(.U?!(. D(D((.|?5^@(.U?!(.ca '@ D(D((.Aff@( 3~jt?!( 0QIקUd@ D(D( ~ ( .( .U?!( 1 D( D( .(2=yXg@$($($($( B.(2'xe@$($($( $( B(-.... )<= )=;~ ).).U?!). D)D)).|?5^@).U?!).ca '@ D)D)).B`"l@) 3~jt?!) 0--؀i@ D)D) ~ ) .) .U?!) 1 D) D) .)2GzJm@$)$)$)$) B.)2 Ij@$)$)$) $) B)-.... *>> *?~ *.*.U?!*. D*D**.|?5^@*.U?!*.ca '@ D*D*~ *.* 3~jt?!* 0~1@ D*D* ~ * .* .U?!* 1 D* D* .*21Z8@$*$*$*$* B.*2HN`,<@$*$*$* $* B*-.... +@? +A~ +B+BU?!+B D+D++B|?5^@+BU?!+Bca '@ D+D+~ +B+ C#~j?!+ D D+D+ ~ + B+ BU?!+ E D+ D+ .+F|?5^@$+$+$+$+ B.+Fca '@$+$+$+ $+ B+:;;;;8,GGGGGGHHHHHHHHHH..... -@6-..... .I .J .KA .LB .MC .ND,.O00000000P;;;;; /' /'E~ /( /QF/+k?!/2Pp3N@ D/D/,/;;;;; 0' 0'G~ 0.v 0RF01k?!02W2L@ D0D0,0;;;;; 1'> 1'H~ 1. 1RI11|\*?!12F%u@ D1D1,1 2'3 2'J~ 2. 2RF21k?!22ߦ?O@ D2D2,2 3'+ 3'K~ 3. 3RF31k?!32sczX@ D3D3,3-........PPPPPPP0P 4'- 4'L~ 4.z 4RI41|\*?!42U[;@ D4D4,4 5'9 5'M~ 5.j 5RF51k?!526=[ >=N~ >. >RF>1k?!>2d`TR8@ D>D>,> ?S\ ?SN~ ?.?RMb??T~ ?2,?@,@A,@B,@C,@D@ @[ @\ @T+@22%`@333333?D>D?,@ A[ A: AT+AFnI@D9D>333333?,A8BUH8CU8D.............PPPPPP.P--PH0(  >'@444   dMbP?_%*+&?'?('}'}?)'}'}?" d,, ` `? ` `?U} d@@@@@@@@@ @ @ @ @ @@@@@@@@@@@@@@@@@@@.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP. PPPPPPPPPPPPPPPPPPPP. PPPPPPPPPPPPPPPPPPPP. PPPPPPPPPPPPPPPPPPPP. PPPPPPPPPPPPPPPPPPPP. PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP @!@"@#@$@%@&@'@(@)@*@+@,@-@.@/@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@. PPPPPPPPPPPPPPPPPPPP.!PPPPPPPPPPPPPPPPPPPP."PPPPPPPPPPPPPPPPPPPP.#PPPPPPPPPPPPPPPPPPPP.$PPPPPPPPPPPPPPPPPPPP.%PPPPPPPPPPPPPPPPPPPP.&PPPPPPPPPPPPPPPPPPPP.'PPPPPPPPPPPPPPPPPPPP.(PPPPPPPPPPPPPPPPPPPP.)PPPPPPPPPPPPPPPPPPPP.*PPPPPPPPPPPPPPPPPPPP.+PPPPPPPPPPPPPPPPPPPP.,PPPPPPPPPPPPPPPPPPPP.-PPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPP./PPPPPPPPPPPPPPPPPPPP.0PPPPPPPPPPPPPPPPPPPP.1PPPPPPPPPPPPPPPPPPPP.2PPPPPPPPPPPPPPPPPPPP.3PPPPPPPPPPPPPPPPPPPP.4PPPPPPPPPPPPPPPPPPPP.5PPPPPPPPPPPPPPPPPPPP.6PPPPPPPPPPPPPPPPPPPP.7PPPPPPPPPPPPPPPPPPPP.8PPPPPPPPPPPPPPPPPPPP.9PPPPPPPPPPPPPPPPPPPP.:PPPPPPPPPPPPPPPPPPPP.;PPPPPPPPPPPPPPPPPPPP.<PPPPPPPPPPPPPPPPPPPP.=PPPPPPPPPPPPPPPPPPPP.>PPPPPPPPPPPPPPPPPPPP.?PPPPPPPPPPPPPPPPPPPP@@A@B@C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@Z@[@\@]@^@_@.@PPPPPPPPPPPPPPPPPPPP.APPPPPPPPPPPPPPPPPPPP.BPPPPPPPPPPPPPPPPPPPP.CPPPPPPPPPPPPPPPPPPPP.DPPPPPPPPPPPPPPPPPPPP.EPPPPPPPPPPPPPPPPPPPP.FPPPPPPPPPPPPPPPPPPPP.GPPPPPPPPPPPPPPPPPPPP.HPPPPPPPPPPPPPPPPPPPP.IPPPPPPPPPPPPPPPPPPPP.JPPPPPPPPPPPPPPPPPPPP.KPPPPPPPPPPPPPPPPPPPP.LPPPPPPPPPPPPPPPPPPPP.MPPPPPPPPPPPPPPPPPPPP.NPPPPPPPPPPPPPPPPPPPP.OPPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPPP.QPPPPPPPPPPPPPPPPPPPP.RPPPPPPPPPPPPPPPPPPPP.SPPPPPPPPPPPPPPPPPPPP.TPPPPPPPPPPPPPPPPPPPP.UPPPPPPPPPPPPPPPPPPPP.VPPPPPPPPPPPPPPPPPPPP.WPPPPPPPPPPPPPPPPPPPP.XPPPPPPPPPPPPPPPPPPPP.YPPPPPPPPPPPPPPPPPPPP.ZPPPPPPPPPPPPPPPPPPPP.[PPPPPPPPPPPPPPPPPPPP.\PPPPPPPPPPPPPPPPPPPP.]PPPPPPPPPPPPPPPPPPPP.^PPPPPPPPPPPPPPPPPPPP._PPPPPPPPPPPPPPPPPPPP`@a@b@c@.`PPPPPPPPPPPPPPPPPPPP.aPPPPPPPPPPPPPPPPPPPP.bPPPPPPPPPPPPPPPPPPPP.cPPPPPPPPPPPPPPPPPPPPPH 0(  >@   dMbP?_%*+&?'?('}'}?)'}'}?" d,, ` `? ` `?U} d@@@@@@@@@ @ @ @ @ @@@@@@@@@@@@@@@@@@@.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP. PPPPPPPPPPPPPPPPPPPP. PPPPPPPPPPPPPPPPPPPP. PPPPPPPPPPPPPPPPPPPP. PPPPPPPPPPPPPPPPPPPP. PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPP @!@"@#@$@%@&@'@(@)@*@+@,@-@.@/@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@. PPPPPPPPPPPPPPPPPPPP.!PPPPPPPPPPPPPPPPPPPP."PPPPPPPPPPPPPPPPPPPP.#PPPPPPPPPPPPPPPPPPPP.$PPPPPPPPPPPPPPPPPPPP.%PPPPPPPPPPPPPPPPPPPP.&PPPPPPPPPPPPPPPPPPPP.'PPPPPPPPPPPPPPPPPPPP.(PPPPPPPPPPPPPPPPPPPP.)PPPPPPPPPPPPPPPPPPPP.*PPPPPPPPPPPPPPPPPPPP.+PPPPPPPPPPPPPPPPPPPP.,PPPPPPPPPPPPPPPPPPPP.-PPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPP./PPPPPPPPPPPPPPPPPPPP.0PPPPPPPPPPPPPPPPPPPP.1PPPPPPPPPPPPPPPPPPPP.2PPPPPPPPPPPPPPPPPPPP.3PPPPPPPPPPPPPPPPPPPP.4PPPPPPPPPPPPPPPPPPPP.5PPPPPPPPPPPPPPPPPPPP.6PPPPPPPPPPPPPPPPPPPP.7PPPPPPPPPPPPPPPPPPPP.8PPPPPPPPPPPPPPPPPPPP.9PPPPPPPPPPPPPPPPPPPP.:PPPPPPPPPPPPPPPPPPPP.;PPPPPPPPPPPPPPPPPPPP.<PPPPPPPPPPPPPPPPPPPP.=PPPPPPPPPPPPPPPPPPPP.>PPPPPPPPPPPPPPPPPPPP.?PPPPPPPPPPPPPPPPPPPP@@A@B@C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@Z@[@\@]@^@_@.@PPPPPPPPPPPPPPPPPPPP.APPPPPPPPPPPPPPPPPPPP.BPPPPPPPPPPPPPPPPPPPP.CPPPPPPPPPPPPPPPPPPPP.DPPPPPPPPPPPPPPPPPPPP.EPPPPPPPPPPPPPPPPPPPP.FPPPPPPPPPPPPPPPPPPPP.GPPPPPPPPPPPPPPPPPPPP.HPPPPPPPPPPPPPPPPPPPP.IPPPPPPPPPPPPPPPPPPPP.JPPPPPPPPPPPPPPPPPPPP.KPPPPPPPPPPPPPPPPPPPP.LPPPPPPPPPPPPPPPPPPPP.MPPPPPPPPPPPPPPPPPPPP.NPPPPPPPPPPPPPPPPPPPP.OPPPPPPPPPPPPPPPPPPPP.PPPPPPPPPPPPPPPPPPPPP.QPPPPPPPPPPPPPPPPPPPP.RPPPPPPPPPPPPPPPPPPPP.SPPPPPPPPPPPPPPPPPPPP.TPPPPPPPPPPPPPPPPPPPP.UPPPPPPPPPPPPPPPPPPPP.VPPPPPPPPPPPPPPPPPPPP.WPPPPPPPPPPPPPPPPPPPP.XPPPPPPPPPPPPPPPPPPPP.YPPPPPPPPPPPPPPPPPPPP.ZPPPPPPPPPPPPPPPPPPPP.[PPPPPPPPPPPPPPPPPPPP.\PPPPPPPPPPPPPPPPPPPP.]PPPPPPPPPPPPPPPPPPPP.^PPPPPPPPPPPPPPPPPPPP._PPPPPPPPPPPPPPPPPPPP`@a@b@c@.`PPPPPPPPPPPPPPPPPPPP.aPPPPPPPPPPPPPPPPPPPP.bPPPPPPPPPPPPPPPPPPPP.cPPPPPPPPPPPPPPPPPPPPPH0 0(   >@  FMicrosoft Excel 97-TabelleBiff8՜.+,D՜.+,\Oh+'0\@ H T ` l x0@@@@GH\(t̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙   Root EntryFY@Workbook2CompObjIOle SummaryInformation(Z]DocumentSummaryInformation8tsrc/biochem_utils.pl0000750000076400007640000000023511104377544015660 0ustar polonatorpolonator#!/usr/bin/perl $cmd = join(' ', @ARGV); $cmd = "python /home/polonator/G.007/G.007_fluidics/src/biochem_utils.py " . $cmd; print "$cmd\n"; system "$cmd"; src/mux.py0000750000076400007640000005351311142363577013672 0ustar polonatorpolonator""" -------------------------------------------------------------------------------- Author: Mirko Palla. Date: February 19, 2008. Modified: Richard Terry Date: March 5, 2008. For: G.007 polony sequencer design [fluidics software] at the Church Lab - Genetics Department, Harvard Medical School. Purpose: This program contains the complete code for class Mux, containing multiplexer communication subroutines in Python. This software may be used, modified, and distributed freely, but this header may not be modified and must appear at the top of this file. ------------------------------------------------------------------------------- """ import sys import getpass import time import logging from tel_net import Tel_net log=logging.getLogger("mux\t") class Mux: global mux_state global mux_state_00 global session mux_state_00 = ([0,0,0,0,0]) def __init__(self, logger=None): """Initialize Ultimac Mux R/P PCB mux object with default parameters""" self.session = Tel_net() log.debug("---\t-\t--> MUX: Initialize mux") mux_state = ([0,0,0,0,0,1,0,0]) mux_state_00 = ([0,0,0,0,0]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state = ([0,0,0,0,0,0,1,0]) self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state = ([0,0,0,0,0,0,0,1]) self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state = ([0,0,0,0,0,0,1,1]) self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') log.debug("---\t-\t--> MUX: mux object constructed") # Added by Greg Porreca 01-23-2009 to easily select an arbitrary device def setToDevice(self, device_name): log.debug("---\t-\t--> switch to device %s" %(device_name)) if(device_name == 'V1'): self.set_to_rotary_valve1() if(device_name == 'V2'): self.set_to_rotary_valve2() if(device_name == 'V3'): self.set_to_rotary_valve3() if(device_name == 'V4'): self.set_to_rotary_valve4() if(device_name == 'SP'): self.set_to_syringe_pump() if(device_name == 'TCFC0'): # flowcell 0 temperature controller self.set_to_temperature_control1() if(device_name == 'TCFC1'): # flowcell 1 temperature controller self.set_to_temperature_control2() if(device_name == 'TCRB'): # reagent block temperature controller self.set_to_reagent_block_cooler() #--------------------------------------------------------------------------------------# # Ultimac Mux R/P PCB FUNCTIONS # #--------------------------------------------------------------------------------------# # Discrete valves def discrete_valve4_open(self): "Sets valve V4 to ON state" log.debug("---\t-\t--> MUX: switch 3-way discrete valve V4 to NO (ligase)") mux_state_00[0] = 1 mux_state = ([0,0,0,0,0,1,0,0]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state_00[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state_00[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state_00[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state_00[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state_00[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') def discrete_valve4_close(self): "Sets valve V4 to OFF state" log.debug("---\t-\t--> MUX: switch 3-way discrete valve V4 to NC (ligase buffer)") mux_state_00[0] = 0 mux_state = ([0,0,0,0,0,1,0,0]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state_00[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state_00[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state_00[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state_00[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state_00[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') def discrete_valve5_open(self): "Sets valve V5 to ON state" log.debug("---\t-\t--> MUX: switch 3-way discrete valve V5 to NO (from V3 to FC)") mux_state_00[1] = 1 mux_state = ([0,0,0,0,0,1,0,0]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state_00[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state_00[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state_00[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state_00[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state_00[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') def discrete_valve5_close(self): "Sets valve V5 to OFF state" log.debug("---\t-\t--> MUX: switch 3-way discrete valve V5 to NC (from mixer to FC)") mux_state_00[1] = 0 mux_state = ([0,0,0,0,0,1,0,0]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state_00[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state_00[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state_00[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state_00[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state_00[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') def discrete_valve6_open(self): "Sets valve V6 to ON state" log.debug("---\t-\t--> MUX: switch 3-way discrete valve V6 to NO (through FC 2)") mux_state_00[2] = 1 mux_state = ([0,0,0,0,0,1,0,0]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state_00[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state_00[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state_00[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state_00[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state_00[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') def discrete_valve6_close(self): "Sets valve V6 to OFF state" log.debug("---\t-\t--> MUX: switch 3-way discrete valve V6 to NC (through FC 1)") mux_state_00[2] = 0 mux_state = ([0,0,0,0,0,1,0,0]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state_00[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state_00[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state_00[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state_00[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state_00[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') def discrete_valve7_open(self): "Sets valve V7 to ON state" log.debug("---\t-\t--> MUX: switch 3-way discrete valve V7 to NO (dH2O)") mux_state_00[3] = 1 mux_state = ([0,0,0,0,0,1,0,0]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state_00[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state_00[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state_00[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state_00[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state_00[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') def discrete_valve7_close(self): "Sets valve V7 to OFF state" log.debug("---\t-\t--> MUX: switch 3-way discrete valve V7 to NC (air)") mux_state_00[3] = 0 mux_state = ([0,0,0,0,0,1,0,0]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state_00[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state_00[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state_00[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state_00[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state_00[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') # Reagent mixer def mixer_ON(self): "Mixing in mixer: ON" log.debug("---\t-\t--> MUX: mixing chamber on") mux_state_00[4] = 1 mux_state = ([0,0,0,0,0,1,0,0]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state_00[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state_00[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state_00[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state_00[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state_00[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') def mixer_OFF(self): "Mixing in mixer: OFF" log.debug("---\t-\t--> MUX: mixing chamber off") mux_state_00[4] = 0 mux_state = ([0,0,0,0,0,1,0,0]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state_00[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state_00[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state_00[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state_00[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state_00[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') # Flowcell heater/cooler def set_to_temperature_control1(self): "Communication channel set to temperature controller 1" log.debug("---\t-\t--> MUX: switch communication to temperature controller 1") mux_state = ([0,0,0,0,0,1,0,1]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') def set_to_temperature_control2(self): "Communication channel set to temperature controller 2" log.debug("---\t-\t--> MUX: switch communication to temperature controller 2") mux_state = ([1,0,0,0,0,1,0,1]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') def set_to_reagent_block_cooler(self): "Communication channel set to reagent block cooler" log.debug("---\t-\t--> MUX: switch communication to reagent block cooler") mux_state = ([0,1,0,0,0,1,0,1]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') # Rotary valves def set_to_rotary_valve1(self): "Communication channel set to rotary valve 1" log.debug("---\t-\t--> MUX: switch communication to ten port rotary valve V1") mux_state = ([0,0,1,0,0,1,0,1]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') def set_to_rotary_valve2(self): "Communication channel set to rotary valve 2" log.debug("---\t-\t--> MUX: switch communication to ten port rotary valve V2") mux_state = ([1,0,1,0,0,1,0,1]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') def set_to_rotary_valve3(self): "Communication channel set to rotary valve 3" log.debug("---\t-\t--> MUX: switch communication to ten port rotary valve V3") mux_state = ([0,1,1,0,0,1,0,1]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') def set_to_rotary_valve4(self): "Communication channel set to rotary valve 4" log.debug("---\t-\t--> MUX: switch communication to ten port rotary valve V4") mux_state = ([1,1,1,0,0,1,0,1]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') # Syringe pump def set_to_syringe_pump(self): "Communication channel set to syringe pump" log.debug("---\t-\t--> MUX: switch communication to syringe pump") mux_state = ([1,1,0,0,0,1,0,1]) self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[0]=' + str(mux_state[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state[4]), '>') self.session.parse_read_string('m_dout[6]=' + str(mux_state[6]), '>') self.session.parse_read_string('m_dout[7]=' + str(mux_state[7]), '>') mux_state[5] = 0 self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') mux_state[5] = 1 #self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') def __del__(self): mux_state = ([0,0,0,0,0,0]) self.session.parse_read_string('m_dout[0]=' + str(mux_state[0]), '>') self.session.parse_read_string('m_dout[1]=' + str(mux_state[1]), '>') self.session.parse_read_string('m_dout[2]=' + str(mux_state[2]), '>') self.session.parse_read_string('m_dout[3]=' + str(mux_state[3]), '>') self.session.parse_read_string('m_dout[4]=' + str(mux_state[4]), '>') self.session.parse_read_string('m_dout[5]=' + str(mux_state[5]), '>') self.session.parse_read_string('m_dout[6]=' + str(1), '>') self.session.parse_read_string('m_dout[7]=' + str(1), '>') self.session.parse_read_string('m_dout[6]=' + str(0), '>') self.session.parse_read_string('m_dout[7]=' + str(0), '>') self.session.parse_read_string('m_dout[6]=' + str(1), '>') self.session.parse_read_string('m_dout[7]=' + str(0), '>') self.session.parse_read_string('m_dout[6]=' + str(0), '>') return src/syringe_pump.py0000740000076400007640000001656111263351335015574 0ustar polonatorpolonator""" -------------------------------------------------------------------------------- Author: Richard Terry. Date: February 12, 2008. Modified by: Mirko Palla Date: March 5, 2008. For: G.007 polony sequencer design [fluidics software] at the Church Lab - Genetics Department, Harvard Medical School. Purpose: This program contains the complete code for class Syringe_pump, containing Cavro XCalibur syringe pump communication subroutines in Python. This software may be used, modified, and distributed freely, but this header may not be modified and must appear at the top of this file. ------------------------------------------------------------------------------- """ import logging log=logging.getLogger("syr_pump") class Syringe_pump: global serport def __init__(self, config, serial_port, mux, logger=None): "Initialize Cavro XCalibur syringe pump object with default parameters." #--------------------------------- Serial configuration --------------------------- self._baud_rate = int(config.get("communication","syringe_pump_baud")) self._read_length = int(config.get("communication","read_length")) self._sleep_time = float(config.get("communication","sleep_time")) self.serport = serial_port self.mux = mux self.state = 'syringe pump initialized' #self.initialize_syringe() #log.debug("---\t-\t--> SP: Syringe pump object constructed") # Added by Greg Porreca 01-23-2009 # # Call this function to pull an arbitraty volume with the syringe; if the # volume specified is greater than the syringe volume, this iteratively # does full strokes then pulls the remainder # waste port is assumed to be port 3 unless specified # def draw(self, volume, flowcell, draw_speed, return_speed, waste_port=3): # volume of syringe full stroke syringe_volume = 1000 # initialize i so remainder calculation works even if we # don't enter the for: loop i = -1 # set the mux to the syringe pump hardware self.mux.setToDevice('SP') # iterate over the total volume to pull; if it is more than the # syringe barrel volume, do multiple full-stroke pulls for i in range(0, int(volume / syringe_volume)): self.draw_simple(syringe_volume, flowcell, draw_speed, return_speed, waste_port) # pull the remainder self.draw_simple(int(volume - ((i+1)*syringe_volume)), flowcell, draw_speed, return_speed, waste_port) # Call this function to pull a volume <= the syringe volume def draw_simple(self, volume, flowcell, draw_speed, return_speed, waste_port=3): self.set_valve_position(flowcell + 1) self.set_speed(draw_speed) self.set_absolute_volume(volume) if(flowcell == 0): self.set_valve_position_CCW(waste_port) else: self.set_valve_position(waste_port) self.set_speed(return_speed) self.set_absolute_volume(0) #--------------------------------------------------------------------------------------# # Cavro XCalibur syringe pump FUNCTIONS # #--------------------------------------------------------------------------------------# # # Performs low-level functional commands (e.g. set pump flow rate, draw volume, etc). # Each command implemented here must know the command set of the hardware being # controlled, but does not need to know how to communicate with the device (how to poll # it, etc). Each functional command will block until execution is complete. # #--------------------------------------------------------------------------------------# # BASIC SETTINGS # #--------------------------------------------------------------------------------------# def initialize_syringe(self): "Initializes syringe pump with default operation settings." log.debug("---\t-\t--> SP: initialize syringe pump") self.serport.set_baud(self._baud_rate) # Initialize syringe dead volume self.serport.write_serial('/1k5R\r') self.serport.read_serial(3) find_string = chr(96) response_string_size = 4 self.serport.parse_read_string('/1QR\r', find_string, response_string_size) # Initialize move to zero position, full dispense, full force self.serport.write_serial('/1Z0,4,3R\r') self.serport.read_serial(3) find_string = chr(96) response_string_size = 4 self.serport.parse_read_string('/1QR\r', find_string, response_string_size) # Initialize speed, range is 0-40, the maximum speed is 0 (1.25 strokes/second) self.serport.write_serial('/1S20R\r') self.serport.read_serial(3) find_string = chr(96) response_string_size = 4 self.serport.parse_read_string('/1QR\r', find_string, response_string_size) #log.debug("---\t-\t--> SP: initialized syringe pump object") def set_valve_position(self, valve_position): "Sets to given syringe pump valve position, an integer" #log.info("---\t-\t--> SP: set syringe pump valve position to %i" % valve_position) self.serport.set_baud(self._baud_rate) self.serport.write_serial('/1I' + str(valve_position) + 'R\r') response = self.serport.read_serial(3) #log.info("---\t-\t--> SP: received <%d> <%d> <%d>" %(ord(response[0]), ord(response[1]), ord(response[2]))) find_string = chr(96) response_string_size = 4 response = self.serport.parse_read_string('/1QR\r', find_string, response_string_size) #log.info("---\t-\t--> SP: received <%d> <%d> <%d> <%d>" %(ord(response[0]), ord(response[1]), ord(response[2]), ord(response[3]))) def set_valve_position_CCW(self, valve_position): "Sets to given syringe pump valve position, an integer" #log.info("---\t-\t--> SP: set syringe pump valve position CCW to %i" % valve_position) self.serport.set_baud(self._baud_rate) self.serport.write_serial('/1O' + str(valve_position) + 'R\r') response = self.serport.read_serial(3) #log.info("---\t-\t--> SP: received <%d> <%d> <%d>" %(ord(response[0]), ord(response[1]), ord(response[2]))) find_string = chr(96) response_string_size = 4 response = self.serport.parse_read_string('/1QR\r', find_string, response_string_size) #log.info("---\t-\t--> SP: received <%d> <%d> <%d> <%d>" %(ord(response[0]), ord(response[1]), ord(response[2]), ord(response[3]))) #log.debug("---\t-\t--> Set syringe pump valve position to %i" % valve_position) def set_speed(self, speed): """Sets syringe pump move speed (an integer) in range of 0-40, where the maximum speed is 0 equivalent to 1.25 strokes/second = 1250 ul/s.""" #log.debug("---\t-\t--> SP: set syringe pump speed to %i" % speed) self.serport.set_baud(self._baud_rate) self.serport.write_serial('/1S' + str(speed) + 'R\r') self.serport.read_serial(3) find_string = chr(96) response_string_size = 4 self.serport.parse_read_string('/1QR\r', find_string, response_string_size) def set_absolute_volume(self, absolute_volume): """Sets syringe pump absolute volume (an integer) in ragne of 0-1000, where 0 is the syringe initial position and the maximum filling volume is the stroke of the syringe (1000 ul).""" #log.debug("---\t-\t--> SP: set syringe pump absolute volume to %i" % absolute_volume) self.serport.set_baud(self._baud_rate) # Increments = (pump resolution * volume ul) / (syringe size ml * ul/ml) absolute_steps = (3000 * absolute_volume) / (1 * 1000) self.serport.write_serial('/1A' + str(absolute_steps) + 'R\r') # 'P' command for relative pick-up, 'A' for absolute position self.serport.read_serial(3) find_string = chr(96) response_string_size = 4 self.serport.parse_read_string('/1QR\r', find_string, response_string_size) src/config.txt0000600000076400007640000001321511213730641014467 0ustar polonatorpolonator#--------------------------------------------------------------------------------------# # DEVICE COMMUNICATION # #--------------------------------------------------------------------------------------# [communication] serial_port = /dev/ttyS0 timeout = 0.05 read_length = 1024 sleep_time = 0.005 temperature_control_baud = 115200 syringe_pump_baud = 9600 rotary_valve_baud = 19200 home_dir = /home/polonator/G.007/G.007_fluidics/src/ log_dir = /home/polonator/G.007/G.007_fluidics/logs/ #--------------------------------------------------------------------------------------# # TUBING CONFIGURATION # #--------------------------------------------------------------------------------------# [tube_constants] syringe_dead_volume = 48 multi_dead_volume = 25 discrete_dead_volume = 0 rotary_dead_volume = 0 #channel_volume = 120 #flowcell_volume = 185 channel_volume = 120 flowcell_volume = 140 dH2O_to_V4 = 356 wash1_to_V = 424 V_to_V4 = 33 V4_to_T = 31 V5_to_T = 18 ligase_to_V5 = 24 T_to_Y = 258 Y_to_FC = 13 FC_to_syringe = 192 well_to_V = 26 NaOH_to_V4 = 162 guadinine_to_V4 = 162 #--------------------------------------------------------------------------------------# # REAGENT BLOCK CONFIGURATION # #--------------------------------------------------------------------------------------# [block_constants] primer_chamber_volume = 500 nonamer_chamber_volume = 500 spare_chamber_volume = 500 ligase_chamber_volume = 500 buffer_chamber_volume = 500 A5_chamber_volume = 500 A6_chamber_volume = 500 #--------------------------------------------------------------------------------------# # SYRINGE CONFIGURATION # #--------------------------------------------------------------------------------------# [syringe_constants] full_stroke = 1000 pull_speed = 29 slow_speed = 29 fast_speed = 29 critical_speed = 29 final_pull_speed = 29 empty_speed = 0 mixer_empty_speed = 29 #--------------------------------------------------------------------------------------# # COMMON BIOCHEM. PARAMETER(S) # #--------------------------------------------------------------------------------------# [biochem_parameters] stage_temp = 4 room_temp = 28 temp_tolerance = 2 air_gap = 0 front_gap = 0 middle_gap = 0 back_gap = 0 time_limit = 2 mixer_iter = 1 syringe_iter = 1 slow_push_volume = 0 #--------------------------------------------------------------------------------------# # ENZYMATIC REACTION PARAMETER(S) # #--------------------------------------------------------------------------------------# [exo_parameters] exo_volume = 278 exo_temp = 37 exo_set_temp = 44 exo_poll_temp = 36 exo_time = 1 exo_extra = 0 #--------------------------------------------------------------------------------------# # CHEMICAL STRIPPING PARAMETER(S) # #--------------------------------------------------------------------------------------# [stripping_parameters] guadinine_volume = 330 NaOH_volume = 330 dH2O_volume = 330 guadinine_time = 0 NaOH_time = 0 guadinine_extra = 0 NaOH_extra = 0 #--------------------------------------------------------------------------------------# # HYBRIDIZATION PARAMETER(S) # #--------------------------------------------------------------------------------------# [hyb_parameters] primer_volume = 330 hyb_temp1 = 50 hyb_set_temp1 = 50 hyb_poll_temp1 = 45 hyb_time1 = 1 hyb_temp2 = 44 hyb_set_temp2 = 44 hyb_poll_temp2 = 46 hyb_time2 = 5 hyb_extra = 0 #--------------------------------------------------------------------------------------# # STEPUP PEG LIGATION PARAMETER(S) # #--------------------------------------------------------------------------------------# [lig_parameters] buffer_volume = 330 ligase_volume = 11 nonamer_volume = 330 #ligase_volume = 1 #nonamer_volume = 278 lig_step1 = 18 lig_set_step1 = 8 lig_poll_step1 = 22 lig_time1 = 10 lig_step2 = 24 lig_set_step2 = 24 lig_poll_step2 = 24 lig_time2 = 10 lig_step3 = 30 lig_set_step3 = 31 lig_poll_step3 = 29 lig_time3 = 10 lig_step4 = 35 lig_set_step4 = 36 lig_poll_step4 = 34 lig_time4 = 5 # #lig_step1 = 37 #lig_set_step1 = 45 #lig_poll_step1 = 34 #lig_time1 = 1 # #lig_step2 = 37 #lig_set_step2 = 45 #lig_poll_step2 = 34 #lig_time2 = 1 # #lig_step3 = 37 #lig_set_step3 = 45 #lig_poll_step3 = 34 #lig_time3 = 1 # #lig_step4 = 37 #lig_set_step4 = 45 #lig_poll_step4 = 34 #lig_time4 = 1 mix_time = 1 lig_extra = 0 #--------------------------------------------------------------------------------------# # CYCLE CONSTANTS # #--------------------------------------------------------------------------------------# [cycle_constants] # M7: M6 nonamer, 1N anchor port_scheme = {"AM1" : ['V3', 1,'V1',1], "AM2" : ['V3', 1,'V1',2], "AM3" : ['V3',1,'V1',3], "AM4" : ['V3', 1,'V1',4], "AM5" : ['V3',1,'V1',5], "AM6" : ['V3',1,'V1',6], "AM7" : ['V3',5,'V1',6], "AM8" : ['V3',5,'V1',7], "AP1" : ['V3', 2,'V2',1], "AP2" : ['V3', 2,'V2',2], "AP3" : ['V3',2,'V2',3], "AP4" : ['V3', 2,'V2',4], "AP5" : ['V3',2,'V2',5], "AP6" : ['V3',2,'V2',6], "BM1" : ['V3', 3, 'V1', 1], "BM2" : ['V3', 3, 'V1', 2], "BM3" : ['V3', 3, 'V1', 3], "BM4" : ['V3', 3, 'V1', 4], "BM5" : ['V3', 3, 'V1', 5], "BM6" : ['V3', 3, 'V1', 6], "BM7": ['V3', 6, 'V1', 6], "BM8": ['V3', 6, 'V1', 7], "BP1" : ['V3', 4,'V2',1], "BP2" : ['V3', 4,'V2',2], "BP3" : ['V3',4,'V2',3], "BP4" : ['V3', 4,'V2',4], "BP5" : ['V3',4,'V2',5], "BP6" : ['V3',4,'V2',6]} src/device_utils.py0000740000076400007640000002351011012311765015515 0ustar polonatorpolonator#!/usr/local/bin/python """ -------------------------------------------------------------------------------- Author: Mirko Palla. Date: May 8, 2008. For: G.007 polony sequencer design [fluidics software] at the Church Lab - Genetics Department, Harvard Medical School. Purpose: given function command, this utility program performs any device method consisting of: 1. temperature_control (temperature controller) 2. syringe_pump (syringe pump) 3. rotary_valve (rotary valve) This software may be used, modified, and distributed freely, but this header may not be modified and must appear at the top of this file. ------------------------------------------------------------------------------- """ import sys import time #----------------------------- Input argument handling --------------------------------- if len(sys.argv) == 1: print """\n ---------------------------------------------------------------------- - - - WELCOME TO THE DEVICE UTILITY PROGRAM - - - - Usage: python device_utils.py method - - - ---------------------------------------------------------------------- | Methods defined here: | | --------- Mux class --------- | | discrete_valve4_close(self) | Sets valve V4 to OFF state | | discrete_valve4_open(self) | Sets valve V4 to ON state | | discrete_valve5_close(self) | Sets valve V5 to OFF state | | discrete_valve5_open(self) | Sets valve V5 to ON state | | discrete_valve6_close(self) | Sets valve V6 to OFF state | | discrete_valve6_open(self) | Sets valve V6 to ON state | | discrete_valve7_close(self) | Sets valve V7 to OFF state | | discrete_valve7_open(self) | Sets valve V7 to ON state | | mixer_OFF(self) | Mixing in mixer: OFF | | mixer_ON(self) | Mixing in mixer: ON | | set_to_reagent_block_cooler(self) | Communication channel set to reagent block cooler | | set_to_rotary_valve1(self) | Communication channel set to rotary valve 1 | | set_to_rotary_valve2(self) | Communication channel set to rotary valve 2 | | set_to_rotary_valve3(self) | Communication channel set to rotary valve 3 | | set_to_syringe_pump(self) | Communication channel set to syringe pump | | set_to_temperature_control1(self) | Communication channel set to temperature controller 1 | | set_to_temperature_control2(self) | Communication channel set to temperature controller 2 | | --------- Temperature control class --------- | | get_temperature(self) | Gets temperature sensor 1 reading, a float - register [100] | | set_control_off(self) | Clears RUN flag in regulator, so main output is blocked | | set_control_on(self) | Sets RUN flag in regulator, so main output is opened | | set_temperature(self, temperature) | Sets main temperature reference (C), a float - register [0] | | --------- Syringe pump class --------- | | initialize_syringe(self) | Initializes syringe pump with default operation settings | | set_absolute_volume(self, absolute_volume) | Sets syringe pump absolute volume (an integer) in ragne of 0-1000, where 0 is | the syringe initial position and the maximum filling volume is the stroke of | the syringe (1000 ul) | | set_speed(self, speed) | Sets syringe pump move speed (an integer) in range of 0-40, where the | maximum speed is 0 equivalent to 1.25 strokes/second = 1250 ul/s | | set_syringe_valve_position(self, valve_position) | Sets to given syringe pump valve position, an integer | | --------- Rotary valve class --------- | | set_rotary_valve_position(self, valve_position) | Switch valve to given port on rotary valve, an integer\n\n""" sys.exit() elif len(sys.argv) < 2: print '\n--> Error: not correct input!\n--> Usage: python device_utils.py method\n' sys.exit() else: import ConfigParser # Import configuration parser class. from logger import Logger # Import logger class. from biochem import Biochem # Import biochecmistry class. #--------------------- G.007 fluidics sub-system initialization ------------------------ config = ConfigParser.ConfigParser() config.readfp(open('config.txt')) t0 = time.time() # get current time logger = Logger(config) # initialize logger object print '\n' biochem = Biochem('WL1', 0, logger) # Initialize biochemistry object - cycle-name and flowcell-number need to be passed. logger.info('---\t-\t--> Started %s method execution - device_utils.py' % sys.argv[1]) method = sys.argv[1] # set method to second argument #--------------------------------------------------------------------------------------- # TEMPERATURE CONTROL #--------------------------------------------------------------------------------------- if method == 'set_to_temperature_control1': biochem.mux.set_to_temperature_control1() elif method == 'set_to_temperature_control2': biochem.mux.set_to_temperature_control2() elif method == 'get_temperature': c_temp = biochem.temperature_control.get_temperature() print "INFO\t---\t-\t--> Current flowcell temperature: %0.2f C" % c_temp elif method == 'set_control_on': biochem.temperature_control.set_control_on() elif method == 'set_control_off': biochem.temperature_control.set_control_off() elif method == 'set_temperature': print "INFO\t---\t-\t--> Please, enter set point temperature [integer]: ", set_temp = int(sys.stdin.readline().strip()) # use stdin explicitly and remove trailing newline character biochem.temperature_control.set_temperature(set_temp) elif method == 'set_to_reagent_block_cooler': biochem.mux.set_to_reagent_block_cooler() #--------------------------------------------------------------------------------------- # ROTARY VALVE CONTROL #--------------------------------------------------------------------------------------- elif method == 'set_to_rotary_valve1': biochem.mux.set_to_rotary_valve1() elif method == 'set_to_rotary_valve2': biochem.mux.set_to_rotary_valve2() elif method == 'set_to_rotary_valve3': biochem.mux.set_to_rotary_valve3() elif method == 'set_rotary_valve_position': print "INFO\t---\t-\t--> Please, enter valve position (1-9) to be set [integer]: ", position = int(sys.stdin.readline().strip()) # use stdin explicitly and remove trailing newline character biochem.rotary_valve.set_valve_position(position) #--------------------------------------------------------------------------------------- # SYRINGE PUMP CONTROL #--------------------------------------------------------------------------------------- elif method == 'set_to_syringe_pump': biochem.mux.set_to_syringe_pump() elif method == 'initialize_syringe': biochem.syringe_pump.initialize_syringe() elif method == 'absolute_volume': print "INFO\t---\t-\t--> Please, enter absolute syringe volume (0-1000) to be set [integer]: ", volume = int(sys.stdin.readline().strip()) # use stdin explicitly and remove trailing newline character biochem.syringe_pump.set_absolute_volume(volume) elif method == 'set_speed': print "INFO\t---\t-\t--> Please, enter syringe speed (0-40) to be set [integer]: ", speed = int(sys.stdin.readline().strip()) # use stdin explicitly and remove trailing newline character biochem.syringe_pump.set_speed(speed) elif method == 'set_syringe_valve_position': print "INFO\t---\t-\t--> Please, enter valve position (1-9) to be set [integer]: ", position = int(sys.stdin.readline().strip()) # use stdin explicitly and remove trailing newline character biochem.syringe_pump.set_valve_position(position) #--------------------------------------------------------------------------------------- # DISCRETE VALVE CONTROL #--------------------------------------------------------------------------------------- elif method == 'discrete_valve4_open': biochem.mux.discrete_valve4_open() elif method == 'discrete_valve4_close': biochem.mux.discrete_valve4_close() elif method == 'discrete_valve5_open': biochem.mux.discrete_valve5_open() elif method == 'discrete_valve5_close': biochem.mux.discrete_valve5_close() elif method == 'discrete_valve6_open': biochem.mux.discrete_valve6_open() elif method == 'discrete_valve6_close': biochem.mux.discrete_valve6_close() elif method == 'discrete_valve7_open': biochem.mux.discrete_valve7_open() elif method == 'discrete_valve7_close': biochem.mux.discrete_valve7_close() #--------------------------------------------------------------------------------------- # MIXING CHAMBER CONTROL #--------------------------------------------------------------------------------------- elif method == 'mixer_ON': biochem.mux.mixer_ON() time.sleep(5) elif method == 'mixer_OFF': biochem.mux.mixer_OFF() else: print '\nINFO\t---\t-\t--> Error: not correct method input!\n--> Double check method name (1st argument)\n' sys.exit() #-------------------------- Duration of biochemistry test ------------------------------ delta = (time.time() - t0) / 60 # Calculate elapsed time for flowcell flush. logger.info('---\t-\t--> Finished %s method execution - duration: %0.2f minutes\n\n' % (method, delta)) src/WL0000640000076400007640000000000211003434003012706 0ustar polonatorpolonator1 src/testing/0000750000076400007640000000000011011051110014116 5ustar polonatorpolonatorsrc/testing/biochem_test.py0000740000076400007640000001262510776476052017206 0ustar polonatorpolonator#!/usr/local/bin/python """ -------------------------------------------------------------------------------- Author: Mirko Palla. Date: March 19, 2008. For: G.007 polony sequencer design [fluidics software] at the Church Lab - Genetics Department, Harvard Medical School. Purpose: performs function testing of biochemistry object This software may be used, modified, and distributed freely, but this header may not be modified and must appear at the top of this file. ------------------------------------------------------------------------------- """ import sys import time import ConfigParser from logger import Logger # Import logger class. from biochem import Biochem # Import biochecmistry class. #--------------------------- Configuration input handling ------------------------------ if len(sys.argv) < 3: print '\n--> Error: not correct input!\n--> Usage: python biochem_test.py cycle-name flowcell-number\n' sys.exit() #--------------------- G.007 fluidics sub-system initialization ------------------------ config = ConfigParser.ConfigParser() config.readfp(open('config.txt')) t0 = time.time() # get current time logger = Logger(config) # initialize logger object print '\n' biochem = Biochem(sys.argv[1], int(sys.argv[2]), logger) # Initialize biochemistry object - cycle-name and flowcell-number need to be passed. #--------------------------------------------------------------------------------------- # BIOCHEMISTRY CONTROL #--------------------------------------------------------------------------------------- logger.info('***\t*\t--> Started biochemistry object testing - biochem_test.py') #--------------------------------- Initialization -------------------------------------- #biochem.syringe_pump_init() #biochem.reagent_block_init() # Set reagent block cooler to constant temperature, 4 Celsius degrees. #biochem.rotary_valve1_init() # Initialize reagent start points in ten port rotary valve V1. #biochem.rotary_valve2_init() # Initialize reagent start points in ten port rotary valve V2. #biochem.rotary_valve3_init() # Initialize reagent start points in ten port rotary valve V3. #biochem.syringe_pump_init() # Initializes syringe pump by moving it to zero position and setting speed to 20. #biochem.mixer_init() # Prime mixer chamber with Wash 1 as initialization step. #biochem.ligase_init() # Initialize ligase/ligase buffer start points in nine port valve V0. biochem.init() # Initialize biochemistry sub-system. #------------------------------- Complex functions ------------------------------------- #biochem.get_config_parameters() # Retieves all biochemistry and device related configuration parameters configuration file. #biochem.get_excel_volumes() # Extracts path length and tube cross-sectional area information from standard Excel file. #biochem.clean_V1_to_syringe() # Fills tube path V1 to syringe port 5 with Wash 1 and dumps previous tube content to waste. #biochem.clean_V2_to_syringe() # Fills tube path V2 to syringe port 6 with Wash 1 and dumps previous tube content to waste. #biochem.draw_air_to_syringe() # Draws a specific volume of air plug to syringe's COM-port. #biochem.draw_air_to_valve('V3') # Draws a specific volume of air plug to specified valve COM-port. #biochem.move_reagent(1000, 20, 4, 30, 7) # Moves a given volume of reagent from one syringe port to another at different speeds. #biochem.draw_into_flowcell(1000) # Draws reagent into flowcell. #biochem.flush_flowcell(5) # Flushes flowcell 3-times with Wash 1 or dH20. #biochem.prime_flowcells() # Prime both flowcells with Wash 1 as initialization step. #biochem.set_to_RT() # Sets temperataure controller to room temperature (28 C). #biochem.incubate_reagent(1) # Incubates reagent for given amount of time. #biochem.wait_for_SS(15) # Waits until steady-state temperature is reached, or exits wait block if ramping. #biochem.nonamer_prep('V1', 1) # Moves nonamer and ligase into mixing chamber. #biochem.ligase_mix(10) # Mixes ligase with nonamer in mixing chamber. """ biochem.move_reagent(biochem.mixer_to_V5, biochem.pull_speed, 2, biochem.empty_speed, 4) # draw "Wash 1" from mixer through flowcell to waste biochem.move_reagent(biochem.syringe_1_to_mixer, biochem.pull_speed, 1, biochem.pull_speed, 4) # clear path syringe port 1 to mixing chamber inlet 1 biochem.move_reagent(biochem.syringe_8_to_mixer, biochem.pull_speed, 8, biochem.pull_speed, 4) # clear path syringe port 8 to mixing chamber inlet 2 """ #---------------------------- Biochemistry functions ----------------------------------- #biochem.exo_start() # Performs biochemistry to prepare polony sequencing run. #biochem.enzyme_reaction() # Digests unprotected bead-bound ePCR primers with Exonuclease I using rotary valve 2. #biochem.strip_chem() # Performs chemical stripping protocol for polony sequencing. #biochem.hyb(4) # Runs primer hybridization protocol for polony sequencing. #biochem.lig_stepup_peg(4, 'V1', 1) # Runs stepup peg ligation reaction protocol for polony sequencing. #biochem.cycle_ligation() # Performs a cycle of polony sequencing biochemistry. #-------------------------- Duration of biochemistry test ------------------------------ delta = (time.time() - t0) / 60 # Calculate elapsed time for polony sequencing cycles. logger.warn('***\t*\t--> Finished biochemistry object testing - duration: %0.2f minutes\n\n' % delta) src/testing/device_test.py0000740000076400007640000001334111000737547017021 0ustar polonatorpolonator#!/usr/local/bin/python """ -------------------------------------------------------------------------------- Author: Mirko Palla. Date: February 12, 2008. For: G.007 polony sequencer design [fluidics software] at the Church Lab - Genetics Department, Harvard Medical School. Purpose: performs a function testing of G.007 fluidics device communication consisting of: 1. temperature_control (temperature controller) 2. syringe_pump (syringe pump) 3. rotary_valve (rotary valve) This software may be used, modified, and distributed freely, but this header may not be modified and must appear at the top of this file. ------------------------------------------------------------------------------- """ import sys import time import serial import ConfigParser # Import configuration file parser class. from logger import Logger # Import logger class. from serial_port import Serial_port # Import serial port class. from mux import Mux # Import serial port class. from biochem import Biochem # Import biochemistry class. from syringe_pump import Syringe_pump # Import syringe_pump class. from rotary_valve import Rotary_valve # Import rotary valve class. from temperature_control import Temperature_control # Import temperature controller class. #--------------------------- Configuration input handling ------------------------------ if len(sys.argv) < 2: print '\n--> Error: not correct input!\n--> Usage: python polony_sequencing.py config.txt\n' sys.exit() config = ConfigParser.ConfigParser() # Create configuration file parser object. config.read(sys.argv[1]) # Fill it in with configuration parameters from file. logger = Logger(config) # Initialize logger object. #---------------------------- Device(s) initialization --------------------------------- t0 = time.time() # Get current time. print '\n' logger.info('***\t*\t--> Device testing started - test.py') # Test start. serial_port = Serial_port(config, logger) # Initialize serial port object. mux = Mux(logger) # Initialize mux object. syringe_pump = Syringe_pump(config, serial_port, logger) # Initialize syringe pump object. rotary_valve = Rotary_valve(config, serial_port, logger) # Initialize rotary valve object. temperature_control = Temperature_control(config, serial_port, logger) # Initialize temperature controller object. #--------------------------------------------------------------------------------------- # TEMPERATURE CONTROL #--------------------------------------------------------------------------------------- mux.set_to_temperature_control1() # Switch communication to temperature controller 1. mux.set_to_temperature_control2() # Switch communication to temperature controller 2. temperature_control.set_control_on() # Set RUN flag command. temperature_control.set_control_off() # Clear RUN flag command. temperature_control.set_temperature(30) # Set register 0 to 'temperature', a float. t = temperature_control.get_temperature() # Get current temperature reading of heat-spreader. print "Current temperature: %0.2f C\n" %t #--------------------------------------------------------------------------------------- # REAGENT BLOCK CONTROL #--------------------------------------------------------------------------------------- mux.set_to_reagent_block_cooler() # Switch communication to reagent block cooler. biochem.reagent_block_init() # Set reagent block cooler to 4C. #--------------------------------------------------------------------------------------- # SYRINGE PUMP CONTROL #--------------------------------------------------------------------------------------- mux.set_to_syringe_pump() # Switch communication to syringe pump. syringe_pump.initialize_syringe() # Initialize syringe pump. syringe_pump.set_valve_position(0) # Set valve to port 'i'. syringe_pump.set_speed(20) # Valid speed range 0 to 40, the maximum speed is 0. syringe_pump.set_absolute_volume(1000) # Draw [1] ul of fluid into syringe. #--------------------------------------------------------------------------------------- # ROTARY VALVE CONTROL #--------------------------------------------------------------------------------------- mux.set_to_rotary_valve1() # Switch communication to rotary valve 1. mux.set_to_rotary_valve2() # Switch communication to rotary valve 2. mux.set_to_rotary_valve3() # Switch communication to rotary valve 3. rotary_valve.set_valve_position(6) # Set ten port valve to given position. #--------------------------------------------------------------------------------------- # DISCRETE VALVE CONTROL #--------------------------------------------------------------------------------------- mux.discrete_valve4_open() # Open discrete valve 4. mux.discrete_valve4_close() # Close discrete valve 4. mux.discrete_valve5_open() # Open discrete valve 5. mux.discrete_valve5_close() # Close discrete valve 5. mux.discrete_valve6_open() # Open discrete valve 6. mux.discrete_valve6_close() # Close discrete valve 6. mux.discrete_valve7_open() # Open discrete valve 7. mux.discrete_valve7_close() # Close discrete valve 7. #--------------------------------------------------------------------------------------- # MIXING CHAMBER CONTROL #--------------------------------------------------------------------------------------- mux.mixer_ON() # Turn mixer on. time.sleep(5) mux.mixer_OFF() # Turn mixer off. #-------------------------- Duration of device test ------------------------------ delta = (time.time() - t0) / 60 # Calculate elapsed time for polony sequencing cycles. logger.warn("***\t*\t--> Finished device test protocol - duration: %0.2f minutes\n\n" % delta) src/testing/install_test.py0000740000076400007640000002212311001667444017225 0ustar polonatorpolonator#!/usr/local/bin/python """ -------------------------------------------------------------------------------- Author: Mirko Palla. Date: March 19, 2008. For: G.007 polony sequencer design [fluidics software] at the Church Lab - Genetics Department, Harvard Medical School. Purpose: this program checks proper installation of all fluidics sub-system devices, i.e., it switches all discrete valves off and on (and vica and versa), switches all rotary valves from port position 1 to 10 in a step-wise manner, switches ports on the 9-port syringe pump similarly to protocol described for rotary valves and also performs a full-stroke syringe movement twice. Further- more it turns the mixer on and performs mixing for 10 seconds, then it turns the mixer off. And finally it turns "temperature controller 1" on, ramps up the flowcell temperature to 15 C, then turns it off. Similarly, this procedure is repeated for "temperature controller 2" and "reagent block cooler". This software may be used, modified, and distributed freely, but this header may not be modified and must appear at the top of this file. ------------------------------------------------------------------------------- """ import sys import time import ConfigParser # Import configuration file parser class. from logger import Logger # Import logger class. from serial_port import Serial_port # Import serial port class. from mux import Mux # Import serial port class. from syringe_pump import Syringe_pump # Import syringe_pump class. from rotary_valve import Rotary_valve # Import rotary valve class. from temperature_control import Temperature_control # Import temperature controller class. #import pycallgraph #--------------------------- Configuration input handling ------------------------------ #pycallgraph.start_trace() # start process call graph if len(sys.argv) < 2: print '\n--> Error: not correct input!\n--> Usage: python install_test.py config.txt\n' sys.exit() config = ConfigParser.ConfigParser() # Create configuration file parser object. config.read(sys.argv[1]) # Fill it in with configuration parameters from file. logger = Logger(config) # Initialize logger object. #---------------------------- Device(s) initialization --------------------------------- t0 = time.time() # Get current time. print '\n' logger.info('***\t*\t--> Installation testing started - install_test.py') # Installation test start. serial_port = Serial_port(config, logger) # Initialize serial port object. mux = Mux(logger) # Initialize mux object. syringe_pump = Syringe_pump(config, serial_port, logger) # Initialize syringe pump object. rotary_valve = Rotary_valve(config, serial_port, logger) # Initialize rotary valve object. temperature_control = Temperature_control(config, serial_port, logger) # Initialize temperature controller object. #--------------------------------------------------------------------------------------- # DISCRETE VALVE CONTROL #--------------------------------------------------------------------------------------- for i in range(0, 2): # Switche all discrete valves off and on twice. mux.discrete_valve4_open() # Open discrete valve 4. time.sleep(1) mux.discrete_valve4_close() # Close discrete valve 4. time.sleep(1) mux.discrete_valve5_open() # Open discrete valve 5. time.sleep(1) mux.discrete_valve5_close() # Close discrete valve 5. time.sleep(1) mux.discrete_valve6_open() # Open discrete valve 6. time.sleep(1) mux.discrete_valve6_close() # Close discrete valve 6. time.sleep(1) mux.discrete_valve7_open() # Open discrete valve 7. time.sleep(1) mux.discrete_valve7_close() # Close discrete valve 7. time.sleep(1) #--------------------------------------------------------------------------------------- # ROTARY VALVE CONTROL #--------------------------------------------------------------------------------------- mux.set_to_rotary_valve1() # Switch communication to rotary valve 1. for i in range(1, 11): # Switch all rotary valves from port position 1 to 10 in a step-wise manner. rotary_valve.set_valve_position(i) # Set ten port valve to given position. time.sleep(1) mux.set_to_rotary_valve2() # Switch communication to rotary valve 2. for i in range(1, 11): # Switch all rotary valves from port position 1 to 10 in a step-wise manner. rotary_valve.set_valve_position(i) # Set ten port valve to given position. time.sleep(1) mux.set_to_rotary_valve3() # Switch communication to rotary valve 3. for i in range(1, 11): # Switch all rotary valves from port position 1 to 10 in a step-wise manner. rotary_valve.set_valve_position(i) # Set ten port valve to given position. time.sleep(1) #--------------------------------------------------------------------------------------- # SYRINGE PUMP CONTROL #--------------------------------------------------------------------------------------- # Switch ports on the 9-port syringe pump similarly to protocol described above. mux.set_to_syringe_pump() # Switch communication to syringe pump. syringe_pump.initialize_syringe() # Initialize syringe pump. for i in range(1, 10): # Switch all rotary valves from port position 1 to 10 in a step-wise manner. syringe_pump.set_valve_position(i) # Set valve to port 'i'. time.sleep(1) # Performs a full-stroke syringe movement twice. for i in range(0, 2): # Switch all rotary valves from port position 1 to 10 in a step-wise manner. syringe_pump.set_speed(13) # Set syringe speed to pull speed (moderately fast). syringe_pump.set_absolute_volume(1000) # Draw 1000 ul of fluid into syringe. syringe_pump.set_speed(0) # Set syringe speed to eject speed (fastest possible on 0-40 scale). syringe_pump.set_absolute_volume(0) # Empty syringe contents. time.sleep(1) #--------------------------------------------------------------------------------------- # MIXING CHAMBER CONTROL #--------------------------------------------------------------------------------------- mux.mixer_ON() # Turn mixer on. time.sleep(10) # Performs mixing for 10 seconds. mux.mixer_OFF() # Turn mixer off. #--------------------------------------------------------------------------------------- # TEMPERATURE CONTROL #--------------------------------------------------------------------------------------- #------------------------- Steady-state temperature waiting ---------------------------- def wait_for_SS(target): """Waits until steady-state temperature is reached, or exits wait block if ramping time exceeds timeout parameter set in manually here.""" time_limit = 10 # set time limit for temperature setting t0 = time.time() # get current time tc = temperature_control.get_temperature() # get current flowcell temperature while abs(target - tc) > 1: tc = temperature_control.get_temperature() time.sleep(1) delta = time.time() - t0 # elapsed time in seconds sys.stdout.write('TIME---\t-\t---> Elapsed time: ' + str(delta) + ' second \n') sys.stdout.flush() if delta > time_limit * 60: print "--> Time limit %s exceeded -> [current: %f, target: %f] C" % (time_limit, tc, target) break elapsed = (time.time() - t0) / 60 print "--> Time to set temperature: %0.2f minutes" % elapsed #--------------------------------------------------------------------------------------- target = 15 # Set target temperature to 15 C. mux.set_to_temperature_control1() # Switch communication to temperature controller 1. temperature_control.set_control_on() # Set RUN flag command. temperature_control.set_temperature(target) # Set register 0 to 'temperature', a float. wait_for_SS(target) # Wait until target temperature is reached. temperature_control.set_control_off() # Clear RUN flag command. mux.set_to_temperature_control2() # Switch communication to temperature controller 2. temperature_control.set_control_on() # Set RUN flag command. temperature_control.set_temperature(target) # Set register 0 to 'temperature', a float. wait_for_SS(target) # Wait until target temperature is reached. temperature_control.set_control_off() # Clear RUN flag command. #--------------------------------------------------------------------------------------- # REAGENT BLOCK CONTROL #--------------------------------------------------------------------------------------- mux.set_to_reagent_block_cooler() # Switch communication to reagent block cooler. temperature_control.set_control_on() # Set RUN flag command. temperature_control.set_temperature(target) # Set register 0 to 'temperature', a float. wait_for_SS(target) # Wait until target temperature is reached. temperature_control.set_control_off() # Clear RUN flag command. #-------------------------- Duration of device test ------------------------------ delta = (time.time() - t0) / 60 # Calculate elapsed time for polony sequencing cycles. logger.warn("***\t*\t--> Finished installation test protocol - duration: %0.2f minutes\n" % delta) #pycallgraph.make_dot_graph('test.png') # Finish graphing and generate file. src/testing/fluidics_utils.py0000640000076400007640000003447311010616675017554 0ustar polonatorpolonator#!/usr/local/bin/python """ -------------------------------------------------------------------------------- Author: Mirko Palla. Date: May 8, 2008. For: G.007 polony sequencer design [fluidics software] at the Church Lab - Genetics Department, Harvard Medical School. Purpose: given function command, this utility program performs any fluidics method contained in biochemistry module. This software may be used, modified, and distributed freely, but this header may not be modified and must appear at the top of this file. ------------------------------------------------------------------------------- """ import sys import time #----------------------------- Input argument handling --------------------------------- if len(sys.argv) == 1: print """\n ********************************************************************** * Welcome to the fluidics sub-system utility program * * Usage: python fluidics_utils.py flowcell-number method * ********************************************************************** | Methods defined here: | | __init__(self, cycle_name, flowcell, logger) | Initialize biochemistry object with default parameters | | clean_V1_to_syringe(self) | Fills tube path V1 to syringe port 5 with dH2O and dumps previous tube content to waste. | | clean_V2_to_syringe(self) | Fills tube path V2 to syringe port 6 with dH2O and dumps previous tube content to waste. | | clean_flowcell_and_syringe(self) | Cleans flowcell-to-syringe path and syringe pump completely with 'Wash 1' first then with dH2O, | making sure that there is no left over reagent leading to or in the syringe pump after a biochemistry step. | This function also flushes the flowcell, thus incorporates the 'flowcell_flush' procedure inherently. | | cycle_ligation(self) | Performs a cycle of polony sequencing biochemistry consisting of: | | - chemical stripping | - primer hybridization | - query nonamer ligation (stepup temperature, peg) | | Reagent requirements: | | - see 'cycle_list' valve-port map in configuration file | | draw_air_to_mixer(self, gap_size) | Draws a specific volume of air plug to mixing chamber's input/output needle | | draw_air_to_syringe(self) | Draws a specific volume of air plug to syringe's COM-port. | | draw_air_to_valve(self, valve) | Draws a 60 ul volume of air plug in front of specified valve COM-port | assuming that the V1-10/V2-10 & V3-8 ports open to air. | | draw_into_flowcell(self, draw_volume, port) | Draws reagent into flowcell. | | exo_start(self) | Digests unprotected bead-bound ePCR primers with Exonuclease I using rotary | valve 2 to prepare polony sequencing. Does the following: | | - incubate reaction mix at 'exo_set_temp' for 'exo_time' minutes | - flush flowcell with 'Wash 1' | | Reagent requirements: | | - V2-6 : 625 ul reaction mix | - V3-2 : 650 ul 'Wash 1' | | fill_with_air_to_valve(self, valve) | Fills tube with air to specified valve COM-port and sets discrete valve V7 | open to dH2O as default state. | | flush_flowcell(self, port) | Flushes flowcell 3-times with 'Wash 1' or dH2O. | | get_config_parameters(self) | Retieves all biochemistry and device related configuration parameters from the confi- | guration file using the ConfigParser facility. It assigns each parameter to a field of | the biochemistry object, thus it can access it any time during a run. | | get_excel_volumes(self) | Extracts path length and tube cross-sectional area information from standard Excel file | containing all internal and external volume calculations in the G.007 fluidics sub-system. | It automatically calculates total path volumes in both cases, creating a dictionary object | holding volume data specified by the following format: | | volumes[point_B][point_A] = 'total path volume from point A to point B in the system' | | This function creates two dictionary objects as fields of the 'Biochem' object: one for | volume calculations internal, while the other for volume calculations external to manifold | respectively. | | If changes occur in either path length or cross-sectional area data, the numbers must be | updated accordingly, but the file format and data tabulation cannot be changed. | | hyb(self) | Runs primer hybridization protocol for polony sequencing. Does the following: | | - incubate primer at 'hyb_temp1' for 'hyb_time1' minutes | - incubate primer at 'hyb_temp2' for 'hyb_time2' minutes | - flush flowcell with 'Wash 1' | | Reagent requirements: | | - V3-i : 650 ul hyb mix (650 ul 6x SSPE w/ 0.01 TX100, 6.5 ul each 1mM primer) | - V3-2 : 650 ul 'Wash 1' | | incubate_reagent(self, time_m) | Incubates reagent for given amount of time and dynamically counts elapsed time | in seconds to update user about incubation state. | | init(self) | Initialize biochemistry sub-system. | | lig_stepup_peg(self, valve, nonamer_port) | Runs stepup peg ligation reaction protocol for polony sequencing. Does the following: | | - prime flowcell with Quick ligase buffer | - incubate quick ligation mix at the following steps: | | 5' at 18C | 5' at 25C | 5' at 30C | 5' at 37C | | - flush flowcell with 'Wash 1' | | Reagent requirements: | | - valve-nonamer_port : 625 ul Quick ligation mix (165ul 2x Qlig buff, 24ul 100uM nonamer mix, 6ul Qlig, 135ul dH2O) | - V4-7 : 625 ul 1x Quick ligase buffer | - V3-8 : 625 ul 'Wash 1' | | ligase_mix(self, mix_time) | Mixes ligase with nonamer in mixing chamber. | | mixer_init(self) | Prime mixing chamber with dH2O as initialization step in a multi-step iterative | volume filling manner. With increasing fill volume in every iteration, the side of | the mixing chamber is cleaned from residue. Assumes, that rotary valve V2 to syringe | pump port 6 path is filled with dH2O. | | move_reagent(self, fill_volume, from_speed, from_port, to_speed, to_port) | Moves a given volume of reagent [1] into syringe at speed [2] through specified valve | position [3], then transfers syringe content through valve position [4] into an other | location in the fluidic system. All parameters are integers respectively. | | move_reagent_slow(self, fill_volume, from_speed, from_port, to_speed, to_port) | Moves a given volume of reagent [1] into syringe at speed [2] through specified valve | position [3], then transfers syringe content through valve position [4] into an other | location in the fluidic system. The last 200 ul reagent is drawn into the flowcell with | slower speed to avoid air bubble build up in the chambers. All parameters are integers | respectively. | | nonamer_prep(self, valve, nonamer_port) | Moves nonamer and ligase into mixing chamber. | | prime_flowcells(self) | Primes both flowcells with 'Wash 1' as initialization step. | | prime_fluidics_system(self) | Primes all fluid lines, flowcells and reagent block chambers with 'Wash 1'. | Assume that all reagent block chambers and bottles are filled with 'Wash 1'. | | prime_ligase(self) | Primes ligase and ligation buffer chambers in reagent cooling block. | | prime_reagent_block(self) | Primes all reagent block chambers with 'Wash 1'. | | prime_rotary_valve1(self) | Primes reagent block chambers in ten port rotary valve V1. | | prime_rotary_valve2(self) | Primes reagent block chambers in ten port rotary valve V2. | | prime_rotary_valve3(self) | Primes reagent block chambers in ten port rotary valve V3. | | push_back_to_reagent_chamber(self, key) | Pushes anchor primer, nonamer and Exonuclease 1 back to the reagent block cooler, | after reagent usage in biochemistry steps (hybridization, ligation). | | reagent_block_init(self) | Set reagent block cooler to constant temperature, 4 Celsius degrees. | | rotary_valve1_init(self) | Initialize reagent start point for dH2O in ten port rotary valve V1. | | rotary_valve2_init(self) | Initialize reagent start point for dH2O in ten port rotary valve V2. | | rotary_valve3_init(self) | Initialize external reagent start points in ten port rotary valve V3. | | run(self) | Runs polony sequencing cycle(s) based on cycle-name and flowcell-number list | already contained in biochemistry object. | | set_to_RT(self) | Sets temperataure controller to room temperature (30 C). | | strip_chem(self) | Performs chemical stripping protocol for polony sequencing. Does the following: | | - flush flowcell with dH2O | - flush flowcell with guanidine HCl and incubate for 1' at RT | - flush flowcell with dH2O | - flush flowcell with NaOH and incubate for 1' at RT | - flush flowcell with dH2O | - flush flowcell with 'Wash 1' | | syringe_pump_init(self) | Initializes syringe pump by moving it to zero position and setting speed to 20. | | temperature_control_init(self) | Set temperature controller 1/2 to OFF state to avoid any temperature | control operation left-over from a possible previous process. | | wait_for_SS(self, set_temp, poll_temp, tolerance=None) | Waits until steady-state temperature is reached, or exits wait block if ramping | time exceeds timeout parameter set in configuration file.\n\n""" sys.exit() elif len(sys.argv) < 3: print '\n--> Error: not correct input!\n--> Usage: python fluidics_utils.py flowcell-number method\n' sys.exit() else: import ConfigParser # Import configuration parser class. from logger import Logger # Import logger class. from biochem import Biochem # Import biochecmistry class. #--------------------- G.007 fluidics sub-system initialization ------------------------ config = ConfigParser.ConfigParser() config.readfp(open('config.txt')) t0 = time.time() # get current time logger = Logger(config) # initialize logger object biochem = Biochem('WL1', int(sys.argv[1]), logger) # Initialize biochemistry object - cycle-name and flowcell-number need to be passed. #--------------------------------------------------------------------------------------- # FLUIDICS SUB-SYSTEM FUNCTIONS #--------------------------------------------------------------------------------------- logger.info('***\t*\t--> Started %s method execution - fluidics_utils.py' % sys.arg[2]) if method is 'clean_V1_to_syringe': biochem.clean_V1_to_syringe() elif method is 'clean_V2_to_syringe': biochem.clean_V2_to_syringe() elif method is 'clean_flowcell_and_syringe': biochem.clean_flowcell_and_syringe() elif method is 'cycle_ligation': biochem.cycle_ligation() elif method is 'draw_air_to_mixer': print "\n***\t*\t--> Please, enter air gap size [integer]: ", gap_size = int(sys.stdin.readline().strip()) # use stdin explicitly and remove trailing new-line character biochem.draw_air_to_mixer(gap_size) elif method is 'draw_air_to_syringe': biochem.draw_air_to_syringe() elif method is 'draw_air_to_valve': print "\n***\t*\t--> Please, enter valve name air to be drawn (V1, V2, V3, V5) [string]: ", valve = str(sys.stdin.readline().strip()) # use stdin explicitly and remove trailing new-line character biochem.draw_air_to_valve(valve) elif method is 'draw_into_flowcell': print "\n***\t*\t--> Please, enter reagent to use (Wash 1 / dH2O) [string]: ", reagent = str(sys.stdin.readline().strip()) # use stdin explicitly and remove trailing new-line character if reagent is 'Wash 1': port = 2 else: port = 8 print "\n***\t*\t--> Please, enter volume to get into flowcell [integer]: ", draw_volume = int(sys.stdin.readline().strip()) biochem.draw_into_flowcell(draw_volume, port) elif method is 'exo_start': biochem.exo_start() elif method is 'fill_with_air_to_valve': print "\n***\t*\t--> Please, enter valve name air to be drawn (V1, V2, V3, V5) [string]: ", valve = str(sys.stdin.readline().strip()) # use stdin explicitly and remove trailing new-line character biochem.fill_with_air_to_valve(valve) elif method is 'flush_flowcell': print "\n***\t*\t--> Please, enter reagent to use (Wash 1 / dH2O) [string]: ", reagent = str(sys.stdin.readline().strip()) # use stdin explicitly and remove trailing new-line character if reagent is 'Wash 1': port = 2 else: port = 8 biochem.flush_flowcell(port) elif method is 'hyb': biochem.hyb() elif method is 'incubate_reagent': print "\n***\t*\t--> Please, enter minutes for incubation [integer]: ", time = int(sys.stdin.readline().strip()) # use stdin explicitly and remove trailing new-line character biochem.incubate_reagent(time) elif method is 'init': biochem.init() else: print '\n***\t*\t--> Error: not correct method input!\n--> Double check method name (2nd argument)\n' sys.exit() #-------------------------- Duration of biochemistry test ------------------------------ delta = (time.time() - t0) / 60 # Calculate elapsed time for flowcell flush. logger.warn('***\t*\t--> Finished %s method execution - duration: %0.2f minutes\n\n' % delta) src/testing/excel_test.py0000740000076400007640000000747210776476052016704 0ustar polonatorpolonator"""-------------------------------------------------------------------------------- Author: Mirko Palla. Date: February 13, 2008. For: G.007 polony sequencer design [fluidics software] at the Church Lab - Genetics Department, Harvard Medical School. Purpose: This program contains the complete code for module Biochem, containing re-occurring biochecmistry subroutines in Python. This software may be used, modified, and distributed freely, but this header may not be modified and must appear at the top of this file. ------------------------------------------------------------------------------- """ import xlrd book = xlrd.open_workbook("G007 Fluidic Volumes.xls") # read in Excel file into 'xlrd' object sh = book.sheet_by_index(0) # create handle for first Excel sheet #--------------------------------------------------------------------------------------# # INTERNAL VOLUMES # #--------------------------------------------------------------------------------------# i_volumes = {} # create dictionary for internal tubing volumes for row in range(2, 44): from_row = sh.cell_value(rowx=row, colx=0) to_row = sh.cell_value(rowx=row, colx=1) # From reagent block into manifold block_to_manifold = sh.cell_value(rowx=row, colx=2) tube_area_1 = sh.cell_value(rowx=row, colx=3) tube_volume_1 = block_to_manifold * tube_area_1 # tube volume 1 # Manifold layer transition manifold_transition = sh.cell_value(rowx=row, colx=5) hole_area = sh.cell_value(rowx=row, colx=6) transition_volume = manifold_transition * hole_area # transition_volume # Manifold path length manifold_path_length = sh.cell_value(rowx=row, colx=8) path_area = sh.cell_value(rowx=row, colx=9) path_volume = manifold_path_length * path_area # path volume # From manifold to valve manifold_to_valve = sh.cell_value(rowx=row, colx=11) tube_area_2 = sh.cell_value(rowx=row, colx=12) tube_volume_2 = manifold_to_valve * tube_area_2 # tube volume 2 #--------------------------- Volume dictionary creation ------------------------------ total_volume = tube_volume_1 + transition_volume + path_volume + tube_volume_2 # total volume sum if not i_volumes.has_key(to_row): i_volumes[to_row] = {} """ try: i_volumes[to_row] except KeyError: i_volumes[to_row] = {} """ i_volumes[to_row][from_row] = total_volume print "\n--> TESTING INTERNAL:", i_volumes #--------------------------------------------------------------------------------------# # EXTERNAL VOLUMES # #--------------------------------------------------------------------------------------# e_volumes = {} # create dictionary for external tubing volumes for row in range(47, 62): from_row = sh.cell_value(rowx=row, colx=0) to_row = sh.cell_value(rowx=row, colx=1) # Tubing run length tubing_run = sh.cell_value(rowx=row, colx=2) cross_sectional_area = sh.cell_value(rowx=row, colx=4) total_volume = tubing_run * cross_sectional_area # tubing path volume #--------------------------- Volume dictionary creation ------------------------------ if not e_volumes.has_key(to_row): e_volumes[to_row] = {} e_volumes[to_row][from_row] = total_volume print "\n\n--> TESTING EXTERNAL:", e_volumes #--------------------------------------------------------------------------------------# # MIXING CHAMBER VOLUMES # #--------------------------------------------------------------------------------------# for row in range(63, 65): from_row = sh.cell_value(rowx=row, colx=0) to_row = sh.cell_value(rowx=row, colx=1) if not e_volumes.has_key(to_row): e_volumes[to_row] = {} e_volumes[to_row][from_row] = sh.cell_value(rowx=row, colx=5) print "\n\n--> TESTING MIXER:", e_volumes print "\n--> FINISHED VOLUME TESTING\n" src/speech/0000750000076400007640000000000011021605464013732 5ustar polonatorpolonatorsrc/speech/exe_bio_00.wav0000640000076400007640000025255410777433746016423 0ustar polonatorpolonatorRIFFdUWAVEfmt >}data@U                                       *(#* ####2-799F9>FC<<7<>>77<77<CFAAHKKMFHHF<92472*# ## y{qqgg]]NNGIGIBNGGNQINIDBB??8-((&&&!#&-=L`oq~#4i%Al;  2$%i&&$!-b 3*5mMBv=D^~ u? 'g!oL -)Y' O  ;1x : !+  s(0|Fv% 'yY,,s!hީ݇/U2R(7(O" p 7!c,)\?* U~_ BY#Z&a$L  W.T &6B 'Jr-QKd  xa#w!) +YbhZXF   #*%'.)& n Xp)p s 0ߪU͓ fHŭ 69#~03S0`))33+9 dBќ3u %/2t353+: t6ߋ|m޻k$&#+*76><3$9%?  Nԃ`fmx8DXhAYEA[K0)RaO4Kޑ2\5=85E?F7^.HѮL())i7i@G-LKa?-x NZi33j*Vɋ_ ɺ)1lTC &==q'β*.440..$~+1ޚcpU_):/3\76,0 'CsSI\V\,71\Ȍzg$RS,a-5&8Jɒϸ5E Q2Yc_X -{(g16#9}5C-m"cuh F\2s֚ҾĦbP`!W56N&}:'j'J зΟԿڞyP +2j3 -#u%lC|^p_\ b(?15'4%-%l lcj1}ki*ؔlښӆʗl@'?2kt *Oa /2%h l >s[!#'#  k*p_SyۓֽfֱʇAː> I(-x%V A ՅsN ~k"+>-)R%&5 j/ }t$&))$(# ;dvn1^[Z^dϯfˤșǮ@V65`z9& 1 X(k+($q xS l,#H%#h! l &>%SLo`R/aO̒ Y!-4KDlZ^8 Sc m |xI F [( TK.P 9evRk\>lJf!\ dy    }[ /  ; }{9| ;m(@?-1ߪ' ÓÑ͞+\ZC/ !!4d  f  /GOjHX .2S2>q3ݏ'֗сʹ<Ƥ`YE p{_'fdC-7 sy ux# m߾LѹC48R u@ , ;c )Zq 6(f).u~6r <TX"wjƅƼ|u'ZP _JgJ4 '0o# 5nc%; ~ e r:KtM xټקn̺O3(Q X JGPlg:;~,7 Xx^  ! j j  q S}uvVeR`t).2D8h!Wu Vl   y h ( F A % R1YfVF-JJBtIV_P27. %Tw)j(q!SZ8{{tby l0-!87KS#0iML~{+t{{P}in#l~( }#vqVelb #/Znxs_aF7FRZlgdiqgW2#{v{~  (9FMKPMUZUUH>77/249272/#**#     %####//2>44249/%#   # #%(#*#-( %(*///%%#    "&!!%+&"(-,*#$   &           #%               #%%*# %# 4(/#%(/%(#(%  ~yqqoggt{y~ogqR*g 7JT48ls~I`?X(g d+{+#5=*v< 2*BD#5MxqZ jP2eQbi]8##&=5lb#?( #O<+ f3FKZKP f+b  im' N mr ozd&< E| k\ n60 8e$7nl#d $Ov H[!w A L w8~9 = \ = $ Ew _dRNzn } G@j  P0Uw mT q$ , E(+ :a? Z'![WmU  P\! 5 5 wOD ? K'y27c}(U/k0 s'[Z # y 29( u*y! egq{IbG Vk~ V,P~ # \ PI U*UTQ 4Z _;01 7'I[4FAmG5#i[O#zYKB  q  t( Dg'v~"QKeS9  .i ybQ !< G[ g,'d 6)d Kz\ Z~{ d bi 3 <9 # kpW `  tc#f*u<6I>& NZ :G.:{S(nN8{l2FPgP/SiD~DAy{oS{t%MUAxHK+N#x+d/ _BUZgA&tni<X5A(_g/l#o#&q: xXtZqlqZ:d{(a7/A?&[@=Oh  h;TyPvR)T *r`v/^ !LVp 0 [  in;=G Q   {  W0A @7"3'u]+'di I   *[ % P[  t=is?F \tgh؁ؐ'k5qy_Y &4,; ` n ue`5xUn M 7 3 ]-_4<,kV p{! 0MPue٢4%ByW 8 );z<HB,; E!8E C>I , NtXYfcM') N[*.7# V$. _ ;  # `r; 0 [b&S%}O$"[]nRnB> 1Er  d "8?$'W P H 9r IwwL:JU}N9  z < # ] X \ |)+8`rb e#g&%{<972#   ##% ##    (/(/(/2/22//*/(%#%%      (%#*(*//*/2/(*%#%(*    #22/427799979<><>9422//**( #%##% #  # %/22297<479>><<99<979444**2%% #   #(#/299><<FMPRMPUZWaUUKHA9<4*2(#][llo~oILVgeeV]glQg]jD[Sg&+[H!  pQ8og%I#pai' -}2~{KqPL>xNZK%7(l%-ZAu bMq&DUox4<@`A SmN>R:iS ( "=+nN>?u~nv|M(*<>?Kl_L#5F IqjQ I8D# ZgZ{<dIJZ# !tdVIg ' .T ?{b }+2U%h*>#} HbhSdig xltl>PeR;(#S>%(Z':n(R4_BSEg7&2F*-L7*lP BnvDlbKx*SU*M?{l*U%YR (og~ 7!P L sr;6] ?:E 6'qUI#$dF?A_P4bd!~ DIU:@! 51j~q&Z_Wv =O )D K8Z:5%l#5D5b Llnq+b32n#Qzjd-j?A~# 2pxlf2((>RZ##}7~4Z_7yiAi+<jlbAt #{fQ{JBksg M@nWa~v:NRUlZylNH-{>~PWiF}+I_:I Kybb_db#8#F_NW3lv8?I+H =? oZ(D(? ?-jjdoDoD5=8&(Slq:M#dyQ}iDg#AobX*vl~xvS>A_eZRlP5q{S&(53?N rmN7K5iHge2Z7vRdmw&yTFL-tk/#l&S$@A ? !B1^uTOt  =eDgU/^uvPR;rQ;> fSi {KemcM;r _ V  C  ""Txdq3I݌,ܹfު݈p@l~ {lqGc WM O^)Jd : ]  ~ j H _ kz5*U{Xj]Yڰ؊օՃ݅&JP ~ a]y4r0 /Q gA5\ yukt  T'QT8d՝Wxq$ۢ݅D{ pu-? [x:AA: }l wpRs < I/l߭ޓԑf@%Ci5kX&[ 92{ : FIYj T#hfU:Dq" MA{ * ~QF*od*OЩquCݣް@Roo r26"2 }O=G qLZbb# eL~.v d $ V.!/ѠP߳pGx *</2f p3@y3_{Ie wcGvu)y % |}NبKӌXנ;xg' WrX~ * Y[: oH7 P X iyS] Loo fEo} وװ/}zc>%:;F <,f7M;x>  M )~n1JZg?D ~spq YUUfat=ۜو }ԗ۷\>v!% @ 9) ? I@ P-gR l C=UQ  UkzDnzצ׊. V  M`ed  @o(7*iK&H %FW;+3 q}_"7nQ}[4g g [_(<R*7 C  >l:j > y q t n z;!:7iS%5y|Z}9,J6/l'Wv=v LYY|E`"E$v5{V7:Bq![B ~3!xX{:52<7/R ;Ya9*7:>IA~33``=&Xb0AKxF[5qdXI2dN#_>#UbtNF_L 3DS`XN?.N_2dAlK4~jQ5qXI?(&?U_j~Be7d?v7d5IQSLB5vNi#i*{?{XI5+&+:DUd{5LXqtlXLB-&#&8IXo*Ml7PgvZK5lU7l]SLI=?:::=DNQS]et~{ojebgggloy~ 2FWl}xg_P4*%*9HRdgqvztjj]SGF9.$#qcXNE1"xb^SRNTRh}\ T k BR:(yO~=WNnX }#-#S5gaa:X{xG]K/NZ%dUq]*/%+ Sd f-'4 *gv?-*%5[rG%px@ d 6Te6 iynM2Ewq*O+J;}Scz ~ kg} (!!!!! Um@{ p HBuT gX76+Ѽһі^وm]W SWC"%6&[$r#!$#!myU`Vt OL6ox E  \5_qwVaǜ}C`֭oOLi (*u(%%R(C)&$IX# S_vlJ%p eb9?P <4{Ct҇?׾;\"ƕL͜LzW ', ,(3%$%#K. < =P!Sa &A/$?%g &F-V0׾Ͻκ/љԈߩ f(! $B$ 5qKg ;DBQ:/U?N ;RrBID  |8o Bٵד!ͼɜ&)՗ߐe[2 WKzzZ@ r+ N    7 b Jkcq{xn v  UOaF`֢o+Nπ~ֽSq-8 [42o >  ( u R  g2B Ar L t t v<8T^=D߆ک$4Ү֘pTوB:O}tU rqKmad*`h{  e  u _ n H %9' | ^< $ L {s < @ lP C{[@V'޵ٍԕбЍT FF /"3`.K } U U; ? !K N D W / G | f%k/!2ϤЗԪקuI?'<MVI! "E>*W2 k d    b 6 9  nB ?g{ׅV:Ժ$NQE 1fxAWwN } #\ T _8  y o p \ x   1 ` e = {>gUb#9s72% U:7[դܴe7##%]&1 JL>CAV~i  W< f  W .     E  ~: {&{w!{ vTW/9ڤ# j.;b2Q ,>q=;ThD#  G 0  \ 5  3 g:RBt2,gX\oRдѪъ&իيu-}< _&+"XW6o tA z W  E J DFl>yl0 & +.Mо rifެ{ uX S F rN !!! )_1v_ \ n = 5 y  SeSe<H-q t\?JcTбѫؑݕH9{tW (UW_=!"";"!M'rB4mt C , | ` Pl<uHJEF-qzjq#$ ݥedMu'fl٘N4< g~\{ ;"J#p##! !k:Npb =  xU-5ndR_5'(#zoԛrж%V"֗nރKs" m?! #4$#3#+" |&<}|  L v[F*zwMuuET8&NxA:xK `ڛaH E0g "##"! Ok:nH` Z v MfZm|h8;Ez80_3u߱Drk7y 5_8/! !#p#"!  1  LbF6@=c JRLo~?6$ۘQտJ) ׅٕbm.N 2?/!###"@" UT<%fF  E nsOE="c+ FCF-1V3M2(aa4 2" "#\#"~!l k[g` ~3_f}))63..]_uiVZF,-מ y_ +%t(J? 5 ,f!""""&!SIYm H  #%'JqLy+ ?N4,K۸Nںb{~gpsp{d { !["V"! ;,aB r MM!SWM1S%vb NߨݪIKonqYs <VAX$g 8  @V&d-cx0nT Wy.x&kLa G"v,Hr  ]}k6&0_RA<gRrBa@}eCvlQ4 :xamIbP>( q|y }ya. E    7 u R  T of^jd#jxUSf9/1e~&q(2(X{GA`rRJx<## s'z1Ll!tR]AWHCZP>PHC(9+   -7"D,SG]ES@; PlpiJ_t*zR?%sy\; pTB<$ u`P9.#jD-BQ[ SD"z"BwEn=u3zb[.Lk`w^sTW9x!6i]H7Lg lj A a k   p " k%WWzic'ܴ`ӏ(ԳYJ` A/- (V:5L :O #6o7 kCT   4MKc Q Kgc%r`Ȣȹʷ̽l'<*2"1+n$ ^_V <Y(W.?[ dEZ\mL Lk:nt6 g}lxGy<~ܠ$ (Ԣټh#++$+ xWD;yo Sj* 2wI\}!#"lo u(I<0^!$=2W b=,ژb%0:O  ##$# !f 4d} 8 _>uu[f='^φJ6QOf#09V=5#<I2d__o U ?pX :o`H~ c _ {\ /r-?cߚOef2k  #.578,1 K48!N NqX iE9h C `Pr sb R AA  ??]&ҭz A*<1+5d1"C QIE|+ 1"!n4 M6 c &c    }, . sl"vՕaͨҹـL3!+_1S3+L0Mefxӟޥ #x# {\L uU" w G  ; w ; B *k[o(q(% =޶.ϪʄKY^l&/&30_$s#xشZJ""+]G nx#{!H o, 5 d5 .| o 9U 4 1wF85 ɕg͔1L"b,\0.!&Q.`Ղ# ";! %L  I!? @67  ` ::a. ) #`(1Mj6C!ZҶbq#D+-*yt !v։%  W gPhn-@: ZF  ) w[ e S _b[3ݱ $sm )V-7+& 7q'ޢ jPY ,C_Ut " = g s '] *KV?! V bS,dD9tv6W w$**f"/]J;" &` ,-0Ng!io| 1 M  2 2 n' /{fQZ`  :ED"U :eϲ͘OܱF |'y, +!uvdۅդݿ[ q !Svm ` h L H[ t^:4 ) _/]ڊ{0ϵՈ#G (+>)[= PמA(d5 a;C Ju{S5  5n< O -0 7bLV8 VB\!,92.\չ^? ojh  Dr< # g   ) KAIio7c#(Xѕׇr2$.-/*cLՙ |D %1J7 vO{B<! f 2+ b y]| Cf (leHBSvgs̐ݧng%./(ND8ױؑl9 Q<JTX z}f m p iK d>:k ^i_)aYjݭMxуԺ, (b, (TS a Iqi"7# I dhpL S   e4LhIzVjݫZ cIԼնݏjWr {Xt. ad& k\0 +.c vA~<A51Zsv&3դ؎ػߔ;:T: AW [}Pd@ @  M p | Z.QV2=(ԑΌזm 9fT,UN r}Xc ?    :o >AFWϮgΕV`)4N a ? #x7/_ @DGa][(@ E   " cL3+2u6^ A/5 GS a U)B a XMYu I | -*rCi{؁՞>Op˲!)v`{ !ny FQ6D $ `[UK ^ / "#_1usb,Uمnӫdҟ0}Gl"fK` x-H2h ` |Oxc, { hTa߻*ѧHͰWJQ 0l  _x- $!  q^=?4 $Qk9'hי҇Ѩһηs̾E#S ( 9i(n ~iAXVB=s( _'DC'9ڵa%C˂=5l? bK0c& ' | oQ^0  7A^1ѝ*һZ*k@"%) oe `v& &N. p .Y W_+{)SFڵeggdʑ 9|! F+@ L M4e j &\wm6b3 9 R2?J߂Kҗ͛˭ٍ$) ! 5 n`?I{2DM \ Q @{i B 2b8n>S`$Ϋ̑yE  jh"p IMaj sZ*{5}lUN$F  \)T݁,޶֢(eؙGdJwh H#"P" <0mJm  s%oSAfH0 o ? a(\!݆͟mCTݭ } "%"35{|tE$-  ;^ ?kL &d0,FڒݒeϑɋȚȇCZ y \#-%"@ R(b|& fTT>=!tj 2/iV@ۻy&}bǧ,Y . u ; E"z!*/n2 ,:^ X >w]lB ; " x  UtiT\Bݍ[bNgS j &]je &Kl@|QW6G y  R BOޡɛ˻؏8(f}(QY > ZoW4L4\-G\= SV \; 43Fۤ"Зa-ˊNb!tFE "n+ Il=6 k_am}U  ױW׿i>Ye }{M@e9]Ze xyM# Mt2#y  >F(& `ݥ٩֫O Ҍ4ў  !aA* c y vgM ;(9Oso֭үJЎ!S̫~@ w $xy?  * %%;0 ^ 2Ad |umi=YԊ@՞Ձ 1@-Ly f +o<b'K>N7O .LL޽عռӱdӯыn3ٓ!BV&)O("kDY lZd:p DPgt6K  miCBղ 4ЯΚ!"PKi U&+,,' (>n  =j5]>IX WPLus8ՃvҢҎ=B;',*+&~pLeb~~B@G42%?  WyJY~'ybӭ/pyx+V'],+&DqZ?8#2W q!b!d <RoH i4R[]-&ekށ!)v,*$ b{.`-U6 I7 V"L" cN$X tx׋eh.ӱе A$!M*.g-' l4 &;+pR>8""!4cnQzk EesӖ_ӡ՚ԹDG(,5, (y"K/ #' `!""=!JY+ ~9htαBԭ%9k7T2&+,W*% <jqwJN>x"#\#! a Ar>Gֈϑˢʾ0әӃڀ? s"(+*& 7JuHH /(K"#^" .q|; Ss'slγ>ђ/Fg ^!g%b&$n* a <>)D~?7 7rVF C6Ѻtv̀͜В*sUi Z4 ! L``Z # > l;xW , 7r<d m2ip|$ܝX;cPҕՂZ޲  tISs( !;br( Vrp V RqBh۲StuT5\- kU zl > ! lsyHMn i e`n -  2+z4c7/g$+!lsl>s"Ezi!lMn.F 6 J  @ ) AjX iSk,iX oSD0]IdgX#~=O@piWJ r;$j!I+U{<>* #4CH9F}s>  ty2C<%AZ]WM/%FidF --2% -7HFC/ -744<997%2FUWZWF- %/*   #--%-42<A<AA97%    # #27>AMKRHA77-*%//AHUMZWUWUHAKC9/%  -7299<747A>>F7/   /-2444-%#*--             % %%2#* #%-42 %%-- ## //7*44# -24-2272-<<9/*-///2*%/#  {voq]jV]NX::0IAA-:&-(?#5(I2S#zm> $6165Y<f1tTHHGocC,z3wXQ3*#N.T 7me.mv(- %*zA&!=`P$SLy# ( Z7y]n[Ql/(4<< IC?bqi<,D\]g{ gsTaT.Vbksn~Cu,~BKnv> ` c7 x+7D^905Mix\D*V$,( 8ikedCe94d#Q7Z wNhLk`M| h h+ b*O s]uW -!YdF _(v)m^|N 9 ' .er T  g   v{\Z}!Z,tDoc)+'Wvn6` | H 4(i%F J o& m(qY \ަ!ISea:d  # V  : g2! OX1rl  Eo]PS rk'ݩaGMk ? ) 2BO,LpK ] !{!3F ?*Y Jt.&>'e/E8Y3tv|L o@ \ #f%U&"v !&%t#qCi)Q&n\aޡ\rՔ߷[$$h7<IK1 !()y(j)D*&$"%"D F ?lRXkfյтn͛IϞ'U؏-, C 5  4,e2e0*,22.=)$#7 <Bw IP5# iAОBȰa]nYڛ#4 *V  [ g [-`4%''!*/563-,+' k\& U467ox$ϩ˪Aվ˱KوjxlQ\ i { #f-]14D8:;A841p.'.q@ v R-pfߊre6)ֱ`Ow P yy 'C<`b C8)1F7uD;D?;S92^*!F Ql{ Eז껉rUb "S'$ mI}7/ }$S/%5'-#. g:f h*߼o¢9aJ#('$/ M3 )3j:BFWD =9/5-#V jg2u]H?Kܧݢ3Zzih$k-)$16 DY^k?2$/@;BEiF$CW<,50K(z hRCD9EB}=D7/*# *xe&9V[>036U RQ!\.U.u& EbxZ/&2>;DsD!A:1:*f&&"j- O1sm/oث>̈́Ř٬ ,-&Tg GeL_#>,6>~AF?9e00(1# wRuV> uѧ{,fة9 s"%c#  MKX(g 0"&,16;;R;6,%1Y7a>+lgQ١҉Gđ Q#3mvPg $ y : H: 2}!Y#>%&.*W.0-.(# ld; I[]ZTi$ڛ֞;9y"j˝(=, H { Z g(-&HG}b : =""!2!n /ok* B Z#+H@ABBA?=952N/p,e)/&"r[ U5MQxDz7ýS w ,+&0Cl |$c+046-89;=>K?>= ;7401R-G*'%!HL F h -Q`ZGxհ *w(M+Z#KdFT~FH m%#)-.05236q8h:;><:8d6;3/-Y*'s%,#D a9 & Cr*$!P@3ٶ_cKX… 3A}Ɔ;ӕٵ g yq_ n&'+.0 2f4F7`9:;;I963 1-+(P&# H MZY}6Y̼ ðN8sȾ;,)Z=`d 3q %*-/`13P689[:=97p41.V+(&#Q!Yg  Z f';k& Gnq̫T=pWĶ2ؔk +pz ^!U&)*,.0c35#777Z631-.'+((%#G!JN /Ri[DdIW!5bǙƑzљܘ+/Xe SJ#S'.*a,.0$345542/'-e*'$"U o%  v NkkI 1-'5: Z ͚ҿ ݧ8w!s%(*-P/134W4h3o1.+)7&@# $ m ) W< P-_(fXz͢zl^-Τ,`%Q59dJ $&)+*.023;31/,5*i'$!>e2.t` S S   l ZA 2"ΊΥͬ8˜|ոr - L # 5 9\~nZ MbN;Ppq(Р̘˸9Τ*XT !g="$ ')*9-/00.,*X(&m# "J-O$ ^ sW$odx]!s)n6nߋP4ӳ_͛͑Ӕ0uw~wr"%';+-.i.E-L+)'1%" Yz :  *IwoP|ݒeӶQϼfϧ6Xo v!$&),-.-.+)&/%$#S 9# : %'rNl_xF#5#3` ׯuљЍY NS4 DX "f%D(* ,+*(&\$"s @J   b92g4 ,d۫E4(TԶ7,RF%v a2d-4I '  '#6#!;H yD0>ތܞErtf/lwOQ-@  H0Bm=o gy7Q   n  ! t ; {bg Tswr ͟U$Ty1 9} S j gl\ F,"&Q OB6e H  *&7  1%l i@ӵ:ĤOՍ3P\l1$]O=;N }:0G ab!Ps 8 B&L*|O՚UϹ1ʩۣ vp` yBL+p$!U [X >+ (/s}lc XEO  MC$VY[ _ОY ȭƜИ-0/@ @_C@RZ"X|2d+yG  sg_RXEI < R*  #wU>ݚ٥9ՐӍʈȂoښv7ei|T ORkqY:+NMQ  1N\PeCP  C %w52_ 2 H J4JkMߊ۩A+oҦ#Ϡt *s ( W  ay] R$g o_oGT  X df N 1 / z6oJߺܔԤU~$Z| q:LE 5C!U<w  D J `  p # HHn Ye h w . 8 (Gߋܱ4׻`۩LB3+ ) ieG _} ~=(F] ; ^ k B T \ V nsD #[cwXR407ؑل܃ !w[bN | g/ gb({F  , *9i  3   }fhC6cm;#q#@+x$$F#CK! !  q%8^^ = \MAN2C' " ={iPt`KvFwkjl%?IT^&L} N$y3t)Epv . * {b %  w \(6v7ZKq (_ :kwduf;'_-3^qKI}@ El7Ak[+ D j  V M / Q  = 2 shm37j <bW2-<EIJ:O;Mak L"9rRc4G= T_52UAI<x&A("D9 WC OQ7tCgq<`syd?/ 0.a ?vICP7TSL Qi3\%lKBv+bB!\+pF Lp] qf~4V;cyDC{)x^il m AL,k`AIM< D; zv66o q6 |GE AHz*g f0 65 #( \(rHP S&v -yf F'.]vw 2{A\ 5 Y. 9 y4zU #C sk<R <g 5t ~= 9? l9l p ?llC?P fYpy0 a:F3eP $&u+ FT & ~ -st8- _ ~Q DlJW Uow{r0!}TQYF C\g4/" " { Q X5 50E Dy uheF{g N7I1% 3 ( 2 p ]cB _B :` N?' @gX I~ *:C  18 n+Z 7Mv$4 r\ \ e> N%dk% #M|y #B'd=&q d{ r +2 mO t [#5 [6 qm[ hHa^ .sL s+j JM:U *() 7Sy ; Bd3 B9YL Tr6^;e$ lX8_6W U} O b<& {K jd:qY S p-0> Y 1-7}HwP q wl|_e3\VV0j- !XLjVwjWe_N!(+ }*Y9;_: g+HZM0/xId{5l(-?--7:jQ`yNqM%XdV2lWll7_AM 9 2 \KHC(~ -RFI@+{uX>x~]s2uyf^: "R'Q,F/( ,Gg6o,mocH!Ho04+vF!;u SaYroS]tl[eht7q_ q iulF9&O Gg` )~x )$gDO/ P&< IG>:>F^6 M' R  D g9PBqj 2 b\zdU0uwfO2 C=5rHCt (lbVGuP 'b!6fF D r YN ;Eq lg`K0I-& 5%w QD} X6o&hk\c_d y40>os WEu`[="7*u] j-*U&Gg$gT^`v-7eK:NF5dl 45FXK=S]i[{W o/vvdZ+0K<CN- F >b2I-?]&97Q4BSxv\U{ZIdnbq- 2 50+bi}<{K]sHZM U P]-t[@) [mh+v0GtUA2UOPz3{. :/  C}2#72M1 j ] %Elqe!c>q٩c:xc 4&0D j , MEr4v :D S8H'yv= i 2: k  $t+c?gJr _rއܩܼb ])  ^s7  j4su  SPW"GvV/  Ym7zu]: % 8S2){tARݸߏ27}5NT PS : 2 <6{A x W  kDo7 a 3 2$lF/u;jHo8==L`sU ^ 7B@}A i!H< DR1[lp 9 Sgm= gY' [   GB\$~ rl;96R{D,U &us  +@>xy | DAHG]!`a|Yhވ:p9`   V pK Es X l -U*,}#{5- t 4 TLZ]%c= ! H2j%u5T?\E:g3k' $`%5-U h C:k + H!(16uD<j4 _j#4Y xv(rf]KFE,G.FU`1 P q{#0" e ,eXKkA @oJWlQ  A]uNm#g xaG>"h^BKU]7 J P>& 1 R(mS/SO:  )6 J } up2V1~&MYpc- B ".iM%'/ ^ S8O Hl+FaQ7  $ _ vj=X y v 2T9P>J[jS^rh++S/?X:6YI sa < H@ R8 `J1 s  h p R  C !Y(Sl$gafg *b  [Z Z ~ Yg$ W l > DHz!7l  oXS 5U  ;< 6_<=K TH  b!V $7$dP LO(86v % ZB5n ~}JzgxaT f+R"hn*Hwc] % 7 7 ^ b[  w Ebp>R3T MC: JOW :  > RoT yDh C8u wH#/o\ ;m * ~vwD \t B  Bp RO z[X0 #o@"z Vi -', iE z 6c/ 00* 1hb2c  k'bP s m|~WBTS ]" S~ U I % l!aaxL 2!  !0WH ?/ zvrq %]- (_>r+hD ",$]A0g: #:VXRU 57.S1 ۇ\#L<f2 \'\ c $ $RD.{{pv _^;_ Ig8 (Q t3 g2a`bmabZ#>i''z]S E`R~LqM: O Pvce L { # SzGdq +~ONX Oh z> [ hW+I =b !"8  2F`oHBP_#j? qW 6 $ _ ,  Ttg  -F9n6 `M3[l C FKS(MH')fU8+3 9@t8 < R )k  [ih 20mi nG @G9dZ 1bMzI.S&^?'~nevNm! Ua54 J3 GHLGGW?}sv 2g( -}I,A>! vevq3/l# H#+^ @y( LuWq}.W 3AGd R 8A+ H ! i}Z q| aGF4i#KKg r= :IdO6s;[ `A[Hq S$GSX %Kl =Zs N$- g #]M .WD X , L1 5i[ld m=Tn-| V0aE< *$  =$1q$ӆϗ͚GKs*62{2'=NۼC|v-rk!%D&u! ]L^4: EanlY * 0 _ _1\i C Mgo[+@rؼ1{>u-*E:mAAN7T3_2ұL"z:Hd?#&% > 5Aqk S6 8Wo ! 32 2 7 e5Gv` QcHkz7+z:=?2>:5I_͎Σk>:w "$}!U%Gd  zEe D f X zE v l ,Br:tԑПvִ641AB<-̺̖֒яڱ! aU$#6 * :{ #  =c+  9D.)_8g PZ5+>s \ء'(nۊ` 5AA</:nӼϝٝ& zC" NO!.G v Hy eD  L1(   = A<rTP$ѵ~ͱ,ٱ5*CBC;,j-c8^6r(*X%y;"|@vS m%9  B _#Rt6 >  / N Yu*%aW{#Ԧذݑ٭~7 ׾98?8z(f%3Pw A*2/#T6C 0 1e $"k ]A w I-#z{ WڀԴ*KWdTݡ9?5&2k g=+3^0#x+X ?f#' '   v$ y2V"+Fc;Vnة}0P:-ёA-$@@(4"iZA6ߔڶݾ"a04-! 5B$j) #$r!Pw;KM - ( |;* `%9\i\we7fA͂ڤP6?_8R*ztԇ *2q-6!*EIap\ 9)"1#" S ]S J <g6 &^&pZ:Rҽ+C˥˪Zo )s3k0/*=+Oު2#7$  3_ZZ1 3 o%%$ OH r  n t e[v%ڎyXŃ^Q ($$i OyQ^ 2<#q&$ [?J5 #""!f v h  G : #f1!ݿD6iҥʭ73&.F!^2f `+U#&$-|B *Q & { = q%uۿڬؾ}s0nٙ[cE zA d{X9S X {X 1g(LA ?)+KJWEfИס  W _t jF wJ Y9Q i bA7d}= o_KKx5x ن׀Ԫnh;_K7^S qq  ]3  Q-sK[T4/^7O f?%3~BeԒ[0ӢFa PjM ^ RW`L#W~ 0 x2hN+ 3K#+&  6v$Ig\,ax&$MQԞԹѦcm{r bh U-D%4LQ {n{JR; 4 " 8< t@3H߷ڨ?!yqB { c t Y %^,.gkfh q4Sl <  S UcsCn*yݷJ٨*OB; 6  9 T { aMW (d ; T } CJoyKm _ _53L9i5XgYbZ 0 G e t  #  L c $  8 ) v*b<~1^u 6eT"LRFRUY^mc1aR VJ9heTGQDD _9Q+#Z0 P sSD-0?{+&0b* 4\W/<% 4Z}2- bHRRZb__nqql_ZM># yttv~~~~q[e]?:I:5Ieqv{#/CZ_d\W_gllidgs}sWF9#~qleoto~ty   (-7<FW_iv{xxnnibUA-(   #%///A9CFCRMMURUMHA99*-%    #%((%(%2/79<47724///-*%%%-%(   #( %%(%(#2/*/24<-2-*%-((%%#   #4YuInK'7BZ!=X}"aznQ.D`=Sb*db( BK();' 14 "MYW6C-  ds>#ytoL~ vs>4*CK2%*>_dal_% `N(02tFgqn9X& [~(>(]e`e 7>>7 N:!(2=VNtDq+I(  '6bpH:j+-u*3s;-Se4Anqg0Nv~Z75BM0BA-XsRt_XLag(vqaA A#!-UqIHg_AUWnN&7/ UU{Pi#%#oKs<A5-/D#+ U#b2 =n/#{#2xs&(yP_*ygx7gZ(i!.v!o XDA5K >sZP2eF-g4(*w,@y`yw@OP>:eY v  ` "T$ ^ :    8 X X ( n N$qw)N{/)զѽ%؈޻[,tV3r d>nY[;Z^K8 S V  \K 0 ofk k ]  ~9ZXh&rՙxs(#׻ޕv } 2+?; Hg  > Q j  E:0M< 5 CRr m`7W11ތm֔R88Uqkt"#\"  { 8fh+;6| #t. 4 J " a } 6 w< q h %agEH54Ri#Pٓ}ҍT !X!" $ mj)K{ <of.  ]  b BX* K F 1 G M{e~ucq aVV,#vDv 8E L!@  g!'pw*%s =`] )   [ l K f|G3~V'd z @ ` ZFs6 0w=$0ޞ{8@t Y ?4!_v g j-@m5G %+l  L   .wn 8 z4  yBg{7` xauw=&1$1R jf!K2C#{=!E'? D b S  b : FS D rm I X^?,VM߫ݷsufݻ 0A 6mr0{g b#yM}g21,wS NX (; Q G q b  v e = & @)   Ha(=&܅یڣV`U?8q1 7P27o _k/#nt #v@ + F  b 8ETwP g = )A!2-^frވ a:H Ne+ QAGj"1 MjL2# &u Z dJz")9pL:d T=jceK=IrKWZ &_<c VvF .[%&z>o& 3 L=C| ! W%"zQ@  Yt~tKgO}Fmg;~pCugQ W6( $UDaygmFq a?Lm(]p; [t:[G6uk@X YGbiFQvF6.Y o6h p&Z Pikc[T'q SmO ? Z /%\y. Kz08-)0CO IL JP B :CL<$)Ty.@e7T} g)1~nQ ~_#+<McvX:2g\ m obB pyo VbD ~BZK36w ; DQ tQ}:F0vAAUF,ET( /) Wq Q SAi 2Rw ` ZusH`ylKfTsA+KBm >u4i*WO g F ")b+<-D!A{Fs'Y]K9.c+Dn 1 c9k"| L K >+*#0# O EO = a"+~&l0jxY]7A/+]qPK^*XV=(  f "UeY|ALD)8j]Z + b yjx!bp{t=",ZyOf{m1pm]3$g 9  + o| Sc< J \ 2  KbG_R;U^-gX7! 3 B Q ( %]X;e0ݣ۪{pnUt ,. MIN[] * _U e :llP#%vq! 3 dZg1yVSd7܏(= ~$`e P<s_Pxl 1zae&  .l0lg e 0 ! 27dWi%i< D  +  $ {:HHzTaw{DF0Kޞ(`b0 ; s<n(! cufMf 7]!%5 + xCP4Sj {  ) $ ~ g l#F3t5GL!p @ M 2"}C f}(@ XxjiIU! t I & & &S(n<n}q   N  qbjLg +)uQ )G :dWOk_U }Mz& igKqR ) { + nnA G | hc5 = dD(9H4O?][P5  -<U#N h4;1 :P-7N?v . ] ?q j o SiU7V-Jo m-ߛ-_ CB , = *sbM ? j ZU7 5 y 5?2{:P(D ,` #T! YB& tpJ *  s-vZoX sI G 2o&vqt-B N $ N q  ?~F_N~Ky$["`O X+0޲Fl .r _%z'X|%6"B 4s IUF]8#i D N n[{{8#xN~(B t K(Qbn\*!.te 7vI }" bm G%} {2%blB]! ^ 5m 5 `FUs 72 $)) 2W0n#;wr@ wz/|=35!+@>2. S FQ . j 0 : V I2U<]0K0C} A#X ` X bDeVgr4O ) qM g B  ? t~2ilPdKF!l/d-5  w I #%XlFnDZbfJ R wS3> 6 !As/_gQnb  y Ng3t U%{o]DXq!g g }X&Pd#bdx izTwB6.yLLm  x<iFiU{ | 6 Nqv ?b {&n477I~ 3 !D0P}Is_- ',oVv5  qK-(j 8 3.  <Kn*\# :-{XtyX D V   UsPins+tF R^\ OJ%+\ ob&vqA+ t t S UR# 5&q:K& 0 Sg52F  NN#I}Xidx#P%b]HAR'k@^ "^W7<N:~P N j j ~iqAIXG(!qbI<:] ] 7(}2sS%sxF6xMr,3_Ba7v%5a]o-xqdP-sN{A~Z] qU+-tP_s2 \5vZ\66\C1z9 #%KsHK2F2NX_lZ}_*BevF 'a))|^EiA9l  | Y@ m ) ! N 5-?dvqX\(<P*{ Z:iqx?+AF(4SA>I<9i4}uO EpR9>+I!<] D 5  X  { q #0DZ7F_(}ZM-%PiCn 4ZlgUS*i* o(g 2dpu9}>HODNxX~ g y Q L  V y j 7]t+gF}Nvnvs\gn}*_:biXSFN4%AGD{7?gWuk "_g:R2s_!g  V g 0  0 I y{+ qnXP/A%29b{ ?/  #?: i2N&o#:Pgq2k fE"JF97AvDI . L g + l  &AISZN}]SC%4-Kn#S{{}qggbN-(_!B`K{/\Uf% Ca- (%S!SHsN( X[ Q : D5-?&dI2v{ IZggXAF]ibK-n9 #+yN{0s _} PZM% (A?.& 0IBS{0l0I#xIs_I(#<NlvdIA#4SU2bpszPK_KKA2{Wl<vS-jV7_ s0Z:v](  (7?D:Kbxs< dWi=t+}2H{`X ddfFHfRlgIv{224 }X !d___?Z7&gXZA#+- dI#}P%i U {S&nDgC%UxA<X7N#nU!gIZPU:}{_KK5qP*U Up?Q]qlln (A\q{dP2sU>4#yj[[VX]`be`ebbeeeqleee]]bjg`bXQGDBGGD:5&+3308DINNVS]j{ 4K\k}}k\PRM>9/   (*24442/-4-*4><442/42<AA>>9<7/4<92/2/*-(%%--(     #(                      src/speech/run.wav0000640000076400007640000014765410776476052015316 0ustar polonatorpolonatorRIFFWAVEfmt >}data                                        ##**(%-//*-(*%*%% % # -*/(-##   {yjjSbBN07#00(( &9\;3{&o? x*bqQ xq xL~lIlvC`vi_70/ 8Hh5%m5V>g5>%xyHk_Nq[L+v0j' !% V@& L|  YHT;&S3S6g7HH;) x ׵М \k!).+,!be`~ .PK^.  c9 7 'OhI$d9,"ΎRMp(7YMIF7!&\L'l(1-ZacCa.T|K@? QL] M_ u5ty~oD=ޓɜaQҔK-AC8;*vKiqο˛n9'p,..+ eY<.t v!KX' jX a  N &<P_RbwBdLpqGtdΎ ݑY2BB7% QZǾًdN&.1+ -U h5#$   U  tw\s[zO*ˏX3s@aZ\p>N|˳j Q)3S9t:0ctw=B h%u,},' ;  f Q x 1'ѵ`¾ɔ-0HPFp+ ~6oۜ9) 3 0 ;r=5_$^ m|U? N#-0*!r9g u N  X Rhb s xWI@sޗ'˷ľ^rF )>D>.a"ֿП=-:&j"*<8=k6 (0$nkp\r8%.0.Q)" d H[ ={ sZ{jtǔVaU 6z>:s.2b ޲@[b*$394({ lx'K( l1b84.)%[\ rK Xt f ы0ɝ˻FѮәyE k5 ?e:+arl1g^".41)d r p+-..N/1+$Q ID[ 22 [6>>rF% '̇ϤR]4|;4B'@@" '--&b5sf9^ IjWS-<$(#-/x-h*n$W2_ > S ! X6%wL-Fۚ҉~}CϟzVתf&:2?\6&U t2M( i&)L'!4o(;yl/#),-g.+#6^m6"l7Dq߁~9+ͣK%5ӡ5 7?8*Lܘ."ԇR]7x &*7%fHS@ j u$,I11-#  A gbfm]hX 8T )!::l0w!OLN BV+̨ٖbU uU(x#+-2'1dXF] K$)Z,z*#kf3i - gJ%t CAdWIo܄ ${/D0*!y d ! aՎ@nnGa S $~&*[' <Pq u!3!& c] Sj-M;:ъgҰ E!$++:&l8SW =خݧJ I%(\$N ^l`  _  ? N|tP| ZSD{,ٜgЛiΨ=1աӒP(twu# )(# 9& .vO߇w2Km;## .@ G K L `*u!f ` \aG$ G ʦzXсn ($+,(/#bW %RlyaQ cb >" a pAn  aj | * /a{7ڐԏͮe Mgl٧? G!'o)(_&!@1c?z-n @/   ]=o 4  x e Q  ;hyWRߴ5aΚFƦǩʍ҄j |!'**'# &9  "w2vsoI^N 4kUQ!$(&&v&%!b7z & 7 c]<[D$ +{iBtޔ j ! 4B] XW>:sU  #Q(+-s-*2& [  d hN{]Dx/ZLLx(.܇xm!ӿmu!Lu8~_A'N } 1>"iV iv!%'('9%!W Ri1pyAKHi#qܙّבւP`> yJ1 @s9 b lJ:8h 0G ^"a#" qfI < Y qC3# lxch=`u.ڨDܖ`4Vbcl H4kh ~BmpPPnYv +"0./:  ?b4,@ ) //\= u,^ 7u`B4JrQ By QL]~8'] 1SEKZ1J|g+ A ;5Ziq+J)uސݳMlB{Fh *^mc;4~ _ }X|+<0N ^924oe a pD#xVI݁ݐޘGP + $E; l W b([ZU7!%+ "2b(xh$X  TNI9rqMGlMl~x$ޚYߌ8gu l$oyssm Q P 9 "mvqE)_N(adJ!!V!L e. >]Ng*^e l  _zi 3 O['[ 6>cS%D W7L f^ #%X&%#3!i y+q\6DS5d^[ܜܘݘZ Jbi@eD 7 @EEKeK}'K0 @!4%')('$Y!Dy/ "Z%@@K:Ldܓv?j DxH } D 17dnJQL' o8 "$g$#"yFxF  nvx,d#$MQO15)&АӔIdTF I55* pFH<AF9 *AzXe  S s?tb[K`s1>U^0̀ʴn&X@lC #c3K j4 H  7 ]J^[w0 E sd`91`&^s!Ԋܽ`N]("!"?e  7 "A .wN( E : b D;5[~t?x.ˌɔf(Ny@ -So 9{a^, tg5 U =Gf@VUH m u l` t %9l7]w^!znХ+vϦ׫D m IgK aE*( l Q 3 m o\T[ .gdN>Ҍ΋7͵̩׳C O28e ktAu+O ffV SC W ; w ) Uk@#VytK@ hO p)M-#O <("k U) '  Y > \ 1 C  N gg(V}<wB{hrH݂ؐHUmW?P<<NlD .k>> V  J B  p 1 W =  }"+q"NT߼߯sW3P2 LxN{ ~= `p[&] z >  n Y O  ! MamL`{>jSDvW`Xڿَ7sk1 J P j Q 'y2qhP <  d%\z G ~ ; j | | M  1V i^L7HJ< (X9c S t  y < %dK+ .  V  g    2 nZEHjX_ h>d021Q1(| a DA#1[ Y ' L ~ & 8rct`L -+11Chw 9@{sd 0=qlS}n   >>TB~L5e32cel^joTDnT~dBZV 89Avb.  {/*wm10l]{Yt<"|=jGj1b! 5 %m uU; eD  @ X _;"7#+ ;LyNKywk`c7$ u kF5 k@Si W;]X# c`-&HD*%I=6t }juk**]g   sMQy2bK 2A$dNq&nF߾ߺ`wk %5Y1yP1 [ }Olg55dX] *wge h  *Oc3` j~"dݤۺp=Qh Zx),(6-R6, 'Z&#hrP^ !  ?'2iMhXI5ۣ L3 G B 1$'nN>_] 4| " R yb, A s  ^  6s=\`v(ޠmݥ\ 8  { 'M t[ h(; m s` b; 4( y]%X  6ݰ>هGX !i1 u- ` ] R1' 4?)EM:   t%$P .2Pg9 ZN[jz*/pNC^[ S8Rgmi f N 0\A0-NC6VKNq Aj~#9Yr>jmDD܉וPٕX!. F Ov=3 )| Q 4v &E; $OFo  [&r!զܵw(j s0~[ c~ R8WK`> >y%J .[Q|?=R؁ԒE#. Pxyz< j O$ tc}e v 7$ 9 {K=*wT" @ | g MmI]u  bb+O} N5|پ(I<(- nv6] HJk#7M ,@IzY 0$ > c%e7 ` d cx8bHؿh;$">w0luSftHzH/ dJ-] s 3Z D  ~] 0 ـ|]B}&lD4aI V L!}O V ' GQ x<w ]}v ,( o Y3w9شנԦ-F62T sثy` K"  | 4 ~ '   (DN !=) !ly|'VKz,ە9ь >?A$ jqE dC$"z A 3 xFXg ( m   p 5! bN%W[!m'fޗ01~D0xP!ڜ#S'P  5%E/ @_@K {mCzg!0kA]-s2%ɪ['} u# ,)wy| !o Uv?   B.Z aLF8TkHךբq;i9x:M#=cσ@KZ([ 3! vc br t%Fh(=  0,{:(5-V7.:*,m ^ҟqq>  K.5 z Zb@Lj B wx W#:cw/gc%װyܯ#$6-F5 чt gXl  \ P pD `;_!!S}%vce 3 Q0ߍ<զ03&nFO4Ȍ'K=:4$R  q(e<$!K %t* KsQ5,߰>[ըҎ"s3-%Rɓݺ ~_$n^ AJ  ;   Da  %#v;b "  {; zZePv_2|0@*T" (P˻Z<ixvO#e \ Bk I  !Y Y +xQso ) qf j~c lٕH1r/_,+& +ۅ5X[m Z y* V hYEdV[c wbxZD&XO ;OߞDCץ )-,K+~r݋W *8u@ 7  GV z }@,{ H +Oa6T:`W#x,,.R$&nѨ;7pCUnt|e ~Mm N%7 *?X!=?Jޜl!pآnl&+,q.ݒӄпfgl:IF [Xo  UU_Zzv-16,Z#p+-2,! <1μ۽F#"`F=  :/? 4 Rn3@ *AH ] ](00{1 N q- :A# V&`=ֺQJ"*,:RA,2 j$%.tW&}1+"@ :  Z! q >s[( r#I`Du݁B٢ѵ҆!0@_9%|Ƙ |/%+L/A+)#5< ) O  [ ^" ? x/N-@Yע}փ@T)p9?<(L՛ߕ'k*,-b% \&e3 q<O   P mHk }KӲ>رڽ2&-Q<6Xu Ҳ}ya")@0/l& :4a]: ~ 75D ^q%}%+,=(r!3E=$Dj ft{  )&ou_}]1jI̫,ҶZ=-O>==+z; ѱ7$ (&#I0 M4Rt7bmPo v)B_ڜ1HʅˤRr-&a:Bm8* Ւ1DH 1H& q1 uQ7TV mDv){_ћб΀aAZtfx3.96Y/O)j b|߾_= G9@ J(:KY | T S !_}lzkљl~`S8 6aI>nq64  "  OP M,pA^&{aw!N6l V 3  : xa e B [ G  *6radP'r~'zTbn+q@:[[pE  | S  X 2 v%p5lgxe GsK}? yvbS<[RsAlS%}4RWJo`b*?#;r$w05V~$Br R-RqqE6COM6a38|   0a@T hJ) ;p uWZUXWP:y$w)OppJhx?s 9Z$`E@G[rERi2e KV'Hwf> ;~Ls<Xdk*zruwRAgb\~LH)49>3! J ~47*|&Bu,e$_?#4f3Iwn\M&7'DXcdYI(wB8e(m?oSA.+(!+*0246?=B<7$R ;k.YWY8.=^61U?/n `Yh8 QD [&S0vg\H>2%~[7Kba1|M'Md2#% vB5o1;81tD ]$[g5W9 vobN2X#A n>z2uPU{>gg:o.GTTTO:3l=vK{FW7l?gI2x{ib]PSUIKCIZ]_d{:Sv&V9}2q7+`.+! X)b#DdQqK#}}}}#(2-&DPZb2x\CKPs sC<lo8DGljN\K2=_4>%/_U F}PdXNX]7JJhr*u,hpYpe@$XP27#%X*1'z)+(os^ r %{+nNC =$ n  \'y!F\#/]?P, 4dg>v %3hB2!]  97 %a'9t $yNTD '}{P Z ԡӼЇ'\ wiZL@M!Q O$qi/xaX9 s~Tj+-p~ O '-;Ld HuGtӭ27 6ߩ 4T-^`fZ.Ed [+!1>~ St[  '&^oxq`MٖrX!bшH)4f-g Ujjla? 2 R`!%o7AYu[~ O%7= F QK{ޜyNۘM_3'$_q _6  o~l \ !>FC Tq 4MV9Eܑقݓ bo=fl  O|T5 7 rI'nN`N:_7 y~T$|h t8 m߅ 6(~W O2-5~nY : A E>KY^=X I UMuW, g Z V Zz@e{<\S#PVSVgq7Z#s<5l0Cui#~g]SN?-+&!(+-27IN[jt#%     *%4FKKURW_ggigglddZWF22-  %47<CAKPWURHKWPH>92//%  %(**(2/22/7/2/*%(%*#   %%%-2-/*/24-//((% #       $$%()(+*0041<7EDEAE>GKIGLMMPJJHCD<@8>0295*&$" |rgcXWQE<'5+tJ${ | 22+$8p 0jYKu X\ } T_Zc <M'TH9Un'c 7H^jchU:r$;Y~H`W y@$+\N!}SC9? XhVN-CF#;~bm(r) zy}<#jm)4IHhl};yJ Zq#W ,j;DufLL bzu!6Ja s 0d 2uc`i V oRPUTpRP +-[AؤqӕшКY c 9&$ "S$!|BB< s[ K85T S2!!$!UBGcmv t6a9[Zxn߹ަܷ?6cL S u M !I?g NVY*$cF 'f"n` & x-PW Y^^a}EڒkҰ.ԣ{BFr <DW( zZS 5q h @es!"! _4U \_$XtE4&2fn(Ǭȼp|Flap }&%2 rm~  )? Y^mg  +oIpJ-xxݷ(DǕyخd"$;%w @U"y> S8or: {Mt e   p   e s k 8 EeqՏyzɽȒǢE9\ ""2tH=EQt m k   @?{~U .  t?kWg*B̮˜Tѷ%E %# <z N+5)r: E.} Orq % e  X5u: C a|vh :+K<ϻ5@/njE ,)VE\j |N c ( EtX ' { _ - @ 8 _ <  < & ]     h J @ u# " 9 - ` ]FTt<\ӗЫѳ)2ݍ~3Yj!v sL;K:0TY%k 4 ;6ku,'UFiWUn~ :   y Oa:-ׂ '1tcGWBiO <=)"b!!x!! )sJ t`+X!0 J m Q u5zO!%mҕ n)nrXj ( 7"""#!E=m iu] dA   42}nZIz'ҋ7՚ؖLP_ E4N !""t"!vH. b \+`{IsQ  l 3  2 X c&+dqT@F޻ڍZ>Ի6%՟<߹rJ >Ag\ !!! 'o\) z! 5Xq{;u g y K.jDkKNgU-_jew"PS? k [o v! )P?P $r[?lF<IWH 5 Z D m3c0D:Wx]*%6ک׀_ը֚ڼ HSD T 0ZB W U w]/Kj  fe {2=G;Y/_% X } K 4Rpt)v2&pm>?M6:~i- ,k  w0a / =~7f ) - E'e3-7qb u9K@aY?I4Ynxh}ڻ{N:ؽ] wF m.A\ : /m.Q~  N+ FW 6ErIHqq@%c:ުm ":Pygj{ wi = ]`/W%|BX48`Kx   8+? 8$Opzz1yPWo_3Eۢ$ښ^NwAOK\x G d:YX?  n /\RYhQQy+^zJm K(x^pr:2ݯ\ځqBV,1:G ,b Irv.:k. x %j=0!|EwY$&sDU4&Ol߈( ߉^Z\ "[V8Q[v?-}w A _@8y9\ :`avssx1LݬܪXx:H$.]: @ pt?v; 0 v N86=~ ua z {#7Tcx 2fgq $_ o d9Yjy==y`obb |:R[+mq.n^&8gSlߧ/JJPG -t.t7N Y }V K F\6)Q0G~cJS(< | fu.߰!ߤߓZ=nSnY rlS\ $ ~ 0 r  G=|ltydCX"5v*R2M6@wY/)H3%pl^j LVXIFY(; $  h OJJwEYh0(RLPRG?,x=Z_3#ލ_0,- MlU}{`>C ~ X m|H,o QE46~cyo2{2,,+ >fS߂ݔܰ߹_ y ffvWV&T= @  q  u K $\ BvQܗe\0j>8 w <6b( 3 97l, 3  q h4/VXC'&5F#GA}{V\ zg{w G 6 c Qp9H+TX; a +Q0Z|N" t 9vh5;;?-,xd(L(Sigx = ` K=dXn@ &"-3wM eBC"c* O)t<'_#@l| 57J tq"R)O#e [Vf bhpt]ooyO=Nߨ!ލ'+j 7+)L{ @(n #v d+TH I! <G  |!*TTT=tG}ߖۗy{vRڧ| 7A7N _ d>N8~A V %p,^@ lo&-dC?][FY]sSc6)~ا A 1Jm!UV\:--7Xs$ &+,)AwJE_DIY=E^Aوժל=l(%z O"~rKb>@ ag  a T % $MMdWF8)+- ,S6U ֈiփI [!q? j`-7<  M &Hp?+ ^ > O+D=pc+^/4ٽmNkۈ 7 t "S!ugX\Mb}T2>I H.baS8W'e  +bD&h?hSۼׄݫ;dB&7 !$# a ?94}MMRQ{ {0$?4dI  {[ > S_w.H7֘׹}sDQzmC ) ~A@S{-U;q ^}s`=jL!K)X ,|e~h 9 1 +n7?ߊC>'E q]PEL{9  # #6!Z:" y0D%o4.Z; !$^VZ ,.XUIaT O "`vXDH SU ؾ,1ִ6Yڢ(Sx "$#/ F-Pyv<93 01%/ -mn .0A(S9  , [eC7^f=Fپٷٲٷ4زY2 u|d! "> U  `~?`G~wbN \>x[rR ,%e 0x  X!(6x$ 2ٴ}Udu'}l ]6* h`g  jc8q*aIW s o3C-n  D > %  hSDL.8xJJ=wQ݈.Nܺ}ڂ-ػתg/5  $lxTEly5 P d N &G `jq+L pN7e!Kx>t>ކAױ>DB`|/Q W " 0eND X 6 Nry -VcZ`VaJE' ~Yܡl5ۋ݋5Ow 6   F K 1f@>2 <f -  G  j~tte+Xg0t5*?}y0 i9d +yܦݸN x6 t1eI]- K ' sNaqBkf J:$F |8L L0g5 l*4\zcRF#  FG&B! n U  v A `UMDnL z 7Gb -  e`0%xISFO[=g}Pu 3-^J (X : { - W ]u Zw F tB Vo![ 7sGee NS&D{.&r% *  X N +   6 spAQ~Wn @e % )Y@|UqlKsYSQ)b5'D 8 {  } D 7 g N s A_j= wJ,Y GE) T[{MKsa<s0O]]$8ZZKy+E% z   ] g A & `#(}b2& ^$ M R $=zhi*4{b*#p-b of_Q i  U F } U } f N/l<-EU +6P ,= ^k`Kns#RB!M@52 U 'UO _ i 0v`A  k 9A45# %.? H TO^hOJSeG!&75sY`a;OuU>^\BC` YZ D g < J [{"MgKvT s BHt{ . 6G~:8@=kE  7AhDAC[6ߚTTJp9Yl9WwB(  v F &-]r,#(PSr lX0 |)e5' P IS k oq 0(@:o:s4ߘ'^"V,<9 Ne  w H~cKQof U g .jn v % 6 ' m # gX ( 4 Cpc5'tNFzpoݓz- Y<n - M$S)x}XE K   / i Y ` Tq ' ] g0?? s * > YSbBxs`'~hb}dq Vl۔[}3e&u p -qNF^8drx x X a es<5u 5@^ n  > : QL&lg ]@m :Gdۂ٢-a^ eFx 2>My{ Z> VDybIw{  D: #0 l kWA n : ^HPOjX0fMBYkQވ W% X8u#a  N uWHn/[ . D  @ h(FW$  & :  Pd n${q'6}"&ݡ|-(j D} rn^C_ #jW , [pb u C % B  z > f 3 t)I TtL݉ޞ:c8 2YzH I0  ,j.dax  A%+   i z E J  oT I& U!z7ߊ7LE +uL , .,Gn h2# m`4u \& $ B 3{, {s k   \8 []G03LIXlrC5%ߐ` <!a'q( aqa 7c E,v  3q  , 2 ? a lq   w 9=+JP$E[yDL{hM(ދߺd XaUKumP39 } (7;GlU c3 w  m ! 1j;v Hn 3 N . P ~1171"(sd ^QV :?_;WO%2 f1B +'wDsZa J  F( ` [ w r4 R 3 ! e PUaw$ei@IWdkI\߄߰/M_=#F dcb3lY 1U q#k    M8 v  ? S H>p"z0?_d#o M7i@ebZ6;6 E3 JoliGZ7 _l: NE X u   B g =  y <p9{ist?OXL!NXP\| )\a7 74 )I BpQxD)  # )  N  [ EAQ\ f fF G kXZk 85v( l)4Nw 9 8 6ru'1S: a 4z  9 ?*eyvYk`S f P9 # g F 1 n2# 95:n>@ Y0=Oy,T}gYfD1  G{p<{^ 1  < a>[,6Ex>C! Q o ( n{  /n} /<_[,(}B_p o g{ 0  4 @ I }'vLJcn^z 5 &  % `  | sz m qp@(\jv:q,uz.&}v d:1%pP N q k~}   ! y 8  ivi =  6 $ _  bKd>A([Y.:G?gd$4*H%#vN'? 5 # b UPgt!w H \< X { -  ! O . {XCO)I!N'Hj&N2m"4@  T 7b '> ,J~7#!]obo pF ( b - SzUg! 5 [ r  . z  - s5n;,", v&l=h7+e&nj%> L t : >IX0#:> F i    B  5 z((g7a3w]x;o5vu,$=G3J|teDARl$$hW I h  .G<dQK b 5  wA9WV n ? * c R iH`0%v.AR06 A_j?ZN_ V^.y3\.snu  :;toNrFvF%(0XArDej< j/yw{7S'R3LMV&"*d? K  PKE'TM; 1;YfrpWOwybX c(DnRfj86K b w   $ D umwLI$!IgoeQrd>\/f"r-Z-^tgP9$U"H D~L,'FY m " " m ) 5 x {UMv?vl<D7VS"'mK Z P % {P rG}~s2OsWY`TesH\ )~iq)k : 3 8 T B Q  99QoX:.5VbV5BSjwJma;}JVF4YDKFCTcpmjvsC P(; V O D G S |bN+otVAQby lE;r kpu!bE P&gNX5%?*&^l2 S X   `  x U[JD).5:NL'  %h>u Sdr '`b: (v;H/n!YZmD  y   S  k~LyN.$+L`oGO).`dIHYLX8+1X@\"6 2 < 5 d D 4k$j ~J L|6yT3U~35NfwT@4BM%2!i0ek6\CZ  + l q966m^; b&!y$ew|.GL8m3wSF A@'J0qD5:VVX0="f &_Ke.R>>fZH(MW;fJSVK#\4o?qK0bnx4z=L,"^6w*'Id3G9s%i  4Umr )Qv<9l-gN<}]FC #ZzY@%4>xinva}NJhH/49"Hf^2d\L!lF#5DKD& :II7U92#z(_q0q:9NKj=~ !.5G`mQ.tQ5 N}K2glS++~~nK27:Nd__?!Pi~ 5Qv> X5! X%vUR/-vbS:=BQeebIB+0&+-&(&&&(BVjoj*2ARg}}qlq}{nM\ZandaWZZ_ZaWK># <>9>A9CKKMZH-%       * #  7%4<4AA9%<4   MaA <F%   %# /  (72(     #%                                                                                                               #                                                   src/speech/lig_stepup_peg.wav0000640000076400007640000026525411021605426017474 0ustar polonatorpolonatorRIFFjWAVEfmt >}dataj   #2<7,//2)#11!  .$  12(:-")   # # ##   #*#    #                #%#( %#       47**F-2(-% *t4}vC992x9[q](%v--j 4_ FZl-(y&s-o9qql WHbKf*XC*Ng#lq-f77{+\Rt G\ q`_>FbId7  SjsUXT0FSW0nl<tZ/* Ad(G(N~q}S4Zq`&nPX&]ZU:/PAbUg7?($sRR[+w`qb*~`j[lx ]PvZ '5l-KMd0(5=l{ZF?I R6-A(&'#-GIS  8!&wgei {)W0P1 l 2$^dN<c0j[/7y9:t 'O  nOVgV %O+[(re+ u{/v Z7a7 A3 (0? m )?U B{>S ZH %W3 % MNg _{Gi$=0m  ~3t4 _e{g! \ N\ og/ u@24} ~l} -D +bi_ 3TjPJ_R g +w!_Dm qVS6~ a$1fl Uk XC D'߁#32:Rx$MBlzb h/4  Ad V4 ZNd@"u bG  Ja*w Z:, W2WS x GX ElB1 J Pdyy@*Z IX ai X"P];;4& b'/yE 5!,K p>)37" f^!e+)te5[R5nL>M GwYu-2 5xipC `BP>J ^|tJ1II < #oa wGn Q0"<^H(fmN#޻\ k 6FY %w}+B*  %}7У@'޾ s4 '%*o)&C 9 x; .PZRZ-9}$]H*Q {  rlH SJ0w~7Uy+qC  } P %Mn >]PjR *Slzb^GG(= C_+l8gaq&_#FiF jXeq`RnZ}:X-#5HU#(f{yZ`{Ix~*//- lF2(# (}M qU-CA< 2 >- 7( * # (  #- 4  #           %* % *2*-# 4-#/(4-(->%81.))""'"&#$+%(()!$*%!  /- <kf*f S.s1E8?- W>g<by*R&d:  l Z~FAv~0~Zrb?2=XFMpyI`rZv9Y#@XT)A (0xm& ,>yqO] Pd.  * = MOao m N  8h# ')q  zz, I  T#-\x m }?c rl+ Q{8Lk gvbd_VtC?pD`2 xn_nI/8+L26{}q7hrn\H#<L3Oa  c O  4  4 ' . VA`:>d;}YMXeDF`LC( ""."  b!SkJ ~ GQL+Igp m . R   Bd\A^Zغ ƕGS/JC! [ Ft ?<<\]&K LZ, x m   > 4txTܢnӃ/_̇"zo. m(*$'^  dUJWM? 9N} {~  p7 ?dY<4,J3! 8+xYVՊ $* *&.y'uV$ {:.l TNq D DAM>hC z T  +?-r*r W = " }5a[9nIӾ `GP+3/# , ]7fF x)FHQ^ Q  F| .vsFya1CLs3u`ϛTVЖ,W50$ 56ed Y{,  C Nt@Ge c- l } ;pBNPLϊ ʔ%*]8I9.  t{imO# JR/Lu a  ^ KC' $B99R' G im~!aAcPF.Eʨc5,;T;0!t0-]|1IMO# 0v<` |eu~_, IA/qjnKP( IĶ}˗5@suoi;(r XNnac# 7E yjc! oߤESӸϲ#`-+!x:@r8zY SW   Q y7] =YP  :+bDU&(T{ڧL!nV4X%)S%).*vCK RA  | %b])XY   W xT B #!'nD F>Bң $]% :(]xk: %+LO k  T 3>X  2 {D s fV | jg>)gW܇; #' [#"mGn}|   [ y P v U 6\%>A ` 2\o|M@%~F޽܊r׭ IN! B ;1}-/2 I  qq  Kq L/ml * !6}Gv 0ZAm`"5B=kNeXu$% o K_d  '  W 7  Nt t<lxnGPZPڡտٶ^v !<bJ * Q aZ, J i  nOR    oL  2 }.Yx !P(_Uށۑ=T>65   vUqGTdߛ<٧֙ԕX. 6( ! &  x'Y daW$L #  d X ?W m t r @ ] +S O :  T l{>ޱ݁ܳZٯוծk Z - sL  cec (  s N^A s ] 5  B  9 Y f2M.r!xEׁqLRAw  2v~13&    ~f J m f _ H\5>ib4ظԇӽ՝ R 6   O ' l?e) n oAS P [bM2$BZP>_U=yVV+M3GGS kJ`LNuxxyHen{77dd_R2}W'"@U y!Fp M[tL b*%DUS5 *]yJi:LmzP2dg?g,h+I:(eb7 hD1gZi] lr2ځ׿mOY1gj T }V$q/ f^P!iJC }Ky} !q;3ud? k&~m_EZ[ ))bٔrAYX lq^-D |HCAD8rC<^aIx"# R' {1K!D4o  ޥ۩>`;b / A /|F<|  n;_|Ux+J =* #"Kp 4Bl$.lCnxhTdܥټן١x q e 8ctEu 3D('rT @ !"; 1 VxZ$!ijL߸ލZOڳ+6Pl} m 5j-&o "AEt 0&0 `c2 \!GS# C?b NZC%߲0׍ߌG#*1F_2 !1&  D_P4|_  ,Me_AhcaLU{ު]c֐-4O;ۘލ*O OZ7Beff - , s M t q :1Di / R#JjFZtmίʙ ˦Ak=q>  j|xP&qC Dy p 9 ` & Z `Ds ):r  6 d  #n$d@T^E&з!RϲrExyI?#E 7  !,/! L \ o 0 ?z  RF !  mv e  L L ,R(ӣBB;=ΜyJ ni + > Ja+dJu Ne  R o { e B  S V ; : +v Ce ! 8  M xLM5@sEʊ͒ 7"U!D K7/B{ @ ^ I I  7l t H: 8 Q  z z   _y'7U֞DέMʲ2̻lCؕܪq\| !,""";" )}-x  WW/H9I B G y . r ? 20VlBXn̠0]q6oߩ(x: }) /"#X$$$# "^ r{hF 6 [ SMR*)O;Y%  ` V B {1i2܌ϨRHk˫̡)~sy%L &Bi /"#$K%D%$#O!LBA 6 G ?_UkEmU25D : |  I [ \Hj`( ߭h8v/˴(bobh < 4l >"#l$$$#/"V oc7 , l_RJ /qi  8 l K"B5/߰۴[%̔P] bܛ.b =84!"#($ $d#! gQ[5 dz>C H Yf# j 5 Q s;]57|:ά}Ӯ֦J-I AHc!"x##p#"!g s  5 %MCF( g t {W^4Jߦ6سԬ$.@VC#` Z Tm3!x"_###"h!(@ f Y 8 X }|1hO;hcpixj^/ptul<٤SKҌI:}D:Wnu TK+!!J""@!8 2a[PnA 2 dH\J1mEWJtX )Ne'Ss}.jOOiڟTߍ5 +t @  ^?!  {MG8BuV8@/HJ`wޤ)c|n`hN E\lyfe w =a0@fyU%' ,! 9 p t .  X 1NgC} @3}8YW_*A9 DY V v}qG)$,g( z H J y  N *p7-%i7HJ,V=%"e#iMc-n>4 f(xj  D G  C   Y " x\#i u H 1 '  : x_pG[L&X:CzYp'YMe^rcI!Yz_t" m r >  h  G $ $ - V P00Z h`zY<2CG(x5)bDTq~cH\,{tU8u F   D 7 N r  x}%PkW_)NU-+]t  s14{2{VO)Gx9IqR#3#L & L  7$-y +KDq.iFL-H\hgC|AB |hLIZYlxPU>M  % p~ ;Rt `y I-UX7m `"q ZMD+Y4pmD< a {_s Ea j +>:Js ( /i  iCgQ 9O {G WA5{ #7}Vh 7r /L~{ IA*/ Cm5L1H l#V % 2 ]U=L@9?bvO    n  ~ q2Fn9 / +^ QO1 *GD0 J Q2<d / b7yL0 m fk $ RS JU YY" i & /Z H6Y , 0Bv b~CCk>i\4^H"EIVI5Y 4% cL t )!FD=&e#7 m6t BpB=M"a.jTQ vm: '%sA|79 $ hL 0?{(bWD9~:s Y Se 9 (g.>_6:P\Q [#GeI+A{ z ? f :; V Wz  m'8 POwON= o+ 0 * L 3'Q e L@rCwJ|U1 .}[VW Vf:DQp5R}`s E O'H/C i\Lt ~63Q6F7# A3 f r mb^u_x` t7\A7U  3 &o` D v)!%zٸassXhEGFW#bh*sZ>{ Nz,yV  pq"I n z1 [ 1grX  Ynwrj[y_2=2Q0FWV1@5T+N9dB59$x's\2>[ZU FP4e<Z]6NwKJcvb2>,wd V7A5`nF1vLRU}X:<b-RQR#N[2W9M/*4 (%4>7(7--* KC* # 7                        $* 25'@.=3C9H;P@L3OCRBPFS@WKSKUHSHMHJ@D=B551&% jWX{#nXE1|V( eZ9g 17.e 5D^K!E2&sJM ' E[>AN|D( ! V \ `J1 |l# d%bL#gbSx eq;FK,AMJnNj7SN8]*:Pu4q/Me@$V~ \ nFXq mBuN , 5 Zr 1m E 0iG"Ga^X'0ҟњЇͧn<nhG =P!!B)Yg #!FYa}Cu) V~!u   /9:b2N A'FX0 }G[-bC t 1}< . ZUD5(% 0 8 mMMCc KJ k3Dϭͮ}k!b" a]< 4c^D}~i HeqYQk]h<i^ p,sv}y-bRA(%%^,*&C ( b7n{;av9j  U Y _Iz ly$y٭ԚҰЮS ij`o }m (,5*o#}V<5m(bB (x!%%wHao q <(GU p,3} )0P{p R 8?!txx {X_!I a8Sd*0jBl qQ  Ww:e i 7Xti1$ܛ qֳѱyZH\Rk`X tAV+y  c*N \52Sanߙ)pVυw8$ ;k$ 6Mu;e #"NcqX QU D |("$" |[ .,r0mtߴg03  3 S!2 J$"A\0l- -"#" l,r|%r.s>[ aI8_ H%#Xcv Ix!#$PC@ R[8ks7I g_ 0P8X9yK ׊ 1 ]BJEi XB#?v#Y !xfV""' vLZUsgdc%u5gB x)%)n{\|Ns Y=A| z   *@,k -qtPT nKSs/q&8ד8/9EXh I$  * 8<  y{Na A9hf0{JibM$gӌBJBD C/o hk`HB >i( d=Z޾ډڢړ՘ӥڙV gH $M  xF I HFiU n"zHH>2%#/<HWUURA7 %727<2/# %7AHAFFMKF9- #  /7<7/%       % -/<797-*%   %----                              %#%%-77227<99><>AA>KFKHKKHHKAH>HFKKHFMKHKMKRMWKKFUHKA<7A272-#%vjb[LL<:#+{U~+~#wSHbbq0_b?qgi-?N])c- + fz'-IqFgLq%{-)Jd_PMA  : - U S < 7 >|`2+_R~sf|ݡ8J 3/j(Q b%(P+p! )  LjiM5fl e ? e 6L#),M:Opۙ~  r} U O Kx/Zdd|b/3 i%P" w b@  3Q 6~ S ils}(,5 @yF\~&߅0ߒ7 b?=M4z) , E2W ,Q8im t WL&0w^  z6v݇HۯHO #" T2 +A q>"! ^eh { # K  HFD jWR! N  _,NK"ܕٕg߹@A"c&!d@j=2 w , fy O;-'oq $2Q Q O e v s `GA8>8g>&*0ZiC !$ x"jtIJg M;m #^Os3 vz y]Sg& b Y L 7xdD}ܢڱgt6y K"#3[Z _ {ZjN >E-3  &V j l D 931Ed}=sHyC&ށs["Q%O+t@ZG +d d{aP&X # % LW  F V d6Ep&49R'-ޯB?mU!F?L% }  z53x :Q2le ;Qm'mP%  D Q : 7}R5*v8ߧ($ Bb  q&|CiDW *T7y qO2,A~ 'h - }:F G b e  : {DE n\~04 0jq:h_[ g|VC3 ]l! AS4pA  yDN ` 4 nH%"vG6=rGs~+6 "WKc $ {5 U|Hcc ![)j L-Dx# $ 0  @ c s>IR3s Z'5t">2rEh 8 Y9 D<[g~ Ce2 \8Im ^#=:Y HLg;D S 3 6 ; In'%T}b]YJ.  ED|Uo R s o Uj)K  1w?2 X > c &  gan1Wq(9|&z6Gu=/9Vg ?2+ ZWLi ;G c!14 {ABy o/< A   ' V 7wN , KMhF 4F #|  P By+\^< b }Vsn}S af:Ut N +o&k}4y&QdmB)4KebLMA/.[&IA X?y &.w`B X3y1T.b+tL<?<nSg?b-\4*244Hu*R!?Z2bKFZv !&2AX[XL<(xbN5&s_K/~tqebVIIIIISVVXVSLB:0+!!##&0:?BIIVbt/7ARZbiv-0::<:0&vgWF2%#->FKWRWMF<92*%%*/*/772-2/*  ##  %*-*-% # %###        !                                                         ####%%--2--/(((%(2/((-//2/*(-%*(%#  +'8;GGV[gjw| ,,.295A?CBAC@;A?@C>@:15+#~o\B.s[>%f@nS!~[% W#[" |c5&e cbvlV r #CrW# " ` Z  [ @_xQK(`mLFTO+d3P\Fe.isu*[^?q3xtNkn<^ :D%DDKC% iS+P!bey~h!(#U# 7g7# q C7d 7`VyLg([NFqd+F(  Z!tXd'` fVzHx=lRXb$F\Yk_q[~84[mOr)V c 5   8 `  = c O j xb^V0#E h9v5AoZ0OHv xV   .Ek V NN[ x S -rXn\A1Mjhr7VeH.%Z\5!N $YhK&=1o$He K  , [r  g  c a  z '  yX\cZ'1uUt.h ޽,llmF L 8 Gk) ^FsY !   " d<$  ) t */LIbax~dZcBܒ݋Ym^ G ]g*6 c7$dz ^VS" WVU/ } ^@ LryJi%E EBA$4UN03DLy@E aCx/> sQM P$KwZ k X_K04h0|"y !j[٢ > s^_qq Ii&e^| -zM> b Tu ;W/ "Pz 1 s 5QC7hh߸0i' Q ]-I-T'lO` pF.  r4J= j1OK(v&  p\6 & ?\"&ۋ܇޻Lb~/ v nT| kwh PD` &- )dd K}~c h f <%vM@k8=n߶ޠމޮD`1 jW/mTSB2|BTMtu jRb5 ( `st X&]FDFH+Z&2yoI{N yx bi71l5 q ]Tw )oPL m  +PPAyzDwjN8UZ7߯ތߔ | ,:[qEP E`Q xf1 e`r v ) Xv}}bKO)j*/*H`t2ۗކ> 1  8?,Ua(o 7 O z njb 3 ; i ">B V V/\(/|DpXd߼hfY2v~y vv c &NiD!,PD   / V_B @ T b |  U F  3I > u  g] W9jNB ޱ>x t _ *l9{5+[Lw   Y f  Iq &  3 Q @  , " > t/R<JB3Yy}VmODl ( " 1 9 [oLU).1H~ M R 9 a M bDi<0ql4!,rwwQO51cDS~    |&&/=3I=8v J ' / ) | S-I"hGLo n rL3?mP`Uo]2:Di#nvILjl]N+2/v:}Z R27AaD :qAWdi!?Xj:S||lN)X(i-b7.=MMb_kfnnnoii`]^TLJFD9>;55Fto\]M~ r&  YYA{2 $ xVE[!C' T)l3jnp[oX2Ayn.T K*9 h g XU<R#7_8$C  z`oqh ? 15oLX <+ !R:t <g . 2k]qm,Ocp{7GA_ G . *KGfD7   \(Nnu^2Hr`~-@v   ] MK4 U]qd<X= r p2B w j ^! q [1=#u}mg5*@ ng m{  (&M[4!g!3NKP>7ײi*Y-&1 lu^* X z}0>:!  I)c / bbpI{ -( .)bn 's r  ? ,^ |r .h:5b H9|oԔ('.)UI1'8N9 e)> 1',q\  [ y Nq Rt:BDN2|VJ#-תt)۶V^#w.2*.u&lMXt-  .@XgT* Io@~N  ~ y 0t  [S&:#x *VeG!rg WP S { D * f}dnWp0AM9ݰH< Y,B55t*AڄD? Eu9a=q %   S G"  s _ F .xav(McsfeM'1c6.W މܭM6h $"n&A   t  +86 n s _ b . ? ,2K_<  "!{i o4jt 3 < Nj    f Tg77n+K4-4-:O<͞նm*2_2+AG9%&[  jR!L ri*O C R =  g 8{/6Z*h? ^(݆Ԋ= %Y485r)DۋO$!j{7Vom  I -   O m 8 P & (j)6uyg0vjjߣUjd;E)5824n0 P}* A Dh f+z se%  *K D ` _ZJYfSdkL"%pO -BJuG\7oŝ۩P NG %.$hRa sA} u uz $ J e 8Q46_  : 7  >,nθΡ3-صD8FG:?0)]UŌ5Ri d '|)&"<h<<UJ hF  d gBd "* { # B y?nTu}rΰH 0D&KGE~3:-:H*)0V*; lmg" )O9  Uu :z# N R m+;*ҼA #a  k1F)J@,&F9N}A5.g3+s Z7  ?- )aU! g Q_w; ! 5nEGIwi ) Z.3  QAD ߳iG 9ϖRՑL$CJTA'0[(DF܌&| 082"Xt3Dl>WN#q+ O9 rR $vݎN-kо)6ԙ, @GG?0 d\rט0u P,28/#Ub :GW=  mNd   y 8'j   \ h;{ts 1Zx"ϝ<)ĸpN:jD<=02"DZVܟQH!:()X'!1l\wKK\ "|$#2"Q S N 8 ) QlHh!̱ă¶ŭ !9a<34[( Tc}-d L"$$#F!z !4K!%X'%#8",u SEQ K>ChՓ1e͇˃Gĥ&:.*m%a -1/5$()#"x {M\}G 2M!H%'n'&+"Y2( `u2+PNe*r2CʯÍ2̱D!b"!$d!"YctcSV  u !p!`7 Lm  #%$#G^W T1bV$}_^ez~( _4lF WQ %r*"V  Bj! !ލأnGgM QȅǮdx %,(^81H+) Z?u S M ^ $[ =_ 4V(w fB3{z;fĂTQ/. $'H-  .K]hjW3@  N #@xarE 7)Z ; =\҈Ș =!zD$l" D UXEam  e-xa@_ ;d #\Y(l٭+ԅՒB b  p FGZW aA LL Sa ,_!y5j  C ]SCpg ?OXAS  6 7  & n  @ er h aPZ yS?u)XAVdPJdE!57K5Lk, v]N=J _ _ J ,  Y :D}m8=HyPCWt [?nM47s{&k>`RRXqn}X/\Wh gKW%tQ7vI#d4R.H/%so>xN!=e wL&vXD+lCoD gN7 %>b2K`v-2F]i{dU>- vot`X[X[bl~{ *2-9<<<4-##%#/9CHAFMMPWWWM]RRMPHF9<<--/*    #*((/*(*(- # (%*%%%    (2--/C>CFFP]RWW]ZHFFFRKRKR<A<79-~{:Gds t 4+vRy ?* # R i$A 7 D 5j,:F_/{Hk&r[{u_x 60@MlMn\^lRv( N!%%"'' Llltl{q~R#b:VX @>xAA}]Gsb?0yHVAd%A 9b.KAD?7FbZIqCtAC>A@# >%ZlqKI]{L+b{-x gUq# GiRj _Aj{MqC77MD~b|g+Zb#77 >Hz;BvGBt>Q_KLJ_iq . o  G [ E  ZrP'+Ope=F<+.E` S\OyG* %ob5wZ5  H -v]DSO,  fjno*edK0ߖߞZ6N WnNj C LM?"qOC Kw"|R" !R]26h_ + GDB bzT37? * 0|+~Z D `U1XF.7l_H@(> z ocJ  1^߆ݼ0!i:FR "Q;u9 Wj] PH.n| EC".T@TV@:a>p2\**v !0&+ v!~yP"1 j (-',|-; I6:ݚ(P|[ =PT :@i7 pa!<g)1|K !0Lm"F 6r RU-q{S V " +-#t (8} H,hu1|X, 7u[ #e2xbzB /y7*f';\ `E}sf L v8lhUJ] DZ>d %4[I1lG9ISD=G2 ekq l ,5 #K\|K\ 7}ct-{x%^~ p6o}Qt 7 &%%  iJd 3"| 8Wc~ wyUIWev]uTmO54_TNU\ a} qa f3yKxC R xCYD | "TN>&[tpHl ySe l98~od g  !< [ 6RD [#ix ag{O| y ` W :  ? y&M&/;N & " u vj6= ~T S -tVZc+Psgk;%*&}2id8V @  V /o'R#+qbL  x 5Bj9 dgpw{L!jGAAa}y4x7 J ) T f : `{#iD1 i U>-FZ}  s*Yl gEfKf,yyGGl]PLjXi  S 8 E  /^?-=D c    :ftz*6 T 7 k,[|B<F> P7 9'Hu j w  y [ e ? 5#/6{oi_][gFXC_R iC\X)ki5[+B,wCOis-?pEQyb(+{ iK15^.{zjZq(_-?g(0tCj.^YT[sKXqsJ6?2d\2'd#De+}MX&? 7d @TX-^J2pa_^i8{?I<0!j& -t{6+7XGR Z!W;ed:5l0d$_ H&D- Pw2:_ogegv B&~xm tVGw/D/emh%  ~,2 J  y(PU6dNR<x>h[ }(c g m}b  k .V"F p  U ,o?K } E 2ZE q} SFX*/_ipLURJ  d("; [L  U8] !` # [3MIfgXY&0]! - jH - B w- ]~k1 Pyt2bL23ZXtQW9^c l Ru^ F n /OC2w >RR:aK*U nc-ld n?RGt IpxRUzyR C3+cI $gD* &C< fqLelvdY <5 {o&-9w'V$v8'[7MqMtj7^/ lUKB&D0HUs R\WjTMJB]0 ~EsMp[_T%tZ#t5)GQ/"H <sdi*cr&\0(Oo<dZt)Vn e V/p 1 46uU `@~rG 0 g Z wpms~04Tr O7yձ܀  l $  A=-I h 0 u 0 y ! P ^ 7[.)$x<7Jf(_5u'j_ 1 s s) p _1 j zE s _ * 3I}z^`j0v[>&޸٘գF׺ ~  7 [)] 1 m ~r S  { + $ v& yY\RA p^r?*(U ٶֈ&7Z Z wT8 F 2 [ Cu  4  _s|7mrL  Oc۾לv#ؔH^6H - g v 9 e L/  " .  T}h? j<^ p R  u  Ke h4hց&?ލ|m)&} X  Hj&{^4 n z Lowj/[:)yv$~y=-I+@ E K  z lP2tޚߪph/)tv w C lk  ; o H ]G[`((T]~Pn> <>>ޖ2Wuܠ Wu uK.a!d'0 W (%yI7/vor'  w R  Q80#L~݉=4ܨުQp-3?k MGu;F{  -pJA K oZ&< *C<!7Q+ , $ :i}RuHݝ۹ܞޯ/0{hb f \_Nav ( p{ev2g<Pe':& f w |iNTn Fa k>N*d_tRj ._jd?#^cs n V3l-M E 8!dJ ]ި ݣ >r5pZ\ Dxm O 0h.29[(-lPN5/P?! J \ . ^{?++17E_`R[j5o޷CPQ|)'e]C N ;50 5 O HIiR1e8 \  i&H%K[ZmxKJL߰I0߬&zA`%]a ;vI < k }9/F&-IVx$ O i.A*:*Js?JIް޳UqJ )h_ao  9 ~.tHu"-9X~DD. 8 v? aHi&DCRUjfH-> w 1 + dq'3z5\  =IA O3E;G@4~`tVp6U6QF)Z)T`QHIb o ?#A(^[!Y D ep$#/Iu RiZ!@i>&0 Rq tL#IkREmG<5N} a=| !]>-nH9:0-!l22c8S{bX<  9UMP &]~t]]qvP5 -v5dKmpC97l(APyCvbRM>ZgMUbRR]bqnl 7Xb:-DDU7gHA%~ {VSlvggvv`bot  /-->KMXMHH>><4<72/--(  %(*%*9<>9><742/ %%     (%*47>>9AAHHHHKMMRKMKMAHA>A>92---(% **2/7>@@NIUYV^lfjmyy|}|yrsdaZPK>6*/ dJ }whWTPDE66)'!2// *&&+466FMd,uvr9mmA!"4gS-K  s\oZb(K&vbg/--X#d!ll (D7`? DI){a7P(`FPm9nNlICS0+7X0bRN(IUZ#WqZ<o ZtPeZNZ?Ai25!*!E[lB KSTtg\xT`S= ' K0S\NR4*u2~7-]-5CInNGQj-bj{RIq(< _=X>SHgs(K#txgfPK#RC<yR5 F5#F I-5%qq{Gq-+n9SXI _S~D2]75( g?#!i M=w gsg2:S-iUtX5-- ]F-l-G-SR@UI *{5}K]bFFXdSSP5X}lt gFXQW#](a-{ex%:(>! iNK2-n0 (n*:X*+vlXdg Bt<sXZ KNX79_-aPy[eUR(??-5islg(N\D{ sseg!qI5:X7k1#2RbUlt.rE C < 4 i<1;O`9r~x52g_7`d RP eoH9dki3 G d ;?p<)٪֩?ttjխzf_Aw # ~]pC  FE%y \']b| =܀Z.|Ae"e H%SgAZ-xs El 5k   mDbs5Y!B-3t F҃h$z qM` q< ) (b ?  OzrI_TP w2EͰou?/0%8'%". >0{H ue wy]Io2. zU7>hu4Dm+pגP{UFȹxA$,0/,(!4e Nab(ZG i C[Y;h g b <M/ s ] g y Q him%Ia2m|{Ӓ?ɯxe˱֧#G( 585.&A UGbYqpr2R[ `38 pf|\ 68(B*ՃP.qMǬ׈ /):rVU! 6"!z 7!\ k.( |`j:}&F  Vs[ߍ۴=vFk]ʿʄ5ѕ?:1 & L"ZsM } r #(# 'J# Oby  S2B ;LeѪe̬/ЄL %3;:4+D dd$ "!C  0$b9o4_} Jk0ڂԚϣϥKЍ6B $!/9;5H-!CL>[u5!!mPG L-z J0 <[ۻֈ5Ж'nʹʹ]~7O*6Z=;m3)] ?^50HC[ _? ҷM,3ۆ-,8>Q;'4)F 2;?L9/C"yuF U\ 7 ^"!4 w ^ 6(_[v  |Dno-׺ӺsDVFˌqZFc&@04X3-b&Jq &SPsX/ J{r$}'  vez K & < RoGN}yOӤ ĂI#+=.#,Q&Np ) $ ^LM' J l*Zp / < "  { |GRb"vڻD(ӐFUĿ"`ޙ&**J%qf 1xq6y  d;v< o  1^ =)"AvS aX ҡ I&.! '(% 5 PC \A m L %[d*y/ e  0 Y+K+N}N:f[۟Ӌ#J'|5 W!%$!EEIi HK7_Wnt   : bo  Y c o k~Xd=s%6vR?޷ԳL ._G"":c$. / UrG Sb|77 h L%+3aX$aP\ނx?WLϣS44gK< K-KA.j}V )B 4 v!S' =Goc^? iT8w(ܚs,=2Ya9&g<vXLV @D h b #cl''t RII6zC IgI ::\dN'#   ; $ G^{d /_I IvfkxuK 7K 4l`b+rgso1oߑGϑ̄ɉȠPիߓ H^ 32JC'+ "u/{,E+ *=07"IPG?F8ؼ՞ӘCDіsL s5;aMkA *"xt e*dALN4:' d %`]0M7cm4ib;h>ro x9iܗt Yk0' / Lus Y06^NiEb %}!:s7&~) ;lF xCX,[nl۸^Lο̡ޱ{  $$ m,t xu^l4{p`TW/ $\N~T&A. ( 'aXCT9Jny#޾S7Еԑۖg re ^?~ l xnAlq"Dlo 4uzk  5 eF4>RjH;e5(9]۴ܕnK, [c  gdgAMN`J0~N+j3q2?B[q~{nPH@fOB5Plnb :rkOgb2vO;, |;^oSK#d+-dvx}xO=%v%w&mu!L- 1vH DM Kcoe8\-V05y`S!7Xu|{wR;E&8h @sEK6\wt!'i!BzEAmY[fWf q-D  0pgDLGf5zlshcx.(Kb: K 9phTK 9 + F~G, dHAnR " q I r]p=uAޭfgno}3%  hWb! r-M?.MeG ~ ," _ 6 LQK6dLn5#'y6_guB_l=a=& u Y{5 '58^x2Z ae+M4\cr`Li88M;S5K`fFlS<A  m'0yA&R(-FXH2 ~P0sF_*k UPA7{)[cIbK+O$mP3$01Phh2-gwm !,XroY}tkHiGQA>>=) 8ir')B_^M:24EV]F' (72-*29AA>7272274/#   #       %*%#% #(( %*#   #(*279AAA<444/4*#   #**-44999<4477722*( #     %(**###  #F     %%# #  74    # *( (2/-      # #"3101'#,)4=:92, &/37@6-)"" 1RY2Ns` kkzb;EYieA0BTR8 `GDp + 2^g 3 ]DMstXjPf Dy.Q&W.R @:uJV. "W m a0M Oy9tMd1luAzJ\JbvQlMWd:( n[9F+d#[ ]q{l}+!*t1y ?x6&/(D}]Iq?`I'4@dIA{sqpZ( 4`F9qq&Iq .ZF<4 +lnBt20eg7iTL~ ZoQP#{7-  3:PyoIi]dlK4bVL{D(R`g+s >n`D&tD7/H+0eZ{+E@^sdN q4p eGy.FRg-.( y!(gS{( ( }R*s0i:AH`q _)_3QY:r\zk/4.jWr)n%8O }$_ztNd@w`2_@Tx] m  vQW   3  ] A ? z   -/Q'k&A=>ou+m CZe S>$vv[xU'eS*:xNN{@Z  n/oi[Jz  y & $   / c IbW% j-NrJvhC Fwtr xK(2 G   : -N 2w ,> kw|1V:(r'h \9UMl jQ ( r  A2_z p!@+@ [BfK\ "bYTv%Z B"('2D#AmGdA0 g76 0 kJm  q t\s}F7W?Q)glyb57'{,޿ (p}I!()D!Rݟڴ0 b-U,~ >~f~ 4 ~, {* f9# nMQD@8 7)  o(s-!)^o%sWޚt2 & F((-l>#c#sV "P!h}D~  ` &  9("h&Q; y>Bs *1.j !GӮCPRY ~ <N! EE!"" yA0?SHAl = ^ e }~3pise*߽64aH $+/*Tׅ4B| I -HI;w""lS# XFN,92 E O D.L)kgM6_n5y 3;o$UOy  (2.w(d>ڍi)[ %1?N *WqJ { /e \ ,g : 5 v V E j  )VhO}h!V7?ON+ O*2/ a rNшNPlj %os,b{aI  <{ Z e [ {K 6@i$?x0k#-30c!k =%ξO+r+` ui d |(_E7 ;:# v :  m D}odWp 4D4\"\+-$ p ZYs>' ("7}U X < xAF ! kby#V>OkK+Jo /#,./$QGW֨}I q IwlU4RlvT@& e t f7 0  S /:{Dyc/o~F3%m $.*&Kvf/H`q@0}  ["j2+tq x}N b[ { 5 A x7 $ t : aA5++)m3X;KjW &% '0ݣ~ )S `WU/80k /M*1 O}#v+s#,7 L = M|b9d:S]_F , } @~rL 4^bWbc@6VH >%u 3 y9FLuE(CK  F d5a>iC@t( !"# PNjS*8L #-Z1sBP*  j~va (. A#yK/\=|4\A2 7X VU 5Y aRBV\H)#?  5 Ae l!I3(qc\a KAX YF h `Zfr9jle &^\s^0?]~~/ bP9$/!k*Z)8a[ q!  #9hDF Jt=VD/4H% : F3 P _(%F [bn % $tjX4(+y&} &JE/>31*v& y+ }oG   "wKirp 7V "R _e9%; 2  }*}$_1 | qh/Sd4g RFF$B6v B 3 y *t[ :`H5p!XAk^9nfgvC GLO#NZc F5&ub 6qi %ux;:1g  7 vjfdl&@,mYg%nl:Uty- StAvQU} LZ5-8f LE^. >w 56H_7Wf+V O j " +dX+'L"L)&K#9l~T(D-!`y %Om"]HoRS6! ~q343 P $ 1*|".(f T  7 c6lOS{cB{<Tf=`+q=nu'! 4aK#8 <H h4T*U ; k /Q~ q[% D rV{//nwGg vej^r_P2U; uqhlXl Yz t$J 2n tR-s U5o]A<kvH  ( -   /k}t~pPgv0+bxZv?)! ZyOh%lS}k vxL+ 2Y>JJ7_ d } ibf~g z  A yK%}(Tr>n6\YVa&:>7Z?]?5j`|( j8J-~s   xDb_p2|k? = - n`vIa C %e8O`Vx{]<l5IqtF;Ug,t}yX0/Y.pJa =7 ,Y!%'  m 6 L \i_GrG} 4O[ ::5g Di>b::(SqAFq=bSBh\% I X]k;"~qpp>iB(<yVH<Pl-y/b}{F'o7M^DDFu6JD< *C Nm:  x OwKIv=w/b//Os&}W^N:R o!F3s I< $Zv0U*sdMzP_} i_=Hdn,$Hyn}z2>Hgl%4p=@J$TS--K-#/+9k.P_O$je]M[4Ub%bz,VI g?;\ayD!S!Nc[I${NvAojg:i2=c{x.)t21tqX^B{2--q##eu Zamm=wuuhT|wjt$8cJj qAU6|!vsMYkj=H454#?y Ne)E\*ssnzuWHaiaiidW1|fJ o8  PZ/MtyKK/ Hi_ y:)1*vPKo? mC7UA*> J\I$F{~4p\J6h.v- (?b3y;afkzpkhmkY> {7Md<2<]nScEOYWcOWazc\E" IIxZU]le l<xaJ4 ' ,@/PAHKMAK]{:`2_5Peytvq:toY?+0:L[eje[[YTTG5Nsxx<t<l9 /Plxx}qlbZ_is}P~g[l/Pi  (Kbo{vgbVN[ee[K0d9(/* yg`[g{~[2 0Xo[PF2# &N{  R]9 #>l&x>(P{iM%*CZdg_K2(27#t[PSUo~y{ -9A9-FviA />Rdnxq]7*Ux}]7 >Xiqi_H#~ovFglnd9vty AX]PAtUSj#9PRH/  %  %*  %/4/-*(# %/9FPXXXUF- *274/(%       %%   #                            src/speech/welcome.wav0000640000076400007640000014455410776476052016141 0ustar polonatorpolonatorRIFFdWAVEfmt >}data@        '"%#   (////<<<ACFCKZRWWb]Z]]_]_URRRMKC9<2-(     # #*%#%--44-*--## #*%(*% ##         %9KMdqvsgUMA4%~q]L:( 5A`~7Rd(A_y3:DQB?.&oI&RIlCJzT'ks27c$}(N`! y  "  J =K-+#\UZc45zWeD'#B  VJc3[u ZY<<eu  G Y  ~ v`'+GAx%iwޚyS` v Y   @  #?_f;tG ox5  eT< c,h0z&d]mܼq!zf#=> $3.8Ys?Z |j>i ,t1 b={ k ]>)N7_?i}Vr otjړT~P*= =3 >|   a e uIV[2J n .`45W N{MMwd~ݡڠ)ՑӬ5ͥyLېe I*+|  ; P & sN4N=YAt@ 32jVqhV{(DVK& {` 1 6Q7fښ~9pO;. %zV+ x Yc' xs,` T ET Ozk" ~H<ۇ؏n՜$Β˳3hB>#U,0~/l(S \1OwvS K& g 3>T !6)_ ) $ lN[ӝҊӣ|%B,y,&$e WuGA  2qJ? %|KE ~ !\  &  g#rRRqݢوtyI=!5]4+31(mcQ*i"$N pcN, / Hu*"K 1 !!n! ;BP \Ooi2  ^ޅmAԇ5Ձ|6g$.3,  t7Xz ko]W] J pk U U!zYBShXe Ye-{xYxCW7`՛W%hѾذb!+S3l3))mJ5^@q TlHV=n% bNO;m1/!uO W!O,x2!?&wpWӎ}pѾҾ!hq1!T/ 87-&5owTg<SZ YSFv!#/!.8 "  S.{=k {${x^Z|݊\Հӂҕma279) 10<& "a-_߰& m~Jn z++,2N!M(,`-+%=H BD:eQi 4DѢ1Ohњ֋k $e65<==2L@ٝ~אܓLVQ'150#b3w~)]w*<5972v*&; w\O ܺӦQ̏qIxXӅA+&;FwPS_A4dDϏR` q*d780$ x ,(6H: <7, k/ 'k ' h jP՗˒g+s7Xsޮ3*BOUIy*% @p`Ώsweur->41+ /9dR P C ^Yb$ +.23A, C&LJ^G * R 2'Z܏-gԼ՛ը-bb" $s4YC|PM6# ُXͫ G<@3'++Q(a hޘC |"?&#,0<.&|_"f$@OUߔDZєbԥ״8&3AkHW=' W2/>G7nc!S X#"z \r,@Y N #$$8&%0! Ly'  '8f4sHWfwy/ LL[ I$$= w^ Zak zr eLW'Mn*ٔ]֙49ޖ"jM "y( '3# ?|H> 6 *O   uE J }%k @kh$ M 9     R?6%pܥږ5֌ڄ; %j%["w ^Qid.x1  @=, 46 ^cT 69Wy^//RM:נվz/8!$%"| ;mU h u I\xR$  /  hJ  aFsI+$mP44uYz 8woxQ;wrA   xn<b37c Q E> * \ Ug?h~JQ.cf^96 c@ R M ZQ!e)j^,T\CM%}  ;f " \#}C z  r  6 p  k x  ; %20e,QJ. Wu=wt-7 n*C* 4 C @  Y _U1_U@/a# w Vt;GEYT&5=DgxM4} d/psa1H <2_.S):IQ&&|YOD.=X5] Pz(/U aC4(42%>#d#x/8 !bN8+0rg0wLLK\U-ooF/2Z>CW9axsdAK #Ca}}W#|q*Udp_>4<4(/>A42<>* *>Zd_U72<>2 # %%           9CAH4  %%#                      # # %   ""#(&'$'$''&)))'* !"  wpxjxen`kVWDK;IALJXKST8 m c,]&+D( 9 .C5R cd;# /6-"=F>;7 q*# 5~% k M}W|,7Hj Vd! c "   &?\ ' C } ?ME ]G ` J Y ud $y}?ږuMqLBG޿+$X% 0 Em'6 g%O { % = 1 :  > l I|z)b۹~-FԴwNΟGq#!pv: ^`R ARq &_s k y   m . ,dM;ݺ܀ۼھ3l0Lk9y IqS];v$ M! 61 ~F   :  6  ^5t2)SMj"ѹPG  /a0 o|= Mbn 0  , n  X :j t ;$qoKފnٍ4We3 R Ws: 5 &? m h   {U 3   O ! Oz 5 Wz(wRڕ/}8~D2n5D,2 | A C_ 4H%    a u ^ 7* U 3 2pY4ADWgHFR b@5m{AAڧ׼թqf(m j ^ {J!y %0H   T 9 3 49l? h = p = y b v\s6ߵs$ߴ%'k?oW`Q1 P  L5X]zGX1  3  Q;l?2K/HW  Rr7r[Q4W"ܳކޒyܲܝTd~S v4"7oPbE<RA?4 V . V z%&sl%.A/`ݾ*٣yuگ(O- z A- N~n}A % V <&[wPMAPis@#Ry=;< ٲڭP۷_ڴj g-B]  /qogpvHA  PR9)yCdT,H~?Qckڂ \ڙڛۢhAq=]ovvjQ& vfQX5" z`gEJ,-`d67{qrZcVfZ]]ogzz '4l{;)lN M&6))I6* fKro ]8n.X-!7#q{e' .z?FePu^8VqgK8}c4URF8(O@1f-[H9%<\22 #j \F<Rk= $L</ [  Po V [ A 2]% km)4c& ;j * BL[t9 # i u$*.| u[ yNA K e V("jM+P j#9u |Jp} _96d\ {$ oktEjMr tbA)bb X.NVr #:\#b=l !`b8b<v  2 /Y D IE3NDDM<(P|H0s19%  (' X,WY RD~f="$ ec*]R NE/bE7v_:l_"SXXi\:md-e0%_FA+}zpt ss <Mc1-UV4U%=V-h x(yPFP-:+[bMA[-HSVwpXSfz@E{ J9`bާWR4?E$u/dK 6~,J $ ^ y)\ kGpPEP n=]Cm!ږ'6٘kߵ|YUR AM Z9[ =5r| e L a?0S%cA cdv=dq]\M=݁w_0 yn &+  )q*/\ 7&h 5}_= zj8 fJ]:(HݎެݺLV+z5> r +?m TISp?q%p H(6v2 , F u++LU.$h%}*~3|k bqPiu*dHuhh[)JhmD`0#x?i85u 1"1Hp Fe'-t zT4n>b>lUZ4\1wYt8v`K:XjPe+Fq U=t!{jIIIb{LJ\{P&5| 6cw^)jGZF/vcQN>64$lYOH/* .=E]k %5MdqxnfTNB5"- ##- Xt7F( <M>7< a\R2 #>/#i{CU FCn}SC<G>4yRav~Mqxb}b{oF4[7F j-Mi n#5\2s =a +n-}a5-PKq`~DT'.P-w&p% #AFe#qZSna d?0<y P~7d:AKixPhc_^O _i])>@f H  l /R4s Tp{] lgS9_p٫s;L T~n C  GT4~ ~c l|u #` 678%A9q,`ћuAQ<i & A* C6& W'v* D fr! U ^L8 "U / >#YU) $FرѨͅnԖe3$ ]!"! 9~{^81#8K /TTp   OQM_ U 4'd"Sq0&ՎQ`ӄuӇޅKsS p*0yF @!wsTbD<' 1m C@AC1b  '"Djs68[a643ڃٲ&;'OZS . ]!  irhmm6H3~E] |6@f    VG$8\'Bv^)3 ~`BW~Yb5^6} Ey.Z0-2&b#A2tF! 2j..038L[=D7xsy_n m%cB1" 1JaFnx_q\2?y&BNQ[L=0{eUD#}iK(  5AZnsK Ub t2P %Ps#Do:X2_-AKZqxl]? _2X( (BQgytqe`VXVV[[bev4Md  %##nRA/ #%%(%(# #%%(%%/227<<>>AA>722   #      )#,0;5>;M@NP^^ggsozt|~~}wrprih[\NM=C24$" mi>?m=tOE)`H$g>M ~F(Z  tn w  2 B QC(+JF B vPa[y <uaR- /I27g!SCmusP* >FVg&ql